fix error handling in random.windows if acquiring the crypto context fails
parent
8f688eb742
commit
91834fb336
|
@ -1,6 +1,7 @@
|
||||||
USING: accessors alien.c-types byte-arrays continuations
|
USING: accessors alien.c-types byte-arrays
|
||||||
kernel windows.advapi32 init namespaces random destructors
|
combinators.short-circuit continuations destructors init kernel
|
||||||
locals windows.errors ;
|
locals namespaces random windows.advapi32 windows.errors
|
||||||
|
windows.kernel32 ;
|
||||||
IN: random.windows
|
IN: random.windows
|
||||||
|
|
||||||
TUPLE: windows-rng provider type ;
|
TUPLE: windows-rng provider type ;
|
||||||
|
@ -12,22 +13,37 @@ C: <windows-crypto-context> windows-crypto-context
|
||||||
M: windows-crypto-context dispose ( tuple -- )
|
M: windows-crypto-context dispose ( tuple -- )
|
||||||
handle>> 0 CryptReleaseContext win32-error=0/f ;
|
handle>> 0 CryptReleaseContext win32-error=0/f ;
|
||||||
|
|
||||||
: factor-crypto-container ( -- string ) "FactorCryptoContainer" ; inline
|
CONSTANT: factor-crypto-container "FactorCryptoContainer"
|
||||||
|
|
||||||
:: (acquire-crypto-context) ( provider type flags -- handle )
|
:: (acquire-crypto-context) ( provider type flags -- handle ret )
|
||||||
[let | handle [ "HCRYPTPROV" <c-object> ] |
|
"HCRYPTPROV" <c-object> :> handle
|
||||||
handle
|
handle
|
||||||
factor-crypto-container
|
factor-crypto-container
|
||||||
provider
|
provider
|
||||||
type
|
type
|
||||||
flags
|
flags
|
||||||
CryptAcquireContextW win32-error=0/f
|
CryptAcquireContextW handle swap ;
|
||||||
handle *void* ] ;
|
|
||||||
|
|
||||||
: acquire-crypto-context ( provider type -- handle )
|
: acquire-crypto-context ( provider type -- handle )
|
||||||
[ 0 (acquire-crypto-context) ]
|
0 (acquire-crypto-context)
|
||||||
[ drop CRYPT_NEWKEYSET (acquire-crypto-context) ] recover ;
|
0 = [
|
||||||
|
GetLastError NTE_BAD_KEYSET =
|
||||||
|
[ drop f ] [ win32-error-string throw ] if
|
||||||
|
] [
|
||||||
|
*void*
|
||||||
|
] if ;
|
||||||
|
|
||||||
|
: create-crypto-context ( provider type -- handle )
|
||||||
|
CRYPT_NEWKEYSET (acquire-crypto-context) win32-error=0/f *void* ;
|
||||||
|
|
||||||
|
ERROR: acquire-crypto-context-failed provider type ;
|
||||||
|
|
||||||
|
: attempt-crypto-context ( provider type -- handle )
|
||||||
|
{
|
||||||
|
[ acquire-crypto-context ]
|
||||||
|
[ create-crypto-context ]
|
||||||
|
[ acquire-crypto-context-failed ]
|
||||||
|
} 2|| ;
|
||||||
|
|
||||||
: windows-crypto-context ( provider type -- context )
|
: windows-crypto-context ( provider type -- context )
|
||||||
acquire-crypto-context <windows-crypto-context> ;
|
acquire-crypto-context <windows-crypto-context> ;
|
||||||
|
|
|
@ -291,6 +291,40 @@ CONSTANT: SE_GROUP_ENABLED 4
|
||||||
CONSTANT: SE_GROUP_OWNER 8
|
CONSTANT: SE_GROUP_OWNER 8
|
||||||
CONSTANT: SE_GROUP_LOGON_ID -1073741824
|
CONSTANT: SE_GROUP_LOGON_ID -1073741824
|
||||||
|
|
||||||
|
CONSTANT: NTE_BAD_UID HEX: 80090001
|
||||||
|
CONSTANT: NTE_BAD_HASH HEX: 80090002
|
||||||
|
CONSTANT: NTE_BAD_KEY HEX: 80090003
|
||||||
|
CONSTANT: NTE_BAD_LEN HEX: 80090004
|
||||||
|
CONSTANT: NTE_BAD_DATA HEX: 80090005
|
||||||
|
CONSTANT: NTE_BAD_SIGNATURE HEX: 80090006
|
||||||
|
CONSTANT: NTE_BAD_VER HEX: 80090007
|
||||||
|
CONSTANT: NTE_BAD_ALGID HEX: 80090008
|
||||||
|
CONSTANT: NTE_BAD_FLAGS HEX: 80090009
|
||||||
|
CONSTANT: NTE_BAD_TYPE HEX: 8009000A
|
||||||
|
CONSTANT: NTE_BAD_KEY_STATE HEX: 8009000B
|
||||||
|
CONSTANT: NTE_BAD_HASH_STATE HEX: 8009000C
|
||||||
|
CONSTANT: NTE_NO_KEY HEX: 8009000D
|
||||||
|
CONSTANT: NTE_NO_MEMORY HEX: 8009000E
|
||||||
|
CONSTANT: NTE_EXISTS HEX: 8009000F
|
||||||
|
CONSTANT: NTE_PERM HEX: 80090010
|
||||||
|
CONSTANT: NTE_NOT_FOUND HEX: 80090011
|
||||||
|
CONSTANT: NTE_DOUBLE_ENCRYPT HEX: 80090012
|
||||||
|
CONSTANT: NTE_BAD_PROVIDER HEX: 80090013
|
||||||
|
CONSTANT: NTE_BAD_PROV_TYPE HEX: 80090014
|
||||||
|
CONSTANT: NTE_BAD_PUBLIC_KEY HEX: 80090015
|
||||||
|
CONSTANT: NTE_BAD_KEYSET HEX: 80090016
|
||||||
|
CONSTANT: NTE_PROV_TYPE_NOT_DEF HEX: 80090017
|
||||||
|
CONSTANT: NTE_PROV_TYPE_ENTRY_BAD HEX: 80090018
|
||||||
|
CONSTANT: NTE_KEYSET_NOT_DEF HEX: 80090019
|
||||||
|
CONSTANT: NTE_KEYSET_ENTRY_BAD HEX: 8009001A
|
||||||
|
CONSTANT: NTE_PROV_TYPE_NO_MATCH HEX: 8009001B
|
||||||
|
CONSTANT: NTE_SIGNATURE_FILE_BAD HEX: 8009001C
|
||||||
|
CONSTANT: NTE_PROVIDER_DLL_FAIL HEX: 8009001D
|
||||||
|
CONSTANT: NTE_PROV_DLL_NOT_FOUND HEX: 8009001E
|
||||||
|
CONSTANT: NTE_BAD_KEYSET_PARAM HEX: 8009001F
|
||||||
|
CONSTANT: NTE_FAIL HEX: 80090020
|
||||||
|
CONSTANT: NTE_SYS_ERR HEX: 80090021
|
||||||
|
|
||||||
! SID is a variable length structure
|
! SID is a variable length structure
|
||||||
TYPEDEF: void* PSID
|
TYPEDEF: void* PSID
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue