diff --git a/basis/random/windows/windows.factor b/basis/random/windows/windows.factor index c1d3010c0f..a10f90ddef 100644 --- a/basis/random/windows/windows.factor +++ b/basis/random/windows/windows.factor @@ -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 ; -[ - MS_DEF_PROV - PROV_RSA_FULL system-random-generator set-global +ERROR: no-windows-crypto-provider ; - [ MS_STRONG_PROV PROV_RSA_FULL ] - [ drop MS_ENH_RSA_AES_PROV PROV_RSA_AES ] recover - secure-random-generator set-global +: try-crypto-providers ( seq -- windows-rng ) + [ first2 ] try-find drop + [ no-windows-crypto-provider ] unless* ; + +[ + { + ${ 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 } + ${ MS_ENH_RSA_AES_PROV PROV_RSA_AES } + } try-crypto-providers secure-random-generator set-global ] "random.windows" add-startup-hook [