]> gitweb.factorcode.org Git - factor.git/blob - basis/random/windows/windows.factor
a4cf74e1df1940b18c88d6116b72b5355e84fb3c
[factor.git] / basis / random / windows / windows.factor
1 USING: accessors alien.c-types byte-arrays continuations
2 kernel windows windows.advapi32 init namespaces random
3 destructors locals ;
4 IN: random.windows
5
6 TUPLE: windows-rng provider type ;
7 C: <windows-rng> windows-rng
8
9 TUPLE: windows-crypto-context handle ;
10 C: <windows-crypto-context> windows-crypto-context
11
12 M: windows-crypto-context dispose ( tuple -- )
13     handle>> 0 CryptReleaseContext win32-error=0/f ;
14
15 : factor-crypto-container ( -- string ) "FactorCryptoContainer" ; inline
16
17 :: (acquire-crypto-context) ( provider type flags -- handle )
18     [let | handle [ "HCRYPTPROV" <c-object> ] |
19         handle
20         factor-crypto-container
21         provider
22         type
23         flags
24         CryptAcquireContextW win32-error=0/f
25         handle *void* ] ;
26
27 : acquire-crypto-context ( provider type -- handle )
28     [ 0 (acquire-crypto-context) ]
29     [ drop CRYPT_NEWKEYSET (acquire-crypto-context) ] recover ;
30
31
32 : windows-crypto-context ( provider type -- context )
33     acquire-crypto-context <windows-crypto-context> ;
34
35 M: windows-rng random-bytes* ( n tuple -- bytes )
36     [
37         [ provider>> ] [ type>> ] bi
38         windows-crypto-context &dispose
39         handle>> swap dup <byte-array>
40         [ CryptGenRandom win32-error=0/f ] keep
41     ] with-destructors ;
42
43 [
44     MS_DEF_PROV
45     PROV_RSA_FULL <windows-rng> system-random-generator set-global
46
47     MS_STRONG_PROV
48     PROV_RSA_FULL <windows-rng> secure-random-generator set-global
49
50     ! MS_ENH_RSA_AES_PROV
51     ! PROV_RSA_AES <windows-rng> secure-random-generator set-global
52 ] "random.windows" add-init-hook