* icall.c: Added new icall for RNG.
* rand.c|h: Added new icall to open the RNG. This allows to share a
single handle on Linux to access /dev/urandom and fix #73183.
svn path=/trunk/mono/; revision=41402
+2005-03-03 Sebastien Pouliot <sebastien@ximian.com>
+
+ * icall.c: Added new icall for RNG.
+ * rand.c|h: Added new icall to open the RNG. This allows to share a
+ single handle on Linux to access /dev/urandom and fix #73183.
Thu Mar 3 17:53:17 CET 2005 Paolo Molaro <lupus@ximian.com>
static const IcallEntry rng_icalls [] = {
{"RngClose", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngClose},
{"RngGetBytes", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngGetBytes},
- {"RngInitialize", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngInitialize}
+ {"RngInitialize", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngInitialize},
+ {"RngOpen", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngOpen}
};
static const IcallEntry methodhandle_icalls [] = {
* Sebastien Pouliot (sebastien@ximian.com)
*
* (C) 2001 Ximian, Inc.
- * (C) 2004 Novell (http://www.novell.com)
+ * Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
*/
#include <config.h>
#define CRYPT_VERIFY_CONTEXT 0xF0000000
#endif
+MonoBoolean
+ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngOpen (void)
+{
+ /* FALSE == Local (instance) handle for randomness */
+ return FALSE;
+}
+
gpointer
ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngInitialize (MonoArray *seed)
{
#endif
static gboolean egd = FALSE;
+static gint file = -1;
-gpointer
-ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngInitialize (MonoArray *seed)
+MonoBoolean
+ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngOpen (void)
{
- gint file = -1;
-
- if (egd)
- return (gpointer) -1;
+ if (egd || (file >= 0))
+ return TRUE;
#if defined (NAME_DEV_URANDOM)
file = open (NAME_DEV_URANDOM, O_RDONLY);
if (file < 0) {
const char *socket_path = g_getenv("MONO_EGD_SOCKET");
egd = (socket_path != NULL);
- return (gpointer) -1;
}
+ /* TRUE == Global handle for randomness */
+ return TRUE;
+}
+
+gpointer
+ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngInitialize (MonoArray *seed)
+{
/* if required exception will be thrown in managed code */
- return ((file < 0) ? NULL : GINT_TO_POINTER (file));
+ return ((!egd && (file < 0)) ? NULL : GINT_TO_POINTER (file));
}
gpointer
void
ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngClose (gpointer handle)
{
- if (!egd)
- close (GPOINTER_TO_INT (handle));
}
#endif /* OS definition */
* Sebastien Pouliot (sebastien@ximian.com)
*
* (C) 2001 Ximian, Inc.
- * (C) 2004 Novell (http://www.novell.com)
- *
+ * Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
*/
#ifndef _MONO_METADATA_RAND_H_
#include <mono/metadata/object.h>
+MonoBoolean ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngOpen (void);
gpointer ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngInitialize (MonoArray *seed);
gpointer ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngGetBytes (gpointer handle, MonoArray *arry);
void ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngClose (gpointer handle);