fix secure-random-generator for windows

db4
Doug Coleman 2008-03-29 14:25:57 -05:00
parent a00e325b96
commit cee0eb5be3
2 changed files with 74 additions and 17 deletions

View File

@ -1,31 +1,54 @@
USING: accessors alien.c-types byte-arrays continuations
kernel windows windows.advapi32 init namespaces random ;
kernel windows windows.advapi32 init namespaces random
destructors locals ;
USE: tools.walker
IN: random.windows
TUPLE: windows-crypto-context handle ;
TUPLE: windows-rng provider type ;
C: <windows-rng> windows-rng
TUPLE: windows-crypto-context handle ;
C: <windows-crypto-context> windows-crypto-context
M: windows-crypto-context dispose ( tuple -- )
handle>> 0 CryptReleaseContext win32-error=0/f ;
TUPLE: windows-cryptographic-rng context ;
: factor-crypto-container ( -- string ) "FactorCryptoContainer" ; inline
C: <windows-cryptographic-rng> windows-cryptographic-rng
:: (acquire-crypto-context) ( provider type flags -- handle )
[let | handle [ "HCRYPTPROV" <c-object> ] |
handle
factor-crypto-container
provider
type
flags
CryptAcquireContextW win32-error=0/f
handle *void* ] ;
M: windows-cryptographic-rng dispose ( tuple -- )
context>> dispose ;
: acquire-crypto-context ( provider type -- handle )
[ 0 (acquire-crypto-context) ]
[ drop CRYPT_NEWKEYSET (acquire-crypto-context) ] recover ;
M: windows-cryptographic-rng random-bytes* ( tuple n -- bytes )
>r context>> r> dup <byte-array>
[ CryptGenRandom win32-error=0/f ] keep ;
: windows-aes-context ( -- context )
"HCRYPTPROV" <c-object>
dup f f PROV_RSA_AES CRYPT_NEWKEYSET
CryptAcquireContextW win32-error=0/f *void*
<windows-crypto-context> ;
: windows-crypto-context ( provider type -- context )
acquire-crypto-context <windows-crypto-context> ;
! [
! windows-aes-context secure-random-generator set-global
! ] "random.windows" add-init-hook
M: windows-rng random-bytes* ( n tuple -- bytes )
[
[ provider>> ] [ type>> ] bi
windows-crypto-context
dup add-always-destructor handle>>
swap dup <byte-array>
[ CryptGenRandom win32-error=0/f ] keep
] with-destructors ;
[
MS_DEF_PROV
PROV_RSA_FULL <windows-rng> insecure-random-generator set-global
! MS_STRONG_PROV
! PROV_RSA_FULL <windows-rng> secure-random-generator set-global
MS_ENH_RSA_AES_PROV
PROV_RSA_AES <windows-rng> secure-random-generator set-global
] "random.windows" add-init-hook

View File

@ -21,6 +21,40 @@ LIBRARY: advapi32
: PROV_REPLACE_OWF 23 ; inline
: PROV_RSA_AES 24 ; inline
: MS_DEF_DH_SCHANNEL_PROV
"Microsoft DH Schannel Cryptographic Provider" ; inline
: MS_DEF_DSS_DH_PROV
"Microsoft Base DSS and Diffie-Hellman Cryptographic Provider" ; inline
: MS_DEF_DSS_PROV
"Microsoft Base DSS Cryptographic Provider" ; inline
: MS_DEF_PROV
"Microsoft Base Cryptographic Provider v1.0" ; inline
: MS_DEF_RSA_SCHANNEL_PROV
"Microsoft RSA Schannel Cryptographic Provider" ; inline
! Unsupported (!)
: MS_DEF_RSA_SIG_PROV
"Microsoft RSA Signature Cryptographic Provider" ; inline
: MS_ENH_DSS_DH_PROV
"Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider" ; inline
: MS_ENH_RSA_AES_PROV
"Microsoft Enhanced RSA and AES Cryptographic Provider" ; inline
: MS_ENHANCED_PROV
"Microsoft Enhanced Cryptographic Provider v1.0" ; inline
: MS_SCARD_PROV
"Microsoft Base Smart Card Crypto Provider" ; inline
: MS_STRONG_PROV
"Microsoft Strong Cryptographic Provider" ; inline
: CRYPT_VERIFYCONTEXT HEX: F0000000 ; inline
: CRYPT_NEWKEYSET HEX: 8 ; inline
: CRYPT_DELETEKEYSET HEX: 10 ; inline