X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=mono%2Fmetadata%2Frand.c;h=4ed1203f85df3390b9d75bd5c597ec955c0c6dea;hb=1e726ce7a38a92860acab28f4427813d2ba14c13;hp=28e4b8716022d292b3251a7b774e2b5ccbdf43a8;hpb=b6b13e72e91d5b529a6306ce53bda685932c77db;p=mono.git diff --git a/mono/metadata/rand.c b/mono/metadata/rand.c index 28e4b871602..4ed1203f85d 100644 --- a/mono/metadata/rand.c +++ b/mono/metadata/rand.c @@ -6,8 +6,8 @@ * Patrik Torstensson (p@rxc.se) * Sebastien Pouliot (sebastien@ximian.com) * - * (C) 2001 Ximian, Inc. - * Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com) + * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com) + * Copyright 2004-2009 Novell, Inc (http://www.novell.com) */ #include @@ -15,13 +15,18 @@ #include #include #include +#ifdef HAVE_UNISTD_H #include +#endif +#ifdef HAVE_STRING_H +#include +#endif #include #include #include -#if !defined(PLATFORM_WIN32) +#if !defined(__native_client__) && !defined(HOST_WIN32) #include #include #include @@ -92,7 +97,7 @@ get_entropy_from_server (const char *path, guchar *buf, int len) } #endif -#if defined (PLATFORM_WIN32) +#if defined (HOST_WIN32) #include #include @@ -175,6 +180,58 @@ ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngClose (gpoint CryptReleaseContext ((HCRYPTPROV) handle, 0); } +#elif defined (__native_client__) + +#include + +MonoBoolean +ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngOpen (void) +{ + srand (time (NULL)); + return TRUE; +} + +gpointer +ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngInitialize (MonoArray *seed) +{ + return -1; +} + +gpointer +ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngGetBytes (gpointer handle, MonoArray *arry) +{ + guint32 len = mono_array_length (arry); + guchar *buf = mono_array_addr (arry, guchar, 0); + + /* Read until the buffer is filled. This may block if using NAME_DEV_RANDOM. */ + gint count = 0; + gint err; + + do { + if (len - count >= sizeof (long)) + { + *(long*)buf = rand(); + count += sizeof (long); + } + else if (len - count >= sizeof (short)) + { + *(short*)buf = rand(); + count += sizeof (short); + } + else if (len - count >= sizeof (char)) + { + *buf = rand(); + count += sizeof (char); + } + } while (count < len); + + return (gpointer)-1L; +} + +void +ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngClose (gpointer handle) +{ +} #else #ifndef NAME_DEV_URANDOM