1 /***********************************************************************\ 2 * wincrypt.d * 3 * * 4 * Windows API header module * 5 * * 6 * Translated from MinGW Windows headers * 7 * by Stewart Gordon * 8 * * 9 * Placed into public domain * 10 \***********************************************************************/ 11 module win32.wincrypt; 12 13 private import win32.w32api, win32.winbase, win32.windef; 14 15 /* FIXME: 16 * Types of some constants 17 * Types of macros 18 * Inits of various "size" and "version" members 19 * Why are some #ifdefs commented out? 20 */ 21 22 const TCHAR[] 23 MS_DEF_PROV = "Microsoft Base Cryptographic Provider v1.0", 24 MS_ENHANCED_PROV = "Microsoft Enhanced Cryptographic Provider v1.0", 25 MS_STRONG_PROV = "Microsoft Strong Cryptographic Provider", 26 MS_DEF_RSA_SIG_PROV = "Microsoft RSA Signature Cryptographic Provider", 27 MS_DEF_RSA_SCHANNEL_PROV = "Microsoft RSA SChannel Cryptographic Provider", 28 MS_DEF_DSS_PROV = "Microsoft Base DSS Cryptographic Provider", 29 MS_DEF_DSS_DH_PROV 30 = "Microsoft Base DSS and Diffie-Hellman Cryptographic Provider", 31 MS_ENH_DSS_DH_PROV 32 = "Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider", 33 MS_DEF_DH_SCHANNEL_PROV = "Microsoft DH SChannel Cryptographic Provider", 34 MS_SCARD_PROV = "Microsoft Base Smart Card Crypto Provider"; 35 36 static if (WINVER > 0x501) { 37 const TCHAR[] MS_ENH_RSA_AES_PROV 38 = "Microsoft Enhanced RSA and AES Cryptographic Provider"; 39 } else static if (WINVER == 0x501) { 40 const TCHAR[] MS_ENH_RSA_AES_PROV 41 = "Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)"; 42 } 43 44 ALG_ID GET_ALG_CLASS(ALG_ID x) { return x & 0xE000; } 45 ALG_ID GET_ALG_TYPE (ALG_ID x) { return x & 0x1E00; } 46 ALG_ID GET_ALG_SID (ALG_ID x) { return x & 0x01FF; } 47 48 enum : ALG_ID { 49 ALG_CLASS_ANY = 0, 50 ALG_CLASS_SIGNATURE = 0x2000, 51 ALG_CLASS_MSG_ENCRYPT = 0x4000, 52 ALG_CLASS_DATA_ENCRYPT = 0x6000, 53 ALG_CLASS_HASH = 0x8000, 54 ALG_CLASS_KEY_EXCHANGE = 0xA000, 55 ALG_CLASS_ALL = 0xE000 56 } 57 58 enum : ALG_ID { 59 ALG_TYPE_ANY = 0, 60 ALG_TYPE_DSS = 0x0200, 61 ALG_TYPE_RSA = 0x0400, 62 ALG_TYPE_BLOCK = 0x0600, 63 ALG_TYPE_STREAM = 0x0800, 64 ALG_TYPE_DH = 0x0A00, 65 ALG_TYPE_SECURECHANNEL = 0x0C00 66 } 67 68 enum : ALG_ID { 69 ALG_SID_ANY = 0, 70 ALG_SID_RSA_ANY = 0, 71 ALG_SID_RSA_PKCS, 72 ALG_SID_RSA_MSATWORK, 73 ALG_SID_RSA_ENTRUST, 74 ALG_SID_RSA_PGP, // = 4 75 ALG_SID_DSS_ANY = 0, 76 ALG_SID_DSS_PKCS, 77 ALG_SID_DSS_DMS, // = 2 78 ALG_SID_DES = 1, 79 ALG_SID_3DES = 3, 80 ALG_SID_DESX, 81 ALG_SID_IDEA, 82 ALG_SID_CAST, 83 ALG_SID_SAFERSK64, 84 ALG_SID_SAFERSK128, 85 ALG_SID_3DES_112, 86 ALG_SID_SKIPJACK, 87 ALG_SID_TEK, 88 ALG_SID_CYLINK_MEK, 89 ALG_SID_RC5, // = 13 90 ALG_SID_RC2 = 2, 91 ALG_SID_RC4 = 1, 92 ALG_SID_SEAL = 2, 93 ALG_SID_MD2 = 1, 94 ALG_SID_MD4, 95 ALG_SID_MD5, 96 ALG_SID_SHA, 97 ALG_SID_MAC, 98 ALG_SID_RIPEMD, 99 ALG_SID_RIPEMD160, 100 ALG_SID_SSL3SHAMD5, 101 ALG_SID_HMAC, 102 ALG_SID_TLS1PRF, // = 10 103 ALG_SID_AES_128 = 14, 104 ALG_SID_AES_192, 105 ALG_SID_AES_256, 106 ALG_SID_AES, // = 17 107 ALG_SID_EXAMPLE = 80 108 } 109 110 enum : ALG_ID { 111 CALG_MD2 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD2, 112 CALG_MD4 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD4, 113 CALG_MD5 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5, 114 CALG_SHA = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA, 115 CALG_SHA1 = CALG_SHA, 116 CALG_MAC = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MAC, 117 CALG_3DES = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | 3, 118 CALG_CYLINK_MEK = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | 12, 119 CALG_SKIPJACK = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | 10, 120 CALG_KEA_KEYX = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_STREAM | ALG_TYPE_DSS | 4, 121 CALG_RSA_SIGN = ALG_CLASS_SIGNATURE | ALG_TYPE_RSA | ALG_SID_RSA_ANY, 122 CALG_DSS_SIGN = ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_DSS_ANY, 123 CALG_RSA_KEYX = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_RSA | ALG_SID_RSA_ANY, 124 CALG_DES = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_DES, 125 CALG_RC2 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_RC2, 126 CALG_RC4 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_STREAM | ALG_SID_RC4, 127 CALG_SEAL = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_STREAM | ALG_SID_SEAL, 128 CALG_DH_EPHEM = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_STREAM | ALG_TYPE_DSS 129 | ALG_SID_DSS_DMS, 130 CALG_DESX = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_DESX, 131 // is undefined ALG_CLASS_DHASH in MinGW - presuming typo 132 CALG_TLS1PRF = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_TLS1PRF, 133 CALG_AES_128 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_128, 134 CALG_AES_192 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_192, 135 CALG_AES_256 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_256, 136 CALG_AES = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES, 137 } 138 139 /+ 140 #define CRYPT_VERIFYCONTEXT 0xF0000000 141 #define CRYPT_NEWKEYSET 8 142 #define CRYPT_DELETEKEYSET 16 143 #define CRYPT_MACHINE_KEYSET 32 144 #define CRYPT_SILENT 64 145 #define CRYPT_EXPORTABLE 1 146 #define CRYPT_USER_PROTECTED 2 147 #define CRYPT_CREATE_SALT 4 148 #define CRYPT_UPDATE_KEY 8 149 #define SIMPLEBLOB 1 150 #define PUBLICKEYBLOB 6 151 #define PRIVATEKEYBLOB 7 152 #define PLAINTEXTKEYBLOB 8 153 #define OPAQUEKEYBLOB 9 154 #define PUBLICKEYBLOBEX 10 155 #define SYMMETRICWRAPKEYBLOB 11 156 #define AT_KEYEXCHANGE 1 157 #define AT_SIGNATURE 2 158 #define CRYPT_USERDATA 1 159 #define PKCS5_PADDING 1 160 #define CRYPT_MODE_CBC 1 161 #define CRYPT_MODE_ECB 2 162 #define CRYPT_MODE_OFB 3 163 #define CRYPT_MODE_CFB 4 164 #define CRYPT_MODE_CTS 5 165 #define CRYPT_MODE_CBCI 6 166 #define CRYPT_MODE_CFBP 7 167 #define CRYPT_MODE_OFBP 8 168 #define CRYPT_MODE_CBCOFM 9 169 #define CRYPT_MODE_CBCOFMI 10 170 #define CRYPT_ENCRYPT 1 171 #define CRYPT_DECRYPT 2 172 #define CRYPT_EXPORT 4 173 #define CRYPT_READ 8 174 #define CRYPT_WRITE 16 175 #define CRYPT_MAC 32 176 #define HP_ALGID 1 177 #define HP_HASHVAL 2 178 #define HP_HASHSIZE 4 179 #define HP_HMAC_INFO 5 180 #define CRYPT_FAILED FALSE 181 #define CRYPT_SUCCEED TRUE 182 #define RCRYPT_SUCCEEDED(r) ((r)==CRYPT_SUCCEED) 183 #define RCRYPT_FAILED(r) ((r)==CRYPT_FAILED) 184 #define PP_ENUMALGS 1 185 #define PP_ENUMCONTAINERS 2 186 #define PP_IMPTYPE 3 187 #define PP_NAME 4 188 #define PP_VERSION 5 189 #define PP_CONTAINER 6 190 #define PP_CHANGE_PASSWORD 7 191 #define PP_KEYSET_SEC_DESCR 8 192 #define PP_CERTCHAIN 9 193 #define PP_KEY_TYPE_SUBTYPE 10 194 #define PP_PROVTYPE 16 195 #define PP_KEYSTORAGE 17 196 #define PP_APPLI_CERT 18 197 #define PP_SYM_KEYSIZE 19 198 #define PP_SESSION_KEYSIZE 20 199 #define PP_UI_PROMPT 21 200 #define PP_ENUMALGS_EX 22 201 #define PP_ENUMMANDROOTS 25 202 #define PP_ENUMELECTROOTS 26 203 #define PP_KEYSET_TYPE 27 204 #define PP_ADMIN_PIN 31 205 #define PP_KEYEXCHANGE_PIN 32 206 #define PP_SIGNATURE_PIN 33 207 #define PP_SIG_KEYSIZE_INC 34 208 #define PP_KEYX_KEYSIZE_INC 35 209 #define PP_UNIQUE_CONTAINER 36 210 #define PP_SGC_INFO 37 211 #define PP_USE_HARDWARE_RNG 38 212 #define PP_KEYSPEC 39 213 #define PP_ENUMEX_SIGNING_PROT 40 214 #define CRYPT_FIRST 1 215 #define CRYPT_NEXT 2 216 #define CRYPT_IMPL_HARDWARE 1 217 #define CRYPT_IMPL_SOFTWARE 2 218 #define CRYPT_IMPL_MIXED 3 219 #define CRYPT_IMPL_UNKNOWN 4 220 #define PROV_RSA_FULL 1 221 #define PROV_RSA_SIG 2 222 #define PROV_DSS 3 223 #define PROV_FORTEZZA 4 224 #define PROV_MS_MAIL 5 225 #define PROV_SSL 6 226 #define PROV_STT_MER 7 227 #define PROV_STT_ACQ 8 228 #define PROV_STT_BRND 9 229 #define PROV_STT_ROOT 10 230 #define PROV_STT_ISS 11 231 #define PROV_RSA_SCHANNEL 12 232 #define PROV_DSS_DH 13 233 #define PROV_EC_ECDSA_SIG 14 234 #define PROV_EC_ECNRA_SIG 15 235 #define PROV_EC_ECDSA_FULL 16 236 #define PROV_EC_ECNRA_FULL 17 237 #define PROV_DH_SCHANNEL 18 238 #define PROV_SPYRUS_LYNKS 20 239 #define PROV_RNG 21 240 #define PROV_INTEL_SEC 22 241 #define PROV_RSA_AES 24 242 #define MAXUIDLEN 64 243 #define CUR_BLOB_VERSION 2 244 #define X509_ASN_ENCODING 1 245 #define PKCS_7_ASN_ENCODING 65536 246 #define CERT_V1 0 247 #define CERT_V2 1 248 #define CERT_V3 2 249 #define CERT_E_CHAINING (-2146762486) 250 #define CERT_E_CN_NO_MATCH (-2146762481) 251 #define CERT_E_EXPIRED (-2146762495) 252 #define CERT_E_PURPOSE (-2146762490) 253 #define CERT_E_REVOCATION_FAILURE (-2146762482) 254 #define CERT_E_REVOKED (-2146762484) 255 #define CERT_E_ROLE (-2146762493) 256 #define CERT_E_UNTRUSTEDROOT (-2146762487) 257 #define CERT_E_UNTRUSTEDTESTROOT (-2146762483) 258 #define CERT_E_VALIDITYPERIODNESTING (-2146762494) 259 #define CERT_E_WRONG_USAGE (-2146762480) 260 #define CERT_E_PATHLENCONST (-2146762492) 261 #define CERT_E_CRITICAL (-2146762491) 262 #define CERT_E_ISSUERCHAINING (-2146762489) 263 #define CERT_E_MALFORMED (-2146762488) 264 #define CRYPT_E_REVOCATION_OFFLINE (-2146885613) 265 #define CRYPT_E_REVOKED (-2146885616) 266 #define TRUST_E_BASIC_CONSTRAINTS (-2146869223) 267 #define TRUST_E_CERT_SIGNATURE (-2146869244) 268 #define TRUST_E_FAIL (-2146762485) 269 #define CERT_TRUST_NO_ERROR 0 270 #define CERT_TRUST_IS_NOT_TIME_VALID 1 271 #define CERT_TRUST_IS_NOT_TIME_NESTED 2 272 #define CERT_TRUST_IS_REVOKED 4 273 #define CERT_TRUST_IS_NOT_SIGNATURE_VALID 8 274 #define CERT_TRUST_IS_NOT_VALID_FOR_USAGE 16 275 #define CERT_TRUST_IS_UNTRUSTED_ROOT 32 276 #define CERT_TRUST_REVOCATION_STATUS_UNKNOWN 64 277 #define CERT_TRUST_IS_CYCLIC 128 278 #define CERT_TRUST_IS_PARTIAL_CHAIN 65536 279 #define CERT_TRUST_CTL_IS_NOT_TIME_VALID 131072 280 #define CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID 262144 281 #define CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE 524288 282 #define CERT_TRUST_HAS_EXACT_MATCH_ISSUER 1 283 #define CERT_TRUST_HAS_KEY_MATCH_ISSUER 2 284 #define CERT_TRUST_HAS_NAME_MATCH_ISSUER 4 285 #define CERT_TRUST_IS_SELF_SIGNED 8 286 #define CERT_TRUST_IS_COMPLEX_CHAIN 65536 287 #define CERT_CHAIN_POLICY_BASE ((LPCSTR) 1) 288 #define CERT_CHAIN_POLICY_AUTHENTICODE ((LPCSTR) 2) 289 #define CERT_CHAIN_POLICY_AUTHENTICODE_TS ((LPCSTR) 3) 290 #define CERT_CHAIN_POLICY_SSL ((LPCSTR) 4) 291 #define CERT_CHAIN_POLICY_BASIC_CONSTRAINTS ((LPCSTR) 5) 292 #define CERT_CHAIN_POLICY_NT_AUTH ((LPCSTR) 6) 293 #define USAGE_MATCH_TYPE_AND 0 294 #define USAGE_MATCH_TYPE_OR 1 295 #define CERT_SIMPLE_NAME_STR 1 296 #define CERT_OID_NAME_STR 2 297 #define CERT_X500_NAME_STR 3 298 #define CERT_NAME_STR_SEMICOLON_FLAG 1073741824 299 #define CERT_NAME_STR_CRLF_FLAG 134217728 300 #define CERT_NAME_STR_NO_PLUS_FLAG 536870912 301 #define CERT_NAME_STR_NO_QUOTING_FLAG 268435456 302 #define CERT_NAME_STR_REVERSE_FLAG 33554432 303 #define CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG 131072 304 #define CERT_FIND_ANY 0 305 #define CERT_FIND_CERT_ID 1048576 306 #define CERT_FIND_CTL_USAGE 655360 307 #define CERT_FIND_ENHKEY_USAGE 655360 308 #define CERT_FIND_EXISTING 851968 309 #define CERT_FIND_HASH 65536 310 #define CERT_FIND_ISSUER_ATTR 196612 311 #define CERT_FIND_ISSUER_NAME 131076 312 #define CERT_FIND_ISSUER_OF 786432 313 #define CERT_FIND_KEY_IDENTIFIER 983040 314 #define CERT_FIND_KEY_SPEC 589824 315 #define CERT_FIND_MD5_HASH 262144 316 #define CERT_FIND_PROPERTY 327680 317 #define CERT_FIND_PUBLIC_KEY 393216 318 #define CERT_FIND_SHA1_HASH 65536 319 #define CERT_FIND_SIGNATURE_HASH 917504 320 #define CERT_FIND_SUBJECT_ATTR 196615 321 #define CERT_FIND_SUBJECT_CERT 720896 322 #define CERT_FIND_SUBJECT_NAME 131079 323 #define CERT_FIND_SUBJECT_STR_A 458759 324 #define CERT_FIND_SUBJECT_STR_W 524295 325 #define CERT_FIND_ISSUER_STR_A 458756 326 #define CERT_FIND_ISSUER_STR_W 524292 327 #define CERT_FIND_OR_ENHKEY_USAGE_FLAG 16 328 #define CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG 1 329 #define CERT_FIND_NO_ENHKEY_USAGE_FLAG 8 330 #define CERT_FIND_VALID_ENHKEY_USAGE_FLAG 32 331 #define CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG 2 332 #define CERT_CASE_INSENSITIVE_IS_RDN_ATTRS_FLAG 2 333 #define CERT_UNICODE_IS_RDN_ATTRS_FLAG 1 334 #define CERT_CHAIN_FIND_BY_ISSUER 1 335 #define CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG 1 336 #define CERT_CHAIN_FIND_BY_ISSUER_COMPLEX_CHAIN_FLAG 2 337 #define CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG 32768 338 #define CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG 4 339 #define CERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAG 8 340 #define CERT_CHAIN_FIND_BY_ISSUER_NO_KEY_FLAG 16384 341 #define CERT_STORE_PROV_SYSTEM 10 342 #define CERT_SYSTEM_STORE_LOCAL_MACHINE 131072 343 #define szOID_PKIX_KP_SERVER_AUTH "4235600" 344 #define szOID_SERVER_GATED_CRYPTO "4235658" 345 #define szOID_SGC_NETSCAPE "2.16.840.1.113730.4.1" 346 #define szOID_PKIX_KP_CLIENT_AUTH "1.3.6.1.5.5.7.3.2" 347 #define CRYPT_NOHASHOID 0x00000001 348 #define CRYPT_NO_SALT 0x10 349 #define CRYPT_PREGEN 0x40 350 #define CRYPT_RECIPIENT 0x10 351 #define CRYPT_INITIATOR 0x40 352 #define CRYPT_ONLINE 0x80 353 #define CRYPT_SF 0x100 354 #define CRYPT_CREATE_IV 0x200 355 #define CRYPT_KEK 0x400 356 #define CRYPT_DATA_KEY 0x800 357 #define CRYPT_VOLATILE 0x1000 358 #define CRYPT_SGCKEY 0x2000 359 #define KP_IV 0x00000001 360 #define KP_SALT 0x00000002 361 #define KP_PADDING 0x00000003 362 #define KP_MODE 0x00000004 363 #define KP_MODE_BITS 0x00000005 364 #define KP_PERMISSIONS 0x00000006 365 #define KP_ALGID 0x00000007 366 #define KP_BLOCKLEN 0x00000008 367 #define KP_KEYLEN 0x00000009 368 #define KP_SALT_EX 0x0000000a 369 #define KP_P 0x0000000b 370 #define KP_G 0x0000000c 371 #define KP_Q 0x0000000d 372 #define KP_X 0x0000000e 373 #define KP_Y 0x0000000f 374 #define KP_RA 0x00000010 375 #define KP_RB 0x00000011 376 #define KP_INFO 0x00000012 377 #define KP_EFFECTIVE_KEYLEN 0x00000013 378 #define KP_SCHANNEL_ALG 0x00000014 379 #define KP_PUB_PARAMS 0x00000027 380 #define CRYPT_FLAG_PCT1 0x0001 381 #define CRYPT_FLAG_SSL2 0x0002 382 #define CRYPT_FLAG_SSL3 0x0004 383 #define CRYPT_FLAG_TLS1 0x0008 384 #define CRYPT_FLAG_IPSEC 0x0010 385 #define CRYPT_FLAG_SIGNING 0x0020 386 #define SCHANNEL_MAC_KEY 0x00000000 387 #define SCHANNEL_ENC_KEY 0x00000001 388 #define INTERNATIONAL_USAGE 0x00000001 389 +/ 390 391 alias UINT ALG_ID; 392 alias ULONG HCRYPTPROV, HCRYPTKEY, HCRYPTHASH; 393 alias PVOID HCERTSTORE, HCRYPTMSG, HCERTCHAINENGINE; 394 395 struct VTableProvStruc { 396 FARPROC FuncVerifyImage; 397 } 398 alias VTableProvStruc* PVTableProvStruc; 399 400 struct _CRYPTOAPI_BLOB { 401 DWORD cbData; 402 BYTE* pbData; 403 } 404 alias _CRYPTOAPI_BLOB CRYPT_INTEGER_BLOB, CRYPT_UINT_BLOB, 405 CRYPT_OBJID_BLOB, CERT_NAME_BLOB, CERT_RDN_VALUE_BLOB, CERT_BLOB, 406 CRL_BLOB, DATA_BLOB, CRYPT_DATA_BLOB, CRYPT_HASH_BLOB, 407 CRYPT_DIGEST_BLOB, CRYPT_DER_BLOB, CRYPT_ATTR_BLOB; 408 alias _CRYPTOAPI_BLOB* PCRYPT_INTEGER_BLOB, PCRYPT_UINT_BLOB, 409 PCRYPT_OBJID_BLOB, PCERT_NAME_BLOB, PCERT_RDN_VALUE_BLOB, PCERT_BLOB, 410 PCRL_BLOB, PDATA_BLOB, PCRYPT_DATA_BLOB, PCRYPT_HASH_BLOB, 411 PCRYPT_DIGEST_BLOB, PCRYPT_DER_BLOB, PCRYPT_ATTR_BLOB; 412 413 // not described in SDK; has the same layout as HTTPSPolicyCallbackData 414 struct SSL_EXTRA_CERT_CHAIN_POLICY_PARA { 415 DWORD cbStruct; 416 DWORD dwAuthType; 417 DWORD fdwChecks; 418 LPWSTR pwszServerName; 419 } 420 alias SSL_EXTRA_CERT_CHAIN_POLICY_PARA HTTPSPolicyCallbackData; 421 alias SSL_EXTRA_CERT_CHAIN_POLICY_PARA* PSSL_EXTRA_CERT_CHAIN_POLICY_PARA, 422 PHTTPSPolicyCallbackData; 423 424 /* #if (_WIN32_WINNT>=0x500) */ 425 struct CERT_CHAIN_POLICY_PARA { 426 DWORD cbSize = CERT_CHAIN_POLICY_PARA.sizeof; 427 DWORD dwFlags; 428 void* pvExtraPolicyPara; 429 } 430 alias CERT_CHAIN_POLICY_PARA* PCERT_CHAIN_POLICY_PARA; 431 432 struct CERT_CHAIN_POLICY_STATUS { 433 DWORD cbSize = CERT_CHAIN_POLICY_STATUS.sizeof; 434 DWORD dwError; 435 LONG lChainIndex; 436 LONG lElementIndex; 437 void* pvExtraPolicyStatus; 438 } 439 alias CERT_CHAIN_POLICY_STATUS* PCERT_CHAIN_POLICY_STATUS; 440 /* #endif */ 441 442 struct CRYPT_ALGORITHM_IDENTIFIER { 443 LPSTR pszObjId; 444 CRYPT_OBJID_BLOB Parameters; 445 } 446 alias CRYPT_ALGORITHM_IDENTIFIER* PCRYPT_ALGORITHM_IDENTIFIER; 447 448 struct CRYPT_BIT_BLOB { 449 DWORD cbData; 450 BYTE* pbData; 451 DWORD cUnusedBits; 452 } 453 alias CRYPT_BIT_BLOB* PCRYPT_BIT_BLOB; 454 455 struct CERT_PUBLIC_KEY_INFO { 456 CRYPT_ALGORITHM_IDENTIFIER Algorithm; 457 CRYPT_BIT_BLOB PublicKey; 458 } 459 alias CERT_PUBLIC_KEY_INFO* PCERT_PUBLIC_KEY_INFO; 460 461 struct CERT_EXTENSION { 462 LPSTR pszObjId; 463 BOOL fCritical; 464 CRYPT_OBJID_BLOB Value; 465 } 466 alias CERT_EXTENSION* PCERT_EXTENSION; 467 468 struct CERT_INFO { 469 DWORD dwVersion; 470 CRYPT_INTEGER_BLOB SerialNumber; 471 CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm; 472 CERT_NAME_BLOB Issuer; 473 FILETIME NotBefore; 474 FILETIME NotAfter; 475 CERT_NAME_BLOB Subject; 476 CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo; 477 CRYPT_BIT_BLOB IssuerUniqueId; 478 CRYPT_BIT_BLOB SubjectUniqueId; 479 DWORD cExtension; 480 PCERT_EXTENSION rgExtension; 481 } 482 alias CERT_INFO* PCERT_INFO; 483 484 struct CERT_CONTEXT { 485 DWORD dwCertEncodingType; 486 BYTE* pbCertEncoded; 487 DWORD cbCertEncoded; 488 PCERT_INFO pCertInfo; 489 HCERTSTORE hCertStore; 490 } 491 alias CERT_CONTEXT* PCERT_CONTEXT; 492 alias CPtr!(CERT_CONTEXT) PCCERT_CONTEXT; 493 494 struct CTL_USAGE { 495 DWORD cUsageIdentifier; 496 LPSTR* rgpszUsageIdentifier; 497 } 498 alias CTL_USAGE CERT_ENHKEY_USAGE; 499 alias CTL_USAGE* PCTRL_USAGE, PCERT_ENHKEY_USAGE; 500 501 struct CERT_USAGE_MATCH { 502 DWORD dwType; 503 CERT_ENHKEY_USAGE Usage; 504 } 505 alias CERT_USAGE_MATCH* PCERT_USAGE_MATCH; 506 /* #if (_WIN32_WINNT>=0x500) */ 507 508 struct CERT_CHAIN_PARA { 509 DWORD cbSize = CERT_CHAIN_PARA.sizeof; 510 CERT_USAGE_MATCH RequestedUsage; 511 //#if CERT_CHAIN_PARA_HAS_EXTRA_FIELDS 512 CERT_USAGE_MATCH RequestedIssuancePolicy; 513 DWORD dwUrlRetrievalTimeout; 514 BOOL fCheckRevocationFreshnessTime; 515 DWORD dwRevocationFreshnessTime; 516 //#endif 517 } 518 alias CERT_CHAIN_PARA* PCERT_CHAIN_PARA; 519 520 extern (Windows) alias BOOL function(PCCERT_CONTEXT, void*) 521 PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK; 522 523 struct CERT_CHAIN_FIND_BY_ISSUER_PARA { 524 DWORD cbSize = CERT_CHAIN_FIND_BY_ISSUER_PARA.sizeof; 525 LPCSTR pszUsageIdentifier; 526 DWORD dwKeySpec; 527 DWORD dwAcquirePrivateKeyFlags; 528 DWORD cIssuer; 529 CERT_NAME_BLOB* rgIssuer; 530 PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK pfnFIndCallback; 531 void* pvFindArg; 532 DWORD* pdwIssuerChainIndex; 533 DWORD* pdwIssuerElementIndex; 534 } 535 alias CERT_CHAIN_FIND_BY_ISSUER_PARA* PCERT_CHAIN_FIND_BY_ISSUER_PARA; 536 /* #endif */ 537 538 struct CERT_TRUST_STATUS { 539 DWORD dwErrorStatus; 540 DWORD dwInfoStatus; 541 } 542 alias CERT_TRUST_STATUS* PCERT_TRUST_STATUS; 543 544 struct CRL_ENTRY { 545 CRYPT_INTEGER_BLOB SerialNumber; 546 FILETIME RevocationDate; 547 DWORD cExtension; 548 PCERT_EXTENSION rgExtension; 549 } 550 alias CRL_ENTRY* PCRL_ENTRY; 551 552 struct CRL_INFO { 553 DWORD dwVersion; 554 CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm; 555 CERT_NAME_BLOB Issuer; 556 FILETIME ThisUpdate; 557 FILETIME NextUpdate; 558 DWORD cCRLEntry; 559 PCRL_ENTRY rgCRLEntry; 560 DWORD cExtension; 561 PCERT_EXTENSION rgExtension; 562 } 563 alias CRL_INFO* PCRL_INFO; 564 565 struct CRL_CONTEXT { 566 DWORD dwCertEncodingType; 567 BYTE* pbCrlEncoded; 568 DWORD cbCrlEncoded; 569 PCRL_INFO pCrlInfo; 570 HCERTSTORE hCertStore; 571 } 572 alias CRL_CONTEXT* PCRL_CONTEXT; 573 alias CPtr!(CRL_CONTEXT) PCCRL_CONTEXT; 574 575 struct CERT_REVOCATION_CRL_INFO { 576 DWORD cbSize = CERT_REVOCATION_CRL_INFO.sizeof; 577 PCCRL_CONTEXT pBaseCRLContext; 578 PCCRL_CONTEXT pDeltaCRLContext; 579 PCRL_ENTRY pCrlEntry; 580 BOOL fDeltaCrlEntry; 581 } 582 alias CERT_REVOCATION_CRL_INFO* PCERT_REVOCATION_CRL_INFO; 583 584 struct CERT_REVOCATION_INFO { 585 DWORD cbSize = CERT_REVOCATION_INFO.sizeof; 586 DWORD dwRevocationResult; 587 LPCSTR pszRevocationOid; 588 LPVOID pvOidSpecificInfo; 589 BOOL fHasFreshnessTime; 590 DWORD dwFreshnessTime; 591 PCERT_REVOCATION_CRL_INFO pCrlInfo; 592 } 593 alias CERT_REVOCATION_INFO* PCERT_REVOCATION_INFO; 594 595 /* #if (_WIN32_WINNT>=0x500) */ 596 struct CERT_CHAIN_ELEMENT { 597 DWORD cbSize = CERT_CHAIN_ELEMENT.sizeof; 598 PCCERT_CONTEXT pCertContext; 599 CERT_TRUST_STATUS TrustStatus; 600 PCERT_REVOCATION_INFO pRevocationInfo; 601 PCERT_ENHKEY_USAGE pIssuanceUsage; 602 PCERT_ENHKEY_USAGE pApplicationUsage; 603 } 604 alias CERT_CHAIN_ELEMENT* PCERT_CHAIN_ELEMENT; 605 /* #endif */ 606 607 struct CRYPT_ATTRIBUTE { 608 LPSTR pszObjId; 609 DWORD cValue; 610 PCRYPT_ATTR_BLOB rgValue; 611 } 612 alias CRYPT_ATTRIBUTE* PCRYPT_ATTRIBUTE; 613 614 struct CTL_ENTRY { 615 CRYPT_DATA_BLOB SubjectIdentifier; 616 DWORD cAttribute; 617 PCRYPT_ATTRIBUTE rgAttribute; 618 } 619 alias CTL_ENTRY* PCTL_ENTRY; 620 621 struct CTL_INFO { 622 DWORD dwVersion; 623 CTL_USAGE SubjectUsage; 624 CRYPT_DATA_BLOB ListIdentifier; 625 CRYPT_INTEGER_BLOB SequenceNumber; 626 FILETIME ThisUpdate; 627 FILETIME NextUpdate; 628 CRYPT_ALGORITHM_IDENTIFIER SubjectAlgorithm; 629 DWORD cCTLEntry; 630 PCTL_ENTRY rgCTLEntry; 631 DWORD cExtension; 632 PCERT_EXTENSION rgExtension; 633 } 634 alias CTL_INFO* PCTL_INFO; 635 636 struct CTL_CONTEXT { 637 DWORD dwMsgAndCertEncodingType; 638 BYTE* pbCtlEncoded; 639 DWORD cbCtlEncoded; 640 PCTL_INFO pCtlInfo; 641 HCERTSTORE hCertStore; 642 HCRYPTMSG hCryptMsg; 643 BYTE* pbCtlContent; 644 DWORD cbCtlContent; 645 } 646 alias CTL_CONTEXT* PCTL_CONTEXT; 647 alias CPtr!(CTL_CONTEXT) PCCTL_CONTEXT; 648 649 struct CERT_TRUST_LIST_INFO { 650 DWORD cbSize = CERT_TRUST_LIST_INFO.sizeof; 651 PCTL_ENTRY pCtlEntry; 652 PCCTL_CONTEXT pCtlContext; 653 } 654 alias CERT_TRUST_LIST_INFO* PCERT_TRUST_LIST_INFO; 655 656 struct CERT_SIMPLE_CHAIN { 657 DWORD cbSize = CERT_SIMPLE_CHAIN.sizeof; 658 CERT_TRUST_STATUS TrustStatus; 659 DWORD cElement; 660 PCERT_CHAIN_ELEMENT* rgpElement; 661 PCERT_TRUST_LIST_INFO pTrustListInfo; 662 BOOL fHasRevocationFreshnessTime; 663 DWORD dwRevocationFreshnessTime; 664 } 665 alias CERT_SIMPLE_CHAIN* PCERT_SIMPLE_CHAIN; 666 667 /* #if (_WIN32_WINNT>=0x500) */ 668 alias CPtr!(CERT_CHAIN_CONTEXT) PCCERT_CHAIN_CONTEXT; 669 struct CERT_CHAIN_CONTEXT { 670 DWORD cbSize = CERT_CHAIN_CONTEXT.sizeof; 671 CERT_TRUST_STATUS TrustStatus; 672 DWORD cChain; 673 PCERT_SIMPLE_CHAIN* rgpChain; 674 DWORD cLowerQualityChainContext; 675 PCCERT_CHAIN_CONTEXT* rgpLowerQualityChainContext; 676 BOOL fHasRevocationFreshnessTime; 677 DWORD dwRevocationFreshnessTime; 678 } 679 alias CERT_CHAIN_CONTEXT* PCERT_CHAIN_CONTEXT; 680 /* #endif */ 681 682 struct PROV_ENUMALGS { 683 ALG_ID aiAlgid; 684 DWORD dwBitLen; 685 DWORD dwNameLen; 686 CHAR[20] szName; 687 } 688 689 struct PUBLICKEYSTRUC { 690 BYTE bType; 691 BYTE bVersion; 692 WORD reserved; 693 ALG_ID aiKeyAlg; 694 } 695 alias PUBLICKEYSTRUC BLOBHEADER; 696 697 struct RSAPUBKEY { 698 DWORD magic; 699 DWORD bitlen; 700 DWORD pubexp; 701 } 702 703 struct HMAC_INFO { 704 ALG_ID HashAlgid; 705 BYTE* pbInnerString; 706 DWORD cbInnerString; 707 BYTE* pbOuterString; 708 DWORD cbOuterString; 709 } 710 alias HMAC_INFO* PHMAC_INFO; 711 712 extern (Windows) { 713 BOOL CertCloseStore(HCERTSTORE, DWORD); 714 BOOL CertGetCertificateChain(HCERTCHAINENGINE, PCCERT_CONTEXT, LPFILETIME, 715 HCERTSTORE, PCERT_CHAIN_PARA, DWORD, LPVOID, PCCERT_CHAIN_CONTEXT*); 716 BOOL CertVerifyCertificateChainPolicy(LPCSTR, PCCERT_CHAIN_CONTEXT, 717 PCERT_CHAIN_POLICY_PARA, PCERT_CHAIN_POLICY_STATUS); 718 void CertFreeCertificateChain(PCCERT_CHAIN_CONTEXT); 719 DWORD CertNameToStrA(DWORD, PCERT_NAME_BLOB, DWORD, LPSTR, DWORD); 720 DWORD CertNameToStrW(DWORD, PCERT_NAME_BLOB, DWORD, LPWSTR, DWORD); 721 HCERTSTORE CertOpenSystemStoreA(HCRYPTPROV, LPCSTR); 722 HCERTSTORE CertOpenSystemStoreW(HCRYPTPROV, LPCWSTR); 723 HCERTSTORE CertOpenStore(LPCSTR, DWORD, HCRYPTPROV, DWORD, CPtr!(void)); 724 PCCERT_CONTEXT CertFindCertificateInStore(HCERTSTORE, DWORD, DWORD, DWORD, 725 CPtr!(void), PCCERT_CONTEXT); 726 BOOL CertFreeCertificateContext(PCCERT_CONTEXT); 727 PCCERT_CONTEXT CertGetIssuerCertificateFromStore(HCERTSTORE, 728 PCCERT_CONTEXT, PCCERT_CONTEXT, DWORD*); 729 PCCERT_CHAIN_CONTEXT CertFindChainInStore(HCERTSTORE, DWORD, DWORD, DWORD, 730 CPtr!(void), PCCERT_CHAIN_CONTEXT); 731 732 BOOL CryptAcquireContextA(HCRYPTPROV*, LPCSTR, LPCSTR, DWORD, DWORD); 733 BOOL CryptAcquireContextW(HCRYPTPROV*, LPCWSTR, LPCWSTR, DWORD, DWORD); 734 BOOL CryptContextAddRef(HCRYPTPROV, DWORD*, DWORD); 735 BOOL CryptReleaseContext(HCRYPTPROV, DWORD); 736 BOOL CryptGenKey(HCRYPTPROV, ALG_ID, DWORD, HCRYPTKEY*); 737 BOOL CryptDeriveKey(HCRYPTPROV, ALG_ID, HCRYPTHASH, DWORD, HCRYPTKEY*); 738 BOOL CryptDestroyKey(HCRYPTKEY); 739 static if (WINVER >= 0x0500) { 740 BOOL CryptDuplicateHash(HCRYPTHASH, DWORD*, DWORD, HCRYPTHASH*); 741 BOOL CryptDuplicateKey(HCRYPTKEY, DWORD*, DWORD, HCRYPTKEY*); 742 } 743 BOOL CryptSetKeyParam(HCRYPTKEY, DWORD, PBYTE, DWORD); 744 BOOL CryptGetKeyParam(HCRYPTKEY, DWORD, PBYTE, PDWORD, DWORD); 745 BOOL CryptSetHashParam(HCRYPTHASH, DWORD, PBYTE, DWORD); 746 BOOL CryptGetHashParam(HCRYPTHASH, DWORD, PBYTE, PDWORD, DWORD); 747 BOOL CryptSetProvParam(HCRYPTPROV, DWORD, PBYTE, DWORD); 748 BOOL CryptGetProvParam(HCRYPTPROV, DWORD, PBYTE, PDWORD, DWORD); 749 BOOL CryptGenRandom(HCRYPTPROV, DWORD, PBYTE); 750 BOOL CryptGetUserKey(HCRYPTPROV, DWORD, HCRYPTKEY*); 751 BOOL CryptExportKey(HCRYPTKEY, HCRYPTKEY, DWORD, DWORD, PBYTE, PDWORD); 752 BOOL CryptImportKey(HCRYPTPROV, PBYTE, DWORD, HCRYPTKEY, DWORD, 753 HCRYPTKEY*); 754 BOOL CryptEncrypt(HCRYPTKEY, HCRYPTHASH, BOOL, DWORD, PBYTE, PDWORD, 755 DWORD); 756 BOOL CryptDecrypt(HCRYPTKEY, HCRYPTHASH, BOOL, DWORD, PBYTE, PDWORD); 757 BOOL CryptCreateHash(HCRYPTPROV, ALG_ID, HCRYPTKEY, DWORD, HCRYPTHASH*); 758 BOOL CryptHashData(HCRYPTHASH, PBYTE, DWORD, DWORD); 759 BOOL CryptHashSessionKey(HCRYPTHASH, HCRYPTKEY, DWORD); 760 BOOL CryptGetHashValue(HCRYPTHASH, DWORD, PBYTE, PDWORD); 761 BOOL CryptDestroyHash(HCRYPTHASH); 762 BOOL CryptSignHashA(HCRYPTHASH, DWORD, LPCSTR, DWORD, PBYTE, PDWORD); 763 BOOL CryptSignHashW(HCRYPTHASH, DWORD, LPCWSTR, DWORD, PBYTE, PDWORD); 764 BOOL CryptVerifySignatureA(HCRYPTHASH, PBYTE, DWORD, HCRYPTKEY, LPCSTR, 765 DWORD); 766 BOOL CryptVerifySignatureW(HCRYPTHASH, PBYTE, DWORD, HCRYPTKEY, LPCWSTR, 767 DWORD); 768 BOOL CryptSetProviderA(LPCSTR, DWORD); 769 BOOL CryptSetProviderW(LPCWSTR, DWORD); 770 } 771 772 version (Unicode) { 773 alias CertNameToStrW CertNameToStr; 774 alias CryptAcquireContextW CryptAcquireContext; 775 alias CryptSignHashW CryptSignHash; 776 alias CryptVerifySignatureW CryptVerifySignature; 777 alias CryptSetProviderW CryptSetProvider; 778 alias CertOpenSystemStoreW CertOpenSystemStore; 779 /+alias CERT_FIND_SUBJECT_STR_W CERT_FIND_SUBJECT_STR; 780 alias CERT_FIND_ISSUER_STR_W CERT_FIND_ISSUER_STR;+/ 781 } else { 782 alias CertNameToStrA CertNameToStr; 783 alias CryptAcquireContextA CryptAcquireContext; 784 alias CryptSignHashA CryptSignHash; 785 alias CryptVerifySignatureA CryptVerifySignature; 786 alias CryptSetProviderA CryptSetProvider; 787 alias CertOpenSystemStoreA CertOpenSystemStore; 788 /+alias CERT_FIND_SUBJECT_STR_A CERT_FIND_SUBJECT_STR; 789 alias CERT_FIND_ISSUER_STR_A CERT_FIND_ISSUER_STR;+/ 790 }