// Copyright © 2015, Peter Atashian // Licensed under the MIT License //! Cryptographic Primitive API Prototypes and Definitions pub const KDF_HASH_ALGORITHM: ::ULONG = 0x0; pub const KDF_SECRET_PREPEND: ::ULONG = 0x1; pub const KDF_SECRET_APPEND: ::ULONG = 0x2; pub const KDF_HMAC_KEY: ::ULONG = 0x3; pub const KDF_TLS_PRF_LABEL: ::ULONG = 0x4; pub const KDF_TLS_PRF_SEED: ::ULONG = 0x5; pub const KDF_SECRET_HANDLE: ::ULONG = 0x6; pub const KDF_TLS_PRF_PROTOCOL: ::ULONG = 0x7; pub const KDF_ALGORITHMID: ::ULONG = 0x8; pub const KDF_PARTYUINFO: ::ULONG = 0x9; pub const KDF_PARTYVINFO: ::ULONG = 0xA; pub const KDF_SUPPPUBINFO: ::ULONG = 0xB; pub const KDF_SUPPPRIVINFO: ::ULONG = 0xC; pub const KDF_LABEL: ::ULONG = 0xD; pub const KDF_CONTEXT: ::ULONG = 0xE; pub const KDF_SALT: ::ULONG = 0xF; pub const KDF_ITERATION_COUNT: ::ULONG = 0x10; pub const KDF_GENERIC_PARAMETER: ::ULONG = 0x11; pub const KDF_KEYBITLENGTH: ::ULONG = 0x12; pub const KDF_USE_SECRET_AS_HMAC_KEY_FLAG: ::ULONG = 0x1; STRUCT!{struct BCRYPT_KEY_LENGTHS_STRUCT { dwMinLength: ::ULONG, dwMaxLength: ::ULONG, dwIncrement: ::ULONG, }} pub type BCRYPT_AUTH_TAG_LENGTHS_STRUCT = BCRYPT_KEY_LENGTHS_STRUCT; STRUCT!{struct BCRYPT_OID { cbOID: ::ULONG, pbOID: ::PUCHAR, }} STRUCT!{struct BCRYPT_OID_LIST { dwOIDCount: ::ULONG, pOIDs: *mut BCRYPT_OID, }} STRUCT!{struct BCRYPT_PKCS1_PADDING_INFO { pszAlgId: ::LPCWSTR, }} STRUCT!{struct BCRYPT_PSS_PADDING_INFO { pszAlgId: ::LPCWSTR, cbSalt: ::ULONG, }} STRUCT!{struct BCRYPT_OAEP_PADDING_INFO { pszAlgId: ::LPCWSTR, pbLabel: ::PUCHAR, cbLabel: ::ULONG, }} pub const BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO_VERSION: ::ULONG = 1; pub const BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG: ::ULONG = 0x00000001; pub const BCRYPT_AUTH_MODE_IN_PROGRESS_FLAG: ::ULONG = 0x00000002; STRUCT!{struct BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO { cbSize: ::ULONG, dwInfoVersion: ::ULONG, pbNonce: ::PUCHAR, cbNonce: ::ULONG, pbAuthData: ::PUCHAR, cbAuthData: ::ULONG, pbTag: ::PUCHAR, cbTag: ::ULONG, pbMacContext: ::PUCHAR, cbMacContext: ::ULONG, cbAAD: ::ULONG, cbData: ::ULONGLONG, dwFlags: ::ULONG, }} pub type PBCRYPT_AUTHENTICATED_CIPHER_MODE_INFO = *mut BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO; pub const BCRYPT_PROV_DISPATCH: ::ULONG = 0x00000001; pub const BCRYPT_BLOCK_PADDING: ::ULONG = 0x00000001; pub const BCRYPT_PAD_NONE: ::ULONG = 0x00000001; pub const BCRYPT_PAD_PKCS1: ::ULONG = 0x00000002; pub const BCRYPT_PAD_OAEP: ::ULONG = 0x00000004; pub const BCRYPT_PAD_PSS: ::ULONG = 0x00000008; pub const BCRYPT_PAD_PKCS1_OPTIONAL_HASH_OID: ::ULONG = 0x00000010; pub const BCRYPTBUFFER_VERSION: ::ULONG = 0; STRUCT!{struct BCryptBuffer { cbBuffer: ::ULONG, BufferType: ::ULONG, pvBuffer: ::PVOID, }} pub type PBCryptBuffer = *mut BCryptBuffer; STRUCT!{struct BCryptBufferDesc { ulVersion: ::ULONG, cBuffers: ::ULONG, pBuffers: PBCryptBuffer, }} pub type PBCryptBufferDesc = *mut BCryptBufferDesc; //321 pub type BCRYPT_HANDLE = ::PVOID; pub type BCRYPT_ALG_HANDLE = ::PVOID; pub type BCRYPT_KEY_HANDLE = ::PVOID; pub type BCRYPT_HASH_HANDLE = ::PVOID; pub type BCRYPT_SECRET_HANDLE = ::PVOID; STRUCT!{struct BCRYPT_KEY_BLOB { Magic: ::ULONG, }} pub const BCRYPT_RSAPUBLIC_MAGIC: ::ULONG = 0x31415352; pub const BCRYPT_RSAPRIVATE_MAGIC: ::ULONG = 0x32415352; STRUCT!{struct BCRYPT_RSAKEY_BLOB { Magic: ::ULONG, BitLength: ::ULONG, cbPublicExp: ::ULONG, cbModulus: ::ULONG, cbPrime1: ::ULONG, cbPrime2: ::ULONG, }} pub const BCRYPT_RSAFULLPRIVATE_MAGIC: ::ULONG = 0x33415352; pub const BCRYPT_ECDH_PUBLIC_P256_MAGIC: ::ULONG = 0x314B4345; pub const BCRYPT_ECDH_PRIVATE_P256_MAGIC: ::ULONG = 0x324B4345; pub const BCRYPT_ECDH_PUBLIC_P384_MAGIC: ::ULONG = 0x334B4345; pub const BCRYPT_ECDH_PRIVATE_P384_MAGIC: ::ULONG = 0x344B4345; pub const BCRYPT_ECDH_PUBLIC_P521_MAGIC: ::ULONG = 0x354B4345; pub const BCRYPT_ECDH_PRIVATE_P521_MAGIC: ::ULONG = 0x364B4345; pub const BCRYPT_ECDSA_PUBLIC_P256_MAGIC: ::ULONG = 0x31534345; pub const BCRYPT_ECDSA_PRIVATE_P256_MAGIC: ::ULONG = 0x32534345; pub const BCRYPT_ECDSA_PUBLIC_P384_MAGIC: ::ULONG = 0x33534345; pub const BCRYPT_ECDSA_PRIVATE_P384_MAGIC: ::ULONG = 0x34534345; pub const BCRYPT_ECDSA_PUBLIC_P521_MAGIC: ::ULONG = 0x35534345; pub const BCRYPT_ECDSA_PRIVATE_P521_MAGIC: ::ULONG = 0x36534345; STRUCT!{struct BCRYPT_ECCKEY_BLOB { dwMagic: ::ULONG, cbKey: ::ULONG, }} pub type PBCRYPT_ECCKEY_BLOB = *mut BCRYPT_ECCKEY_BLOB; pub const BCRYPT_DH_PUBLIC_MAGIC: ::ULONG = 0x42504844; pub const BCRYPT_DH_PRIVATE_MAGIC: ::ULONG = 0x56504844; STRUCT!{struct BCRYPT_DH_KEY_BLOB { dwMagic: ::ULONG, cbKey: ::ULONG, }} pub type PBCRYPT_DH_KEY_BLOB = *mut BCRYPT_DH_KEY_BLOB; pub const BCRYPT_DH_PARAMETERS_MAGIC: ::ULONG = 0x4d504844; STRUCT!{struct BCRYPT_DH_PARAMETER_HEADER { cbLength: ::ULONG, dwMagic: ::ULONG, cbKeyLength: ::ULONG, }} pub const BCRYPT_DSA_PUBLIC_MAGIC: ::ULONG = 0x42505344; pub const BCRYPT_DSA_PRIVATE_MAGIC: ::ULONG = 0x56505344; pub const BCRYPT_DSA_PUBLIC_MAGIC_V2: ::ULONG = 0x32425044; pub const BCRYPT_DSA_PRIVATE_MAGIC_V2: ::ULONG = 0x32565044; STRUCT!{struct BCRYPT_DSA_KEY_BLOB { dwMagic: ::ULONG, cbKey: ::ULONG, Count: [::UCHAR; 4], Seed: [::UCHAR; 20], q: [::UCHAR; 20], }} pub type PBCRYPT_DSA_KEY_BLOB = *mut BCRYPT_DSA_KEY_BLOB; ENUM!{enum HASHALGORITHM_ENUM { DSA_HASH_ALGORITHM_SHA1, DSA_HASH_ALGORITHM_SHA256, DSA_HASH_ALGORITHM_SHA512, }} ENUM!{enum DSAFIPSVERSION_ENUM { DSA_FIPS186_2, DSA_FIPS186_3, }} STRUCT!{struct BCRYPT_DSA_KEY_BLOB_V2 { dwMagic: ::ULONG, cbKey: ::ULONG, hashAlgorithm: HASHALGORITHM_ENUM, standardVersion: DSAFIPSVERSION_ENUM, cbSeedLength: ::ULONG, cbGroupSize: ::ULONG, Count: [::UCHAR; 4], }} pub type PBCRYPT_DSA_KEY_BLOB_V2 = *mut BCRYPT_DSA_KEY_BLOB_V2; STRUCT!{struct BCRYPT_KEY_DATA_BLOB_HEADER { dwMagic: ::ULONG, dwVersion: ::ULONG, cbKeyData: ::ULONG, }} pub type PBCRYPT_KEY_DATA_BLOB_HEADER = *mut BCRYPT_KEY_DATA_BLOB_HEADER; pub const BCRYPT_KEY_DATA_BLOB_MAGIC: ::ULONG = 0x4d42444b; pub const BCRYPT_KEY_DATA_BLOB_VERSION1: ::ULONG = 0x1; pub const BCRYPT_DSA_PARAMETERS_MAGIC: ::ULONG = 0x4d505344; pub const BCRYPT_DSA_PARAMETERS_MAGIC_V2: ::ULONG = 0x324d5044; STRUCT!{struct BCRYPT_DSA_PARAMETER_HEADER { cbLength: ::ULONG, dwMagic: ::ULONG, cbKeyLength: ::ULONG, Count: [::UCHAR; 4], Seed: [::UCHAR; 20], q: [::UCHAR; 20], }} STRUCT!{struct BCRYPT_DSA_PARAMETER_HEADER_V2 { cbLength: ::ULONG, dwMagic: ::ULONG, cbKeyLength: ::ULONG, hashAlgorithm: HASHALGORITHM_ENUM, standardVersion: DSAFIPSVERSION_ENUM, cbSeedLength: ::ULONG, cbGroupSize: ::ULONG, Count: [::UCHAR; 4], }} ENUM!{enum BCRYPT_HASH_OPERATION_TYPE { BCRYPT_HASH_OPERATION_HASH_DATA = 1, BCRYPT_HASH_OPERATION_FINISH_HASH = 2, }} STRUCT!{struct BCRYPT_MULTI_HASH_OPERATION { iHash: ::ULONG, hashOperation: BCRYPT_HASH_OPERATION_TYPE, pbBuffer: ::PUCHAR, cbBuffer: ::ULONG, }} ENUM!{enum BCRYPT_MULTI_OPERATION_TYPE { BCRYPT_OPERATION_TYPE_HASH = 1, }} STRUCT!{struct BCRYPT_MULTI_OBJECT_LENGTH_STRUCT { cbPerObject: ::ULONG, cbPerElement: ::ULONG, }} pub const BCRYPT_CIPHER_INTERFACE: ::ULONG = 0x00000001; pub const BCRYPT_HASH_INTERFACE: ::ULONG = 0x00000002; pub const BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE: ::ULONG = 0x00000003; pub const BCRYPT_SECRET_AGREEMENT_INTERFACE: ::ULONG = 0x00000004; pub const BCRYPT_SIGNATURE_INTERFACE: ::ULONG = 0x00000005; pub const BCRYPT_RNG_INTERFACE: ::ULONG = 0x00000006; pub const BCRYPT_KEY_DERIVATION_INTERFACE: ::ULONG = 0x00000007; pub const BCRYPT_ALG_HANDLE_HMAC_FLAG: ::ULONG = 0x00000008; pub const BCRYPT_CAPI_AES_FLAG: ::ULONG = 0x00000010; pub const BCRYPT_HASH_REUSABLE_FLAG: ::ULONG = 0x00000020; pub const BCRYPT_BUFFERS_LOCKED_FLAG: ::ULONG = 0x00000040; pub const BCRYPT_EXTENDED_KEYSIZE: ::ULONG = 0x00000080; pub const BCRYPT_CIPHER_OPERATION: ::ULONG = 0x00000001; pub const BCRYPT_HASH_OPERATION: ::ULONG = 0x00000002; pub const BCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION: ::ULONG = 0x00000004; pub const BCRYPT_SECRET_AGREEMENT_OPERATION: ::ULONG = 0x00000008; pub const BCRYPT_SIGNATURE_OPERATION: ::ULONG = 0x00000010; pub const BCRYPT_RNG_OPERATION: ::ULONG = 0x00000020; pub const BCRYPT_KEY_DERIVATION_OPERATION: ::ULONG = 0x00000040; STRUCT!{struct BCRYPT_ALGORITHM_IDENTIFIER { pszName: ::LPWSTR, dwClass: ::ULONG, dwFlags: ::ULONG, }} STRUCT!{struct BCRYPT_PROVIDER_NAME { pszProviderName: ::LPWSTR, }} pub const BCRYPT_PUBLIC_KEY_FLAG: ::ULONG = 0x00000001; pub const BCRYPT_PRIVATE_KEY_FLAG: ::ULONG = 0x00000002; pub const BCRYPT_RNG_USE_ENTROPY_IN_BUFFER: ::ULONG = 0x00000001; pub const BCRYPT_USE_SYSTEM_PREFERRED_RNG: ::ULONG = 0x00000002; STRUCT!{struct BCRYPT_INTERFACE_VERSION { MajorVersion: ::USHORT, MinorVersion: ::USHORT, }} pub type PBCRYPT_INTERFACE_VERSION = *mut BCRYPT_INTERFACE_VERSION; pub const BCRYPT_CIPHER_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION = BCRYPT_MAKE_INTERFACE_VERSION!(1, 0); pub const BCRYPT_HASH_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION = BCRYPT_MAKE_INTERFACE_VERSION!(1, 0); pub const BCRYPT_HASH_INTERFACE_MAJORVERSION_2: ::USHORT = 2; pub const BCRYPT_HASH_INTERFACE_VERSION_2: BCRYPT_INTERFACE_VERSION = BCRYPT_MAKE_INTERFACE_VERSION!(BCRYPT_HASH_INTERFACE_MAJORVERSION_2, 0); pub const BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION = BCRYPT_MAKE_INTERFACE_VERSION!(1, 0); pub const BCRYPT_SECRET_AGREEMENT_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION = BCRYPT_MAKE_INTERFACE_VERSION!(1, 0); pub const BCRYPT_SIGNATURE_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION = BCRYPT_MAKE_INTERFACE_VERSION!(1, 0); pub const BCRYPT_RNG_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION = BCRYPT_MAKE_INTERFACE_VERSION!(1, 0); pub const CRYPT_MIN_DEPENDENCIES: ::ULONG = 0x00000001; pub const CRYPT_PROCESS_ISOLATE: ::ULONG = 0x00010000; pub const CRYPT_UM: ::ULONG = 0x00000001; pub const CRYPT_KM: ::ULONG = 0x00000002; pub const CRYPT_MM: ::ULONG = 0x00000003; pub const CRYPT_ANY: ::ULONG = 0x00000004; pub const CRYPT_OVERWRITE: ::ULONG = 0x00000001; pub const CRYPT_LOCAL: ::ULONG = 0x00000001; pub const CRYPT_DOMAIN: ::ULONG = 0x00000002; pub const CRYPT_EXCLUSIVE: ::ULONG = 0x00000001; pub const CRYPT_OVERRIDE: ::ULONG = 0x00010000; pub const CRYPT_ALL_FUNCTIONS: ::ULONG = 0x00000001; pub const CRYPT_ALL_PROVIDERS: ::ULONG = 0x00000002; pub const CRYPT_PRIORITY_TOP: ::ULONG = 0x00000000; pub const CRYPT_PRIORITY_BOTTOM: ::ULONG = 0xFFFFFFFF; STRUCT!{struct CRYPT_INTERFACE_REG { dwInterface: ::ULONG, dwFlags: ::ULONG, cFunctions: ::ULONG, rgpszFunctions: *mut ::PWSTR, }} pub type PCRYPT_INTERFACE_REG = *mut CRYPT_INTERFACE_REG; STRUCT!{struct CRYPT_IMAGE_REG { pszImage: ::PWSTR, cInterfaces: ::ULONG, rgpInterfaces: *mut PCRYPT_INTERFACE_REG, }} pub type PCRYPT_IMAGE_REG = *mut CRYPT_IMAGE_REG; STRUCT!{struct CRYPT_PROVIDER_REG { cAliases: ::ULONG, rgpszAliases: *mut ::PWSTR, pUM: PCRYPT_IMAGE_REG, pKM: PCRYPT_IMAGE_REG, }} pub type PCRYPT_PROVIDER_REG = *mut CRYPT_PROVIDER_REG; STRUCT!{struct CRYPT_PROVIDERS { cProviders: ::ULONG, rgpszProviders: *mut ::PWSTR, }} pub type PCRYPT_PROVIDERS = *mut CRYPT_PROVIDERS; STRUCT!{struct CRYPT_CONTEXT_CONFIG { dwFlags: ::ULONG, dwReserved: ::ULONG, }} pub type PCRYPT_CONTEXT_CONFIG = *mut CRYPT_CONTEXT_CONFIG; STRUCT!{struct CRYPT_CONTEXT_FUNCTION_CONFIG { dwFlags: ::ULONG, dwReserved: ::ULONG, }} pub type PCRYPT_CONTEXT_FUNCTION_CONFIG = *mut CRYPT_CONTEXT_FUNCTION_CONFIG; STRUCT!{struct CRYPT_CONTEXTS { cContexts: ::ULONG, rgpszContexts: *mut ::PWSTR, }} pub type PCRYPT_CONTEXTS = *mut CRYPT_CONTEXTS; STRUCT!{struct CRYPT_CONTEXT_FUNCTIONS { cFunctions: ::ULONG, rgpszFunctions: *mut ::PWSTR, }} pub type PCRYPT_CONTEXT_FUNCTIONS = *mut CRYPT_CONTEXT_FUNCTIONS; STRUCT!{struct CRYPT_CONTEXT_FUNCTION_PROVIDERS { cProviders: ::ULONG, rgpszProviders: *mut ::PWSTR, }} pub type PCRYPT_CONTEXT_FUNCTION_PROVIDERS = *mut CRYPT_CONTEXT_FUNCTION_PROVIDERS; STRUCT!{struct CRYPT_PROPERTY_REF { pszProperty: ::PWSTR, cbValue: ::ULONG, pbValue: ::PUCHAR, }} pub type PCRYPT_PROPERTY_REF = *mut CRYPT_PROPERTY_REF; STRUCT!{struct CRYPT_IMAGE_REF { pszImage: ::PWSTR, dwFlags: ::ULONG, }} pub type PCRYPT_IMAGE_REF = *mut CRYPT_IMAGE_REF; STRUCT!{struct CRYPT_PROVIDER_REF { dwInterface: ::ULONG, pszFunction: ::PWSTR, pszProvider: ::PWSTR, cProperties: ::ULONG, rgpProperties: *mut PCRYPT_PROPERTY_REF, pUM: PCRYPT_IMAGE_REF, pKM: PCRYPT_IMAGE_REF, }} pub type PCRYPT_PROVIDER_REF = *mut CRYPT_PROVIDER_REF; STRUCT!{struct CRYPT_PROVIDER_REFS { cProviders: ::ULONG, rgpProviders: *mut PCRYPT_PROVIDER_REF, }} pub type PCRYPT_PROVIDER_REFS = *mut CRYPT_PROVIDER_REFS;