' wincrypt.inc ' ' Partial translation of Microsoft's CryptoAPI to Power Basic 32-bit ' Translated from Visual C++ header files by Don Dickinson ' Nov, 1999 ' #If Not %Def(%WINCRYPT_INC) %WINCRYPT_INC = 1 Declare Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextA" _ ( hCryptProv As Long, zContainer As Asciiz, zProvider As Asciiz, _ ByVal dwProvType As Dword, ByVal dwFlags As Dword ) As Long Declare Function CryptGetProvParam Lib "advapi32.dll" Alias "CryptGetProvParam" _ ( ByVal hProv As Long, ByVal dwParam As Dword, pbData As Any, _ dwDataLen As Dword, ByVal dwFlags As Dword ) As Long Declare Function CryptReleaseContext lib "advapi32.dll" Alias "CryptReleaseContext" _ ( ByVal hCryptProv As Long, ByVal dwFlags As Dword ) As Long Declare Function CryptSetProvider Lib "advapi32.dll" Alias "CryptSetProviderA" _ ( zProvName As Asciiz, ByVal dwProvType As Dword ) As Long Declare Function CryptSetProvParam lib "advapi32.dll" Alias "CryptSetProvParam" _ ( ByVal hCryptProv As Long, ByVal dwParam As Dword, pbData As Any, ByVal dwFlags As Dword ) As Long Declare Function CryptCreateHash lib "advapi32.dll" Alias "CryptCreateHash" _ ( ByVal hProv As Long, ByVal iAlgID As Long, ByVal hKey As Long, _ ByVal dwFlags As Dword, hHash As Long ) As Long Declare Function CryptHashData Lib "advapi32.dll" Alias "CryptHashData" _ ( ByVal hHash As Long, pbData As Any, ByVal dwDatalen As Dword, _ ByVal dwFlags As Long ) As Long Declare Function CryptDeriveKey Lib "advapi32.dll" Alias "CryptDeriveKey" _ ( ByVal hProv As Long, ByVal AlgID As Long, ByVal hBaseData As Long, _ ByVal dwFlags As Long, hKey As Long ) As Long Declare Function CryptEncrypt Lib "advapi32.dll" Alias "CryptEncrypt" _ ( ByVal hKey As Long, ByVal hHash As Long, ByVal Final As Long, _ ByVal dwFlags As Dword, pbData As Any, pdwDataLen As Long, _ ByVal dwBufLen As Long ) As Long Declare Function CryptDecrypt Lib "advapi32.dll" Alias "CryptDecrypt" _ ( ByVal hKey As Long, ByVal hHash As Long, ByVal Final As Long, _ ByVal dwFlags As Dword, pbData As Any, pdwDataLen As Long ) As Long Declare Function CryptDestroyHash Lib "advapi32.dll" Alias "CryptDestroyHash" _ ( ByVal hHash As Long ) As Long Declare Function CryptDestroyKey Lib "advapi32.dll" Alias "CryptDestroyKey" _ ( ByVal hKey As Long ) As Long $MS_DEF_PROV_A = "Microsoft Base Cryptographic Provider v1.0" '"Microsoft Base Cryptographic Provider v1.0" $MS_DEF_PROV = "Microsoft Base Cryptographic Provider v1.0" '- Return constants for CryptAquireContext ' %ERROR_INVALID_PARAMETER = defined in win32api.inc ' %ERROR_NOT_ENOUGH_MEMORY = defined in win32api.inc #If %Def(%THESE_AREN_NOT_YET_DEFINED) %NTE_BAD_FLAGS %NTE_BAD_KEYSET %NTE_BAD_KEYSET_PARAM %NTE_BAD_PROV_TYPE %NTE_BAD_SIGNATURE %NTE_EXISTS %NTE_KEYSET_ENTRY_BAD %NTE_KEYSET_NOT_DEF %NTE_NO_MEMORY %NTE_PROV_DLL_NOT_FOUND %NTE_PROV_TYPE_ENTRY_BAD %NTE_PROV_TYPE_NO_MATCH %NTE_PROV_TYPE_NOT_DEF %NTE_PROVIDER_DLL_FAIL %NTE_SIGNATURE_FILE_BAD #EndIf %PROV_RSA_FULL = 1 %PROV_RSA_SIG = 2 %PROV_DSS = 3 %PROV_FORTEZZA = 4 %PROV_MS_EXCHANGE = 5 %PROV_SSL = 6 %PROV_RSA_SCHANNEL = 12 %PROV_DSS_DH = 13 %PROV_EC_ECDSA_SIG = 14 %PROV_EC_ECNRA_SIG = 15 %PROV_EC_ECDSA_FULL = 16 %PROV_EC_ECNRA_FULL = 17 %PROV_SPYRUS_LYNKS = 20 ' dwFlags definitions For CryptAcquireContext %CRYPT_VERIFYCONTEXT = &hF0000000 %CRYPT_NEWKEYSET = &h00000008 %CRYPT_DELETEKEYSET = &h00000010 %CRYPT_MACHINE_KEYSET = &h00000020 ' CryptSetProvParam ' %PP_CLIENT_HWND = 1 %PP_CONTEXT_INFO = 11 %PP_KEYEXCHANGE_KEYSIZE = 12 %PP_SIGNATURE_KEYSIZE = 13 %PP_KEYEXCHANGE_ALG = 14 %PP_SIGNATURE_ALG = 15 %PP_DELETEKEY = 24 '- CryptGetProvParam ' %PP_ENUMALGS = 1 %PP_ENUMCONTAINERS = 2 %PP_IMPTYPE = 3 %PP_NAME = 4 %PP_VERSION = 5 %PP_CONTAINER = 6 %PP_CHANGE_PASSWORD = 7 %PP_KEYSET_SEC_DESCR = 8 %PP_CERTCHAIN = 9 %PP_KEY_TYPE_SUBTYPE = 10 %PP_PROVTYPE = 16 %PP_KEYSTORAGE = 17 %PP_APPLI_CERT = 18 %PP_SYM_KEYSIZE = 19 %PP_SESSION_KEYSIZE = 20 %PP_UI_PROMPT = 21 %PP_ENUMALGS_EX = 22 ' dwFlag definitions For CryptGenKey %CRYPT_EXPORTABLE = &h00000001 %CRYPT_USER_PROTECTED = &h00000002 %CRYPT_CREATE_SALT = &h00000004 %CRYPT_UPDATE_KEY = &h00000008 %CRYPT_NO_SALT = &h00000010 %CRYPT_PREGEN = &h00000040 %CRYPT_RECIPIENT = &h00000010 %CRYPT_INITIATOR = &h00000040 %CRYPT_ONLINE = &h00000080 %CRYPT_SF = &h00000100 %CRYPT_CREATE_IV = &h00000200 %CRYPT_KEK = &h00000400 %CRYPT_DATA_KEY = &h00000800 ' dwFlags definitions For CryptDeriveKey %CRYPT_SERVER = &h00000400 %KEY_LENGTH_MASK = &hFFFF0000 ' dwFlag definitions For CryptExportKey %CRYPT_Y_ONLY = &h00000001 %CRYPT_SSL2_SLUMMING = &h00000002 ' dwFlags definitions For CryptHashSessionKey %CRYPT_LITTLE_ENDIAN = &h00000001 ' dwFlag definitions For CryptSetProviderEx And CryptGetDefaultProvider %CRYPT_MACHINE_DEFAULT = &h00000001 %CRYPT_USER_DEFAULT = &h00000002 %CRYPT_DELETE_DEFAULT = &h00000004 ' exported key blob definitions %SIMPLEBLOB = &h1 %PUBLICKEYBLOB = &h6 %PRIVATEKEYBLOB = &h7 %PLAINTEXTKEYBLOB = &h8 %AT_KEYEXCHANGE = 1 %AT_SIGNATURE = 2 %CRYPT_USERDATA = 1 ' dwParam %KP_IV = 1 ' Initialization vector %KP_SALT = 2 ' Salt value %KP_PADDING = 3 ' Padding values %KP_MODE = 4 ' Mode of the cipher %KP_MODE_BITS = 5 ' Number of bits To feedback %KP_PERMISSIONS = 6 ' Key permissions Dword %KP_ALGID = 7 ' Key algorithm %KP_BLOCKLEN = 8 ' Block Size of the cipher %KP_KEYLEN = 9 ' Length of key In bits %KP_SALT_EX = 10 ' Length of salt In bytes %KP_P = 11 ' DSS/Diffie-Hellman P value %KP_G = 12 ' DSS/Diffie-Hellman G value %KP_Q = 13 ' DSS Q value %KP_X = 14 ' Diffie-Hellman X value %KP_Y = 15 ' Y value %KP_RA = 16 ' Fortezza RA value %KP_RB = 17 ' Fortezza RB value %KP_INFO = 18 ' For putting information into an RSA envelope %KP_EFFECTIVE_KEYLEN = 19 ' setting And getting RC2 effective key length %KP_SCHANNEL_ALG = 20 ' For setting the Secure Channel algorithms %KP_CLIENT_RANDOM = 21 ' For setting the Secure Channel Client Random Data %KP_SERVER_RANDOM = 22 ' For setting the Secure Channel Server Random Data %KP_RP = 23 %KP_PRECOMP_MD5 = 24 %KP_PRECOMP_SHA = 25 %KP_CERTIFICATE = 26 ' For setting Secure Channel certificate Data (PCT1) %KP_CLEAR_KEY = 27 ' For setting Secure Channel clear key Data (PCT1) %KP_PUB_EX_LEN = 28 %KP_PUB_EX_VAL = 29 ' KP_PADDING %PKCS5_PADDING = 1 ' PKCS 5 (sec 6.2) padding method %RANDOM_PADDING = 2 %ZERO_PADDING = 3 ' KP_MODE %CRYPT_MODE_CBC = 1 ' Cipher block chaining %CRYPT_MODE_ECB = 2 ' Electronic code book %CRYPT_MODE_OFB = 3 ' Output feedback mode %CRYPT_MODE_CFB = 4 ' Cipher feedback mode %CRYPT_MODE_CTS = 5 ' Ciphertext stealing mode ' KP_PERMISSIONS %CRYPT_ENCRYPT = &h0001 ' Allow encryption %CRYPT_DECRYPT = &h0002 ' Allow decryption %CRYPT_EXPORT = &h0004 ' Allow key To be exported %CRYPT_READ = &h0008 ' Allow parameters To be Read %CRYPT_WRITE = &h0010 ' Allow parameters To be Set %CRYPT_MAC = &h0020 ' Allow MACs To be used With key %CRYPT_EXPORT_KEY = &h0040 ' Allow key To be used For exporting keys %CRYPT_IMPORT_KEY = &h0080 ' Allow key To be used For importing keys %HP_ALGID = &h0001 ' Hash algorithm %HP_HASHVAL = &h0002 ' Hash value %HP_HASHSIZE = &h0004 ' Hash value Size %HP_HMAC_INFO = &h0005 ' information For creating an HMAC ' ' CryptGetProvParam ' %PP_ENUMALGS = 1 %PP_ENUMCONTAINERS = 2 %PP_IMPTYPE = 3 %PP_NAME = 4 %PP_VERSION = 5 %PP_CONTAINER = 6 %PP_CHANGE_PASSWORD = 7 %PP_KEYSET_SEC_DESCR = 8 ' Get/Set security descriptor of keyset %PP_CERTCHAIN = 9 ' For retrieving certificates From tokens %PP_KEY_TYPE_SUBTYPE = 10 %PP_PROVTYPE = 16 %PP_KEYSTORAGE = 17 %PP_APPLI_CERT = 18 %PP_SYM_KEYSIZE = 19 %PP_SESSION_KEYSIZE = 20 %PP_UI_PROMPT = 21 %PP_ENUMALGS_EX = 22 %CRYPT_FIRST = 1 %CRYPT_NEXT = 2 %CRYPT_IMPL_HARDWARE = 1 %CRYPT_IMPL_SOFTWARE = 2 %CRYPT_IMPL_MIXED = 3 %CRYPT_IMPL_UNKNOWN = 4 ' key storage flags %CRYPT_SEC_DESCR = &h00000001 %CRYPT_PSTORE = &h00000002 %CRYPT_UI_PROMPT = &h00000004 ' protocol flags %CRYPT_FLAG_PCT1 = &h0001 %CRYPT_FLAG_SSL2 = &h0002 %CRYPT_FLAG_SSL3 = &h0004 %CRYPT_FLAG_TLS1 = &h0008 ' ' STT defined Providers ' %PROV_STT_MER = 7 %PROV_STT_ACQ = 8 %PROV_STT_BRND = 9 %PROV_STT_ROOT = 10 %PROV_STT_ISS = 11 ' ' Algorithm IDs And Flags ' ' Algorithm classes %ALG_CLASS_ANY = 0 %ALG_CLASS_SIGNATURE = 8192 '(1 << 13) '8192 %ALG_CLASS_MSG_ENCRYPT = 16384 '(2 << 13) '16384 %ALG_CLASS_DATA_ENCRYPT = 24576 '(3 << 13) '24576 %ALG_CLASS_HASH = 32768 '(4 << 13) '32768 %ALG_CLASS_KEY_EXCHANGE = 40960 '(5 << 13) '40960 ' Algorithm types %ALG_TYPE_ANY = 0 %ALG_TYPE_DSS = 512 '(1 << 9) '512 %ALG_TYPE_RSA = 1024 '(2 << 9) '1024 %ALG_TYPE_BLOCK = 1536 '(3 << 9) '1536 %ALG_TYPE_STREAM = 2048 '(4 << 9) '2048 %ALG_TYPE_DH = 2560 '(5 << 9) '2560 %ALG_TYPE_SECURECHANNEL = 3072 '(6 << 9) '3072 ' Generic Sub-ids %ALG_SID_ANY = 0 ' Some RSA Sub-ids %ALG_SID_RSA_ANY = 0 %ALG_SID_RSA_PKCS = 1 %ALG_SID_RSA_MSATWORK = 2 %ALG_SID_RSA_ENTRUST = 3 %ALG_SID_RSA_PGP = 4 ' Some DSS Sub-ids ' %ALG_SID_DSS_ANY = 0 %ALG_SID_DSS_PKCS = 1 %ALG_SID_DSS_DMS = 2 ' Block cipher Sub ids ' DES sub_ids %ALG_SID_DES = 1 %ALG_SID_3DES = 3 %ALG_SID_DESX = 4 %ALG_SID_IDEA = 5 %ALG_SID_CAST = 6 %ALG_SID_SAFERSK64 = 7 %ALG_SID_SAFERSK128 = 8 %ALG_SID_3DES_112 = 9 %ALG_SID_CYLINK_MEK = 12 %ALG_SID_RC5 = 13 ' Fortezza Sub-ids %ALG_SID_SKIPJACK = 10 %ALG_SID_TEK = 11 ' KP_MODE %CRYPT_MODE_CBCI = 6 ' ANSI CBC Interleaved %CRYPT_MODE_CFBP = 7 ' ANSI CFB Pipelined %CRYPT_MODE_OFBP = 8 ' ANSI OFB Pipelined %CRYPT_MODE_CBCOFM = 9 ' ANSI CBC + OF Masking %CRYPT_MODE_CBCOFMI = 10 ' ANSI CBC + OFM Interleaved ' RC2 Sub-ids %ALG_SID_RC2 = 2 ' Stream cipher Sub-ids %ALG_SID_RC4 = 1 %ALG_SID_SEAL = 2 ' Diffie-Hellman Sub-ids %ALG_SID_DH_SANDF = 1 %ALG_SID_DH_EPHEM = 2 %ALG_SID_AGREED_KEY_ANY = 3 %ALG_SID_KEA = 4 ' Hash Sub ids %ALG_SID_MD2 = 1 %ALG_SID_MD4 = 2 %ALG_SID_MD5 = 3 %ALG_SID_SHA = 4 %ALG_SID_SHA1 = 4 %ALG_SID_MAC = 5 %ALG_SID_RIPEMD = 6 %ALG_SID_RIPEMD160 = 7 %ALG_SID_SSL3SHAMD5 = 8 %ALG_SID_HMAC = 9 ' secure channel Sub ids %ALG_SID_SSL3_MASTER = 1 %ALG_SID_SCHANNEL_MASTER_HASH = 2 %ALG_SID_SCHANNEL_MAC_KEY = 3 %ALG_SID_PCT1_MASTER = 4 %ALG_SID_SSL2_MASTER = 5 %ALG_SID_TLS1_MASTER = 6 %ALG_SID_SCHANNEL_ENC_KEY = 7 ' Our silly example Sub-id %ALG_SID_EXAMPLE = 80 ' algorithm identifier definitions %CALG_MD2 = %ALG_CLASS_HASH Or %ALG_TYPE_ANY Or %ALG_SID_MD2 %CALG_MD4 = %ALG_CLASS_HASH Or %ALG_TYPE_ANY Or %ALG_SID_MD4 %CALG_MD5 = %ALG_CLASS_HASH Or %ALG_TYPE_ANY Or %ALG_SID_MD5 %CALG_SHA = %ALG_CLASS_HASH Or %ALG_TYPE_ANY Or %ALG_SID_SHA %CALG_SHA1 = %ALG_CLASS_HASH Or %ALG_TYPE_ANY Or %ALG_SID_SHA1 %CALG_MAC = %ALG_CLASS_HASH Or %ALG_TYPE_ANY Or %ALG_SID_MAC %CALG_RSA_SIGN = %ALG_CLASS_SIGNATURE Or %ALG_TYPE_RSA Or %ALG_SID_RSA_ANY %CALG_DSS_SIGN = %ALG_CLASS_SIGNATURE Or %ALG_TYPE_DSS Or %ALG_SID_DSS_ANY %CALG_RSA_KEYX = %ALG_CLASS_KEY_EXCHANGE Or %ALG_TYPE_RSA Or %ALG_SID_RSA_ANY %CALG_DES = %ALG_CLASS_DATA_ENCRYPT Or %ALG_TYPE_BLOCK Or %ALG_SID_DES %CALG_3DES_112 = %ALG_CLASS_DATA_ENCRYPT Or %ALG_TYPE_BLOCK Or %ALG_SID_3DES_112 %CALG_3DES = %ALG_CLASS_DATA_ENCRYPT Or %ALG_TYPE_BLOCK Or %ALG_SID_3DES %CALG_RC2 = %ALG_CLASS_DATA_ENCRYPT Or %ALG_TYPE_BLOCK Or %ALG_SID_RC2 %CALG_RC4 = %ALG_CLASS_DATA_ENCRYPT Or %ALG_TYPE_STREAM Or %ALG_SID_RC4 %CALG_SEAL = %ALG_CLASS_DATA_ENCRYPT Or %ALG_TYPE_STREAM Or %ALG_SID_SEAL %CALG_DH_SF = %ALG_CLASS_KEY_EXCHANGE Or %ALG_TYPE_DH Or %ALG_SID_DH_SANDF %CALG_DH_EPHEM = %ALG_CLASS_KEY_EXCHANGE Or %ALG_TYPE_DH Or %ALG_SID_DH_EPHEM %CALG_AGREEDKEY_ANY = %ALG_CLASS_KEY_EXCHANGE Or %ALG_TYPE_DH Or %ALG_SID_AGREED_KEY_ANY %CALG_KEA_KEYX = %ALG_CLASS_KEY_EXCHANGE Or %ALG_TYPE_DH Or %ALG_SID_KEA %CALG_HUGHES_MD5 = %ALG_CLASS_KEY_EXCHANGE Or %ALG_TYPE_ANY Or %ALG_SID_MD5 %CALG_SKIPJACK = %ALG_CLASS_DATA_ENCRYPT Or %ALG_TYPE_BLOCK Or %ALG_SID_SKIPJACK %CALG_TEK = %ALG_CLASS_DATA_ENCRYPT Or %ALG_TYPE_BLOCK Or %ALG_SID_TEK %CALG_CYLINK_MEK = %ALG_CLASS_DATA_ENCRYPT Or %ALG_TYPE_BLOCK Or %ALG_SID_CYLINK_MEK %CALG_SSL3_SHAMD5 = %ALG_CLASS_HASH Or %ALG_TYPE_ANY Or %ALG_SID_SSL3SHAMD5 %CALG_SSL3_MASTER = %ALG_CLASS_MSG_ENCRYPT Or %ALG_TYPE_SECURECHANNEL Or %ALG_SID_SSL3_MASTER %CALG_SCHANNEL_MASTER_HASH = %ALG_CLASS_MSG_ENCRYPT Or %ALG_TYPE_SECURECHANNEL Or %ALG_SID_SCHANNEL_MASTER_HASH %CALG_SCHANNEL_MAC_KEY = %ALG_CLASS_MSG_ENCRYPT Or %ALG_TYPE_SECURECHANNEL Or %ALG_SID_SCHANNEL_MAC_KEY %CALG_SCHANNEL_ENC_KEY = %ALG_CLASS_MSG_ENCRYPT Or %ALG_TYPE_SECURECHANNEL Or %ALG_SID_SCHANNEL_ENC_KEY %CALG_PCT1_MASTER = %ALG_CLASS_MSG_ENCRYPT Or %ALG_TYPE_SECURECHANNEL Or %ALG_SID_PCT1_MASTER %CALG_SSL2_MASTER = %ALG_CLASS_MSG_ENCRYPT Or %ALG_TYPE_SECURECHANNEL Or %ALG_SID_SSL2_MASTER %CALG_TLS1_MASTER = %ALG_CLASS_MSG_ENCRYPT Or %ALG_TYPE_SECURECHANNEL Or %ALG_SID_TLS1_MASTER %CALG_RC5 = %ALG_CLASS_DATA_ENCRYPT Or %ALG_TYPE_BLOCK Or %ALG_SID_RC5 %CALG_HMAC = %ALG_CLASS_HASH Or %ALG_TYPE_ANY Or %ALG_SID_HMAC #EndIf