]> gitweb.factorcode.org Git - factor.git/commitdiff
clean up random.windows init hook, and add another crypto provider
authorDoug Coleman <doug.coleman@gmail.com>
Fri, 29 Jan 2010 04:45:19 +0000 (22:45 -0600)
committerDoug Coleman <doug.coleman@gmail.com>
Fri, 29 Jan 2010 04:45:19 +0000 (22:45 -0600)
basis/random/windows/windows.factor

index c1d3010c0f1e1ea7f605633d0db45fec7b0e4805..a10f90ddef58e32e33291110cc4b662bc1fff651 100644 (file)
@@ -1,7 +1,8 @@
 USING: accessors alien.c-types alien.data byte-arrays
 combinators.short-circuit continuations destructors init kernel
 locals namespaces random windows.advapi32 windows.errors
-windows.kernel32 windows.types math.bitwise ;
+windows.kernel32 windows.types math.bitwise sequences fry
+literals ;
 IN: random.windows
 
 TUPLE: windows-rng provider type ;
@@ -58,13 +59,23 @@ M: windows-rng random-bytes* ( n tuple -- bytes )
         [ CryptGenRandom win32-error=0/f ] keep
     ] with-destructors ;
 
+ERROR: no-windows-crypto-provider ;
+
+: try-crypto-providers ( seq -- windows-rng )
+    [ first2 <windows-rng> ] try-find drop
+    [ no-windows-crypto-provider ] unless* ;
+
 [
-    MS_DEF_PROV
-    PROV_RSA_FULL <windows-rng> system-random-generator set-global
+    {
+        ${ MS_ENHANCED_PROV PROV_RSA_FULL }
+        ${ MS_DEF_PROV PROV_RSA_FULL }
+    } try-crypto-providers
+    system-random-generator set-global
 
-    [ MS_STRONG_PROV PROV_RSA_FULL <windows-rng> ]
-    [ drop MS_ENH_RSA_AES_PROV PROV_RSA_AES <windows-rng> ] recover
-    secure-random-generator set-global
+    {
+        ${ MS_STRONG_PROV PROV_RSA_FULL }
+        ${ MS_ENH_RSA_AES_PROV PROV_RSA_AES }
+    } try-crypto-providers secure-random-generator set-global
 ] "random.windows" add-startup-hook
 
 [