1 // Copyright © 2015, Peter Atashian 2 // Licensed under the MIT License <LICENSE.md> 3 //! Cryptographic Primitive API Prototypes and Definitions 4 pub const KDF_HASH_ALGORITHM: ::ULONG = 0x0; 5 pub const KDF_SECRET_PREPEND: ::ULONG = 0x1; 6 pub const KDF_SECRET_APPEND: ::ULONG = 0x2; 7 pub const KDF_HMAC_KEY: ::ULONG = 0x3; 8 pub const KDF_TLS_PRF_LABEL: ::ULONG = 0x4; 9 pub const KDF_TLS_PRF_SEED: ::ULONG = 0x5; 10 pub const KDF_SECRET_HANDLE: ::ULONG = 0x6; 11 pub const KDF_TLS_PRF_PROTOCOL: ::ULONG = 0x7; 12 pub const KDF_ALGORITHMID: ::ULONG = 0x8; 13 pub const KDF_PARTYUINFO: ::ULONG = 0x9; 14 pub const KDF_PARTYVINFO: ::ULONG = 0xA; 15 pub const KDF_SUPPPUBINFO: ::ULONG = 0xB; 16 pub const KDF_SUPPPRIVINFO: ::ULONG = 0xC; 17 pub const KDF_LABEL: ::ULONG = 0xD; 18 pub const KDF_CONTEXT: ::ULONG = 0xE; 19 pub const KDF_SALT: ::ULONG = 0xF; 20 pub const KDF_ITERATION_COUNT: ::ULONG = 0x10; 21 pub const KDF_GENERIC_PARAMETER: ::ULONG = 0x11; 22 pub const KDF_KEYBITLENGTH: ::ULONG = 0x12; 23 pub const KDF_USE_SECRET_AS_HMAC_KEY_FLAG: ::ULONG = 0x1; 24 STRUCT!{struct BCRYPT_KEY_LENGTHS_STRUCT { 25 dwMinLength: ::ULONG, 26 dwMaxLength: ::ULONG, 27 dwIncrement: ::ULONG, 28 }} 29 pub type BCRYPT_AUTH_TAG_LENGTHS_STRUCT = BCRYPT_KEY_LENGTHS_STRUCT; 30 STRUCT!{struct BCRYPT_OID { 31 cbOID: ::ULONG, 32 pbOID: ::PUCHAR, 33 }} 34 STRUCT!{struct BCRYPT_OID_LIST { 35 dwOIDCount: ::ULONG, 36 pOIDs: *mut BCRYPT_OID, 37 }} 38 STRUCT!{struct BCRYPT_PKCS1_PADDING_INFO { 39 pszAlgId: ::LPCWSTR, 40 }} 41 STRUCT!{struct BCRYPT_PSS_PADDING_INFO { 42 pszAlgId: ::LPCWSTR, 43 cbSalt: ::ULONG, 44 }} 45 STRUCT!{struct BCRYPT_OAEP_PADDING_INFO { 46 pszAlgId: ::LPCWSTR, 47 pbLabel: ::PUCHAR, 48 cbLabel: ::ULONG, 49 }} 50 pub const BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO_VERSION: ::ULONG = 1; 51 pub const BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG: ::ULONG = 0x00000001; 52 pub const BCRYPT_AUTH_MODE_IN_PROGRESS_FLAG: ::ULONG = 0x00000002; 53 STRUCT!{struct BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO { 54 cbSize: ::ULONG, 55 dwInfoVersion: ::ULONG, 56 pbNonce: ::PUCHAR, 57 cbNonce: ::ULONG, 58 pbAuthData: ::PUCHAR, 59 cbAuthData: ::ULONG, 60 pbTag: ::PUCHAR, 61 cbTag: ::ULONG, 62 pbMacContext: ::PUCHAR, 63 cbMacContext: ::ULONG, 64 cbAAD: ::ULONG, 65 cbData: ::ULONGLONG, 66 dwFlags: ::ULONG, 67 }} 68 pub type PBCRYPT_AUTHENTICATED_CIPHER_MODE_INFO = *mut BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO; 69 pub const BCRYPT_PROV_DISPATCH: ::ULONG = 0x00000001; 70 pub const BCRYPT_BLOCK_PADDING: ::ULONG = 0x00000001; 71 pub const BCRYPT_PAD_NONE: ::ULONG = 0x00000001; 72 pub const BCRYPT_PAD_PKCS1: ::ULONG = 0x00000002; 73 pub const BCRYPT_PAD_OAEP: ::ULONG = 0x00000004; 74 pub const BCRYPT_PAD_PSS: ::ULONG = 0x00000008; 75 pub const BCRYPT_PAD_PKCS1_OPTIONAL_HASH_OID: ::ULONG = 0x00000010; 76 pub const BCRYPTBUFFER_VERSION: ::ULONG = 0; 77 STRUCT!{struct BCryptBuffer { 78 cbBuffer: ::ULONG, 79 BufferType: ::ULONG, 80 pvBuffer: ::PVOID, 81 }} 82 pub type PBCryptBuffer = *mut BCryptBuffer; 83 STRUCT!{struct BCryptBufferDesc { 84 ulVersion: ::ULONG, 85 cBuffers: ::ULONG, 86 pBuffers: PBCryptBuffer, 87 }} 88 pub type PBCryptBufferDesc = *mut BCryptBufferDesc; 89 //321 90 pub type BCRYPT_HANDLE = ::PVOID; 91 pub type BCRYPT_ALG_HANDLE = ::PVOID; 92 pub type BCRYPT_KEY_HANDLE = ::PVOID; 93 pub type BCRYPT_HASH_HANDLE = ::PVOID; 94 pub type BCRYPT_SECRET_HANDLE = ::PVOID; 95 STRUCT!{struct BCRYPT_KEY_BLOB { 96 Magic: ::ULONG, 97 }} 98 pub const BCRYPT_RSAPUBLIC_MAGIC: ::ULONG = 0x31415352; 99 pub const BCRYPT_RSAPRIVATE_MAGIC: ::ULONG = 0x32415352; 100 STRUCT!{struct BCRYPT_RSAKEY_BLOB { 101 Magic: ::ULONG, 102 BitLength: ::ULONG, 103 cbPublicExp: ::ULONG, 104 cbModulus: ::ULONG, 105 cbPrime1: ::ULONG, 106 cbPrime2: ::ULONG, 107 }} 108 pub const BCRYPT_RSAFULLPRIVATE_MAGIC: ::ULONG = 0x33415352; 109 pub const BCRYPT_ECDH_PUBLIC_P256_MAGIC: ::ULONG = 0x314B4345; 110 pub const BCRYPT_ECDH_PRIVATE_P256_MAGIC: ::ULONG = 0x324B4345; 111 pub const BCRYPT_ECDH_PUBLIC_P384_MAGIC: ::ULONG = 0x334B4345; 112 pub const BCRYPT_ECDH_PRIVATE_P384_MAGIC: ::ULONG = 0x344B4345; 113 pub const BCRYPT_ECDH_PUBLIC_P521_MAGIC: ::ULONG = 0x354B4345; 114 pub const BCRYPT_ECDH_PRIVATE_P521_MAGIC: ::ULONG = 0x364B4345; 115 pub const BCRYPT_ECDSA_PUBLIC_P256_MAGIC: ::ULONG = 0x31534345; 116 pub const BCRYPT_ECDSA_PRIVATE_P256_MAGIC: ::ULONG = 0x32534345; 117 pub const BCRYPT_ECDSA_PUBLIC_P384_MAGIC: ::ULONG = 0x33534345; 118 pub const BCRYPT_ECDSA_PRIVATE_P384_MAGIC: ::ULONG = 0x34534345; 119 pub const BCRYPT_ECDSA_PUBLIC_P521_MAGIC: ::ULONG = 0x35534345; 120 pub const BCRYPT_ECDSA_PRIVATE_P521_MAGIC: ::ULONG = 0x36534345; 121 STRUCT!{struct BCRYPT_ECCKEY_BLOB { 122 dwMagic: ::ULONG, 123 cbKey: ::ULONG, 124 }} 125 pub type PBCRYPT_ECCKEY_BLOB = *mut BCRYPT_ECCKEY_BLOB; 126 pub const BCRYPT_DH_PUBLIC_MAGIC: ::ULONG = 0x42504844; 127 pub const BCRYPT_DH_PRIVATE_MAGIC: ::ULONG = 0x56504844; 128 STRUCT!{struct BCRYPT_DH_KEY_BLOB { 129 dwMagic: ::ULONG, 130 cbKey: ::ULONG, 131 }} 132 pub type PBCRYPT_DH_KEY_BLOB = *mut BCRYPT_DH_KEY_BLOB; 133 pub const BCRYPT_DH_PARAMETERS_MAGIC: ::ULONG = 0x4d504844; 134 STRUCT!{struct BCRYPT_DH_PARAMETER_HEADER { 135 cbLength: ::ULONG, 136 dwMagic: ::ULONG, 137 cbKeyLength: ::ULONG, 138 }} 139 pub const BCRYPT_DSA_PUBLIC_MAGIC: ::ULONG = 0x42505344; 140 pub const BCRYPT_DSA_PRIVATE_MAGIC: ::ULONG = 0x56505344; 141 pub const BCRYPT_DSA_PUBLIC_MAGIC_V2: ::ULONG = 0x32425044; 142 pub const BCRYPT_DSA_PRIVATE_MAGIC_V2: ::ULONG = 0x32565044; 143 STRUCT!{struct BCRYPT_DSA_KEY_BLOB { 144 dwMagic: ::ULONG, 145 cbKey: ::ULONG, 146 Count: [::UCHAR; 4], 147 Seed: [::UCHAR; 20], 148 q: [::UCHAR; 20], 149 }} 150 pub type PBCRYPT_DSA_KEY_BLOB = *mut BCRYPT_DSA_KEY_BLOB; 151 ENUM!{enum HASHALGORITHM_ENUM { 152 DSA_HASH_ALGORITHM_SHA1, 153 DSA_HASH_ALGORITHM_SHA256, 154 DSA_HASH_ALGORITHM_SHA512, 155 }} 156 ENUM!{enum DSAFIPSVERSION_ENUM { 157 DSA_FIPS186_2, 158 DSA_FIPS186_3, 159 }} 160 STRUCT!{struct BCRYPT_DSA_KEY_BLOB_V2 { 161 dwMagic: ::ULONG, 162 cbKey: ::ULONG, 163 hashAlgorithm: HASHALGORITHM_ENUM, 164 standardVersion: DSAFIPSVERSION_ENUM, 165 cbSeedLength: ::ULONG, 166 cbGroupSize: ::ULONG, 167 Count: [::UCHAR; 4], 168 }} 169 pub type PBCRYPT_DSA_KEY_BLOB_V2 = *mut BCRYPT_DSA_KEY_BLOB_V2; 170 STRUCT!{struct BCRYPT_KEY_DATA_BLOB_HEADER { 171 dwMagic: ::ULONG, 172 dwVersion: ::ULONG, 173 cbKeyData: ::ULONG, 174 }} 175 pub type PBCRYPT_KEY_DATA_BLOB_HEADER = *mut BCRYPT_KEY_DATA_BLOB_HEADER; 176 pub const BCRYPT_KEY_DATA_BLOB_MAGIC: ::ULONG = 0x4d42444b; 177 pub const BCRYPT_KEY_DATA_BLOB_VERSION1: ::ULONG = 0x1; 178 pub const BCRYPT_DSA_PARAMETERS_MAGIC: ::ULONG = 0x4d505344; 179 pub const BCRYPT_DSA_PARAMETERS_MAGIC_V2: ::ULONG = 0x324d5044; 180 STRUCT!{struct BCRYPT_DSA_PARAMETER_HEADER { 181 cbLength: ::ULONG, 182 dwMagic: ::ULONG, 183 cbKeyLength: ::ULONG, 184 Count: [::UCHAR; 4], 185 Seed: [::UCHAR; 20], 186 q: [::UCHAR; 20], 187 }} 188 STRUCT!{struct BCRYPT_DSA_PARAMETER_HEADER_V2 { 189 cbLength: ::ULONG, 190 dwMagic: ::ULONG, 191 cbKeyLength: ::ULONG, 192 hashAlgorithm: HASHALGORITHM_ENUM, 193 standardVersion: DSAFIPSVERSION_ENUM, 194 cbSeedLength: ::ULONG, 195 cbGroupSize: ::ULONG, 196 Count: [::UCHAR; 4], 197 }} 198 ENUM!{enum BCRYPT_HASH_OPERATION_TYPE { 199 BCRYPT_HASH_OPERATION_HASH_DATA = 1, 200 BCRYPT_HASH_OPERATION_FINISH_HASH = 2, 201 }} 202 STRUCT!{struct BCRYPT_MULTI_HASH_OPERATION { 203 iHash: ::ULONG, 204 hashOperation: BCRYPT_HASH_OPERATION_TYPE, 205 pbBuffer: ::PUCHAR, 206 cbBuffer: ::ULONG, 207 }} 208 ENUM!{enum BCRYPT_MULTI_OPERATION_TYPE { 209 BCRYPT_OPERATION_TYPE_HASH = 1, 210 }} 211 STRUCT!{struct BCRYPT_MULTI_OBJECT_LENGTH_STRUCT { 212 cbPerObject: ::ULONG, 213 cbPerElement: ::ULONG, 214 }} 215 pub const BCRYPT_CIPHER_INTERFACE: ::ULONG = 0x00000001; 216 pub const BCRYPT_HASH_INTERFACE: ::ULONG = 0x00000002; 217 pub const BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE: ::ULONG = 0x00000003; 218 pub const BCRYPT_SECRET_AGREEMENT_INTERFACE: ::ULONG = 0x00000004; 219 pub const BCRYPT_SIGNATURE_INTERFACE: ::ULONG = 0x00000005; 220 pub const BCRYPT_RNG_INTERFACE: ::ULONG = 0x00000006; 221 pub const BCRYPT_KEY_DERIVATION_INTERFACE: ::ULONG = 0x00000007; 222 pub const BCRYPT_ALG_HANDLE_HMAC_FLAG: ::ULONG = 0x00000008; 223 pub const BCRYPT_CAPI_AES_FLAG: ::ULONG = 0x00000010; 224 pub const BCRYPT_HASH_REUSABLE_FLAG: ::ULONG = 0x00000020; 225 pub const BCRYPT_BUFFERS_LOCKED_FLAG: ::ULONG = 0x00000040; 226 pub const BCRYPT_EXTENDED_KEYSIZE: ::ULONG = 0x00000080; 227 pub const BCRYPT_CIPHER_OPERATION: ::ULONG = 0x00000001; 228 pub const BCRYPT_HASH_OPERATION: ::ULONG = 0x00000002; 229 pub const BCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION: ::ULONG = 0x00000004; 230 pub const BCRYPT_SECRET_AGREEMENT_OPERATION: ::ULONG = 0x00000008; 231 pub const BCRYPT_SIGNATURE_OPERATION: ::ULONG = 0x00000010; 232 pub const BCRYPT_RNG_OPERATION: ::ULONG = 0x00000020; 233 pub const BCRYPT_KEY_DERIVATION_OPERATION: ::ULONG = 0x00000040; 234 STRUCT!{struct BCRYPT_ALGORITHM_IDENTIFIER { 235 pszName: ::LPWSTR, 236 dwClass: ::ULONG, 237 dwFlags: ::ULONG, 238 }} 239 STRUCT!{struct BCRYPT_PROVIDER_NAME { 240 pszProviderName: ::LPWSTR, 241 }} 242 pub const BCRYPT_PUBLIC_KEY_FLAG: ::ULONG = 0x00000001; 243 pub const BCRYPT_PRIVATE_KEY_FLAG: ::ULONG = 0x00000002; 244 pub const BCRYPT_RNG_USE_ENTROPY_IN_BUFFER: ::ULONG = 0x00000001; 245 pub const BCRYPT_USE_SYSTEM_PREFERRED_RNG: ::ULONG = 0x00000002; 246 STRUCT!{struct BCRYPT_INTERFACE_VERSION { 247 MajorVersion: ::USHORT, 248 MinorVersion: ::USHORT, 249 }} 250 pub type PBCRYPT_INTERFACE_VERSION = *mut BCRYPT_INTERFACE_VERSION; 251 pub const BCRYPT_CIPHER_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION = 252 BCRYPT_MAKE_INTERFACE_VERSION!(1, 0); 253 pub const BCRYPT_HASH_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION = 254 BCRYPT_MAKE_INTERFACE_VERSION!(1, 0); 255 pub const BCRYPT_HASH_INTERFACE_MAJORVERSION_2: ::USHORT = 2; 256 pub const BCRYPT_HASH_INTERFACE_VERSION_2: BCRYPT_INTERFACE_VERSION = 257 BCRYPT_MAKE_INTERFACE_VERSION!(BCRYPT_HASH_INTERFACE_MAJORVERSION_2, 0); 258 pub const BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION = 259 BCRYPT_MAKE_INTERFACE_VERSION!(1, 0); 260 pub const BCRYPT_SECRET_AGREEMENT_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION = 261 BCRYPT_MAKE_INTERFACE_VERSION!(1, 0); 262 pub const BCRYPT_SIGNATURE_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION = 263 BCRYPT_MAKE_INTERFACE_VERSION!(1, 0); 264 pub const BCRYPT_RNG_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION = 265 BCRYPT_MAKE_INTERFACE_VERSION!(1, 0); 266 pub const CRYPT_MIN_DEPENDENCIES: ::ULONG = 0x00000001; 267 pub const CRYPT_PROCESS_ISOLATE: ::ULONG = 0x00010000; 268 pub const CRYPT_UM: ::ULONG = 0x00000001; 269 pub const CRYPT_KM: ::ULONG = 0x00000002; 270 pub const CRYPT_MM: ::ULONG = 0x00000003; 271 pub const CRYPT_ANY: ::ULONG = 0x00000004; 272 pub const CRYPT_OVERWRITE: ::ULONG = 0x00000001; 273 pub const CRYPT_LOCAL: ::ULONG = 0x00000001; 274 pub const CRYPT_DOMAIN: ::ULONG = 0x00000002; 275 pub const CRYPT_EXCLUSIVE: ::ULONG = 0x00000001; 276 pub const CRYPT_OVERRIDE: ::ULONG = 0x00010000; 277 pub const CRYPT_ALL_FUNCTIONS: ::ULONG = 0x00000001; 278 pub const CRYPT_ALL_PROVIDERS: ::ULONG = 0x00000002; 279 pub const CRYPT_PRIORITY_TOP: ::ULONG = 0x00000000; 280 pub const CRYPT_PRIORITY_BOTTOM: ::ULONG = 0xFFFFFFFF; 281 STRUCT!{struct CRYPT_INTERFACE_REG { 282 dwInterface: ::ULONG, 283 dwFlags: ::ULONG, 284 cFunctions: ::ULONG, 285 rgpszFunctions: *mut ::PWSTR, 286 }} 287 pub type PCRYPT_INTERFACE_REG = *mut CRYPT_INTERFACE_REG; 288 STRUCT!{struct CRYPT_IMAGE_REG { 289 pszImage: ::PWSTR, 290 cInterfaces: ::ULONG, 291 rgpInterfaces: *mut PCRYPT_INTERFACE_REG, 292 }} 293 pub type PCRYPT_IMAGE_REG = *mut CRYPT_IMAGE_REG; 294 STRUCT!{struct CRYPT_PROVIDER_REG { 295 cAliases: ::ULONG, 296 rgpszAliases: *mut ::PWSTR, 297 pUM: PCRYPT_IMAGE_REG, 298 pKM: PCRYPT_IMAGE_REG, 299 }} 300 pub type PCRYPT_PROVIDER_REG = *mut CRYPT_PROVIDER_REG; 301 STRUCT!{struct CRYPT_PROVIDERS { 302 cProviders: ::ULONG, 303 rgpszProviders: *mut ::PWSTR, 304 }} 305 pub type PCRYPT_PROVIDERS = *mut CRYPT_PROVIDERS; 306 STRUCT!{struct CRYPT_CONTEXT_CONFIG { 307 dwFlags: ::ULONG, 308 dwReserved: ::ULONG, 309 }} 310 pub type PCRYPT_CONTEXT_CONFIG = *mut CRYPT_CONTEXT_CONFIG; 311 STRUCT!{struct CRYPT_CONTEXT_FUNCTION_CONFIG { 312 dwFlags: ::ULONG, 313 dwReserved: ::ULONG, 314 }} 315 pub type PCRYPT_CONTEXT_FUNCTION_CONFIG = *mut CRYPT_CONTEXT_FUNCTION_CONFIG; 316 STRUCT!{struct CRYPT_CONTEXTS { 317 cContexts: ::ULONG, 318 rgpszContexts: *mut ::PWSTR, 319 }} 320 pub type PCRYPT_CONTEXTS = *mut CRYPT_CONTEXTS; 321 STRUCT!{struct CRYPT_CONTEXT_FUNCTIONS { 322 cFunctions: ::ULONG, 323 rgpszFunctions: *mut ::PWSTR, 324 }} 325 pub type PCRYPT_CONTEXT_FUNCTIONS = *mut CRYPT_CONTEXT_FUNCTIONS; 326 STRUCT!{struct CRYPT_CONTEXT_FUNCTION_PROVIDERS { 327 cProviders: ::ULONG, 328 rgpszProviders: *mut ::PWSTR, 329 }} 330 pub type PCRYPT_CONTEXT_FUNCTION_PROVIDERS = *mut CRYPT_CONTEXT_FUNCTION_PROVIDERS; 331 STRUCT!{struct CRYPT_PROPERTY_REF { 332 pszProperty: ::PWSTR, 333 cbValue: ::ULONG, 334 pbValue: ::PUCHAR, 335 }} 336 pub type PCRYPT_PROPERTY_REF = *mut CRYPT_PROPERTY_REF; 337 STRUCT!{struct CRYPT_IMAGE_REF { 338 pszImage: ::PWSTR, 339 dwFlags: ::ULONG, 340 }} 341 pub type PCRYPT_IMAGE_REF = *mut CRYPT_IMAGE_REF; 342 STRUCT!{struct CRYPT_PROVIDER_REF { 343 dwInterface: ::ULONG, 344 pszFunction: ::PWSTR, 345 pszProvider: ::PWSTR, 346 cProperties: ::ULONG, 347 rgpProperties: *mut PCRYPT_PROPERTY_REF, 348 pUM: PCRYPT_IMAGE_REF, 349 pKM: PCRYPT_IMAGE_REF, 350 }} 351 pub type PCRYPT_PROVIDER_REF = *mut CRYPT_PROVIDER_REF; 352 STRUCT!{struct CRYPT_PROVIDER_REFS { 353 cProviders: ::ULONG, 354 rgpProviders: *mut PCRYPT_PROVIDER_REF, 355 }} 356 pub type PCRYPT_PROVIDER_REFS = *mut CRYPT_PROVIDER_REFS; 357