Home | History | Annotate | Download | only in include
      1 /**
      2  * This file has no copyright assigned and is placed in the Public Domain.
      3  * This file is part of the mingw-w64 runtime package.
      4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
      5  */
      6 #ifndef __WINCRYPT_H__
      7 #define __WINCRYPT_H__
      8 
      9 #include <_mingw.h>
     10 #include <_mingw_unicode.h>
     11 #include <guiddef.h>
     12 #include <winapifamily.h>
     13 
     14 #ifdef __cplusplus
     15 extern "C" {
     16 #endif
     17 
     18 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
     19 
     20 #ifndef _HRESULT_DEFINED
     21 #define _HRESULT_DEFINED
     22   typedef LONG HRESULT;
     23 #endif
     24 
     25 #ifndef DECLSPEC_IMPORT
     26 #ifndef __WIDL__
     27 #define DECLSPEC_IMPORT __declspec(dllimport)
     28 #else
     29 #define DECLSPEC_IMPORT
     30 #endif
     31 #endif
     32 
     33 #ifndef WINIMPM
     34 #define WINIMPM DECLSPEC_IMPORT
     35 #endif
     36 
     37 #include <apisetcconv.h>
     38 
     39 #ifndef WINAPI
     40 #if defined(_ARM_)
     41 #define WINAPI
     42 #else
     43 #define WINAPI __stdcall
     44 #endif
     45 #endif
     46 
     47 #ifndef CALLBACK
     48 #if defined(_ARM_)
     49 #define CALLBACK
     50 #else
     51 #define CALLBACK __stdcall
     52 #endif
     53 #endif
     54 
     55 #ifndef CONST
     56 #define CONST const
     57 #endif
     58 
     59 #ifndef _NO_W32_PSEUDO_MODIFIERS
     60 #ifndef IN
     61 #define IN
     62 #endif
     63 
     64 #ifndef OUT
     65 #define OUT
     66 #endif
     67 
     68 #ifndef OPTIONAL
     69 #define OPTIONAL
     70 #endif
     71 #endif
     72 
     73 #ifndef WINCRYPT32API
     74 #define WINCRYPT32API WINIMPM
     75 #endif
     76 
     77 #ifndef WINCRYPT32STRINGAPI
     78 #define WINCRYPT32STRINGAPI WINIMPM
     79 #endif
     80 
     81 #define GET_ALG_CLASS(x) (x & (7 << 13))
     82 #define GET_ALG_TYPE(x) (x & (15 << 9))
     83 #define GET_ALG_SID(x) (x & 511)
     84 
     85 #define ALG_CLASS_ANY (0)
     86 #define ALG_CLASS_SIGNATURE (1 << 13)
     87 #define ALG_CLASS_MSG_ENCRYPT (2 << 13)
     88 #define ALG_CLASS_DATA_ENCRYPT (3 << 13)
     89 #define ALG_CLASS_HASH (4 << 13)
     90 #define ALG_CLASS_KEY_EXCHANGE (5 << 13)
     91 #define ALG_CLASS_ALL (7 << 13)
     92 
     93 #define ALG_TYPE_ANY (0)
     94 #define ALG_TYPE_DSS (1 << 9)
     95 #define ALG_TYPE_RSA (2 << 9)
     96 #define ALG_TYPE_BLOCK (3 << 9)
     97 #define ALG_TYPE_STREAM (4 << 9)
     98 #define ALG_TYPE_DH (5 << 9)
     99 #define ALG_TYPE_SECURECHANNEL (6 << 9)
    100 
    101 #define ALG_SID_ANY (0)
    102 
    103 #define ALG_SID_RSA_ANY 0
    104 #define ALG_SID_RSA_PKCS 1
    105 #define ALG_SID_RSA_MSATWORK 2
    106 #define ALG_SID_RSA_ENTRUST 3
    107 #define ALG_SID_RSA_PGP 4
    108 
    109 #define ALG_SID_DSS_ANY 0
    110 #define ALG_SID_DSS_PKCS 1
    111 #define ALG_SID_DSS_DMS 2
    112 #if NTDDI_VERSION >= 0x06000000
    113 #define ALG_SID_ECDSA 3
    114 #endif
    115 
    116 #define ALG_SID_DES 1
    117 #define ALG_SID_3DES 3
    118 #define ALG_SID_DESX 4
    119 #define ALG_SID_IDEA 5
    120 #define ALG_SID_CAST 6
    121 #define ALG_SID_SAFERSK64 7
    122 #define ALG_SID_SAFERSK128 8
    123 #define ALG_SID_3DES_112 9
    124 #define ALG_SID_SKIPJACK 10
    125 #define ALG_SID_TEK 11
    126 #define ALG_SID_CYLINK_MEK 12
    127 #define ALG_SID_RC5 13
    128 #define ALG_SID_AES_128 14
    129 #define ALG_SID_AES_192 15
    130 #define ALG_SID_AES_256 16
    131 #define ALG_SID_AES 17
    132 
    133 #define CRYPT_MODE_CBCI 6
    134 #define CRYPT_MODE_CFBP 7
    135 #define CRYPT_MODE_OFBP 8
    136 #define CRYPT_MODE_CBCOFM 9
    137 #define CRYPT_MODE_CBCOFMI 10
    138 
    139 #define ALG_SID_RC2 2
    140 
    141 #define ALG_SID_RC4 1
    142 #define ALG_SID_SEAL 2
    143 
    144 #define ALG_SID_DH_SANDF 1
    145 #define ALG_SID_DH_EPHEM 2
    146 #define ALG_SID_AGREED_KEY_ANY 3
    147 #define ALG_SID_KEA 4
    148 #if NTDDI_VERSION >= 0x06000000
    149 #define ALG_SID_ECDH 5
    150 #endif
    151 
    152 #define ALG_SID_MD2 1
    153 #define ALG_SID_MD4 2
    154 #define ALG_SID_MD5 3
    155 #define ALG_SID_SHA 4
    156 #define ALG_SID_SHA1 4
    157 #define ALG_SID_MAC 5
    158 #define ALG_SID_RIPEMD 6
    159 #define ALG_SID_RIPEMD160 7
    160 #define ALG_SID_SSL3SHAMD5 8
    161 #define ALG_SID_HMAC 9
    162 #define ALG_SID_TLS1PRF 10
    163 #define ALG_SID_HASH_REPLACE_OWF 11
    164 #define ALG_SID_SHA_256 12
    165 #define ALG_SID_SHA_384 13
    166 #define ALG_SID_SHA_512 14
    167 
    168 #define ALG_SID_SSL3_MASTER 1
    169 #define ALG_SID_SCHANNEL_MASTER_HASH 2
    170 #define ALG_SID_SCHANNEL_MAC_KEY 3
    171 #define ALG_SID_PCT1_MASTER 4
    172 #define ALG_SID_SSL2_MASTER 5
    173 #define ALG_SID_TLS1_MASTER 6
    174 #define ALG_SID_SCHANNEL_ENC_KEY 7
    175 
    176 #if NTDDI_VERSION >= 0x06000000
    177 #define ALG_SID_ECMQV 1
    178 #endif
    179 
    180 #define ALG_SID_EXAMPLE 80
    181 
    182 #ifndef ALGIDDEF
    183 #define ALGIDDEF
    184   typedef unsigned int ALG_ID;
    185 #endif
    186 
    187 #define CALG_MD2 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD2)
    188 #define CALG_MD4 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD4)
    189 #define CALG_MD5 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5)
    190 #define CALG_SHA (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA)
    191 #define CALG_SHA1 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1)
    192 #define CALG_MAC (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MAC)
    193 #define CALG_RSA_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_RSA | ALG_SID_RSA_ANY)
    194 #define CALG_DSS_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_DSS_ANY)
    195 #define CALG_NO_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_ANY | ALG_SID_ANY)
    196 #define CALG_RSA_KEYX (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_RSA|ALG_SID_RSA_ANY)
    197 #define CALG_DES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_DES)
    198 #define CALG_3DES_112 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_3DES_112)
    199 #define CALG_3DES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_3DES)
    200 #define CALG_DESX (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_DESX)
    201 #define CALG_RC2 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_RC2)
    202 #define CALG_RC4 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_RC4)
    203 #define CALG_SEAL (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_SEAL)
    204 #define CALG_DH_SF (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_DH_SANDF)
    205 #define CALG_DH_EPHEM (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_DH_EPHEM)
    206 #define CALG_AGREEDKEY_ANY (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_AGREED_KEY_ANY)
    207 #define CALG_KEA_KEYX (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_KEA)
    208 #define CALG_HUGHES_MD5 (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_ANY|ALG_SID_MD5)
    209 #define CALG_SKIPJACK (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_SKIPJACK)
    210 #define CALG_TEK (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_TEK)
    211 #define CALG_CYLINK_MEK (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_CYLINK_MEK)
    212 #define CALG_SSL3_SHAMD5 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SSL3SHAMD5)
    213 #define CALG_SSL3_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SSL3_MASTER)
    214 #define CALG_SCHANNEL_MASTER_HASH (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SCHANNEL_MASTER_HASH)
    215 #define CALG_SCHANNEL_MAC_KEY (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SCHANNEL_MAC_KEY)
    216 #define CALG_SCHANNEL_ENC_KEY (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SCHANNEL_ENC_KEY)
    217 #define CALG_PCT1_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_PCT1_MASTER)
    218 #define CALG_SSL2_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SSL2_MASTER)
    219 #define CALG_TLS1_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_TLS1_MASTER)
    220 #define CALG_RC5 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_RC5)
    221 #define CALG_HMAC (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HMAC)
    222 #define CALG_TLS1PRF (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_TLS1PRF)
    223 #define CALG_HASH_REPLACE_OWF (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HASH_REPLACE_OWF)
    224 #define CALG_AES_128 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_AES_128)
    225 #define CALG_AES_192 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_AES_192)
    226 #define CALG_AES_256 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_AES_256)
    227 #define CALG_AES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_AES)
    228 #define CALG_SHA_256 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_256)
    229 #define CALG_SHA_384 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_384)
    230 #define CALG_SHA_512 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_512)
    231 #if NTDDI_VERSION >= 0x06000000
    232 #define CALG_ECDH (ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_ECDH)
    233 #define CALG_ECMQV (ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_ANY | ALG_SID_ECMQV)
    234 #define CALG_ECDSA (ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_ECDSA)
    235 #endif
    236 
    237 /* In ncrypt.h too */
    238 #ifndef HCRYPTPROV_DEFINED
    239 #define HCRYPTPROV_DEFINED
    240   typedef ULONG_PTR HCRYPTHASH;
    241   typedef ULONG_PTR HCRYPTKEY;
    242   typedef ULONG_PTR HCRYPTPROV;
    243 #endif
    244 
    245 #define CRYPT_VERIFYCONTEXT 0xf0000000
    246 #define CRYPT_NEWKEYSET 0x8
    247 #define CRYPT_DELETEKEYSET 0x10
    248 #define CRYPT_MACHINE_KEYSET 0x20
    249 #define CRYPT_SILENT 0x40
    250 #if NTDDI_VERSION >= 0x06000000
    251 #define CRYPT_DEFAULT_CONTAINER_OPTIONAL 0x80
    252 #endif
    253 
    254 #define CRYPT_EXPORTABLE 0x1
    255 #define CRYPT_USER_PROTECTED 0x2
    256 #define CRYPT_CREATE_SALT 0x4
    257 #define CRYPT_UPDATE_KEY 0x8
    258 #define CRYPT_NO_SALT 0x10
    259 #define CRYPT_PREGEN 0x40
    260 #define CRYPT_RECIPIENT 0x10
    261 #define CRYPT_INITIATOR 0x40
    262 #define CRYPT_ONLINE 0x80
    263 #define CRYPT_SF 0x100
    264 #define CRYPT_CREATE_IV 0x200
    265 #define CRYPT_KEK 0x400
    266 #define CRYPT_DATA_KEY 0x800
    267 #define CRYPT_VOLATILE 0x1000
    268 #define CRYPT_SGCKEY 0x2000
    269 #define CRYPT_ARCHIVABLE 0x4000
    270 #if NTDDI_VERSION >= 0x06000000
    271 #define CRYPT_FORCE_KEY_PROTECTION_HIGH 0x8000
    272 #endif
    273 #define CRYPT_USER_PROTECTED_STRONG 0x100000
    274 
    275 #define RSA1024BIT_KEY 0x4000000
    276 
    277 #define CRYPT_SERVER 0x400
    278 
    279 #define KEY_LENGTH_MASK 0xffff0000
    280 
    281 #define CRYPT_Y_ONLY 0x1
    282 #define CRYPT_SSL2_FALLBACK 0x2
    283 #define CRYPT_DESTROYKEY 0x4
    284 #define CRYPT_DECRYPT_RSA_NO_PADDING_CHECK 0x20
    285 #define CRYPT_OAEP 0x40
    286 #define CRYPT_BLOB_VER3 0x80
    287 #define CRYPT_IPSEC_HMAC_KEY 0x100
    288 
    289 #define CRYPT_SECRETDIGEST 0x1
    290 #define CRYPT_OWF_REPL_LM_HASH 0x1
    291 #define CRYPT_LITTLE_ENDIAN 0x1
    292 
    293 #define CRYPT_NOHASHOID 0x1
    294 #define CRYPT_TYPE2_FORMAT 0x2
    295 #define CRYPT_X931_FORMAT 0x4
    296 
    297 #define CRYPT_MACHINE_DEFAULT 0x1
    298 #define CRYPT_USER_DEFAULT 0x2
    299 #define CRYPT_DELETE_DEFAULT 0x4
    300 
    301 #define SIMPLEBLOB 0x1
    302 #define PUBLICKEYBLOB 0x6
    303 #define PRIVATEKEYBLOB 0x7
    304 #define PLAINTEXTKEYBLOB 0x8
    305 #define OPAQUEKEYBLOB 0x9
    306 #define PUBLICKEYBLOBEX 0xa
    307 #define SYMMETRICWRAPKEYBLOB 0xb
    308 #define KEYSTATEBLOB 0xc
    309 
    310 #define AT_KEYEXCHANGE 1
    311 #define AT_SIGNATURE 2
    312 
    313 #define CRYPT_USERDATA 1
    314 
    315 #define KP_IV 1
    316 #define KP_SALT 2
    317 #define KP_PADDING 3
    318 #define KP_MODE 4
    319 #define KP_MODE_BITS 5
    320 #define KP_PERMISSIONS 6
    321 #define KP_ALGID 7
    322 #define KP_BLOCKLEN 8
    323 #define KP_KEYLEN 9
    324 #define KP_SALT_EX 10
    325 #define KP_P 11
    326 #define KP_G 12
    327 #define KP_Q 13
    328 #define KP_X 14
    329 #define KP_Y 15
    330 #define KP_RA 16
    331 #define KP_RB 17
    332 #define KP_INFO 18
    333 #define KP_EFFECTIVE_KEYLEN 19
    334 #define KP_SCHANNEL_ALG 20
    335 #define KP_CLIENT_RANDOM 21
    336 #define KP_SERVER_RANDOM 22
    337 #define KP_RP 23
    338 #define KP_PRECOMP_MD5 24
    339 #define KP_PRECOMP_SHA 25
    340 #define KP_CERTIFICATE 26
    341 #define KP_CLEAR_KEY 27
    342 #define KP_PUB_EX_LEN 28
    343 #define KP_PUB_EX_VAL 29
    344 #define KP_KEYVAL 30
    345 #define KP_ADMIN_PIN 31
    346 #define KP_KEYEXCHANGE_PIN 32
    347 #define KP_SIGNATURE_PIN 33
    348 #define KP_PREHASH 34
    349 #define KP_ROUNDS 35
    350 #define KP_OAEP_PARAMS 36
    351 #define KP_CMS_KEY_INFO 37
    352 #define KP_CMS_DH_KEY_INFO 38
    353 #define KP_PUB_PARAMS 39
    354 #define KP_VERIFY_PARAMS 40
    355 #define KP_HIGHEST_VERSION 41
    356 #define KP_GET_USE_COUNT 42
    357 #define KP_PIN_ID 43
    358 #define KP_PIN_INFO 44
    359 
    360 #define PKCS5_PADDING 1
    361 #define RANDOM_PADDING 2
    362 #define ZERO_PADDING 3
    363 
    364 #define CRYPT_MODE_CBC 1
    365 #define CRYPT_MODE_ECB 2
    366 #define CRYPT_MODE_OFB 3
    367 #define CRYPT_MODE_CFB 4
    368 #define CRYPT_MODE_CTS 5
    369 
    370 #define CRYPT_ENCRYPT 0x1
    371 #define CRYPT_DECRYPT 0x2
    372 #define CRYPT_EXPORT 0x4
    373 #define CRYPT_READ 0x8
    374 #define CRYPT_WRITE 0x10
    375 #define CRYPT_MAC 0x20
    376 #define CRYPT_EXPORT_KEY 0x40
    377 #define CRYPT_IMPORT_KEY 0x80
    378 #define CRYPT_ARCHIVE 0x100
    379 
    380 #define HP_ALGID 0x1
    381 #define HP_HASHVAL 0x2
    382 #define HP_HASHSIZE 0x4
    383 #define HP_HMAC_INFO 0x5
    384 #define HP_TLS1PRF_LABEL 0x6
    385 #define HP_TLS1PRF_SEED 0x7
    386 
    387 #define CRYPT_FAILED FALSE
    388 #define CRYPT_SUCCEED TRUE
    389 
    390 #define RCRYPT_SUCCEEDED(RT) ((RT) == CRYPT_SUCCEED)
    391 #define RCRYPT_FAILED(RT) ((RT) == CRYPT_FAILED)
    392 
    393 #define PP_ENUMALGS 1
    394 #define PP_ENUMCONTAINERS 2
    395 #define PP_IMPTYPE 3
    396 #define PP_NAME 4
    397 #define PP_VERSION 5
    398 #define PP_CONTAINER 6
    399 #define PP_CHANGE_PASSWORD 7
    400 #define PP_KEYSET_SEC_DESCR 8
    401 #define PP_CERTCHAIN 9
    402 #define PP_KEY_TYPE_SUBTYPE 10
    403 #define PP_PROVTYPE 16
    404 #define PP_KEYSTORAGE 17
    405 #define PP_APPLI_CERT 18
    406 #define PP_SYM_KEYSIZE 19
    407 #define PP_SESSION_KEYSIZE 20
    408 #define PP_UI_PROMPT 21
    409 #define PP_ENUMALGS_EX 22
    410 #define PP_ENUMMANDROOTS 25
    411 #define PP_ENUMELECTROOTS 26
    412 #define PP_KEYSET_TYPE 27
    413 #define PP_ADMIN_PIN 31
    414 #define PP_KEYEXCHANGE_PIN 32
    415 #define PP_SIGNATURE_PIN 33
    416 #define PP_SIG_KEYSIZE_INC 34
    417 #define PP_KEYX_KEYSIZE_INC 35
    418 #define PP_UNIQUE_CONTAINER 36
    419 #define PP_SGC_INFO 37
    420 #define PP_USE_HARDWARE_RNG 38
    421 #define PP_KEYSPEC 39
    422 #define PP_ENUMEX_SIGNING_PROT 40
    423 #define PP_CRYPT_COUNT_KEY_USE 41
    424 #if NTDDI_VERSION >= 0x06000000
    425 #define PP_USER_CERTSTORE 42
    426 #define PP_SMARTCARD_READER 43
    427 #define PP_SMARTCARD_GUID 45
    428 #define PP_ROOT_CERTSTORE 46
    429 #endif
    430 #if NTDDI_VERSION >= 0x06020000
    431 #define PP_SMARTCARD_READER_ICON 47
    432 #endif
    433 
    434 #define CRYPT_FIRST 1
    435 #define CRYPT_NEXT 2
    436 #define CRYPT_SGC_ENUM 4
    437 
    438 #define CRYPT_IMPL_HARDWARE 1
    439 #define CRYPT_IMPL_SOFTWARE 2
    440 #define CRYPT_IMPL_MIXED 3
    441 #define CRYPT_IMPL_UNKNOWN 4
    442 #define CRYPT_IMPL_REMOVABLE 8
    443 
    444 #define CRYPT_SEC_DESCR 0x1
    445 #define CRYPT_PSTORE 0x2
    446 #define CRYPT_UI_PROMPT 0x4
    447 
    448 #define CRYPT_FLAG_PCT1 0x1
    449 #define CRYPT_FLAG_SSL2 0x2
    450 #define CRYPT_FLAG_SSL3 0x4
    451 #define CRYPT_FLAG_TLS1 0x8
    452 #define CRYPT_FLAG_IPSEC 0x10
    453 #define CRYPT_FLAG_SIGNING 0x20
    454 
    455 #define CRYPT_SGC 0x1
    456 #define CRYPT_FASTSGC 0x2
    457 
    458 #define PP_CLIENT_HWND 1
    459 #define PP_CONTEXT_INFO 11
    460 #define PP_KEYEXCHANGE_KEYSIZE 12
    461 #define PP_SIGNATURE_KEYSIZE 13
    462 #define PP_KEYEXCHANGE_ALG 14
    463 #define PP_SIGNATURE_ALG 15
    464 #define PP_DELETEKEY 24
    465 #if NTDDI_VERSION >= 0x06000000
    466 #define PP_PIN_PROMPT_STRING 44
    467 #define PP_SECURE_KEYEXCHANGE_PIN 47
    468 #define PP_SECURE_SIGNATURE_PIN 48
    469 #endif
    470 
    471 #define PROV_RSA_FULL 1
    472 #define PROV_RSA_SIG 2
    473 #define PROV_DSS 3
    474 #define PROV_FORTEZZA 4
    475 #define PROV_MS_EXCHANGE 5
    476 #define PROV_SSL 6
    477 #define PROV_STT_MER 7
    478 #define PROV_STT_ACQ 8
    479 #define PROV_STT_BRND 9
    480 #define PROV_STT_ROOT 10
    481 #define PROV_STT_ISS 11
    482 #define PROV_RSA_SCHANNEL 12
    483 #define PROV_DSS_DH 13
    484 #define PROV_EC_ECDSA_SIG 14
    485 #define PROV_EC_ECNRA_SIG 15
    486 #define PROV_EC_ECDSA_FULL 16
    487 #define PROV_EC_ECNRA_FULL 17
    488 #define PROV_DH_SCHANNEL 18
    489 #define PROV_SPYRUS_LYNKS 20
    490 #define PROV_RNG 21
    491 #define PROV_INTEL_SEC 22
    492 #define PROV_REPLACE_OWF 23
    493 #define PROV_RSA_AES 24
    494 
    495 #define MS_DEF_PROV __MINGW_NAME_UAW(MS_DEF_PROV)
    496 #define MS_ENHANCED_PROV __MINGW_NAME_UAW(MS_ENHANCED_PROV)
    497 #define MS_STRONG_PROV __MINGW_NAME_UAW(MS_STRONG_PROV)
    498 #define MS_DEF_RSA_SIG_PROV __MINGW_NAME_UAW(MS_DEF_RSA_SIG_PROV)
    499 #define MS_DEF_RSA_SCHANNEL_PROV __MINGW_NAME_UAW(MS_DEF_RSA_SCHANNEL_PROV)
    500 #define MS_DEF_DSS_PROV __MINGW_NAME_UAW(MS_DEF_DSS_PROV)
    501 #define MS_DEF_DSS_DH_PROV __MINGW_NAME_UAW(MS_DEF_DSS_DH_PROV)
    502 #define MS_ENH_DSS_DH_PROV __MINGW_NAME_UAW(MS_ENH_DSS_DH_PROV)
    503 #define MS_DEF_DH_SCHANNEL_PROV __MINGW_NAME_UAW(MS_DEF_DH_SCHANNEL_PROV)
    504 #define MS_SCARD_PROV __MINGW_NAME_UAW(MS_SCARD_PROV)
    505 #define MS_ENH_RSA_AES_PROV_XP __MINGW_NAME_UAW(MS_ENH_RSA_AES_PROV_XP)
    506 #define MS_ENH_RSA_AES_PROV __MINGW_NAME_UAW(MS_ENH_RSA_AES_PROV)
    507 
    508 #define MS_DEF_PROV_A "Microsoft Base Cryptographic Provider v1.0"
    509 #define MS_DEF_PROV_W L"Microsoft Base Cryptographic Provider v1.0"
    510 #define MS_ENHANCED_PROV_A "Microsoft Enhanced Cryptographic Provider v1.0"
    511 #define MS_ENHANCED_PROV_W L"Microsoft Enhanced Cryptographic Provider v1.0"
    512 #define MS_STRONG_PROV_A "Microsoft Strong Cryptographic Provider"
    513 #define MS_STRONG_PROV_W L"Microsoft Strong Cryptographic Provider"
    514 #define MS_DEF_RSA_SIG_PROV_A "Microsoft RSA Signature Cryptographic Provider"
    515 #define MS_DEF_RSA_SIG_PROV_W L"Microsoft RSA Signature Cryptographic Provider"
    516 #define MS_DEF_RSA_SCHANNEL_PROV_A "Microsoft RSA SChannel Cryptographic Provider"
    517 #define MS_DEF_RSA_SCHANNEL_PROV_W L"Microsoft RSA SChannel Cryptographic Provider"
    518 #define MS_DEF_DSS_PROV_A "Microsoft Base DSS Cryptographic Provider"
    519 #define MS_DEF_DSS_PROV_W L"Microsoft Base DSS Cryptographic Provider"
    520 #define MS_DEF_DSS_DH_PROV_A "Microsoft Base DSS and Diffie-Hellman Cryptographic Provider"
    521 #define MS_DEF_DSS_DH_PROV_W L"Microsoft Base DSS and Diffie-Hellman Cryptographic Provider"
    522 #define MS_ENH_DSS_DH_PROV_A "Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider"
    523 #define MS_ENH_DSS_DH_PROV_W L"Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider"
    524 #define MS_DEF_DH_SCHANNEL_PROV_A "Microsoft DH SChannel Cryptographic Provider"
    525 #define MS_DEF_DH_SCHANNEL_PROV_W L"Microsoft DH SChannel Cryptographic Provider"
    526 #define MS_SCARD_PROV_A "Microsoft Base Smart Card Crypto Provider"
    527 #define MS_SCARD_PROV_W L"Microsoft Base Smart Card Crypto Provider"
    528 #define MS_ENH_RSA_AES_PROV_A "Microsoft Enhanced RSA and AES Cryptographic Provider"
    529 #define MS_ENH_RSA_AES_PROV_W L"Microsoft Enhanced RSA and AES Cryptographic Provider"
    530 #define MS_ENH_RSA_AES_PROV_XP_A "Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)"
    531 #define MS_ENH_RSA_AES_PROV_XP_W L"Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)"
    532 
    533 #define MAXUIDLEN 64
    534 
    535 #define EXPO_OFFLOAD_REG_VALUE "ExpoOffload"
    536 #define EXPO_OFFLOAD_FUNC_NAME "OffloadModExpo"
    537 
    538 #ifndef szKEY_CRYPTOAPI_PRIVATE_KEY_OPTIONS
    539 #define szKEY_CRYPTOAPI_PRIVATE_KEY_OPTIONS "Software\\Policies\\Microsoft\\Cryptography"
    540 #endif
    541 
    542 #define szKEY_CACHE_ENABLED "CachePrivateKeys"
    543 #define szKEY_CACHE_SECONDS "PrivateKeyLifetimeSeconds"
    544 
    545 #define szPRIV_KEY_CACHE_MAX_ITEMS "PrivKeyCacheMaxItems"
    546 #define cPRIV_KEY_CACHE_MAX_ITEMS_DEFAULT 20
    547 
    548 #define szPRIV_KEY_CACHE_PURGE_INTERVAL_SECONDS "PrivKeyCachePurgeIntervalSeconds"
    549 #define cPRIV_KEY_CACHE_PURGE_INTERVAL_SECONDS_DEFAULT 86400
    550 
    551 #define CUR_BLOB_VERSION 2
    552 
    553   typedef struct _CMS_KEY_INFO {
    554     DWORD dwVersion;
    555     ALG_ID Algid;
    556     BYTE *pbOID;
    557     DWORD cbOID;
    558   } CMS_KEY_INFO,*PCMS_KEY_INFO;
    559 
    560   typedef struct _HMAC_Info {
    561     ALG_ID HashAlgid;
    562     BYTE *pbInnerString;
    563     DWORD cbInnerString;
    564     BYTE *pbOuterString;
    565     DWORD cbOuterString;
    566   } HMAC_INFO,*PHMAC_INFO;
    567 
    568   typedef struct _SCHANNEL_ALG {
    569     DWORD dwUse;
    570     ALG_ID Algid;
    571     DWORD cBits;
    572     DWORD dwFlags;
    573     DWORD dwReserved;
    574   } SCHANNEL_ALG,*PSCHANNEL_ALG;
    575 #define SCHANNEL_MAC_KEY 0x0
    576 #define SCHANNEL_ENC_KEY 0x1
    577 
    578 #define INTERNATIONAL_USAGE 0x1
    579 
    580   typedef struct _PROV_ENUMALGS {
    581     ALG_ID aiAlgid;
    582     DWORD dwBitLen;
    583     DWORD dwNameLen;
    584     CHAR szName[20];
    585   } PROV_ENUMALGS;
    586 
    587   typedef struct _PROV_ENUMALGS_EX {
    588     ALG_ID aiAlgid;
    589     DWORD dwDefaultLen;
    590     DWORD dwMinLen;
    591     DWORD dwMaxLen;
    592     DWORD dwProtocols;
    593     DWORD dwNameLen;
    594     CHAR szName[20];
    595     DWORD dwLongNameLen;
    596     CHAR szLongName[40];
    597   } PROV_ENUMALGS_EX;
    598 
    599   typedef struct _PUBLICKEYSTRUC {
    600     BYTE bType;
    601     BYTE bVersion;
    602     WORD reserved;
    603     ALG_ID aiKeyAlg;
    604   } BLOBHEADER,PUBLICKEYSTRUC;
    605 
    606   typedef struct _RSAPUBKEY {
    607     DWORD magic;
    608     DWORD bitlen;
    609     DWORD pubexp;
    610   } RSAPUBKEY;
    611 
    612   typedef struct _PUBKEY {
    613     DWORD magic;
    614     DWORD bitlen;
    615   } DHPUBKEY,DSSPUBKEY,KEAPUBKEY,TEKPUBKEY;
    616 
    617   typedef struct _DSSSEED {
    618     DWORD counter;
    619     BYTE seed[20];
    620   } DSSSEED;
    621 
    622   typedef struct _PUBKEYVER3 {
    623     DWORD magic;
    624     DWORD bitlenP;
    625     DWORD bitlenQ;
    626     DWORD bitlenJ;
    627     DSSSEED DSSSeed;
    628   } DHPUBKEY_VER3, DSSPUBKEY_VER3;
    629 
    630   typedef struct _PRIVKEYVER3 {
    631     DWORD magic;
    632     DWORD bitlenP;
    633     DWORD bitlenQ;
    634     DWORD bitlenJ;
    635     DWORD bitlenX;
    636     DSSSEED DSSSeed;
    637   } DHPRIVKEY_VER3,DSSPRIVKEY_VER3;
    638 
    639   typedef struct _KEY_TYPE_SUBTYPE {
    640     DWORD dwKeySpec;
    641     GUID Type;
    642     GUID Subtype;
    643   } KEY_TYPE_SUBTYPE,*PKEY_TYPE_SUBTYPE;
    644 
    645   typedef struct _CERT_FORTEZZA_DATA_PROP {
    646     unsigned char SerialNumber[8];
    647     int CertIndex;
    648     unsigned char CertLabel[36];
    649   } CERT_FORTEZZA_DATA_PROP;
    650 
    651   typedef struct _CRYPT_RC4_KEY_STATE {
    652     unsigned char Key[16];
    653     unsigned char SBox[256];
    654     unsigned char i;
    655     unsigned char j;
    656   } CRYPT_RC4_KEY_STATE,*PCRYPT_RC4_KEY_STATE;
    657 
    658   typedef struct _CRYPT_DES_KEY_STATE {
    659     unsigned char Key[8];
    660     unsigned char IV[8];
    661     unsigned char Feedback[8];
    662   } CRYPT_DES_KEY_STATE,*PCRYPT_DES_KEY_STATE;
    663 
    664   typedef struct _CRYPT_3DES_KEY_STATE {
    665     unsigned char Key[24];
    666     unsigned char IV[8];
    667     unsigned char Feedback[8];
    668   } CRYPT_3DES_KEY_STATE,*PCRYPT_3DES_KEY_STATE;
    669 
    670 #if NTDDI_VERSION >= 0x06000000
    671   typedef struct _CRYPT_AES_128_KEY_STATE {
    672     unsigned char Key[16];
    673     unsigned char IV[16];
    674     unsigned char EncryptionState[11][16];
    675     unsigned char DecryptionState[11][16];
    676     unsigned char Feedback[16];
    677   } CRYPT_AES_128_KEY_STATE,*PCRYPT_AES_128_KEY_STATE;
    678 
    679   typedef struct _CRYPT_AES_256_KEY_STATE {
    680     unsigned char Key[32];
    681     unsigned char IV[16];
    682     unsigned char EncryptionState[15][16];
    683     unsigned char DecryptionState[15][16];
    684     unsigned char Feedback[16];
    685   } CRYPT_AES_256_KEY_STATE,*PCRYPT_AES_256_KEY_STATE;
    686 #endif
    687 #endif
    688 
    689 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_APP)
    690 
    691 #ifndef CRYPTO_BLOBS_DEFINED
    692 #define CRYPTO_BLOBS_DEFINED
    693   typedef struct _CRYPTOAPI_BLOB {
    694     DWORD cbData;
    695     BYTE *pbData;
    696   } CRYPT_INTEGER_BLOB,*PCRYPT_INTEGER_BLOB,CRYPT_UINT_BLOB,*PCRYPT_UINT_BLOB,CRYPT_OBJID_BLOB,*PCRYPT_OBJID_BLOB,CERT_NAME_BLOB,*PCERT_NAME_BLOB,CERT_RDN_VALUE_BLOB,*PCERT_RDN_VALUE_BLOB,CERT_BLOB,*PCERT_BLOB,CRL_BLOB,*PCRL_BLOB,DATA_BLOB,*PDATA_BLOB,CRYPT_DATA_BLOB,*PCRYPT_DATA_BLOB,CRYPT_HASH_BLOB,*PCRYPT_HASH_BLOB,CRYPT_DIGEST_BLOB,*PCRYPT_DIGEST_BLOB,CRYPT_DER_BLOB,*PCRYPT_DER_BLOB,CRYPT_ATTR_BLOB,*PCRYPT_ATTR_BLOB;
    697 #endif
    698 #endif
    699 
    700 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
    701   typedef struct _CMS_DH_KEY_INFO {
    702     DWORD dwVersion;
    703     ALG_ID Algid;
    704     LPSTR pszContentEncObjId;
    705     CRYPT_DATA_BLOB PubInfo;
    706     void *pReserved;
    707   } CMS_DH_KEY_INFO,*PCMS_DH_KEY_INFO;
    708 
    709 #define CryptAcquireContext __MINGW_NAME_AW(CryptAcquireContext)
    710 #define CryptSignHash __MINGW_NAME_AW(CryptSignHash)
    711 #define CryptVerifySignature __MINGW_NAME_AW(CryptVerifySignature)
    712 #define CryptSetProvider __MINGW_NAME_AW(CryptSetProvider)
    713 #define CryptSetProviderEx __MINGW_NAME_AW(CryptSetProviderEx)
    714 #define CryptGetDefaultProvider __MINGW_NAME_AW(CryptGetDefaultProvider)
    715 #define CryptEnumProviderTypes __MINGW_NAME_AW(CryptEnumProviderTypes)
    716 #define CryptEnumProviders __MINGW_NAME_AW(CryptEnumProviders)
    717 
    718   WINIMPM WINBOOL WINAPI CryptAcquireContextA (HCRYPTPROV *phProv, LPCSTR szContainer, LPCSTR szProvider, DWORD dwProvType, DWORD dwFlags);
    719   WINIMPM WINBOOL WINAPI CryptAcquireContextW (HCRYPTPROV *phProv, LPCWSTR szContainer, LPCWSTR szProvider, DWORD dwProvType, DWORD dwFlags);
    720   WINIMPM WINBOOL WINAPI CryptReleaseContext (HCRYPTPROV hProv, DWORD dwFlags);
    721   WINIMPM WINBOOL WINAPI CryptGenKey (HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKEY *phKey);
    722   WINIMPM WINBOOL WINAPI CryptDeriveKey (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY *phKey);
    723   WINIMPM WINBOOL WINAPI CryptDestroyKey (HCRYPTKEY hKey);
    724   WINIMPM WINBOOL WINAPI CryptSetKeyParam (HCRYPTKEY hKey, DWORD dwParam, CONST BYTE *pbData, DWORD dwFlags);
    725   WINIMPM WINBOOL WINAPI CryptGetKeyParam (HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags);
    726   WINIMPM WINBOOL WINAPI CryptSetHashParam (HCRYPTHASH hHash, DWORD dwParam, CONST BYTE *pbData, DWORD dwFlags);
    727   WINIMPM WINBOOL WINAPI CryptGetHashParam (HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags);
    728   WINIMPM WINBOOL WINAPI CryptSetProvParam (HCRYPTPROV hProv, DWORD dwParam, CONST BYTE *pbData, DWORD dwFlags);
    729   WINIMPM WINBOOL WINAPI CryptGetProvParam (HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags);
    730   WINIMPM WINBOOL WINAPI CryptGenRandom (HCRYPTPROV hProv, DWORD dwLen, BYTE *pbBuffer);
    731   WINIMPM WINBOOL WINAPI CryptGetUserKey (HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUserKey);
    732   WINIMPM WINBOOL WINAPI CryptExportKey (HCRYPTKEY hKey, HCRYPTKEY hExpKey, DWORD dwBlobType, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen);
    733   WINIMPM WINBOOL WINAPI CryptImportKey (HCRYPTPROV hProv, CONST BYTE *pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey);
    734   WINIMPM WINBOOL WINAPI CryptEncrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, WINBOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen);
    735   WINIMPM WINBOOL WINAPI CryptDecrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, WINBOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen);
    736   WINIMPM WINBOOL WINAPI CryptCreateHash (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash);
    737   WINIMPM WINBOOL WINAPI CryptHashData (HCRYPTHASH hHash, CONST BYTE *pbData, DWORD dwDataLen, DWORD dwFlags);
    738   WINIMPM WINBOOL WINAPI CryptHashSessionKey (HCRYPTHASH hHash, HCRYPTKEY hKey, DWORD dwFlags);
    739   WINIMPM WINBOOL WINAPI CryptDestroyHash (HCRYPTHASH hHash);
    740   WINIMPM WINBOOL WINAPI CryptSignHashA (HCRYPTHASH hHash, DWORD dwKeySpec, LPCSTR szDescription, DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen);
    741   WINIMPM WINBOOL WINAPI CryptSignHashW (HCRYPTHASH hHash, DWORD dwKeySpec, LPCWSTR szDescription, DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen);
    742   WINIMPM WINBOOL WINAPI CryptVerifySignatureA (HCRYPTHASH hHash, CONST BYTE *pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCSTR szDescription, DWORD dwFlags);
    743   WINIMPM WINBOOL WINAPI CryptVerifySignatureW (HCRYPTHASH hHash, CONST BYTE *pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCWSTR szDescription, DWORD dwFlags);
    744   WINIMPM WINBOOL WINAPI CryptSetProviderA (LPCSTR pszProvName, DWORD dwProvType);
    745   WINIMPM WINBOOL WINAPI CryptSetProviderW (LPCWSTR pszProvName, DWORD dwProvType);
    746   WINIMPM WINBOOL WINAPI CryptSetProviderExA (LPCSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags);
    747   WINIMPM WINBOOL WINAPI CryptSetProviderExW (LPCWSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags);
    748   WINIMPM WINBOOL WINAPI CryptGetDefaultProviderA (DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags, LPSTR pszProvName, DWORD *pcbProvName);
    749   WINIMPM WINBOOL WINAPI CryptGetDefaultProviderW (DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags, LPWSTR pszProvName, DWORD *pcbProvName);
    750   WINIMPM WINBOOL WINAPI CryptEnumProviderTypesA (DWORD dwIndex, DWORD *pdwReserved, DWORD dwFlags, DWORD *pdwProvType, LPSTR szTypeName, DWORD *pcbTypeName);
    751   WINIMPM WINBOOL WINAPI CryptEnumProviderTypesW (DWORD dwIndex, DWORD *pdwReserved, DWORD dwFlags, DWORD *pdwProvType, LPWSTR szTypeName, DWORD *pcbTypeName);
    752   WINIMPM WINBOOL WINAPI CryptEnumProvidersA (DWORD dwIndex, DWORD *pdwReserved, DWORD dwFlags, DWORD *pdwProvType, LPSTR szProvName, DWORD *pcbProvName);
    753   WINIMPM WINBOOL WINAPI CryptEnumProvidersW (DWORD dwIndex, DWORD *pdwReserved, DWORD dwFlags, DWORD *pdwProvType, LPWSTR szProvName, DWORD *pcbProvName);
    754   WINIMPM WINBOOL WINAPI CryptContextAddRef (HCRYPTPROV hProv, DWORD *pdwReserved, DWORD dwFlags);
    755   WINIMPM WINBOOL WINAPI CryptDuplicateKey (HCRYPTKEY hKey, DWORD *pdwReserved, DWORD dwFlags, HCRYPTKEY *phKey);
    756   WINIMPM WINBOOL WINAPI CryptDuplicateHash (HCRYPTHASH hHash, DWORD *pdwReserved, DWORD dwFlags, HCRYPTHASH *phHash);
    757   WINBOOL __cdecl GetEncSChannel (BYTE **pData, DWORD *dwDecSize);
    758 #endif
    759 
    760 #ifndef _DDK_DRIVER_
    761 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
    762   typedef ULONG_PTR HCRYPTPROV_OR_NCRYPT_KEY_HANDLE;
    763   typedef ULONG_PTR HCRYPTPROV_LEGACY;
    764 
    765 #include <bcrypt.h>
    766 #endif
    767 
    768 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_APP)
    769 #include <ncrypt.h>
    770 
    771   typedef struct _CRYPT_BIT_BLOB {
    772     DWORD cbData;
    773     BYTE *pbData;
    774     DWORD cUnusedBits;
    775   } CRYPT_BIT_BLOB,*PCRYPT_BIT_BLOB;
    776 
    777   typedef struct _CRYPT_ALGORITHM_IDENTIFIER {
    778     LPSTR pszObjId;
    779     CRYPT_OBJID_BLOB Parameters;
    780   } CRYPT_ALGORITHM_IDENTIFIER,*PCRYPT_ALGORITHM_IDENTIFIER;
    781 #endif
    782 
    783 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
    784 #define szOID_RSA "1.2.840.113549"
    785 #define szOID_PKCS "1.2.840.113549.1"
    786 #define szOID_RSA_HASH "1.2.840.113549.2"
    787 #define szOID_RSA_ENCRYPT "1.2.840.113549.3"
    788 
    789 #define szOID_PKCS_1 "1.2.840.113549.1.1"
    790 #define szOID_PKCS_2 "1.2.840.113549.1.2"
    791 #define szOID_PKCS_3 "1.2.840.113549.1.3"
    792 #define szOID_PKCS_4 "1.2.840.113549.1.4"
    793 #define szOID_PKCS_5 "1.2.840.113549.1.5"
    794 #define szOID_PKCS_6 "1.2.840.113549.1.6"
    795 #define szOID_PKCS_7 "1.2.840.113549.1.7"
    796 #define szOID_PKCS_8 "1.2.840.113549.1.8"
    797 #define szOID_PKCS_9 "1.2.840.113549.1.9"
    798 #define szOID_PKCS_10 "1.2.840.113549.1.10"
    799 #define szOID_PKCS_12 "1.2.840.113549.1.12"
    800 
    801 #define szOID_RSA_RSA "1.2.840.113549.1.1.1"
    802 #define szOID_RSA_MD2RSA "1.2.840.113549.1.1.2"
    803 #define szOID_RSA_MD4RSA "1.2.840.113549.1.1.3"
    804 #define szOID_RSA_MD5RSA "1.2.840.113549.1.1.4"
    805 #define szOID_RSA_SHA1RSA "1.2.840.113549.1.1.5"
    806 #define szOID_RSA_SETOAEP_RSA "1.2.840.113549.1.1.6"
    807 
    808 #define szOID_RSAES_OAEP "1.2.840.113549.1.1.7"
    809 #define szOID_RSA_MGF1 "1.2.840.113549.1.1.8"
    810 #define szOID_RSA_PSPECIFIED "1.2.840.113549.1.1.9"
    811 #define szOID_RSA_SSA_PSS "1.2.840.113549.1.1.10"
    812 #define szOID_RSA_SHA256RSA "1.2.840.113549.1.1.11"
    813 #define szOID_RSA_SHA384RSA "1.2.840.113549.1.1.12"
    814 #define szOID_RSA_SHA512RSA "1.2.840.113549.1.1.13"
    815 
    816 #define szOID_RSA_DH "1.2.840.113549.1.3.1"
    817 
    818 #define szOID_RSA_data "1.2.840.113549.1.7.1"
    819 #define szOID_RSA_signedData "1.2.840.113549.1.7.2"
    820 #define szOID_RSA_envelopedData "1.2.840.113549.1.7.3"
    821 #define szOID_RSA_signEnvData "1.2.840.113549.1.7.4"
    822 #define szOID_RSA_digestedData "1.2.840.113549.1.7.5"
    823 #define szOID_RSA_hashedData "1.2.840.113549.1.7.5"
    824 #define szOID_RSA_encryptedData "1.2.840.113549.1.7.6"
    825 
    826 #define szOID_RSA_emailAddr "1.2.840.113549.1.9.1"
    827 #define szOID_RSA_unstructName "1.2.840.113549.1.9.2"
    828 #define szOID_RSA_contentType "1.2.840.113549.1.9.3"
    829 #define szOID_RSA_messageDigest "1.2.840.113549.1.9.4"
    830 #define szOID_RSA_signingTime "1.2.840.113549.1.9.5"
    831 #define szOID_RSA_counterSign "1.2.840.113549.1.9.6"
    832 #define szOID_RSA_challengePwd "1.2.840.113549.1.9.7"
    833 #define szOID_RSA_unstructAddr "1.2.840.113549.1.9.8"
    834 #define szOID_RSA_extCertAttrs "1.2.840.113549.1.9.9"
    835 #define szOID_RSA_certExtensions "1.2.840.113549.1.9.14"
    836 #define szOID_RSA_SMIMECapabilities "1.2.840.113549.1.9.15"
    837 #define szOID_RSA_preferSignedData "1.2.840.113549.1.9.15.1"
    838 
    839 #define szOID_TIMESTAMP_TOKEN "1.2.840.113549.1.9.16.1.4"
    840 #define szOID_RFC3161_counterSign "1.3.6.1.4.1.311.3.3.1"
    841 
    842 #define szOID_RSA_SMIMEalg "1.2.840.113549.1.9.16.3"
    843 #define szOID_RSA_SMIMEalgESDH "1.2.840.113549.1.9.16.3.5"
    844 #define szOID_RSA_SMIMEalgCMS3DESwrap "1.2.840.113549.1.9.16.3.6"
    845 #define szOID_RSA_SMIMEalgCMSRC2wrap "1.2.840.113549.1.9.16.3.7"
    846 
    847 #define szOID_RSA_MD2 "1.2.840.113549.2.2"
    848 #define szOID_RSA_MD4 "1.2.840.113549.2.4"
    849 #define szOID_RSA_MD5 "1.2.840.113549.2.5"
    850 
    851 #define szOID_RSA_RC2CBC "1.2.840.113549.3.2"
    852 #define szOID_RSA_RC4 "1.2.840.113549.3.4"
    853 #define szOID_RSA_DES_EDE3_CBC "1.2.840.113549.3.7"
    854 #define szOID_RSA_RC5_CBCPad "1.2.840.113549.3.9"
    855 
    856 #define szOID_ANSI_X942 "1.2.840.10046"
    857 #define szOID_ANSI_X942_DH "1.2.840.10046.2.1"
    858 
    859 #define szOID_X957 "1.2.840.10040"
    860 #define szOID_X957_DSA "1.2.840.10040.4.1"
    861 #define szOID_X957_SHA1DSA "1.2.840.10040.4.3"
    862 
    863 #define szOID_ECC_PUBLIC_KEY "1.2.840.10045.2.1"
    864 #define szOID_ECC_CURVE_P256 "1.2.840.10045.3.1.7"
    865 #define szOID_ECC_CURVE_P384 "1.3.132.0.34"
    866 #define szOID_ECC_CURVE_P521 "1.3.132.0.35"
    867 #define szOID_ECDSA_SHA1 "1.2.840.10045.4.1"
    868 #define szOID_ECDSA_SPECIFIED "1.2.840.10045.4.3"
    869 #define szOID_ECDSA_SHA256 "1.2.840.10045.4.3.2"
    870 #define szOID_ECDSA_SHA384 "1.2.840.10045.4.3.3"
    871 #define szOID_ECDSA_SHA512 "1.2.840.10045.4.3.4"
    872 
    873 #define szOID_NIST_AES128_CBC "2.16.840.1.101.3.4.1.2"
    874 #define szOID_NIST_AES192_CBC "2.16.840.1.101.3.4.1.22"
    875 #define szOID_NIST_AES256_CBC "2.16.840.1.101.3.4.1.42"
    876 
    877 #define szOID_NIST_AES128_WRAP "2.16.840.1.101.3.4.1.5"
    878 #define szOID_NIST_AES192_WRAP "2.16.840.1.101.3.4.1.25"
    879 #define szOID_NIST_AES256_WRAP "2.16.840.1.101.3.4.1.45"
    880 
    881 #define szOID_DH_SINGLE_PASS_STDDH_SHA1_KDF "1.3.133.16.840.63.0.2"
    882 #define szOID_DH_SINGLE_PASS_STDDH_SHA256_KDF "1.3.132.1.11.1"
    883 #define szOID_DH_SINGLE_PASS_STDDH_SHA384_KDF "1.3.132.1.11.2"
    884 
    885 #define szOID_DS "2.5"
    886 #define szOID_DSALG "2.5.8"
    887 #define szOID_DSALG_CRPT "2.5.8.1"
    888 #define szOID_DSALG_HASH "2.5.8.2"
    889 #define szOID_DSALG_SIGN "2.5.8.3"
    890 #define szOID_DSALG_RSA "2.5.8.1.1"
    891 
    892 #define szOID_OIW "1.3.14"
    893 
    894 #define szOID_OIWSEC "1.3.14.3.2"
    895 #define szOID_OIWSEC_md4RSA "1.3.14.3.2.2"
    896 #define szOID_OIWSEC_md5RSA "1.3.14.3.2.3"
    897 #define szOID_OIWSEC_md4RSA2 "1.3.14.3.2.4"
    898 #define szOID_OIWSEC_desECB "1.3.14.3.2.6"
    899 #define szOID_OIWSEC_desCBC "1.3.14.3.2.7"
    900 #define szOID_OIWSEC_desOFB "1.3.14.3.2.8"
    901 #define szOID_OIWSEC_desCFB "1.3.14.3.2.9"
    902 #define szOID_OIWSEC_desMAC "1.3.14.3.2.10"
    903 #define szOID_OIWSEC_rsaSign "1.3.14.3.2.11"
    904 #define szOID_OIWSEC_dsa "1.3.14.3.2.12"
    905 #define szOID_OIWSEC_shaDSA "1.3.14.3.2.13"
    906 #define szOID_OIWSEC_mdc2RSA "1.3.14.3.2.14"
    907 #define szOID_OIWSEC_shaRSA "1.3.14.3.2.15"
    908 #define szOID_OIWSEC_dhCommMod "1.3.14.3.2.16"
    909 #define szOID_OIWSEC_desEDE "1.3.14.3.2.17"
    910 #define szOID_OIWSEC_sha "1.3.14.3.2.18"
    911 #define szOID_OIWSEC_mdc2 "1.3.14.3.2.19"
    912 #define szOID_OIWSEC_dsaComm "1.3.14.3.2.20"
    913 #define szOID_OIWSEC_dsaCommSHA "1.3.14.3.2.21"
    914 #define szOID_OIWSEC_rsaXchg "1.3.14.3.2.22"
    915 #define szOID_OIWSEC_keyHashSeal "1.3.14.3.2.23"
    916 #define szOID_OIWSEC_md2RSASign "1.3.14.3.2.24"
    917 #define szOID_OIWSEC_md5RSASign "1.3.14.3.2.25"
    918 #define szOID_OIWSEC_sha1 "1.3.14.3.2.26"
    919 #define szOID_OIWSEC_dsaSHA1 "1.3.14.3.2.27"
    920 #define szOID_OIWSEC_dsaCommSHA1 "1.3.14.3.2.28"
    921 #define szOID_OIWSEC_sha1RSASign "1.3.14.3.2.29"
    922 
    923 #define szOID_OIWDIR "1.3.14.7.2"
    924 #define szOID_OIWDIR_CRPT "1.3.14.7.2.1"
    925 #define szOID_OIWDIR_HASH "1.3.14.7.2.2"
    926 #define szOID_OIWDIR_SIGN "1.3.14.7.2.3"
    927 #define szOID_OIWDIR_md2 "1.3.14.7.2.2.1"
    928 #define szOID_OIWDIR_md2RSA "1.3.14.7.2.3.1"
    929 
    930 #define szOID_INFOSEC "2.16.840.1.101.2.1"
    931 #define szOID_INFOSEC_sdnsSignature "2.16.840.1.101.2.1.1.1"
    932 #define szOID_INFOSEC_mosaicSignature "2.16.840.1.101.2.1.1.2"
    933 #define szOID_INFOSEC_sdnsConfidentiality "2.16.840.1.101.2.1.1.3"
    934 #define szOID_INFOSEC_mosaicConfidentiality "2.16.840.1.101.2.1.1.4"
    935 #define szOID_INFOSEC_sdnsIntegrity "2.16.840.1.101.2.1.1.5"
    936 #define szOID_INFOSEC_mosaicIntegrity "2.16.840.1.101.2.1.1.6"
    937 #define szOID_INFOSEC_sdnsTokenProtection "2.16.840.1.101.2.1.1.7"
    938 #define szOID_INFOSEC_mosaicTokenProtection "2.16.840.1.101.2.1.1.8"
    939 #define szOID_INFOSEC_sdnsKeyManagement "2.16.840.1.101.2.1.1.9"
    940 #define szOID_INFOSEC_mosaicKeyManagement "2.16.840.1.101.2.1.1.10"
    941 #define szOID_INFOSEC_sdnsKMandSig "2.16.840.1.101.2.1.1.11"
    942 #define szOID_INFOSEC_mosaicKMandSig "2.16.840.1.101.2.1.1.12"
    943 #define szOID_INFOSEC_SuiteASignature "2.16.840.1.101.2.1.1.13"
    944 #define szOID_INFOSEC_SuiteAConfidentiality "2.16.840.1.101.2.1.1.14"
    945 #define szOID_INFOSEC_SuiteAIntegrity "2.16.840.1.101.2.1.1.15"
    946 #define szOID_INFOSEC_SuiteATokenProtection "2.16.840.1.101.2.1.1.16"
    947 #define szOID_INFOSEC_SuiteAKeyManagement "2.16.840.1.101.2.1.1.17"
    948 #define szOID_INFOSEC_SuiteAKMandSig "2.16.840.1.101.2.1.1.18"
    949 #define szOID_INFOSEC_mosaicUpdatedSig "2.16.840.1.101.2.1.1.19"
    950 #define szOID_INFOSEC_mosaicKMandUpdSig "2.16.840.1.101.2.1.1.20"
    951 #define szOID_INFOSEC_mosaicUpdatedInteg "2.16.840.1.101.2.1.1.21"
    952 
    953 #define szOID_NIST_sha256 "2.16.840.1.101.3.4.2.1"
    954 #define szOID_NIST_sha384 "2.16.840.1.101.3.4.2.2"
    955 #define szOID_NIST_sha512 "2.16.840.1.101.3.4.2.3"
    956 
    957   typedef struct _CRYPT_OBJID_TABLE {
    958     DWORD dwAlgId;
    959     LPCSTR pszObjId;
    960   } CRYPT_OBJID_TABLE,*PCRYPT_OBJID_TABLE;
    961 
    962   typedef struct _CRYPT_HASH_INFO {
    963     CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
    964     CRYPT_HASH_BLOB Hash;
    965   } CRYPT_HASH_INFO,*PCRYPT_HASH_INFO;
    966 #endif
    967 
    968 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_APP)
    969   typedef struct _CERT_EXTENSION {
    970     LPSTR pszObjId;
    971     WINBOOL fCritical;
    972     CRYPT_OBJID_BLOB Value;
    973   } CERT_EXTENSION,*PCERT_EXTENSION;
    974 
    975   typedef const CERT_EXTENSION *PCCERT_EXTENSION;
    976 #endif
    977 
    978 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
    979   typedef struct _CRYPT_ATTRIBUTE_TYPE_VALUE {
    980     LPSTR pszObjId;
    981     CRYPT_OBJID_BLOB Value;
    982   } CRYPT_ATTRIBUTE_TYPE_VALUE,*PCRYPT_ATTRIBUTE_TYPE_VALUE;
    983 
    984   typedef struct _CRYPT_ATTRIBUTE {
    985     LPSTR pszObjId;
    986     DWORD cValue;
    987     PCRYPT_ATTR_BLOB rgValue;
    988   } CRYPT_ATTRIBUTE,*PCRYPT_ATTRIBUTE;
    989 
    990   typedef struct _CRYPT_ATTRIBUTES {
    991     DWORD cAttr;
    992     PCRYPT_ATTRIBUTE rgAttr;
    993   } CRYPT_ATTRIBUTES,*PCRYPT_ATTRIBUTES;
    994 
    995   typedef struct _CERT_RDN_ATTR {
    996     LPSTR pszObjId;
    997     DWORD dwValueType;
    998     CERT_RDN_VALUE_BLOB Value;
    999   } CERT_RDN_ATTR,*PCERT_RDN_ATTR;
   1000 
   1001 #define szOID_COMMON_NAME "2.5.4.3"
   1002 #define szOID_SUR_NAME "2.5.4.4"
   1003 #define szOID_DEVICE_SERIAL_NUMBER "2.5.4.5"
   1004 #define szOID_COUNTRY_NAME "2.5.4.6"
   1005 #define szOID_LOCALITY_NAME "2.5.4.7"
   1006 #define szOID_STATE_OR_PROVINCE_NAME "2.5.4.8"
   1007 #define szOID_STREET_ADDRESS "2.5.4.9"
   1008 #define szOID_ORGANIZATION_NAME "2.5.4.10"
   1009 #define szOID_ORGANIZATIONAL_UNIT_NAME "2.5.4.11"
   1010 #define szOID_TITLE "2.5.4.12"
   1011 #define szOID_DESCRIPTION "2.5.4.13"
   1012 #define szOID_SEARCH_GUIDE "2.5.4.14"
   1013 #define szOID_BUSINESS_CATEGORY "2.5.4.15"
   1014 #define szOID_POSTAL_ADDRESS "2.5.4.16"
   1015 #define szOID_POSTAL_CODE "2.5.4.17"
   1016 #define szOID_POST_OFFICE_BOX "2.5.4.18"
   1017 #define szOID_PHYSICAL_DELIVERY_OFFICE_NAME "2.5.4.19"
   1018 #define szOID_TELEPHONE_NUMBER "2.5.4.20"
   1019 #define szOID_TELEX_NUMBER "2.5.4.21"
   1020 #define szOID_TELETEXT_TERMINAL_IDENTIFIER "2.5.4.22"
   1021 #define szOID_FACSIMILE_TELEPHONE_NUMBER "2.5.4.23"
   1022 #define szOID_X21_ADDRESS "2.5.4.24"
   1023 #define szOID_INTERNATIONAL_ISDN_NUMBER "2.5.4.25"
   1024 #define szOID_REGISTERED_ADDRESS "2.5.4.26"
   1025 #define szOID_DESTINATION_INDICATOR "2.5.4.27"
   1026 #define szOID_PREFERRED_DELIVERY_METHOD "2.5.4.28"
   1027 #define szOID_PRESENTATION_ADDRESS "2.5.4.29"
   1028 #define szOID_SUPPORTED_APPLICATION_CONTEXT "2.5.4.30"
   1029 #define szOID_MEMBER "2.5.4.31"
   1030 #define szOID_OWNER "2.5.4.32"
   1031 #define szOID_ROLE_OCCUPANT "2.5.4.33"
   1032 #define szOID_SEE_ALSO "2.5.4.34"
   1033 #define szOID_USER_PASSWORD "2.5.4.35"
   1034 #define szOID_USER_CERTIFICATE "2.5.4.36"
   1035 #define szOID_CA_CERTIFICATE "2.5.4.37"
   1036 #define szOID_AUTHORITY_REVOCATION_LIST "2.5.4.38"
   1037 #define szOID_CERTIFICATE_REVOCATION_LIST "2.5.4.39"
   1038 #define szOID_CROSS_CERTIFICATE_PAIR "2.5.4.40"
   1039 #define szOID_GIVEN_NAME "2.5.4.42"
   1040 #define szOID_INITIALS "2.5.4.43"
   1041 #define szOID_DN_QUALIFIER "2.5.4.46"
   1042 
   1043 #define szOID_DOMAIN_COMPONENT "0.9.2342.19200300.100.1.25"
   1044 
   1045 #define szOID_PKCS_12_FRIENDLY_NAME_ATTR "1.2.840.113549.1.9.20"
   1046 #define szOID_PKCS_12_LOCAL_KEY_ID "1.2.840.113549.1.9.21"
   1047 #define szOID_PKCS_12_KEY_PROVIDER_NAME_ATTR "1.3.6.1.4.1.311.17.1"
   1048 #define szOID_LOCAL_MACHINE_KEYSET "1.3.6.1.4.1.311.17.2"
   1049 #define szOID_PKCS_12_EXTENDED_ATTRIBUTES "1.3.6.1.4.1.311.17.3"
   1050 #define szOID_PKCS_12_PROTECTED_PASSWORD_SECRET_BAG_TYPE_ID "1.3.6.1.4.1.311.17.4"
   1051 
   1052 #define szOID_KEYID_RDN "1.3.6.1.4.1.311.10.7.1"
   1053 
   1054 #define szOID_EV_RDN_LOCALE "1.3.6.1.4.1.311.60.2.1.1"
   1055 #define szOID_EV_RDN_STATE_OR_PROVINCE "1.3.6.1.4.1.311.60.2.1.2"
   1056 #define szOID_EV_RDN_COUNTRY "1.3.6.1.4.1.311.60.2.1.3"
   1057 
   1058 #define CERT_RDN_ANY_TYPE 0
   1059 #define CERT_RDN_ENCODED_BLOB 1
   1060 #define CERT_RDN_OCTET_STRING 2
   1061 #define CERT_RDN_NUMERIC_STRING 3
   1062 #define CERT_RDN_PRINTABLE_STRING 4
   1063 #define CERT_RDN_TELETEX_STRING 5
   1064 #define CERT_RDN_T61_STRING 5
   1065 #define CERT_RDN_VIDEOTEX_STRING 6
   1066 #define CERT_RDN_IA5_STRING 7
   1067 #define CERT_RDN_GRAPHIC_STRING 8
   1068 #define CERT_RDN_VISIBLE_STRING 9
   1069 #define CERT_RDN_ISO646_STRING 9
   1070 #define CERT_RDN_GENERAL_STRING 10
   1071 #define CERT_RDN_UNIVERSAL_STRING 11
   1072 #define CERT_RDN_INT4_STRING 11
   1073 #define CERT_RDN_BMP_STRING 12
   1074 #define CERT_RDN_UNICODE_STRING 12
   1075 #define CERT_RDN_UTF8_STRING 13
   1076 
   1077 #define CERT_RDN_TYPE_MASK 0x000000ff
   1078 #define CERT_RDN_FLAGS_MASK 0xff000000
   1079 
   1080 #define CERT_RDN_ENABLE_T61_UNICODE_FLAG 0x80000000
   1081 #define CERT_RDN_ENABLE_UTF8_UNICODE_FLAG 0x20000000
   1082 #define CERT_RDN_FORCE_UTF8_UNICODE_FLAG 0x10000000
   1083 #define CERT_RDN_DISABLE_CHECK_TYPE_FLAG 0x40000000
   1084 #define CERT_RDN_DISABLE_IE4_UTF8_FLAG 0x1000000
   1085 #define CERT_RDN_ENABLE_PUNYCODE_FLAG 0x2000000
   1086 
   1087 #define IS_CERT_RDN_CHAR_STRING(X) (((X) & CERT_RDN_TYPE_MASK) >= CERT_RDN_NUMERIC_STRING)
   1088 
   1089   typedef struct _CERT_RDN {
   1090     DWORD cRDNAttr;
   1091     PCERT_RDN_ATTR rgRDNAttr;
   1092   } CERT_RDN,*PCERT_RDN;
   1093 
   1094   typedef struct _CERT_NAME_INFO {
   1095     DWORD cRDN;
   1096     PCERT_RDN rgRDN;
   1097   } CERT_NAME_INFO,*PCERT_NAME_INFO;
   1098 
   1099   typedef struct _CERT_NAME_VALUE {
   1100     DWORD dwValueType;
   1101     CERT_RDN_VALUE_BLOB Value;
   1102   } CERT_NAME_VALUE,*PCERT_NAME_VALUE;
   1103 #endif
   1104 
   1105 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_APP)
   1106   typedef struct _CERT_PUBLIC_KEY_INFO {
   1107     CRYPT_ALGORITHM_IDENTIFIER Algorithm;
   1108     CRYPT_BIT_BLOB PublicKey;
   1109   } CERT_PUBLIC_KEY_INFO,*PCERT_PUBLIC_KEY_INFO;
   1110 #endif
   1111 
   1112 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
   1113 #define CERT_RSA_PUBLIC_KEY_OBJID szOID_RSA_RSA
   1114 #define CERT_DEFAULT_OID_PUBLIC_KEY_SIGN szOID_RSA_RSA
   1115 #define CERT_DEFAULT_OID_PUBLIC_KEY_XCHG szOID_RSA_RSA
   1116 
   1117   typedef struct _CRYPT_ECC_PRIVATE_KEY_INFO {
   1118     DWORD dwVersion;
   1119     CRYPT_DER_BLOB PrivateKey;
   1120     LPSTR szCurveOid;
   1121     CRYPT_BIT_BLOB PublicKey;
   1122   } CRYPT_ECC_PRIVATE_KEY_INFO,*PCRYPT_ECC_PRIVATE_KEY_INFO;
   1123 
   1124 #define CRYPT_ECC_PRIVATE_KEY_INFO_v1 1
   1125 
   1126   typedef struct _CRYPT_PRIVATE_KEY_INFO {
   1127     DWORD Version;
   1128     CRYPT_ALGORITHM_IDENTIFIER Algorithm;
   1129     CRYPT_DER_BLOB PrivateKey;
   1130     PCRYPT_ATTRIBUTES pAttributes;
   1131   } CRYPT_PRIVATE_KEY_INFO,*PCRYPT_PRIVATE_KEY_INFO;
   1132 
   1133   typedef struct _CRYPT_ENCRYPTED_PRIVATE_KEY_INFO {
   1134     CRYPT_ALGORITHM_IDENTIFIER EncryptionAlgorithm;
   1135     CRYPT_DATA_BLOB EncryptedPrivateKey;
   1136   } CRYPT_ENCRYPTED_PRIVATE_KEY_INFO,*PCRYPT_ENCRYPTED_PRIVATE_KEY_INFO;
   1137 
   1138   typedef WINBOOL (CALLBACK *PCRYPT_DECRYPT_PRIVATE_KEY_FUNC) (CRYPT_ALGORITHM_IDENTIFIER Algorithm, CRYPT_DATA_BLOB EncryptedPrivateKey, BYTE *pbClearTextKey, DWORD *pcbClearTextKey, LPVOID pVoidDecryptFunc);
   1139   typedef WINBOOL (CALLBACK *PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC) (CRYPT_ALGORITHM_IDENTIFIER *pAlgorithm, CRYPT_DATA_BLOB *pClearTextPrivateKey, BYTE *pbEncryptedKey, DWORD *pcbEncryptedKey, LPVOID pVoidEncryptFunc);
   1140   typedef WINBOOL (CALLBACK *PCRYPT_RESOLVE_HCRYPTPROV_FUNC) (CRYPT_PRIVATE_KEY_INFO *pPrivateKeyInfo, HCRYPTPROV *phCryptProv, LPVOID pVoidResolveFunc);
   1141 
   1142   typedef struct _CRYPT_PKCS8_IMPORT_PARAMS {
   1143     CRYPT_DIGEST_BLOB PrivateKey;
   1144     PCRYPT_RESOLVE_HCRYPTPROV_FUNC pResolvehCryptProvFunc;
   1145     LPVOID pVoidResolveFunc;
   1146     PCRYPT_DECRYPT_PRIVATE_KEY_FUNC pDecryptPrivateKeyFunc;
   1147     LPVOID pVoidDecryptFunc;
   1148   } CRYPT_PKCS8_IMPORT_PARAMS,*PCRYPT_PKCS8_IMPORT_PARAMS, CRYPT_PRIVATE_KEY_BLOB_AND_PARAMS,*PCRYPT_PRIVATE_KEY_BLOB_AND_PARAMS;
   1149 
   1150   typedef struct _CRYPT_PKCS8_EXPORT_PARAMS {
   1151     HCRYPTPROV hCryptProv;
   1152     DWORD dwKeySpec;
   1153     LPSTR pszPrivateKeyObjId;
   1154     PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC pEncryptPrivateKeyFunc;
   1155     LPVOID pVoidEncryptFunc;
   1156   } CRYPT_PKCS8_EXPORT_PARAMS,*PCRYPT_PKCS8_EXPORT_PARAMS;
   1157 #endif
   1158 
   1159 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_APP)
   1160   typedef struct _CERT_INFO {
   1161     DWORD dwVersion;
   1162     CRYPT_INTEGER_BLOB SerialNumber;
   1163     CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
   1164     CERT_NAME_BLOB Issuer;
   1165     FILETIME NotBefore;
   1166     FILETIME NotAfter;
   1167     CERT_NAME_BLOB Subject;
   1168     CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo;
   1169     CRYPT_BIT_BLOB IssuerUniqueId;
   1170     CRYPT_BIT_BLOB SubjectUniqueId;
   1171     DWORD cExtension;
   1172     PCERT_EXTENSION rgExtension;
   1173   } CERT_INFO,*PCERT_INFO;
   1174 #endif
   1175 
   1176 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
   1177 #define CERT_V1 0
   1178 #define CERT_V2 1
   1179 #define CERT_V3 2
   1180 
   1181 #define CERT_INFO_VERSION_FLAG 1
   1182 #define CERT_INFO_SERIAL_NUMBER_FLAG 2
   1183 #define CERT_INFO_SIGNATURE_ALGORITHM_FLAG 3
   1184 #define CERT_INFO_ISSUER_FLAG 4
   1185 #define CERT_INFO_NOT_BEFORE_FLAG 5
   1186 #define CERT_INFO_NOT_AFTER_FLAG 6
   1187 #define CERT_INFO_SUBJECT_FLAG 7
   1188 #define CERT_INFO_SUBJECT_PUBLIC_KEY_INFO_FLAG 8
   1189 #define CERT_INFO_ISSUER_UNIQUE_ID_FLAG 9
   1190 #define CERT_INFO_SUBJECT_UNIQUE_ID_FLAG 10
   1191 #define CERT_INFO_EXTENSION_FLAG 11
   1192 
   1193   typedef struct _CRL_ENTRY {
   1194     CRYPT_INTEGER_BLOB SerialNumber;
   1195     FILETIME RevocationDate;
   1196     DWORD cExtension;
   1197     PCERT_EXTENSION rgExtension;
   1198   } CRL_ENTRY,*PCRL_ENTRY;
   1199 
   1200   typedef struct _CRL_INFO {
   1201     DWORD dwVersion;
   1202     CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
   1203     CERT_NAME_BLOB Issuer;
   1204     FILETIME ThisUpdate;
   1205     FILETIME NextUpdate;
   1206     DWORD cCRLEntry;
   1207     PCRL_ENTRY rgCRLEntry;
   1208     DWORD cExtension;
   1209     PCERT_EXTENSION rgExtension;
   1210   } CRL_INFO,*PCRL_INFO;
   1211 
   1212 #define CRL_V1 0
   1213 #define CRL_V2 1
   1214 
   1215 #define CERT_BUNDLE_CERTIFICATE 0
   1216 #define CERT_BUNDLE_CRL 1
   1217 
   1218   typedef struct _CERT_OR_CRL_BLOB {
   1219     DWORD dwChoice;
   1220     DWORD cbEncoded;
   1221     BYTE *pbEncoded;
   1222   } CERT_OR_CRL_BLOB,*PCERT_OR_CRL_BLOB;
   1223 
   1224   typedef struct _CERT_OR_CRL_BUNDLE {
   1225     DWORD cItem;
   1226     PCERT_OR_CRL_BLOB rgItem;
   1227   } CERT_OR_CRL_BUNDLE,*PCERT_OR_CRL_BUNDLE;
   1228 
   1229   typedef struct _CERT_REQUEST_INFO {
   1230     DWORD dwVersion;
   1231     CERT_NAME_BLOB Subject;
   1232     CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo;
   1233     DWORD cAttribute;
   1234     PCRYPT_ATTRIBUTE rgAttribute;
   1235   } CERT_REQUEST_INFO,*PCERT_REQUEST_INFO;
   1236 
   1237 #define CERT_REQUEST_V1 0
   1238 
   1239   typedef struct _CERT_KEYGEN_REQUEST_INFO {
   1240     DWORD dwVersion;
   1241     CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo;
   1242     LPWSTR pwszChallengeString;
   1243   } CERT_KEYGEN_REQUEST_INFO,*PCERT_KEYGEN_REQUEST_INFO;
   1244 
   1245 #define CERT_KEYGEN_REQUEST_V1 0
   1246 
   1247   typedef struct _CERT_SIGNED_CONTENT_INFO {
   1248     CRYPT_DER_BLOB ToBeSigned;
   1249     CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
   1250     CRYPT_BIT_BLOB Signature;
   1251   } CERT_SIGNED_CONTENT_INFO,*PCERT_SIGNED_CONTENT_INFO;
   1252 
   1253   typedef struct _CTL_USAGE {
   1254     DWORD cUsageIdentifier;
   1255     LPSTR *rgpszUsageIdentifier;
   1256   } CTL_USAGE,*PCTL_USAGE,CERT_ENHKEY_USAGE,*PCERT_ENHKEY_USAGE;
   1257 
   1258   typedef const CTL_USAGE *PCCTL_USAGE;
   1259   typedef const CERT_ENHKEY_USAGE *PCCERT_ENHKEY_USAGE;
   1260 
   1261   typedef struct _CTL_ENTRY {
   1262     CRYPT_DATA_BLOB SubjectIdentifier;
   1263     DWORD cAttribute;
   1264     PCRYPT_ATTRIBUTE rgAttribute;
   1265   } CTL_ENTRY,*PCTL_ENTRY;
   1266 
   1267   typedef struct _CTL_INFO {
   1268     DWORD dwVersion;
   1269     CTL_USAGE SubjectUsage;
   1270     CRYPT_DATA_BLOB ListIdentifier;
   1271     CRYPT_INTEGER_BLOB SequenceNumber;
   1272     FILETIME ThisUpdate;
   1273     FILETIME NextUpdate;
   1274     CRYPT_ALGORITHM_IDENTIFIER SubjectAlgorithm;
   1275     DWORD cCTLEntry;
   1276     PCTL_ENTRY rgCTLEntry;
   1277     DWORD cExtension;
   1278     PCERT_EXTENSION rgExtension;
   1279   } CTL_INFO,*PCTL_INFO;
   1280 
   1281 #define CTL_V1 0
   1282 
   1283   typedef struct _CRYPT_TIME_STAMP_REQUEST_INFO {
   1284     LPSTR pszTimeStampAlgorithm;
   1285     LPSTR pszContentType;
   1286     CRYPT_OBJID_BLOB Content;
   1287     DWORD cAttribute;
   1288     PCRYPT_ATTRIBUTE rgAttribute;
   1289   } CRYPT_TIME_STAMP_REQUEST_INFO,*PCRYPT_TIME_STAMP_REQUEST_INFO;
   1290 
   1291   typedef struct _CRYPT_ENROLLMENT_NAME_VALUE_PAIR {
   1292     LPWSTR pwszName;
   1293     LPWSTR pwszValue;
   1294   } CRYPT_ENROLLMENT_NAME_VALUE_PAIR,*PCRYPT_ENROLLMENT_NAME_VALUE_PAIR;
   1295 
   1296   typedef struct _CRYPT_CSP_PROVIDER {
   1297     DWORD dwKeySpec;
   1298     LPWSTR pwszProviderName;
   1299     CRYPT_BIT_BLOB Signature;
   1300   } CRYPT_CSP_PROVIDER,*PCRYPT_CSP_PROVIDER;
   1301 
   1302 #define CERT_ENCODING_TYPE_MASK 0x0000ffff
   1303 #define CMSG_ENCODING_TYPE_MASK 0xffff0000
   1304 #define GET_CERT_ENCODING_TYPE(T) (T & CERT_ENCODING_TYPE_MASK)
   1305 #define GET_CMSG_ENCODING_TYPE(T) (T & CMSG_ENCODING_TYPE_MASK)
   1306 
   1307 #define CRYPT_ASN_ENCODING 0x1
   1308 #define CRYPT_NDR_ENCODING 0x2
   1309 #define X509_ASN_ENCODING 0x1
   1310 #define X509_NDR_ENCODING 0x2
   1311 #define PKCS_7_ASN_ENCODING 0x10000
   1312 #define PKCS_7_NDR_ENCODING 0x20000
   1313 
   1314   WINIMPM WINBOOL WINAPI CryptFormatObject (DWORD dwCertEncodingType, DWORD dwFormatType, DWORD dwFormatStrType, void *pFormatStruct, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, void *pbFormat, DWORD *pcbFormat);
   1315 
   1316 #define CRYPT_FORMAT_STR_MULTI_LINE 0x1
   1317 #define CRYPT_FORMAT_STR_NO_HEX 0x10
   1318 
   1319 #define CRYPT_FORMAT_SIMPLE 0x1
   1320 #define CRYPT_FORMAT_X509 0x2
   1321 #define CRYPT_FORMAT_OID 0x4
   1322 #define CRYPT_FORMAT_RDN_SEMICOLON 0x100
   1323 #define CRYPT_FORMAT_RDN_CRLF 0x200
   1324 #define CRYPT_FORMAT_RDN_UNQUOTE 0x400
   1325 #define CRYPT_FORMAT_RDN_REVERSE 0x800
   1326 #define CRYPT_FORMAT_COMMA 0x1000
   1327 #define CRYPT_FORMAT_SEMICOLON CRYPT_FORMAT_RDN_SEMICOLON
   1328 #define CRYPT_FORMAT_CRLF CRYPT_FORMAT_RDN_CRLF
   1329 
   1330   typedef LPVOID (WINAPI *PFN_CRYPT_ALLOC)(size_t cbSize);
   1331   typedef VOID (WINAPI *PFN_CRYPT_FREE)(LPVOID pv);
   1332 
   1333   typedef struct _CRYPT_ENCODE_PARA {
   1334     DWORD cbSize;
   1335     PFN_CRYPT_ALLOC pfnAlloc;
   1336     PFN_CRYPT_FREE pfnFree;
   1337   } CRYPT_ENCODE_PARA,*PCRYPT_ENCODE_PARA;
   1338 
   1339   WINIMPM WINBOOL WINAPI CryptEncodeObjectEx (DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, void *pvEncoded, DWORD *pcbEncoded);
   1340   WINIMPM WINBOOL WINAPI CryptEncodeObject (DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, BYTE *pbEncoded, DWORD *pcbEncoded);
   1341 
   1342 #define CRYPT_ENCODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG 0x8
   1343 #define CRYPT_ENCODE_ALLOC_FLAG 0x8000
   1344 #define CRYPT_UNICODE_NAME_ENCODE_ENABLE_T61_UNICODE_FLAG CERT_RDN_ENABLE_T61_UNICODE_FLAG
   1345 #define CRYPT_UNICODE_NAME_ENCODE_ENABLE_UTF8_UNICODE_FLAG CERT_RDN_ENABLE_UTF8_UNICODE_FLAG
   1346 #define CRYPT_UNICODE_NAME_ENCODE_FORCE_UTF8_UNICODE_FLAG CERT_RDN_FORCE_UTF8_UNICODE_FLAG
   1347 #define CRYPT_UNICODE_NAME_ENCODE_DISABLE_CHECK_TYPE_FLAG CERT_RDN_DISABLE_CHECK_TYPE_FLAG
   1348 #define CRYPT_SORTED_CTL_ENCODE_HASHED_SUBJECT_IDENTIFIER_FLAG 0x10000
   1349 #define CRYPT_ENCODE_ENABLE_PUNYCODE_FLAG 0x20000
   1350 #define CRYPT_ENCODE_ENABLE_UTF8PERCENT_FLAG 0x40000
   1351 #define CRYPT_ENCODE_ENABLE_IA5CONVERSION_FLAG (CRYPT_ENCODE_ENABLE_PUNYCODE_FLAG | CRYPT_ENCODE_ENABLE_UTF8PERCENT_FLAG)
   1352 
   1353   typedef struct _CRYPT_DECODE_PARA {
   1354     DWORD cbSize;
   1355     PFN_CRYPT_ALLOC pfnAlloc;
   1356     PFN_CRYPT_FREE pfnFree;
   1357   } CRYPT_DECODE_PARA,*PCRYPT_DECODE_PARA;
   1358 
   1359   WINIMPM WINBOOL WINAPI CryptDecodeObjectEx (DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo);
   1360   WINIMPM WINBOOL WINAPI CryptDecodeObject (DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo);
   1361 
   1362 #define CRYPT_DECODE_NOCOPY_FLAG 0x1
   1363 #define CRYPT_DECODE_TO_BE_SIGNED_FLAG 0x2
   1364 #define CRYPT_DECODE_SHARE_OID_STRING_FLAG 0x4
   1365 #define CRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG 0x8
   1366 #define CRYPT_DECODE_ALLOC_FLAG 0x8000
   1367 #define CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAG CERT_RDN_DISABLE_IE4_UTF8_FLAG
   1368 #define CRYPT_DECODE_ENABLE_PUNYCODE_FLAG 0x2000000
   1369 #define CRYPT_DECODE_ENABLE_UTF8PERCENT_FLAG 0x4000000
   1370 #define CRYPT_DECODE_ENABLE_IA5CONVERSION_FLAG (CRYPT_DECODE_ENABLE_PUNYCODE_FLAG | CRYPT_DECODE_ENABLE_UTF8PERCENT_FLAG)
   1371 
   1372 #define CRYPT_ENCODE_DECODE_NONE 0
   1373 #define X509_CERT ((LPCSTR) 1)
   1374 #define X509_CERT_TO_BE_SIGNED ((LPCSTR) 2)
   1375 #define X509_CERT_CRL_TO_BE_SIGNED ((LPCSTR) 3)
   1376 #define X509_CERT_REQUEST_TO_BE_SIGNED ((LPCSTR) 4)
   1377 #define X509_EXTENSIONS ((LPCSTR) 5)
   1378 #define X509_NAME_VALUE ((LPCSTR) 6)
   1379 #define X509_NAME ((LPCSTR) 7)
   1380 #define X509_PUBLIC_KEY_INFO ((LPCSTR) 8)
   1381 #define X509_AUTHORITY_KEY_ID ((LPCSTR) 9)
   1382 #define X509_KEY_ATTRIBUTES ((LPCSTR) 10)
   1383 #define X509_KEY_USAGE_RESTRICTION ((LPCSTR) 11)
   1384 #define X509_ALTERNATE_NAME ((LPCSTR) 12)
   1385 #define X509_BASIC_CONSTRAINTS ((LPCSTR) 13)
   1386 #define X509_KEY_USAGE ((LPCSTR) 14)
   1387 #define X509_BASIC_CONSTRAINTS2 ((LPCSTR) 15)
   1388 #define X509_CERT_POLICIES ((LPCSTR) 16)
   1389 #define PKCS_UTC_TIME ((LPCSTR) 17)
   1390 #define PKCS_TIME_REQUEST ((LPCSTR) 18)
   1391 #define RSA_CSP_PUBLICKEYBLOB ((LPCSTR) 19)
   1392 #define X509_UNICODE_NAME ((LPCSTR) 20)
   1393 #define X509_KEYGEN_REQUEST_TO_BE_SIGNED ((LPCSTR) 21)
   1394 #define PKCS_ATTRIBUTE ((LPCSTR) 22)
   1395 #define PKCS_CONTENT_INFO_SEQUENCE_OF_ANY ((LPCSTR) 23)
   1396 #define X509_UNICODE_NAME_VALUE ((LPCSTR) 24)
   1397 #define X509_ANY_STRING X509_NAME_VALUE
   1398 #define X509_UNICODE_ANY_STRING X509_UNICODE_NAME_VALUE
   1399 #define X509_OCTET_STRING ((LPCSTR) 25)
   1400 #define X509_BITS ((LPCSTR) 26)
   1401 #define X509_INTEGER ((LPCSTR) 27)
   1402 #define X509_MULTI_BYTE_INTEGER ((LPCSTR) 28)
   1403 #define X509_ENUMERATED ((LPCSTR) 29)
   1404 #define X509_CHOICE_OF_TIME ((LPCSTR) 30)
   1405 #define X509_AUTHORITY_KEY_ID2 ((LPCSTR) 31)
   1406 #define X509_AUTHORITY_INFO_ACCESS ((LPCSTR) 32)
   1407 #define X509_SUBJECT_INFO_ACCESS X509_AUTHORITY_INFO_ACCESS
   1408 #define X509_CRL_REASON_CODE X509_ENUMERATED
   1409 #define PKCS_CONTENT_INFO ((LPCSTR) 33)
   1410 #define X509_SEQUENCE_OF_ANY ((LPCSTR) 34)
   1411 #define X509_CRL_DIST_POINTS ((LPCSTR) 35)
   1412 #define X509_ENHANCED_KEY_USAGE ((LPCSTR) 36)
   1413 #define PKCS_CTL ((LPCSTR) 37)
   1414 #define X509_MULTI_BYTE_UINT ((LPCSTR) 38)
   1415 #define X509_DSS_PUBLICKEY X509_MULTI_BYTE_UINT
   1416 #define X509_DSS_PARAMETERS ((LPCSTR) 39)
   1417 #define X509_DSS_SIGNATURE ((LPCSTR) 40)
   1418 #define PKCS_RC2_CBC_PARAMETERS ((LPCSTR) 41)
   1419 #define PKCS_SMIME_CAPABILITIES ((LPCSTR) 42)
   1420 #define X509_QC_STATEMENTS_EXT ((LPCSTR) 42)
   1421 #define PKCS_RSA_PRIVATE_KEY ((LPCSTR) 43)
   1422 #define PKCS_PRIVATE_KEY_INFO ((LPCSTR) 44)
   1423 #define PKCS_ENCRYPTED_PRIVATE_KEY_INFO ((LPCSTR) 45)
   1424 #define X509_PKIX_POLICY_QUALIFIER_USERNOTICE ((LPCSTR) 46)
   1425 #define X509_DH_PUBLICKEY X509_MULTI_BYTE_UINT
   1426 #define X509_DH_PARAMETERS ((LPCSTR) 47)
   1427 #define X509_ECC_SIGNATURE ((LPCSTR) 47)
   1428 #define PKCS_ATTRIBUTES ((LPCSTR) 48)
   1429 #define PKCS_SORTED_CTL ((LPCSTR) 49)
   1430 #define X942_DH_PARAMETERS ((LPCSTR) 50)
   1431 #define X509_BITS_WITHOUT_TRAILING_ZEROES ((LPCSTR) 51)
   1432 #define X942_OTHER_INFO ((LPCSTR) 52)
   1433 #define X509_CERT_PAIR ((LPCSTR) 53)
   1434 #define X509_ISSUING_DIST_POINT ((LPCSTR) 54)
   1435 #define X509_NAME_CONSTRAINTS ((LPCSTR) 55)
   1436 #define X509_POLICY_MAPPINGS ((LPCSTR) 56)
   1437 #define X509_POLICY_CONSTRAINTS ((LPCSTR) 57)
   1438 #define X509_CROSS_CERT_DIST_POINTS ((LPCSTR) 58)
   1439 #define CMC_DATA ((LPCSTR) 59)
   1440 #define CMC_RESPONSE ((LPCSTR) 60)
   1441 #define CMC_STATUS ((LPCSTR) 61)
   1442 #define CMC_ADD_EXTENSIONS ((LPCSTR) 62)
   1443 #define CMC_ADD_ATTRIBUTES ((LPCSTR) 63)
   1444 #define X509_CERTIFICATE_TEMPLATE ((LPCSTR) 64)
   1445 #define OCSP_SIGNED_REQUEST ((LPCSTR) 65)
   1446 #define OCSP_REQUEST ((LPCSTR) 66)
   1447 #define OCSP_RESPONSE ((LPCSTR) 67)
   1448 #define OCSP_BASIC_SIGNED_RESPONSE ((LPCSTR) 68)
   1449 #define OCSP_BASIC_RESPONSE ((LPCSTR) 69)
   1450 #define X509_LOGOTYPE_EXT ((LPCSTR) 70)
   1451 #define X509_BIOMETRIC_EXT ((LPCSTR) 71)
   1452 #define CNG_RSA_PUBLIC_KEY_BLOB ((LPCSTR) 72)
   1453 #define X509_OBJECT_IDENTIFIER ((LPCSTR) 73)
   1454 #define X509_ALGORITHM_IDENTIFIER ((LPCSTR) 74)
   1455 #define PKCS_RSA_SSA_PSS_PARAMETERS ((LPCSTR) 75)
   1456 #define PKCS_RSAES_OAEP_PARAMETERS ((LPCSTR) 76)
   1457 #define ECC_CMS_SHARED_INFO ((LPCSTR) 77)
   1458 #define TIMESTAMP_REQUEST ((LPCSTR) 78)
   1459 #define TIMESTAMP_RESPONSE ((LPCSTR) 79)
   1460 #define TIMESTAMP_INFO ((LPCSTR) 80)
   1461 #define X509_CERT_BUNDLE ((LPCSTR) 81)
   1462 #define X509_ECC_PRIVATE_KEY ((LPCSTR) 82)
   1463 #define CNG_RSA_PRIVATE_KEY_BLOB ((LPCSTR) 83)
   1464 
   1465 #define PKCS7_SIGNER_INFO ((LPCSTR) 500)
   1466 #define CMS_SIGNER_INFO ((LPCSTR) 501)
   1467 
   1468 #define szOID_AUTHORITY_KEY_IDENTIFIER "2.5.29.1"
   1469 #define szOID_KEY_ATTRIBUTES "2.5.29.2"
   1470 #define szOID_CERT_POLICIES_95 "2.5.29.3"
   1471 #define szOID_KEY_USAGE_RESTRICTION "2.5.29.4"
   1472 #define szOID_SUBJECT_ALT_NAME "2.5.29.7"
   1473 #define szOID_ISSUER_ALT_NAME "2.5.29.8"
   1474 #define szOID_BASIC_CONSTRAINTS "2.5.29.10"
   1475 /* szOID_KEY_USAGE is defined incorrectly in msdn as 2.5.29.4 --
   1476    http://www.oid-info.com/get/2.5.29.15 RFC3280 */
   1477 #define szOID_KEY_USAGE "2.5.29.15"
   1478 #define szOID_PRIVATEKEY_USAGE_PERIOD "2.5.29.16"
   1479 #define szOID_BASIC_CONSTRAINTS2 "2.5.29.19"
   1480 
   1481 #define szOID_CERT_POLICIES "2.5.29.32"
   1482 #define szOID_ANY_CERT_POLICY "2.5.29.32.0"
   1483 #define szOID_INHIBIT_ANY_POLICY "2.5.29.54"
   1484 
   1485 #define szOID_AUTHORITY_KEY_IDENTIFIER2 "2.5.29.35"
   1486 #define szOID_SUBJECT_KEY_IDENTIFIER "2.5.29.14"
   1487 #define szOID_SUBJECT_ALT_NAME2 "2.5.29.17"
   1488 #define szOID_ISSUER_ALT_NAME2 "2.5.29.18"
   1489 #define szOID_CRL_REASON_CODE "2.5.29.21"
   1490 #define szOID_REASON_CODE_HOLD "2.5.29.23"
   1491 #define szOID_CRL_DIST_POINTS "2.5.29.31"
   1492 #define szOID_ENHANCED_KEY_USAGE "2.5.29.37"
   1493 
   1494 #define szOID_ANY_ENHANCED_KEY_USAGE "2.5.29.37.0"
   1495 
   1496 #define szOID_CRL_NUMBER "2.5.29.20"
   1497 
   1498 #define szOID_DELTA_CRL_INDICATOR "2.5.29.27"
   1499 #define szOID_ISSUING_DIST_POINT "2.5.29.28"
   1500 
   1501 #define szOID_FRESHEST_CRL "2.5.29.46"
   1502 #define szOID_NAME_CONSTRAINTS "2.5.29.30"
   1503 
   1504 #define szOID_POLICY_MAPPINGS "2.5.29.33"
   1505 #define szOID_LEGACY_POLICY_MAPPINGS "2.5.29.5"
   1506 #define szOID_POLICY_CONSTRAINTS "2.5.29.36"
   1507 
   1508 #define szOID_RENEWAL_CERTIFICATE "1.3.6.1.4.1.311.13.1"
   1509 #define szOID_ENROLLMENT_NAME_VALUE_PAIR "1.3.6.1.4.1.311.13.2.1"
   1510 #define szOID_ENROLLMENT_CSP_PROVIDER "1.3.6.1.4.1.311.13.2.2"
   1511 #define szOID_OS_VERSION "1.3.6.1.4.1.311.13.2.3"
   1512 
   1513 #define szOID_ENROLLMENT_AGENT "1.3.6.1.4.1.311.20.2.1"
   1514 
   1515 #define szOID_PKIX "1.3.6.1.5.5.7"
   1516 #define szOID_PKIX_PE "1.3.6.1.5.5.7.1"
   1517 #define szOID_AUTHORITY_INFO_ACCESS "1.3.6.1.5.5.7.1.1"
   1518 #define szOID_SUBJECT_INFO_ACCESS "1.3.6.1.5.5.7.1.11"
   1519 #define szOID_BIOMETRIC_EXT "1.3.6.1.5.5.7.1.2"
   1520 #define szOID_QC_STATEMENTS_EXT "1.3.6.1.5.5.7.1.3"
   1521 #define szOID_LOGOTYPE_EXT "1.3.6.1.5.5.7.1.12"
   1522 
   1523 #define szOID_CERT_EXTENSIONS "1.3.6.1.4.1.311.2.1.14"
   1524 #define szOID_NEXT_UPDATE_LOCATION "1.3.6.1.4.1.311.10.2"
   1525 #define szOID_REMOVE_CERTIFICATE "1.3.6.1.4.1.311.10.8.1"
   1526 #define szOID_CROSS_CERT_DIST_POINTS "1.3.6.1.4.1.311.10.9.1"
   1527 
   1528 #define szOID_CTL "1.3.6.1.4.1.311.10.1"
   1529 
   1530 #define szOID_SORTED_CTL "1.3.6.1.4.1.311.10.1.1"
   1531 
   1532 #ifndef szOID_SERIALIZED
   1533 #define szOID_SERIALIZED "1.3.6.1.4.1.311.10.3.3.1"
   1534 #endif
   1535 
   1536 #ifndef szOID_NT_PRINCIPAL_NAME
   1537 #define szOID_NT_PRINCIPAL_NAME "1.3.6.1.4.1.311.20.2.3"
   1538 #endif
   1539 
   1540 #ifndef szOID_INTERNATIONALIZED_EMAIL_ADDRESS
   1541 #define szOID_INTERNATIONALIZED_EMAIL_ADDRESS "1.3.6.1.4.1.311.20.2.4"
   1542 #endif
   1543 
   1544 #ifndef szOID_PRODUCT_UPDATE
   1545 #define szOID_PRODUCT_UPDATE "1.3.6.1.4.1.311.31.1"
   1546 #endif
   1547 
   1548 #define szOID_ANY_APPLICATION_POLICY "1.3.6.1.4.1.311.10.12.1"
   1549 
   1550 #define szOID_AUTO_ENROLL_CTL_USAGE "1.3.6.1.4.1.311.20.1"
   1551 
   1552 #define szOID_ENROLL_CERTTYPE_EXTENSION "1.3.6.1.4.1.311.20.2"
   1553 
   1554 #define szOID_CERT_MANIFOLD "1.3.6.1.4.1.311.20.3"
   1555 
   1556 #ifndef szOID_CERTSRV_CA_VERSION
   1557 #define szOID_CERTSRV_CA_VERSION "1.3.6.1.4.1.311.21.1"
   1558 #endif
   1559 #define szOID_CERTSRV_PREVIOUS_CERT_HASH "1.3.6.1.4.1.311.21.2"
   1560 #define szOID_CRL_VIRTUAL_BASE "1.3.6.1.4.1.311.21.3"
   1561 #define szOID_CRL_NEXT_PUBLISH "1.3.6.1.4.1.311.21.4"
   1562 #define szOID_KP_CA_EXCHANGE "1.3.6.1.4.1.311.21.5"
   1563 #define szOID_KP_KEY_RECOVERY_AGENT "1.3.6.1.4.1.311.21.6"
   1564 #define szOID_CERTIFICATE_TEMPLATE "1.3.6.1.4.1.311.21.7"
   1565 #define szOID_ENTERPRISE_OID_ROOT "1.3.6.1.4.1.311.21.8"
   1566 #define szOID_RDN_DUMMY_SIGNER "1.3.6.1.4.1.311.21.9"
   1567 #define szOID_APPLICATION_CERT_POLICIES "1.3.6.1.4.1.311.21.10"
   1568 #define szOID_APPLICATION_POLICY_MAPPINGS "1.3.6.1.4.1.311.21.11"
   1569 #define szOID_APPLICATION_POLICY_CONSTRAINTS "1.3.6.1.4.1.311.21.12"
   1570 #define szOID_ARCHIVED_KEY_ATTR "1.3.6.1.4.1.311.21.13"
   1571 #define szOID_CRL_SELF_CDP "1.3.6.1.4.1.311.21.14"
   1572 #define szOID_REQUIRE_CERT_CHAIN_POLICY "1.3.6.1.4.1.311.21.15"
   1573 #define szOID_ARCHIVED_KEY_CERT_HASH "1.3.6.1.4.1.311.21.16"
   1574 #define szOID_ISSUED_CERT_HASH "1.3.6.1.4.1.311.21.17"
   1575 #define szOID_DS_EMAIL_REPLICATION "1.3.6.1.4.1.311.21.19"
   1576 #define szOID_REQUEST_CLIENT_INFO "1.3.6.1.4.1.311.21.20"
   1577 #define szOID_ENCRYPTED_KEY_HASH "1.3.6.1.4.1.311.21.21"
   1578 #define szOID_CERTSRV_CROSSCA_VERSION "1.3.6.1.4.1.311.21.22"
   1579 
   1580 #define szOID_NTDS_REPLICATION "1.3.6.1.4.1.311.25.1"
   1581 
   1582 #define szOID_SUBJECT_DIR_ATTRS "2.5.29.9"
   1583 
   1584 #define szOID_PKIX_KP "1.3.6.1.5.5.7.3"
   1585 
   1586 #define szOID_PKIX_KP_SERVER_AUTH "1.3.6.1.5.5.7.3.1"
   1587 #define szOID_PKIX_KP_CLIENT_AUTH "1.3.6.1.5.5.7.3.2"
   1588 #define szOID_PKIX_KP_CODE_SIGNING "1.3.6.1.5.5.7.3.3"
   1589 #define szOID_PKIX_KP_EMAIL_PROTECTION "1.3.6.1.5.5.7.3.4"
   1590 #define szOID_PKIX_KP_IPSEC_END_SYSTEM "1.3.6.1.5.5.7.3.5"
   1591 #define szOID_PKIX_KP_IPSEC_TUNNEL "1.3.6.1.5.5.7.3.6"
   1592 #define szOID_PKIX_KP_IPSEC_USER "1.3.6.1.5.5.7.3.7"
   1593 #define szOID_PKIX_KP_TIMESTAMP_SIGNING "1.3.6.1.5.5.7.3.8"
   1594 #define szOID_PKIX_KP_OCSP_SIGNING "1.3.6.1.5.5.7.3.9"
   1595 
   1596 #define szOID_PKIX_OCSP_NONCE "1.3.6.1.5.5.7.48.1.2"
   1597 #define szOID_PKIX_OCSP_NOCHECK "1.3.6.1.5.5.7.48.1.5"
   1598 
   1599 #define szOID_IPSEC_KP_IKE_INTERMEDIATE "1.3.6.1.5.5.8.2.2"
   1600 
   1601 #define szOID_PKINIT_KP_KDC "1.3.6.1.5.2.3.5"
   1602 
   1603 #define szOID_KP_CTL_USAGE_SIGNING "1.3.6.1.4.1.311.10.3.1"
   1604 
   1605 #define szOID_KP_TIME_STAMP_SIGNING "1.3.6.1.4.1.311.10.3.2"
   1606 
   1607 #ifndef szOID_SERVER_GATED_CRYPTO
   1608 #define szOID_SERVER_GATED_CRYPTO "1.3.6.1.4.1.311.10.3.3"
   1609 #endif
   1610 
   1611 #ifndef szOID_SGC_NETSCAPE
   1612 #define szOID_SGC_NETSCAPE "2.16.840.1.113730.4.1"
   1613 #endif
   1614 
   1615 #define szOID_KP_EFS "1.3.6.1.4.1.311.10.3.4"
   1616 #define szOID_EFS_RECOVERY "1.3.6.1.4.1.311.10.3.4.1"
   1617 
   1618 #define szOID_WHQL_CRYPTO "1.3.6.1.4.1.311.10.3.5"
   1619 #define szOID_NT5_CRYPTO "1.3.6.1.4.1.311.10.3.6"
   1620 #define szOID_OEM_WHQL_CRYPTO "1.3.6.1.4.1.311.10.3.7"
   1621 #define szOID_EMBEDDED_NT_CRYPTO "1.3.6.1.4.1.311.10.3.8"
   1622 #define szOID_ROOT_LIST_SIGNER "1.3.6.1.4.1.311.10.3.9"
   1623 #define szOID_KP_QUALIFIED_SUBORDINATION "1.3.6.1.4.1.311.10.3.10"
   1624 #define szOID_KP_KEY_RECOVERY "1.3.6.1.4.1.311.10.3.11"
   1625 #define szOID_KP_DOCUMENT_SIGNING "1.3.6.1.4.1.311.10.3.12"
   1626 #define szOID_KP_LIFETIME_SIGNING "1.3.6.1.4.1.311.10.3.13"
   1627 #define szOID_KP_MOBILE_DEVICE_SOFTWARE "1.3.6.1.4.1.311.10.3.14"
   1628 #define szOID_KP_SMART_DISPLAY "1.3.6.1.4.1.311.10.3.15"
   1629 #define szOID_KP_CSP_SIGNATURE "1.3.6.1.4.1.311.10.3.16"
   1630 
   1631 #ifndef szOID_DRM
   1632 #define szOID_DRM "1.3.6.1.4.1.311.10.5.1"
   1633 #endif
   1634 
   1635 #ifndef szOID_DRM_INDIVIDUALIZATION
   1636 #define szOID_DRM_INDIVIDUALIZATION "1.3.6.1.4.1.311.10.5.2"
   1637 #endif
   1638 
   1639 #ifndef szOID_LICENSES
   1640 #define szOID_LICENSES "1.3.6.1.4.1.311.10.6.1"
   1641 #endif
   1642 
   1643 #ifndef szOID_LICENSE_SERVER
   1644 #define szOID_LICENSE_SERVER "1.3.6.1.4.1.311.10.6.2"
   1645 #endif
   1646 
   1647 #ifndef szOID_KP_SMARTCARD_LOGON
   1648 #define szOID_KP_SMARTCARD_LOGON "1.3.6.1.4.1.311.20.2.2"
   1649 #endif
   1650 
   1651 #define szOID_KP_KERNEL_MODE_CODE_SIGNING "1.3.6.1.4.1.311.61.1.1"
   1652 #define szOID_KP_KERNEL_MODE_TRUSTED_BOOT_SIGNING "1.3.6.1.4.1.311.61.4.1"
   1653 #define szOID_REVOKED_LIST_SIGNER "1.3.6.1.4.1.311.10.3.19"
   1654 #define szOID_DISALLOWED_LIST "1.3.6.1.4.1.311.10.3.30"
   1655 #define szOID_KP_KERNEL_MODE_HAL_EXTENSION_SIGNING "1.3.6.1.4.1.311.61.5.1"
   1656 #define szOID_YESNO_TRUST_ATTR "1.3.6.1.4.1.311.10.4.1"
   1657 
   1658 #define szOID_PKIX_POLICY_QUALIFIER_CPS "1.3.6.1.5.5.7.2.1"
   1659 #define szOID_PKIX_POLICY_QUALIFIER_USERNOTICE "1.3.6.1.5.5.7.2.2"
   1660 
   1661 #define szOID_ROOT_PROGRAM_FLAGS "1.3.6.1.4.1.311.60.1.1"
   1662 #define CERT_ROOT_PROGRAM_FLAG_ORG 0x80
   1663 #define CERT_ROOT_PROGRAM_FLAG_LSC 0x40
   1664 #define CERT_ROOT_PROGRAM_FLAG_SUBJECT_LOGO 0x20
   1665 #define CERT_ROOT_PROGRAM_FLAG_OU 0x10
   1666 #define CERT_ROOT_PROGRAM_FLAG_ADDRESS 0x08
   1667 
   1668 #define szOID_CERT_POLICIES_95_QUALIFIER1 "2.16.840.1.113733.1.7.1.1"
   1669 
   1670   typedef struct _CERT_EXTENSIONS {
   1671     DWORD cExtension;
   1672     PCERT_EXTENSION rgExtension;
   1673   } CERT_EXTENSIONS,*PCERT_EXTENSIONS;
   1674 
   1675 #define CERT_UNICODE_RDN_ERR_INDEX_MASK 0x3ff
   1676 #define CERT_UNICODE_RDN_ERR_INDEX_SHIFT 22
   1677 #define CERT_UNICODE_ATTR_ERR_INDEX_MASK 0x3f
   1678 #define CERT_UNICODE_ATTR_ERR_INDEX_SHIFT 16
   1679 #define CERT_UNICODE_VALUE_ERR_INDEX_MASK 0xffff
   1680 #define CERT_UNICODE_VALUE_ERR_INDEX_SHIFT 0
   1681 
   1682 #define GET_CERT_UNICODE_RDN_ERR_INDEX(X) ((X >> CERT_UNICODE_RDN_ERR_INDEX_SHIFT) &CERT_UNICODE_RDN_ERR_INDEX_MASK)
   1683 #define GET_CERT_UNICODE_ATTR_ERR_INDEX(X) ((X >> CERT_UNICODE_ATTR_ERR_INDEX_SHIFT) &CERT_UNICODE_ATTR_ERR_INDEX_MASK)
   1684 #define GET_CERT_UNICODE_VALUE_ERR_INDEX(X) (X &CERT_UNICODE_VALUE_ERR_INDEX_MASK)
   1685 
   1686   typedef struct _CERT_AUTHORITY_KEY_ID_INFO {
   1687     CRYPT_DATA_BLOB KeyId;
   1688     CERT_NAME_BLOB CertIssuer;
   1689     CRYPT_INTEGER_BLOB CertSerialNumber;
   1690   } CERT_AUTHORITY_KEY_ID_INFO,*PCERT_AUTHORITY_KEY_ID_INFO;
   1691 
   1692   typedef struct _CERT_PRIVATE_KEY_VALIDITY {
   1693     FILETIME NotBefore;
   1694     FILETIME NotAfter;
   1695   } CERT_PRIVATE_KEY_VALIDITY,*PCERT_PRIVATE_KEY_VALIDITY;
   1696 
   1697   typedef struct _CERT_KEY_ATTRIBUTES_INFO {
   1698     CRYPT_DATA_BLOB KeyId;
   1699     CRYPT_BIT_BLOB IntendedKeyUsage;
   1700     PCERT_PRIVATE_KEY_VALIDITY pPrivateKeyUsagePeriod;
   1701   } CERT_KEY_ATTRIBUTES_INFO,*PCERT_KEY_ATTRIBUTES_INFO;
   1702 
   1703 #define CERT_ENCIPHER_ONLY_KEY_USAGE 0x01
   1704 #define CERT_OFFLINE_CRL_SIGN_KEY_USAGE 0x02
   1705 #define CERT_KEY_CERT_SIGN_KEY_USAGE 0x04
   1706 #define CERT_KEY_AGREEMENT_KEY_USAGE 0x08
   1707 #define CERT_DATA_ENCIPHERMENT_KEY_USAGE 0x10
   1708 #define CERT_KEY_ENCIPHERMENT_KEY_USAGE 0x20
   1709 #define CERT_NON_REPUDIATION_KEY_USAGE 0x40
   1710 #define CERT_DIGITAL_SIGNATURE_KEY_USAGE 0x80
   1711 
   1712 #define CERT_DECIPHER_ONLY_KEY_USAGE 0x80
   1713 
   1714   typedef struct _CERT_POLICY_ID {
   1715     DWORD cCertPolicyElementId;
   1716     LPSTR *rgpszCertPolicyElementId;
   1717   } CERT_POLICY_ID,*PCERT_POLICY_ID;
   1718 
   1719   typedef struct _CERT_KEY_USAGE_RESTRICTION_INFO {
   1720     DWORD cCertPolicyId;
   1721     PCERT_POLICY_ID rgCertPolicyId;
   1722     CRYPT_BIT_BLOB RestrictedKeyUsage;
   1723   } CERT_KEY_USAGE_RESTRICTION_INFO,*PCERT_KEY_USAGE_RESTRICTION_INFO;
   1724 
   1725   typedef struct _CERT_OTHER_NAME {
   1726     LPSTR pszObjId;
   1727     CRYPT_OBJID_BLOB Value;
   1728   } CERT_OTHER_NAME,*PCERT_OTHER_NAME;
   1729 
   1730   typedef struct _CERT_ALT_NAME_ENTRY {
   1731     DWORD dwAltNameChoice;
   1732     __C89_NAMELESS union {
   1733       PCERT_OTHER_NAME pOtherName;
   1734       LPWSTR pwszRfc822Name;
   1735       LPWSTR pwszDNSName;
   1736       /* CERT_DATA_BLOB is not documented, and x400Address is documented
   1737        * to be not implemented; commented out to prevent compile errors
   1738        * see http://msdn.microsoft.com/en-us/library/aa377173.aspx for
   1739        * CERT_ALT_NAME_ENTRY documentation where this is specified.
   1740       CERT_DATA_BLOB x400Address;
   1741        */
   1742       CERT_NAME_BLOB DirectoryName;
   1743       /* pEdiPartyName is not implemented, either. see:
   1744        * http://msdn.microsoft.com/en-us/library/aa924681.aspx or
   1745        * http://msdn.microsoft.com/en-us/library/aa377173.aspx
   1746       LPWSTR pEdiPartyName;
   1747        */
   1748       LPWSTR pwszURL;
   1749       CRYPT_DATA_BLOB IPAddress;
   1750       LPSTR pszRegisteredID;
   1751     };
   1752   } CERT_ALT_NAME_ENTRY,*PCERT_ALT_NAME_ENTRY;
   1753 
   1754 #define CERT_ALT_NAME_OTHER_NAME 1
   1755 #define CERT_ALT_NAME_RFC822_NAME 2
   1756 #define CERT_ALT_NAME_DNS_NAME 3
   1757 #define CERT_ALT_NAME_X400_ADDRESS 4
   1758 #define CERT_ALT_NAME_DIRECTORY_NAME 5
   1759 #define CERT_ALT_NAME_EDI_PARTY_NAME 6
   1760 #define CERT_ALT_NAME_URL 7
   1761 #define CERT_ALT_NAME_IP_ADDRESS 8
   1762 #define CERT_ALT_NAME_REGISTERED_ID 9
   1763 
   1764   typedef struct _CERT_ALT_NAME_INFO {
   1765     DWORD cAltEntry;
   1766     PCERT_ALT_NAME_ENTRY rgAltEntry;
   1767   } CERT_ALT_NAME_INFO,*PCERT_ALT_NAME_INFO;
   1768 #define CERT_ALT_NAME_ENTRY_ERR_INDEX_MASK 0xff
   1769 #define CERT_ALT_NAME_ENTRY_ERR_INDEX_SHIFT 16
   1770 #define CERT_ALT_NAME_VALUE_ERR_INDEX_MASK 0x0000ffff
   1771 #define CERT_ALT_NAME_VALUE_ERR_INDEX_SHIFT 0
   1772 
   1773 #define GET_CERT_ALT_NAME_ENTRY_ERR_INDEX(X) ((X >> CERT_ALT_NAME_ENTRY_ERR_INDEX_SHIFT) &CERT_ALT_NAME_ENTRY_ERR_INDEX_MASK)
   1774 #define GET_CERT_ALT_NAME_VALUE_ERR_INDEX(X) (X &CERT_ALT_NAME_VALUE_ERR_INDEX_MASK)
   1775 
   1776   typedef struct _CERT_BASIC_CONSTRAINTS_INFO {
   1777     CRYPT_BIT_BLOB SubjectType;
   1778     WINBOOL fPathLenConstraint;
   1779     DWORD dwPathLenConstraint;
   1780     DWORD cSubtreesConstraint;
   1781     CERT_NAME_BLOB *rgSubtreesConstraint;
   1782   } CERT_BASIC_CONSTRAINTS_INFO, *PCERT_BASIC_CONSTRAINTS_INFO;
   1783 
   1784 #define CERT_CA_SUBJECT_FLAG 0x80
   1785 #define CERT_END_ENTITY_SUBJECT_FLAG 0x40
   1786 
   1787   typedef struct _CERT_BASIC_CONSTRAINTS2_INFO {
   1788     WINBOOL fCA;
   1789     WINBOOL fPathLenConstraint;
   1790     DWORD dwPathLenConstraint;
   1791   } CERT_BASIC_CONSTRAINTS2_INFO,*PCERT_BASIC_CONSTRAINTS2_INFO;
   1792 
   1793   typedef struct _CERT_POLICY_QUALIFIER_INFO {
   1794     LPSTR pszPolicyQualifierId;
   1795     CRYPT_OBJID_BLOB Qualifier;
   1796   } CERT_POLICY_QUALIFIER_INFO,*PCERT_POLICY_QUALIFIER_INFO;
   1797 
   1798   typedef struct _CERT_POLICY_INFO {
   1799     LPSTR pszPolicyIdentifier;
   1800     DWORD cPolicyQualifier;
   1801     CERT_POLICY_QUALIFIER_INFO *rgPolicyQualifier;
   1802   } CERT_POLICY_INFO,*PCERT_POLICY_INFO;
   1803 
   1804   typedef struct _CERT_POLICIES_INFO {
   1805     DWORD cPolicyInfo;
   1806     CERT_POLICY_INFO *rgPolicyInfo;
   1807   } CERT_POLICIES_INFO,*PCERT_POLICIES_INFO;
   1808 
   1809   typedef struct _CERT_POLICY_QUALIFIER_NOTICE_REFERENCE {
   1810     LPSTR pszOrganization;
   1811     DWORD cNoticeNumbers;
   1812     int *rgNoticeNumbers;
   1813   } CERT_POLICY_QUALIFIER_NOTICE_REFERENCE,*PCERT_POLICY_QUALIFIER_NOTICE_REFERENCE;
   1814 
   1815   typedef struct _CERT_POLICY_QUALIFIER_USER_NOTICE {
   1816     CERT_POLICY_QUALIFIER_NOTICE_REFERENCE *pNoticeReference;
   1817     LPWSTR pszDisplayText;
   1818   } CERT_POLICY_QUALIFIER_USER_NOTICE,*PCERT_POLICY_QUALIFIER_USER_NOTICE;
   1819 
   1820   typedef struct _CPS_URLS {
   1821     LPWSTR pszURL;
   1822     CRYPT_ALGORITHM_IDENTIFIER *pAlgorithm;
   1823     CRYPT_DATA_BLOB *pDigest;
   1824   } CPS_URLS,*PCPS_URLS;
   1825 
   1826   typedef struct _CERT_POLICY95_QUALIFIER1 {
   1827     LPWSTR pszPracticesReference;
   1828     LPSTR pszNoticeIdentifier;
   1829     LPSTR pszNSINoticeIdentifier;
   1830     DWORD cCPSURLs;
   1831     CPS_URLS *rgCPSURLs;
   1832   } CERT_POLICY95_QUALIFIER1,*PCERT_POLICY95_QUALIFIER1;
   1833 
   1834   typedef struct _CERT_POLICY_MAPPING {
   1835     LPSTR pszIssuerDomainPolicy;
   1836     LPSTR pszSubjectDomainPolicy;
   1837   } CERT_POLICY_MAPPING,*PCERT_POLICY_MAPPING;
   1838 
   1839   typedef struct _CERT_POLICY_MAPPINGS_INFO {
   1840     DWORD cPolicyMapping;
   1841     PCERT_POLICY_MAPPING rgPolicyMapping;
   1842   } CERT_POLICY_MAPPINGS_INFO,*PCERT_POLICY_MAPPINGS_INFO;
   1843 
   1844   typedef struct _CERT_POLICY_CONSTRAINTS_INFO {
   1845     WINBOOL fRequireExplicitPolicy;
   1846     DWORD dwRequireExplicitPolicySkipCerts;
   1847     WINBOOL fInhibitPolicyMapping;
   1848     DWORD dwInhibitPolicyMappingSkipCerts;
   1849   } CERT_POLICY_CONSTRAINTS_INFO,*PCERT_POLICY_CONSTRAINTS_INFO;
   1850 
   1851   typedef struct _CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY {
   1852     LPSTR pszObjId;
   1853     DWORD cValue;
   1854     PCRYPT_DER_BLOB rgValue;
   1855   } CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY,*PCRYPT_CONTENT_INFO_SEQUENCE_OF_ANY;
   1856 
   1857   typedef struct _CRYPT_CONTENT_INFO {
   1858     LPSTR pszObjId;
   1859     CRYPT_DER_BLOB Content;
   1860   } CRYPT_CONTENT_INFO,*PCRYPT_CONTENT_INFO;
   1861 
   1862   typedef struct _CRYPT_SEQUENCE_OF_ANY {
   1863     DWORD cValue;
   1864     PCRYPT_DER_BLOB rgValue;
   1865   } CRYPT_SEQUENCE_OF_ANY,*PCRYPT_SEQUENCE_OF_ANY;
   1866 
   1867   typedef struct _CERT_AUTHORITY_KEY_ID2_INFO {
   1868     CRYPT_DATA_BLOB KeyId;
   1869     CERT_ALT_NAME_INFO AuthorityCertIssuer;
   1870     CRYPT_INTEGER_BLOB AuthorityCertSerialNumber;
   1871   } CERT_AUTHORITY_KEY_ID2_INFO,*PCERT_AUTHORITY_KEY_ID2_INFO;
   1872 
   1873   typedef struct _CERT_ACCESS_DESCRIPTION {
   1874     LPSTR pszAccessMethod;
   1875     CERT_ALT_NAME_ENTRY AccessLocation;
   1876   } CERT_ACCESS_DESCRIPTION,*PCERT_ACCESS_DESCRIPTION;
   1877 
   1878   typedef struct _CERT_AUTHORITY_INFO_ACCESS {
   1879     DWORD cAccDescr;
   1880     PCERT_ACCESS_DESCRIPTION rgAccDescr;
   1881   } CERT_AUTHORITY_INFO_ACCESS,*PCERT_AUTHORITY_INFO_ACCESS;
   1882 
   1883   typedef CERT_AUTHORITY_INFO_ACCESS CERT_SUBJECT_INFO_ACCESS,*PCERT_SUBJECT_INFO_ACCESS;
   1884 
   1885 #define szOID_PKIX_ACC_DESCR "1.3.6.1.5.5.7.48"
   1886 #define szOID_PKIX_OCSP "1.3.6.1.5.5.7.48.1"
   1887 #define szOID_PKIX_CA_ISSUERS "1.3.6.1.5.5.7.48.2"
   1888 #define szOID_PKIX_TIME_STAMPING "1.3.6.1.5.5.7.48.3"
   1889 #define szOID_PKIX_CA_REPOSITORY "1.3.6.1.5.5.7.48.5"
   1890 
   1891 #define CRL_REASON_UNSPECIFIED 0
   1892 #define CRL_REASON_KEY_COMPROMISE 1
   1893 #define CRL_REASON_CA_COMPROMISE 2
   1894 #define CRL_REASON_AFFILIATION_CHANGED 3
   1895 #define CRL_REASON_SUPERSEDED 4
   1896 #define CRL_REASON_CESSATION_OF_OPERATION 5
   1897 #define CRL_REASON_CERTIFICATE_HOLD 6
   1898 #define CRL_REASON_REMOVE_FROM_CRL 8
   1899 
   1900   typedef struct _CRL_DIST_POINT_NAME {
   1901     DWORD dwDistPointNameChoice;
   1902     __C89_NAMELESS union {
   1903       CERT_ALT_NAME_INFO FullName;
   1904     };
   1905   } CRL_DIST_POINT_NAME,*PCRL_DIST_POINT_NAME;
   1906 
   1907 #define CRL_DIST_POINT_NO_NAME 0
   1908 #define CRL_DIST_POINT_FULL_NAME 1
   1909 #define CRL_DIST_POINT_ISSUER_RDN_NAME 2
   1910 
   1911   typedef struct _CRL_DIST_POINT {
   1912     CRL_DIST_POINT_NAME DistPointName;
   1913     CRYPT_BIT_BLOB ReasonFlags;
   1914     CERT_ALT_NAME_INFO CRLIssuer;
   1915   } CRL_DIST_POINT,*PCRL_DIST_POINT;
   1916 
   1917 #define CRL_REASON_UNUSED_FLAG 0x80
   1918 #define CRL_REASON_KEY_COMPROMISE_FLAG 0x40
   1919 #define CRL_REASON_CA_COMPROMISE_FLAG 0x20
   1920 #define CRL_REASON_AFFILIATION_CHANGED_FLAG 0x10
   1921 #define CRL_REASON_SUPERSEDED_FLAG 0x08
   1922 #define CRL_REASON_CESSATION_OF_OPERATION_FLAG 0x04
   1923 #define CRL_REASON_CERTIFICATE_HOLD_FLAG 0x02
   1924 
   1925   typedef struct _CRL_DIST_POINTS_INFO {
   1926     DWORD cDistPoint;
   1927     PCRL_DIST_POINT rgDistPoint;
   1928   } CRL_DIST_POINTS_INFO,*PCRL_DIST_POINTS_INFO;
   1929 
   1930 #define CRL_DIST_POINT_ERR_INDEX_MASK 0x7f
   1931 #define CRL_DIST_POINT_ERR_INDEX_SHIFT 24
   1932 #define GET_CRL_DIST_POINT_ERR_INDEX(X) ((X >> CRL_DIST_POINT_ERR_INDEX_SHIFT) &CRL_DIST_POINT_ERR_INDEX_MASK)
   1933 
   1934 #define CRL_DIST_POINT_ERR_CRL_ISSUER_BIT __MSABI_LONG(0x80000000)
   1935 #define IS_CRL_DIST_POINT_ERR_CRL_ISSUER(X) (0 != (X & CRL_DIST_POINT_ERR_CRL_ISSUER_BIT))
   1936 
   1937   typedef struct _CROSS_CERT_DIST_POINTS_INFO {
   1938     DWORD dwSyncDeltaTime;
   1939     DWORD cDistPoint;
   1940     PCERT_ALT_NAME_INFO rgDistPoint;
   1941   } CROSS_CERT_DIST_POINTS_INFO,*PCROSS_CERT_DIST_POINTS_INFO;
   1942 
   1943 #define CROSS_CERT_DIST_POINT_ERR_INDEX_MASK 0xff
   1944 #define CROSS_CERT_DIST_POINT_ERR_INDEX_SHIFT 24
   1945 #define GET_CROSS_CERT_DIST_POINT_ERR_INDEX(X) ((X >> CROSS_CERT_DIST_POINT_ERR_INDEX_SHIFT) &CROSS_CERT_DIST_POINT_ERR_INDEX_MASK)
   1946 
   1947   typedef struct _CERT_PAIR {
   1948     CERT_BLOB Forward;
   1949     CERT_BLOB Reverse;
   1950   } CERT_PAIR,*PCERT_PAIR;
   1951 
   1952   typedef struct _CRL_ISSUING_DIST_POINT {
   1953     CRL_DIST_POINT_NAME DistPointName;
   1954     WINBOOL fOnlyContainsUserCerts;
   1955     WINBOOL fOnlyContainsCACerts;
   1956     CRYPT_BIT_BLOB OnlySomeReasonFlags;
   1957     WINBOOL fIndirectCRL;
   1958   } CRL_ISSUING_DIST_POINT,*PCRL_ISSUING_DIST_POINT;
   1959 
   1960   typedef struct _CERT_GENERAL_SUBTREE {
   1961     CERT_ALT_NAME_ENTRY Base;
   1962     DWORD dwMinimum;
   1963     WINBOOL fMaximum;
   1964     DWORD dwMaximum;
   1965   } CERT_GENERAL_SUBTREE,*PCERT_GENERAL_SUBTREE;
   1966 
   1967   typedef struct _CERT_NAME_CONSTRAINTS_INFO {
   1968     DWORD cPermittedSubtree;
   1969     PCERT_GENERAL_SUBTREE rgPermittedSubtree;
   1970     DWORD cExcludedSubtree;
   1971     PCERT_GENERAL_SUBTREE rgExcludedSubtree;
   1972   } CERT_NAME_CONSTRAINTS_INFO,*PCERT_NAME_CONSTRAINTS_INFO;
   1973 
   1974 #define CERT_EXCLUDED_SUBTREE_BIT __MSABI_LONG(0x80000000)
   1975 #define IS_CERT_EXCLUDED_SUBTREE(X) (0!=(X & CERT_EXCLUDED_SUBTREE_BIT))
   1976 
   1977 #define SORTED_CTL_EXT_FLAGS_OFFSET (0)
   1978 #define SORTED_CTL_EXT_COUNT_OFFSET (4)
   1979 #define SORTED_CTL_EXT_MAX_COLLISION_OFFSET (8)
   1980 #define SORTED_CTL_EXT_HASH_BUCKET_OFFSET (12)
   1981 
   1982 #define SORTED_CTL_EXT_HASHED_SUBJECT_IDENTIFIER_FLAG 0x1
   1983 
   1984   typedef struct _CERT_DSS_PARAMETERS {
   1985     CRYPT_UINT_BLOB p;
   1986     CRYPT_UINT_BLOB q;
   1987     CRYPT_UINT_BLOB g;
   1988   } CERT_DSS_PARAMETERS,*PCERT_DSS_PARAMETERS;
   1989 
   1990 #define CERT_DSS_R_LEN 20
   1991 #define CERT_DSS_S_LEN 20
   1992 #define CERT_DSS_SIGNATURE_LEN (CERT_DSS_R_LEN + CERT_DSS_S_LEN)
   1993 
   1994 #define CERT_MAX_ASN_ENCODED_DSS_SIGNATURE_LEN (48)
   1995 
   1996   typedef struct _CERT_DH_PARAMETERS {
   1997     CRYPT_UINT_BLOB p;
   1998     CRYPT_UINT_BLOB g;
   1999   } CERT_DH_PARAMETERS,*PCERT_DH_PARAMETERS;
   2000 
   2001   typedef struct _CERT_ECC_SIGNATURE {
   2002     CRYPT_UINT_BLOB r;
   2003     CRYPT_UINT_BLOB s;
   2004   } CERT_ECC_SIGNATURE,*PCERT_ECC_SIGNATURE;
   2005 
   2006   typedef struct _CERT_X942_DH_VALIDATION_PARAMS {
   2007     CRYPT_BIT_BLOB seed;
   2008     DWORD pgenCounter;
   2009   } CERT_X942_DH_VALIDATION_PARAMS,*PCERT_X942_DH_VALIDATION_PARAMS;
   2010 
   2011   typedef struct _CERT_X942_DH_PARAMETERS {
   2012     CRYPT_UINT_BLOB p;
   2013     CRYPT_UINT_BLOB g;
   2014     CRYPT_UINT_BLOB q;
   2015     CRYPT_UINT_BLOB j;
   2016     PCERT_X942_DH_VALIDATION_PARAMS pValidationParams;
   2017   } CERT_X942_DH_PARAMETERS,*PCERT_X942_DH_PARAMETERS;
   2018 
   2019 #define CRYPT_X942_COUNTER_BYTE_LENGTH 4
   2020 #define CRYPT_X942_KEY_LENGTH_BYTE_LENGTH 4
   2021 #define CRYPT_X942_PUB_INFO_BYTE_LENGTH (512/8)
   2022 
   2023   typedef struct _CRYPT_X942_OTHER_INFO {
   2024     LPSTR pszContentEncryptionObjId;
   2025     BYTE rgbCounter[CRYPT_X942_COUNTER_BYTE_LENGTH];
   2026     BYTE rgbKeyLength[CRYPT_X942_KEY_LENGTH_BYTE_LENGTH];
   2027     CRYPT_DATA_BLOB PubInfo;
   2028   } CRYPT_X942_OTHER_INFO,*PCRYPT_X942_OTHER_INFO;
   2029 
   2030 #define CRYPT_ECC_CMS_SHARED_INFO_SUPPPUBINFO_BYTE_LENGTH 4
   2031 
   2032   typedef struct _CRYPT_ECC_CMS_SHARED_INFO {
   2033     CRYPT_ALGORITHM_IDENTIFIER Algorithm;
   2034     CRYPT_DATA_BLOB EntityUInfo;
   2035     BYTE rgbSuppPubInfo[CRYPT_ECC_CMS_SHARED_INFO_SUPPPUBINFO_BYTE_LENGTH];
   2036   } CRYPT_ECC_CMS_SHARED_INFO,*PCRYPT_ECC_CMS_SHARED_INFO;
   2037 
   2038   typedef struct _CRYPT_RC2_CBC_PARAMETERS {
   2039     DWORD dwVersion;
   2040     WINBOOL fIV;
   2041     BYTE rgbIV[8];
   2042   } CRYPT_RC2_CBC_PARAMETERS,*PCRYPT_RC2_CBC_PARAMETERS;
   2043 
   2044 #define CRYPT_RC2_40BIT_VERSION 160
   2045 #define CRYPT_RC2_56BIT_VERSION 52
   2046 #define CRYPT_RC2_64BIT_VERSION 120
   2047 #define CRYPT_RC2_128BIT_VERSION 58
   2048 
   2049   typedef struct _CRYPT_SMIME_CAPABILITY {
   2050     LPSTR pszObjId;
   2051     CRYPT_OBJID_BLOB Parameters;
   2052   } CRYPT_SMIME_CAPABILITY,*PCRYPT_SMIME_CAPABILITY;
   2053 
   2054   typedef struct _CRYPT_SMIME_CAPABILITIES {
   2055     DWORD cCapability;
   2056     PCRYPT_SMIME_CAPABILITY rgCapability;
   2057   } CRYPT_SMIME_CAPABILITIES,*PCRYPT_SMIME_CAPABILITIES;
   2058 
   2059   typedef struct _CERT_QC_STATEMENT {
   2060     LPSTR pszStatementId;
   2061     CRYPT_OBJID_BLOB StatementInfo;
   2062   } CERT_QC_STATEMENT,*PCERT_QC_STATEMENT;
   2063 
   2064   typedef struct _CERT_QC_STATEMENTS_EXT_INFO {
   2065     DWORD cStatement;
   2066     PCERT_QC_STATEMENT rgStatement;
   2067   } CERT_QC_STATEMENTS_EXT_INFO,*PCERT_QC_STATEMENTS_EXT_INFO;
   2068 
   2069 #define szOID_QC_EU_COMPLIANCE "0.4.0.1862.1.1"
   2070 #define szOID_QC_SSCD "0.4.0.1862.1.4"
   2071 
   2072   typedef struct _CRYPT_MASK_GEN_ALGORITHM {
   2073     LPSTR pszObjId;
   2074     CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
   2075   } CRYPT_MASK_GEN_ALGORITHM,*PCRYPT_MASK_GEN_ALGORITHM;
   2076 
   2077   typedef struct _CRYPT_RSA_SSA_PSS_PARAMETERS {
   2078     CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
   2079     CRYPT_MASK_GEN_ALGORITHM MaskGenAlgorithm;
   2080     DWORD dwSaltLength;
   2081     DWORD dwTrailerField;
   2082   } CRYPT_RSA_SSA_PSS_PARAMETERS,*PCRYPT_RSA_SSA_PSS_PARAMETERS;
   2083 
   2084 #define PKCS_RSA_SSA_PSS_TRAILER_FIELD_BC 1
   2085 
   2086   typedef struct _CRYPT_PSOURCE_ALGORITHM {
   2087     LPSTR pszObjId;
   2088     CRYPT_DATA_BLOB EncodingParameters;
   2089   } CRYPT_PSOURCE_ALGORITHM,*PCRYPT_PSOURCE_ALGORITHM;
   2090 
   2091   typedef struct _CRYPT_RSAES_OAEP_PARAMETERS {
   2092     CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
   2093     CRYPT_MASK_GEN_ALGORITHM MaskGenAlgorithm;
   2094     CRYPT_PSOURCE_ALGORITHM PSourceAlgorithm;
   2095   } CRYPT_RSAES_OAEP_PARAMETERS,*PCRYPT_RSAES_OAEP_PARAMETERS;
   2096 
   2097 #define szOID_VERISIGN_PRIVATE_6_9 "2.16.840.1.113733.1.6.9"
   2098 #define szOID_VERISIGN_ONSITE_JURISDICTION_HASH "2.16.840.1.113733.1.6.11"
   2099 #define szOID_VERISIGN_BITSTRING_6_13 "2.16.840.1.113733.1.6.13"
   2100 
   2101 #define szOID_VERISIGN_ISS_STRONG_CRYPTO "2.16.840.1.113733.1.8.1"
   2102 
   2103 #define szOID_NETSCAPE "2.16.840.1.113730"
   2104 #define szOID_NETSCAPE_CERT_EXTENSION "2.16.840.1.113730.1"
   2105 #define szOID_NETSCAPE_CERT_TYPE "2.16.840.1.113730.1.1"
   2106 #define szOID_NETSCAPE_BASE_URL "2.16.840.1.113730.1.2"
   2107 #define szOID_NETSCAPE_REVOCATION_URL "2.16.840.1.113730.1.3"
   2108 #define szOID_NETSCAPE_CA_REVOCATION_URL "2.16.840.1.113730.1.4"
   2109 #define szOID_NETSCAPE_CERT_RENEWAL_URL "2.16.840.1.113730.1.7"
   2110 #define szOID_NETSCAPE_CA_POLICY_URL "2.16.840.1.113730.1.8"
   2111 #define szOID_NETSCAPE_SSL_SERVER_NAME "2.16.840.1.113730.1.12"
   2112 #define szOID_NETSCAPE_COMMENT "2.16.840.1.113730.1.13"
   2113 
   2114 #define szOID_NETSCAPE_DATA_TYPE "2.16.840.1.113730.2"
   2115 #define szOID_NETSCAPE_CERT_SEQUENCE "2.16.840.1.113730.2.5"
   2116 
   2117 #define NETSCAPE_SIGN_CA_CERT_TYPE 0x01
   2118 #define NETSCAPE_SMIME_CA_CERT_TYPE 0x02
   2119 #define NETSCAPE_SSL_CA_CERT_TYPE 0x04
   2120 #define NETSCAPE_SIGN_CERT_TYPE 0x10
   2121 #define NETSCAPE_SMIME_CERT_TYPE 0x20
   2122 #define NETSCAPE_SSL_SERVER_AUTH_CERT_TYPE 0x40
   2123 #define NETSCAPE_SSL_CLIENT_AUTH_CERT_TYPE 0x80
   2124 
   2125 #define szOID_CT_PKI_DATA "1.3.6.1.5.5.7.12.2"
   2126 #define szOID_CT_PKI_RESPONSE "1.3.6.1.5.5.7.12.3"
   2127 
   2128 #define szOID_PKIX_NO_SIGNATURE "1.3.6.1.5.5.7.6.2"
   2129 
   2130 #define szOID_CMC "1.3.6.1.5.5.7.7"
   2131 #define szOID_CMC_STATUS_INFO "1.3.6.1.5.5.7.7.1"
   2132 #define szOID_CMC_IDENTIFICATION "1.3.6.1.5.5.7.7.2"
   2133 #define szOID_CMC_IDENTITY_PROOF "1.3.6.1.5.5.7.7.3"
   2134 #define szOID_CMC_DATA_RETURN "1.3.6.1.5.5.7.7.4"
   2135 #define szOID_CMC_TRANSACTION_ID "1.3.6.1.5.5.7.7.5"
   2136 #define szOID_CMC_SENDER_NONCE "1.3.6.1.5.5.7.7.6"
   2137 #define szOID_CMC_RECIPIENT_NONCE "1.3.6.1.5.5.7.7.7"
   2138 #define szOID_CMC_ADD_EXTENSIONS "1.3.6.1.5.5.7.7.8"
   2139 #define szOID_CMC_ENCRYPTED_POP "1.3.6.1.5.5.7.7.9"
   2140 #define szOID_CMC_DECRYPTED_POP "1.3.6.1.5.5.7.7.10"
   2141 #define szOID_CMC_LRA_POP_WITNESS "1.3.6.1.5.5.7.7.11"
   2142 #define szOID_CMC_GET_CERT "1.3.6.1.5.5.7.7.15"
   2143 #define szOID_CMC_GET_CRL "1.3.6.1.5.5.7.7.16"
   2144 #define szOID_CMC_REVOKE_REQUEST "1.3.6.1.5.5.7.7.17"
   2145 #define szOID_CMC_REG_INFO "1.3.6.1.5.5.7.7.18"
   2146 #define szOID_CMC_RESPONSE_INFO "1.3.6.1.5.5.7.7.19"
   2147 #define szOID_CMC_QUERY_PENDING "1.3.6.1.5.5.7.7.21"
   2148 #define szOID_CMC_ID_POP_LINK_RANDOM "1.3.6.1.5.5.7.7.22"
   2149 #define szOID_CMC_ID_POP_LINK_WITNESS "1.3.6.1.5.5.7.7.23"
   2150 #define szOID_CMC_ID_CONFIRM_CERT_ACCEPTANCE "1.3.6.1.5.5.7.7.24"
   2151 
   2152 #define szOID_CMC_ADD_ATTRIBUTES "1.3.6.1.4.1.311.10.10.1"
   2153 
   2154   typedef struct _CMC_TAGGED_ATTRIBUTE {
   2155     DWORD dwBodyPartID;
   2156     CRYPT_ATTRIBUTE Attribute;
   2157   } CMC_TAGGED_ATTRIBUTE,*PCMC_TAGGED_ATTRIBUTE;
   2158 
   2159   typedef struct _CMC_TAGGED_CERT_REQUEST {
   2160     DWORD dwBodyPartID;
   2161     CRYPT_DER_BLOB SignedCertRequest;
   2162   } CMC_TAGGED_CERT_REQUEST,*PCMC_TAGGED_CERT_REQUEST;
   2163 
   2164   typedef struct _CMC_TAGGED_REQUEST {
   2165     DWORD dwTaggedRequestChoice;
   2166     __C89_NAMELESS union {
   2167       PCMC_TAGGED_CERT_REQUEST pTaggedCertRequest;
   2168     };
   2169   } CMC_TAGGED_REQUEST,*PCMC_TAGGED_REQUEST;
   2170 
   2171 #define CMC_TAGGED_CERT_REQUEST_CHOICE 1
   2172 
   2173   typedef struct _CMC_TAGGED_CONTENT_INFO {
   2174     DWORD dwBodyPartID;
   2175     CRYPT_DER_BLOB EncodedContentInfo;
   2176   } CMC_TAGGED_CONTENT_INFO,*PCMC_TAGGED_CONTENT_INFO;
   2177 
   2178   typedef struct _CMC_TAGGED_OTHER_MSG {
   2179     DWORD dwBodyPartID;
   2180     LPSTR pszObjId;
   2181     CRYPT_OBJID_BLOB Value;
   2182   } CMC_TAGGED_OTHER_MSG,*PCMC_TAGGED_OTHER_MSG;
   2183 
   2184   typedef struct _CMC_DATA_INFO {
   2185     DWORD cTaggedAttribute;
   2186     PCMC_TAGGED_ATTRIBUTE rgTaggedAttribute;
   2187     DWORD cTaggedRequest;
   2188     PCMC_TAGGED_REQUEST rgTaggedRequest;
   2189     DWORD cTaggedContentInfo;
   2190     PCMC_TAGGED_CONTENT_INFO rgTaggedContentInfo;
   2191     DWORD cTaggedOtherMsg;
   2192     PCMC_TAGGED_OTHER_MSG rgTaggedOtherMsg;
   2193   } CMC_DATA_INFO,*PCMC_DATA_INFO;
   2194 
   2195   typedef struct _CMC_RESPONSE_INFO {
   2196     DWORD cTaggedAttribute;
   2197     PCMC_TAGGED_ATTRIBUTE rgTaggedAttribute;
   2198     DWORD cTaggedContentInfo;
   2199     PCMC_TAGGED_CONTENT_INFO rgTaggedContentInfo;
   2200     DWORD cTaggedOtherMsg;
   2201     PCMC_TAGGED_OTHER_MSG rgTaggedOtherMsg;
   2202   } CMC_RESPONSE_INFO,*PCMC_RESPONSE_INFO;
   2203 
   2204   typedef struct _CMC_PEND_INFO {
   2205     CRYPT_DATA_BLOB PendToken;
   2206     FILETIME PendTime;
   2207   } CMC_PEND_INFO,*PCMC_PEND_INFO;
   2208 
   2209   typedef struct _CMC_STATUS_INFO {
   2210     DWORD dwStatus;
   2211     DWORD cBodyList;
   2212     DWORD *rgdwBodyList;
   2213     LPWSTR pwszStatusString;
   2214     DWORD dwOtherInfoChoice;
   2215     __C89_NAMELESS union {
   2216       DWORD dwFailInfo;
   2217       PCMC_PEND_INFO pPendInfo;
   2218     };
   2219   } CMC_STATUS_INFO,*PCMC_STATUS_INFO;
   2220 
   2221 #define CMC_OTHER_INFO_NO_CHOICE 0
   2222 #define CMC_OTHER_INFO_FAIL_CHOICE 1
   2223 #define CMC_OTHER_INFO_PEND_CHOICE 2
   2224 
   2225 #define CMC_STATUS_SUCCESS 0
   2226 #define CMC_STATUS_FAILED 2
   2227 #define CMC_STATUS_PENDING 3
   2228 #define CMC_STATUS_NO_SUPPORT 4
   2229 #define CMC_STATUS_CONFIRM_REQUIRED 5
   2230 
   2231 #define CMC_FAIL_BAD_ALG 0
   2232 #define CMC_FAIL_BAD_MESSAGE_CHECK 1
   2233 #define CMC_FAIL_BAD_REQUEST 2
   2234 #define CMC_FAIL_BAD_TIME 3
   2235 #define CMC_FAIL_BAD_CERT_ID 4
   2236 #define CMC_FAIL_UNSUPORTED_EXT 5
   2237 #define CMC_FAIL_MUST_ARCHIVE_KEYS 6
   2238 #define CMC_FAIL_BAD_IDENTITY 7
   2239 #define CMC_FAIL_POP_REQUIRED 8
   2240 #define CMC_FAIL_POP_FAILED 9
   2241 #define CMC_FAIL_NO_KEY_REUSE 10
   2242 #define CMC_FAIL_INTERNAL_CA_ERROR 11
   2243 #define CMC_FAIL_TRY_LATER 12
   2244 
   2245   typedef struct _CMC_ADD_EXTENSIONS_INFO {
   2246     DWORD dwCmcDataReference;
   2247     DWORD cCertReference;
   2248     DWORD *rgdwCertReference;
   2249     DWORD cExtension;
   2250     PCERT_EXTENSION rgExtension;
   2251   } CMC_ADD_EXTENSIONS_INFO,*PCMC_ADD_EXTENSIONS_INFO;
   2252 
   2253   typedef struct _CMC_ADD_ATTRIBUTES_INFO {
   2254     DWORD dwCmcDataReference;
   2255     DWORD cCertReference;
   2256     DWORD *rgdwCertReference;
   2257     DWORD cAttribute;
   2258     PCRYPT_ATTRIBUTE rgAttribute;
   2259   } CMC_ADD_ATTRIBUTES_INFO,*PCMC_ADD_ATTRIBUTES_INFO;
   2260 
   2261   typedef struct _CERT_TEMPLATE_EXT {
   2262     LPSTR pszObjId;
   2263     DWORD dwMajorVersion;
   2264     WINBOOL fMinorVersion;
   2265     DWORD dwMinorVersion;
   2266   } CERT_TEMPLATE_EXT,*PCERT_TEMPLATE_EXT;
   2267 
   2268   typedef struct _CERT_HASHED_URL {
   2269     CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
   2270     CRYPT_HASH_BLOB Hash;
   2271     LPWSTR pwszUrl;
   2272   } CERT_HASHED_URL,*PCERT_HASHED_URL;
   2273 
   2274   typedef struct _CERT_LOGOTYPE_DETAILS {
   2275     LPWSTR pwszMimeType;
   2276     DWORD cHashedUrl;
   2277     PCERT_HASHED_URL rgHashedUrl;
   2278   } CERT_LOGOTYPE_DETAILS,*PCERT_LOGOTYPE_DETAILS;
   2279 
   2280   typedef struct _CERT_LOGOTYPE_REFERENCE {
   2281     DWORD cHashedUrl;
   2282     PCERT_HASHED_URL rgHashedUrl;
   2283   } CERT_LOGOTYPE_REFERENCE,*PCERT_LOGOTYPE_REFERENCE;
   2284 
   2285   typedef struct _CERT_LOGOTYPE_IMAGE_INFO {
   2286     DWORD dwLogotypeImageInfoChoice;
   2287     DWORD dwFileSize;
   2288     DWORD dwXSize;
   2289     DWORD dwYSize;
   2290     DWORD dwLogotypeImageResolutionChoice;
   2291     __C89_NAMELESS union {
   2292       DWORD dwNumBits;
   2293       DWORD dwTableSize;
   2294     };
   2295     LPWSTR pwszLanguage;
   2296   } CERT_LOGOTYPE_IMAGE_INFO,*PCERT_LOGOTYPE_IMAGE_INFO;
   2297 
   2298 #define CERT_LOGOTYPE_GRAY_SCALE_IMAGE_INFO_CHOICE 1
   2299 #define CERT_LOGOTYPE_COLOR_IMAGE_INFO_CHOICE 2
   2300 
   2301 #define CERT_LOGOTYPE_NO_IMAGE_RESOLUTION_CHOICE 0
   2302 #define CERT_LOGOTYPE_BITS_IMAGE_RESOLUTION_CHOICE 1
   2303 #define CERT_LOGOTYPE_TABLE_SIZE_IMAGE_RESOLUTION_CHOICE 2
   2304 
   2305   typedef struct _CERT_LOGOTYPE_IMAGE {
   2306     CERT_LOGOTYPE_DETAILS LogotypeDetails;
   2307     PCERT_LOGOTYPE_IMAGE_INFO pLogotypeImageInfo;
   2308   } CERT_LOGOTYPE_IMAGE,*PCERT_LOGOTYPE_IMAGE;
   2309 
   2310   typedef struct _CERT_LOGOTYPE_AUDIO_INFO {
   2311     DWORD dwFileSize;
   2312     DWORD dwPlayTime;
   2313     DWORD dwChannels;
   2314     DWORD dwSampleRate;
   2315     LPWSTR pwszLanguage;
   2316   } CERT_LOGOTYPE_AUDIO_INFO,*PCERT_LOGOTYPE_AUDIO_INFO;
   2317 
   2318   typedef struct _CERT_LOGOTYPE_AUDIO {
   2319     CERT_LOGOTYPE_DETAILS LogotypeDetails;
   2320     PCERT_LOGOTYPE_AUDIO_INFO pLogotypeAudioInfo;
   2321   } CERT_LOGOTYPE_AUDIO,*PCERT_LOGOTYPE_AUDIO;
   2322 
   2323   typedef struct _CERT_LOGOTYPE_DATA {
   2324     DWORD cLogotypeImage;
   2325     PCERT_LOGOTYPE_IMAGE rgLogotypeImage;
   2326     DWORD cLogotypeAudio;
   2327     PCERT_LOGOTYPE_AUDIO rgLogotypeAudio;
   2328   } CERT_LOGOTYPE_DATA,*PCERT_LOGOTYPE_DATA;
   2329 
   2330   typedef struct _CERT_LOGOTYPE_INFO {
   2331     DWORD dwLogotypeInfoChoice;
   2332     __C89_NAMELESS union {
   2333       PCERT_LOGOTYPE_DATA pLogotypeDirectInfo;
   2334       PCERT_LOGOTYPE_REFERENCE pLogotypeIndirectInfo;
   2335     };
   2336   } CERT_LOGOTYPE_INFO,*PCERT_LOGOTYPE_INFO;
   2337 
   2338 #define CERT_LOGOTYPE_DIRECT_INFO_CHOICE 1
   2339 #define CERT_LOGOTYPE_INDIRECT_INFO_CHOICE 2
   2340 
   2341   typedef struct _CERT_OTHER_LOGOTYPE_INFO {
   2342     LPSTR pszObjId;
   2343     CERT_LOGOTYPE_INFO LogotypeInfo;
   2344   } CERT_OTHER_LOGOTYPE_INFO,*PCERT_OTHER_LOGOTYPE_INFO;
   2345 
   2346 #define szOID_LOYALTY_OTHER_LOGOTYPE "1.3.6.1.5.5.7.20.1"
   2347 #define szOID_BACKGROUND_OTHER_LOGOTYPE "1.3.6.1.5.5.7.20.2"
   2348 
   2349   typedef struct _CERT_LOGOTYPE_EXT_INFO {
   2350     DWORD cCommunityLogo;
   2351     PCERT_LOGOTYPE_INFO rgCommunityLogo;
   2352     PCERT_LOGOTYPE_INFO pIssuerLogo;
   2353     PCERT_LOGOTYPE_INFO pSubjectLogo;
   2354     DWORD cOtherLogo;
   2355     PCERT_OTHER_LOGOTYPE_INFO rgOtherLogo;
   2356   } CERT_LOGOTYPE_EXT_INFO,*PCERT_LOGOTYPE_EXT_INFO;
   2357 
   2358   typedef struct _CERT_BIOMETRIC_DATA {
   2359     DWORD dwTypeOfBiometricDataChoice;
   2360     __C89_NAMELESS union {
   2361       DWORD dwPredefined;
   2362       LPSTR pszObjId;
   2363     };
   2364     CERT_HASHED_URL HashedUrl;
   2365   } CERT_BIOMETRIC_DATA,*PCERT_BIOMETRIC_DATA;
   2366 
   2367 #define CERT_BIOMETRIC_PREDEFINED_DATA_CHOICE 1
   2368 #define CERT_BIOMETRIC_OID_DATA_CHOICE 2
   2369 
   2370 #define CERT_BIOMETRIC_PICTURE_TYPE 0
   2371 #define CERT_BIOMETRIC_SIGNATURE_TYPE 1
   2372 
   2373   typedef struct _CERT_BIOMETRIC_EXT_INFO {
   2374     DWORD cBiometricData;
   2375     PCERT_BIOMETRIC_DATA rgBiometricData;
   2376   } CERT_BIOMETRIC_EXT_INFO,*PCERT_BIOMETRIC_EXT_INFO;
   2377 
   2378   typedef struct _OCSP_SIGNATURE_INFO {
   2379     CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
   2380     CRYPT_BIT_BLOB Signature;
   2381     DWORD cCertEncoded;
   2382     PCERT_BLOB rgCertEncoded;
   2383   } OCSP_SIGNATURE_INFO,*POCSP_SIGNATURE_INFO;
   2384 
   2385   typedef struct _OCSP_SIGNED_REQUEST_INFO {
   2386     CRYPT_DER_BLOB ToBeSigned;
   2387     POCSP_SIGNATURE_INFO pOptionalSignatureInfo;
   2388   } OCSP_SIGNED_REQUEST_INFO,*POCSP_SIGNED_REQUEST_INFO;
   2389 
   2390   typedef struct _OCSP_CERT_ID {
   2391     CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
   2392     CRYPT_HASH_BLOB IssuerNameHash;
   2393     CRYPT_HASH_BLOB IssuerKeyHash;
   2394     CRYPT_INTEGER_BLOB SerialNumber;
   2395   } OCSP_CERT_ID,*POCSP_CERT_ID;
   2396 
   2397   typedef struct _OCSP_REQUEST_ENTRY {
   2398     OCSP_CERT_ID CertId;
   2399     DWORD cExtension;
   2400     PCERT_EXTENSION rgExtension;
   2401   } OCSP_REQUEST_ENTRY,*POCSP_REQUEST_ENTRY;
   2402 
   2403   typedef struct _OCSP_REQUEST_INFO {
   2404     DWORD dwVersion;
   2405     PCERT_ALT_NAME_ENTRY pRequestorName;
   2406     DWORD cRequestEntry;
   2407     POCSP_REQUEST_ENTRY rgRequestEntry;
   2408     DWORD cExtension;
   2409     PCERT_EXTENSION rgExtension;
   2410   } OCSP_REQUEST_INFO,*POCSP_REQUEST_INFO;
   2411 
   2412 #define OCSP_REQUEST_V1 0
   2413 
   2414   typedef struct _OCSP_RESPONSE_INFO {
   2415     DWORD dwStatus;
   2416     LPSTR pszObjId;
   2417     CRYPT_OBJID_BLOB Value;
   2418   } OCSP_RESPONSE_INFO,*POCSP_RESPONSE_INFO;
   2419 
   2420 #define OCSP_SUCCESSFUL_RESPONSE 0
   2421 #define OCSP_MALFORMED_REQUEST_RESPONSE 1
   2422 #define OCSP_INTERNAL_ERROR_RESPONSE 2
   2423 #define OCSP_TRY_LATER_RESPONSE 3
   2424 #define OCSP_SIG_REQUIRED_RESPONSE 5
   2425 #define OCSP_UNAUTHORIZED_RESPONSE 6
   2426 
   2427 #define szOID_PKIX_OCSP_BASIC_SIGNED_RESPONSE "1.3.6.1.5.5.7.48.1.1"
   2428 
   2429   typedef struct _OCSP_BASIC_SIGNED_RESPONSE_INFO {
   2430     CRYPT_DER_BLOB ToBeSigned;
   2431     OCSP_SIGNATURE_INFO SignatureInfo;
   2432   } OCSP_BASIC_SIGNED_RESPONSE_INFO,*POCSP_BASIC_SIGNED_RESPONSE_INFO;
   2433 
   2434   typedef struct _OCSP_BASIC_REVOKED_INFO {
   2435     FILETIME RevocationDate;
   2436     DWORD dwCrlReasonCode;
   2437   } OCSP_BASIC_REVOKED_INFO,*POCSP_BASIC_REVOKED_INFO;
   2438 
   2439   typedef struct _OCSP_BASIC_RESPONSE_ENTRY {
   2440     OCSP_CERT_ID CertId;
   2441     DWORD dwCertStatus;
   2442     __C89_NAMELESS union {
   2443       POCSP_BASIC_REVOKED_INFO pRevokedInfo;
   2444     };
   2445     FILETIME ThisUpdate;
   2446     FILETIME NextUpdate;
   2447     DWORD cExtension;
   2448     PCERT_EXTENSION rgExtension;
   2449   } OCSP_BASIC_RESPONSE_ENTRY,*POCSP_BASIC_RESPONSE_ENTRY;
   2450 
   2451 #define OCSP_BASIC_GOOD_CERT_STATUS 0
   2452 #define OCSP_BASIC_REVOKED_CERT_STATUS 1
   2453 #define OCSP_BASIC_UNKNOWN_CERT_STATUS 2
   2454 
   2455   typedef struct _OCSP_BASIC_RESPONSE_INFO {
   2456     DWORD dwVersion;
   2457     DWORD dwResponderIdChoice;
   2458     __C89_NAMELESS union {
   2459       CERT_NAME_BLOB ByNameResponderId;
   2460       CRYPT_HASH_BLOB ByKeyResponderId;
   2461     };
   2462     FILETIME ProducedAt;
   2463     DWORD cResponseEntry;
   2464     POCSP_BASIC_RESPONSE_ENTRY rgResponseEntry;
   2465     DWORD cExtension;
   2466     PCERT_EXTENSION rgExtension;
   2467   } OCSP_BASIC_RESPONSE_INFO,*POCSP_BASIC_RESPONSE_INFO;
   2468 
   2469 #define OCSP_BASIC_RESPONSE_V1 0
   2470 #define OCSP_BASIC_BY_NAME_RESPONDER_ID 1
   2471 #define OCSP_BASIC_BY_KEY_RESPONDER_ID 2
   2472 
   2473   typedef void *HCRYPTOIDFUNCSET;
   2474   typedef void *HCRYPTOIDFUNCADDR;
   2475 
   2476 #define CRYPT_OID_ENCODE_OBJECT_FUNC "CryptDllEncodeObject"
   2477 #define CRYPT_OID_DECODE_OBJECT_FUNC "CryptDllDecodeObject"
   2478 #define CRYPT_OID_ENCODE_OBJECT_EX_FUNC "CryptDllEncodeObjectEx"
   2479 #define CRYPT_OID_DECODE_OBJECT_EX_FUNC "CryptDllDecodeObjectEx"
   2480 #define CRYPT_OID_CREATE_COM_OBJECT_FUNC "CryptDllCreateCOMObject"
   2481 #define CRYPT_OID_VERIFY_REVOCATION_FUNC "CertDllVerifyRevocation"
   2482 #define CRYPT_OID_VERIFY_CTL_USAGE_FUNC "CertDllVerifyCTLUsage"
   2483 #define CRYPT_OID_FORMAT_OBJECT_FUNC "CryptDllFormatObject"
   2484 #define CRYPT_OID_FIND_OID_INFO_FUNC "CryptDllFindOIDInfo"
   2485 #define CRYPT_OID_FIND_LOCALIZED_NAME_FUNC "CryptDllFindLocalizedName"
   2486 
   2487 #define CRYPT_OID_REGPATH "Software\\Microsoft\\Cryptography\\OID"
   2488 #define CRYPT_OID_REG_ENCODING_TYPE_PREFIX "EncodingType "
   2489 #define CRYPT_OID_REG_DLL_VALUE_NAME L"Dll"
   2490 #define CRYPT_OID_REG_FUNC_NAME_VALUE_NAME L"FuncName"
   2491 #define CRYPT_OID_REG_FUNC_NAME_VALUE_NAME_A "FuncName"
   2492 
   2493 #define CRYPT_OID_REG_FLAGS_VALUE_NAME L"CryptFlags"
   2494 
   2495 #define CRYPT_DEFAULT_OID "DEFAULT"
   2496 
   2497   typedef struct _CRYPT_OID_FUNC_ENTRY {
   2498     LPCSTR pszOID;
   2499     void *pvFuncAddr;
   2500   } CRYPT_OID_FUNC_ENTRY,*PCRYPT_OID_FUNC_ENTRY;
   2501 
   2502 #define CRYPT_INSTALL_OID_FUNC_BEFORE_FLAG 1
   2503 #define CRYPT_GET_INSTALLED_OID_FUNC_FLAG 0x1
   2504 
   2505 #define CRYPT_REGISTER_FIRST_INDEX 0
   2506 #define CRYPT_REGISTER_LAST_INDEX 0xffffffff
   2507 
   2508   WINIMPM WINBOOL WINAPI CryptInstallOIDFunctionAddress (HMODULE hModule, DWORD dwEncodingType, LPCSTR pszFuncName, DWORD cFuncEntry, const CRYPT_OID_FUNC_ENTRY rgFuncEntry[], DWORD dwFlags);
   2509   WINIMPM HCRYPTOIDFUNCSET WINAPI CryptInitOIDFunctionSet (LPCSTR pszFuncName, DWORD dwFlags);
   2510   WINIMPM WINBOOL WINAPI CryptGetOIDFunctionAddress (HCRYPTOIDFUNCSET hFuncSet, DWORD dwEncodingType, LPCSTR pszOID, DWORD dwFlags, void **ppvFuncAddr, HCRYPTOIDFUNCADDR *phFuncAddr);
   2511   WINIMPM WINBOOL WINAPI CryptGetDefaultOIDDllList (HCRYPTOIDFUNCSET hFuncSet, DWORD dwEncodingType, WCHAR *pwszDllList, DWORD *pcchDllList);
   2512   WINIMPM WINBOOL WINAPI CryptGetDefaultOIDFunctionAddress (HCRYPTOIDFUNCSET hFuncSet, DWORD dwEncodingType, LPCWSTR pwszDll, DWORD dwFlags, void **ppvFuncAddr, HCRYPTOIDFUNCADDR *phFuncAddr);
   2513   WINIMPM WINBOOL WINAPI CryptFreeOIDFunctionAddress (HCRYPTOIDFUNCADDR hFuncAddr, DWORD dwFlags);
   2514   WINIMPM WINBOOL WINAPI CryptRegisterOIDFunction (DWORD dwEncodingType, LPCSTR pszFuncName, LPCSTR pszOID, LPCWSTR pwszDll, LPCSTR pszOverrideFuncName);
   2515   WINIMPM WINBOOL WINAPI CryptUnregisterOIDFunction (DWORD dwEncodingType, LPCSTR pszFuncName, LPCSTR pszOID);
   2516   WINIMPM WINBOOL WINAPI CryptRegisterDefaultOIDFunction (DWORD dwEncodingType, LPCSTR pszFuncName, DWORD dwIndex, LPCWSTR pwszDll);
   2517   WINIMPM WINBOOL WINAPI CryptUnregisterDefaultOIDFunction (DWORD dwEncodingType, LPCSTR pszFuncName, LPCWSTR pwszDll);
   2518   WINIMPM WINBOOL WINAPI CryptSetOIDFunctionValue (DWORD dwEncodingType, LPCSTR pszFuncName, LPCSTR pszOID, LPCWSTR pwszValueName, DWORD dwValueType, const BYTE *pbValueData, DWORD cbValueData);
   2519   WINIMPM WINBOOL WINAPI CryptGetOIDFunctionValue (DWORD dwEncodingType, LPCSTR pszFuncName, LPCSTR pszOID, LPCWSTR pwszValueName, DWORD *pdwValueType, BYTE *pbValueData, DWORD *pcbValueData);
   2520 
   2521   typedef WINBOOL (WINAPI *PFN_CRYPT_ENUM_OID_FUNC) (DWORD dwEncodingType, LPCSTR pszFuncName, LPCSTR pszOID, DWORD cValue, const DWORD rgdwValueType[], LPCWSTR const rgpwszValueName[], const BYTE *const rgpbValueData[], const DWORD rgcbValueData[], void *pvArg);
   2522 
   2523   WINIMPM WINBOOL WINAPI CryptEnumOIDFunction (DWORD dwEncodingType, LPCSTR pszFuncName, LPCSTR pszOID, DWORD dwFlags, void *pvArg, PFN_CRYPT_ENUM_OID_FUNC pfnEnumOIDFunc);
   2524 
   2525 #define CRYPT_MATCH_ANY_ENCODING_TYPE 0xffffffff
   2526 #define CALG_OID_INFO_CNG_ONLY 0xffffffff
   2527 #define CALG_OID_INFO_PARAMETERS 0xfffffffe
   2528 #define IS_SPECIAL_OID_INFO_ALGID(Algid) (Algid >= CALG_OID_INFO_PARAMETERS)
   2529 
   2530 #define CRYPT_OID_INFO_HASH_PARAMETERS_ALGORITHM L"CryptOIDInfoHashParameters"
   2531 #define CRYPT_OID_INFO_ECC_PARAMETERS_ALGORITHM L"CryptOIDInfoECCParameters"
   2532 #define CRYPT_OID_INFO_MGF1_PARAMETERS_ALGORITHM L"CryptOIDInfoMgf1Parameters"
   2533 #define CRYPT_OID_INFO_NO_SIGN_ALGORITHM L"CryptOIDInfoNoSign"
   2534 #define CRYPT_OID_INFO_OAEP_PARAMETERS_ALGORITHM L"CryptOIDInfoOAEPParameters"
   2535 #define CRYPT_OID_INFO_ECC_WRAP_PARAMETERS_ALGORITHM L"CryptOIDInfoECCWrapParameters"
   2536 #define CRYPT_OID_INFO_NO_PARAMETERS_ALGORITHM L"CryptOIDInfoNoParameters"
   2537 
   2538   typedef struct _CRYPT_OID_INFO {
   2539     DWORD cbSize;
   2540     LPCSTR pszOID;
   2541     LPCWSTR pwszName;
   2542     DWORD dwGroupId;
   2543     __C89_NAMELESS union {
   2544       DWORD dwValue;
   2545       ALG_ID Algid;
   2546       DWORD dwLength;
   2547     };
   2548     CRYPT_DATA_BLOB ExtraInfo;
   2549 #ifdef CRYPT_OID_INFO_HAS_EXTRA_FIELDS
   2550     LPCWSTR pwszCNGAlgid;
   2551     LPCWSTR pwszCNGExtraAlgid;
   2552 #endif
   2553   } CRYPT_OID_INFO,*PCRYPT_OID_INFO;
   2554 
   2555   typedef const CRYPT_OID_INFO CCRYPT_OID_INFO,*PCCRYPT_OID_INFO;
   2556 
   2557 #define CRYPT_HASH_ALG_OID_GROUP_ID 1
   2558 #define CRYPT_ENCRYPT_ALG_OID_GROUP_ID 2
   2559 #define CRYPT_PUBKEY_ALG_OID_GROUP_ID 3
   2560 #define CRYPT_SIGN_ALG_OID_GROUP_ID 4
   2561 #define CRYPT_RDN_ATTR_OID_GROUP_ID 5
   2562 #define CRYPT_EXT_OR_ATTR_OID_GROUP_ID 6
   2563 #define CRYPT_ENHKEY_USAGE_OID_GROUP_ID 7
   2564 #define CRYPT_POLICY_OID_GROUP_ID 8
   2565 #define CRYPT_TEMPLATE_OID_GROUP_ID 9
   2566 #define CRYPT_KDF_OID_GROUP_ID 10
   2567 #define CRYPT_LAST_OID_GROUP_ID 10
   2568 
   2569 #define CRYPT_FIRST_ALG_OID_GROUP_ID CRYPT_HASH_ALG_OID_GROUP_ID
   2570 #define CRYPT_LAST_ALG_OID_GROUP_ID CRYPT_SIGN_ALG_OID_GROUP_ID
   2571 
   2572 #define CRYPT_OID_INHIBIT_SIGNATURE_FORMAT_FLAG 0x1
   2573 #define CRYPT_OID_USE_PUBKEY_PARA_FOR_PKCS7_FLAG 0x2
   2574 #define CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG 0x4
   2575 
   2576 #define CRYPT_OID_PUBKEY_ENCRYPT_ONLY_FLAG 0x40000000
   2577 #define CRYPT_OID_PUBKEY_SIGN_ONLY_FLAG 0x80000000
   2578 
   2579   WINIMPM PCCRYPT_OID_INFO WINAPI CryptFindOIDInfo (DWORD dwKeyType, void *pvKey, DWORD dwGroupId);
   2580 
   2581 #define CRYPT_OID_INFO_OID_KEY 1
   2582 #define CRYPT_OID_INFO_NAME_KEY 2
   2583 #define CRYPT_OID_INFO_ALGID_KEY 3
   2584 #define CRYPT_OID_INFO_SIGN_KEY 4
   2585 #define CRYPT_OID_INFO_CNG_ALGID_KEY 5
   2586 #define CRYPT_OID_INFO_CNG_SIGN_KEY 6
   2587 
   2588 #define CRYPT_OID_INFO_OID_KEY_FLAGS_MASK 0xffff0000
   2589 #define CRYPT_OID_INFO_PUBKEY_SIGN_KEY_FLAG 0x80000000
   2590 #define CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG 0x40000000
   2591 
   2592 #define CRYPT_OID_DISABLE_SEARCH_DS_FLAG 0x80000000
   2593 
   2594 #ifdef CRYPT_OID_INFO_HAS_EXTRA_FIELDS
   2595 #define CRYPT_OID_PREFER_CNG_ALGID_FLAG 0x40000000
   2596 #endif
   2597 
   2598 #define CRYPT_OID_INFO_OID_GROUP_BIT_LEN_MASK 0x0fff0000
   2599 #define CRYPT_OID_INFO_OID_GROUP_BIT_LEN_SHIFT 16
   2600 
   2601 #define CRYPT_INSTALL_OID_INFO_BEFORE_FLAG 1
   2602 
   2603   typedef WINBOOL (WINAPI *PFN_CRYPT_ENUM_OID_INFO) (PCCRYPT_OID_INFO pInfo, void *pvArg);
   2604 
   2605   WINIMPM WINBOOL WINAPI CryptRegisterOIDInfo (PCCRYPT_OID_INFO pInfo, DWORD dwFlags);
   2606   WINIMPM WINBOOL WINAPI CryptUnregisterOIDInfo (PCCRYPT_OID_INFO pInfo);
   2607   WINIMPM WINBOOL WINAPI CryptEnumOIDInfo (DWORD dwGroupId, DWORD dwFlags, void *pvArg, PFN_CRYPT_ENUM_OID_INFO pfnEnumOIDInfo);
   2608   WINIMPM LPCWSTR WINAPI CryptFindLocalizedName (LPCWSTR pwszCryptName);
   2609 
   2610 #define CRYPT_LOCALIZED_NAME_ENCODING_TYPE 0
   2611 #define CRYPT_LOCALIZED_NAME_OID "LocalizedNames"
   2612 
   2613 #define CERT_STRONG_SIGN_ECDSA_ALGORITHM L"ECDSA"
   2614 
   2615   typedef struct _CERT_STRONG_SIGN_SERIALIZED_INFO {
   2616     DWORD dwFlags;
   2617     LPWSTR pwszCNGSignHashAlgids;
   2618     LPWSTR pwszCNGPubKeyMinBitLengths;
   2619   } CERT_STRONG_SIGN_SERIALIZED_INFO,*PCERT_STRONG_SIGN_SERIALIZED_INFO;
   2620 
   2621   typedef struct _CERT_STRONG_SIGN_PARA {
   2622     DWORD cbSize;
   2623     DWORD dwInfoChoice;
   2624     __C89_NAMELESS union {
   2625       void *pvInfo;
   2626       PCERT_STRONG_SIGN_SERIALIZED_INFO pSerializedInfo;
   2627       LPSTR pszOID;
   2628     };
   2629   } CERT_STRONG_SIGN_PARA,*PCERT_STRONG_SIGN_PARA;
   2630 
   2631   typedef const CERT_STRONG_SIGN_PARA *PCCERT_STRONG_SIGN_PARA;
   2632 
   2633 #define CERT_STRONG_SIGN_SERIALIZED_INFO_CHOICE 1
   2634 #define CERT_STRONG_SIGN_OID_INFO_CHOICE 2
   2635 
   2636 #define CERT_STRONG_SIGN_ENABLE_CRL_CHECK 0x1
   2637 #define CERT_STRONG_SIGN_ENABLE_OCSP_CHECK 0x2
   2638 
   2639 #define szOID_CERT_STRONG_SIGN_OS_PREFIX "1.3.6.1.4.1.311.72.1."
   2640 
   2641 #define szOID_CERT_STRONG_SIGN_OS_1 "1.3.6.1.4.1.311.72.1.1"
   2642 #define szOID_CERT_STRONG_SIGN_OS_CURRENT szOID_CERT_STRONG_SIGN_OS_1
   2643 
   2644 #define CERT_STRONG_SIGN_PARA_OS_1 { sizeof (CERT_STRONG_SIGN_PARA), CERT_STRONG_SIGN_OID_INFO_CHOICE, szOID_CERT_STRONG_SIGN_OS_1 }
   2645 #define CERT_STRONG_SIGN_PARA_OS_CURRENT { sizeof (CERT_STRONG_SIGN_PARA), CERT_STRONG_SIGN_OID_INFO_CHOICE, szOID_CERT_STRONG_SIGN_OS_CURRENT }
   2646 
   2647 #define szOID_CERT_STRONG_KEY_OS_PREFIX "1.3.6.1.4.1.311.72.2."
   2648 #define szOID_CERT_STRONG_KEY_OS_1 "1.3.6.1.4.1.311.72.2.1"
   2649 #define szOID_CERT_STRONG_KEY_OS_CURRENT szOID_CERT_STRONG_KEY_OS_1
   2650 
   2651 #define CERT_STRONG_KEY_PARA_OS_1 { sizeof (CERT_STRONG_SIGN_PARA), CERT_STRONG_SIGN_OID_INFO_CHOICE, szOID_CERT_STRONG_KEY_OS_1 }
   2652 #define CERT_STRONG_KEY_PARA_OS_CURRENT { sizeof (CERT_STRONG_SIGN_PARA), CERT_STRONG_SIGN_OID_INFO_CHOICE, szOID_CERT_STRONG_KEY_OS_CURRENT }
   2653 
   2654   typedef void *HCRYPTMSG;
   2655 
   2656 #define szOID_PKCS_7_DATA "1.2.840.113549.1.7.1"
   2657 #define szOID_PKCS_7_SIGNED "1.2.840.113549.1.7.2"
   2658 #define szOID_PKCS_7_ENVELOPED "1.2.840.113549.1.7.3"
   2659 #define szOID_PKCS_7_SIGNEDANDENVELOPED "1.2.840.113549.1.7.4"
   2660 #define szOID_PKCS_7_DIGESTED "1.2.840.113549.1.7.5"
   2661 #define szOID_PKCS_7_ENCRYPTED "1.2.840.113549.1.7.6"
   2662 
   2663 #define szOID_PKCS_9_CONTENT_TYPE "1.2.840.113549.1.9.3"
   2664 #define szOID_PKCS_9_MESSAGE_DIGEST "1.2.840.113549.1.9.4"
   2665 
   2666 #define CMSG_DATA 1
   2667 #define CMSG_SIGNED 2
   2668 #define CMSG_ENVELOPED 3
   2669 #define CMSG_SIGNED_AND_ENVELOPED 4
   2670 #define CMSG_HASHED 5
   2671 #define CMSG_ENCRYPTED 6
   2672 
   2673 #define CMSG_ALL_FLAGS (~__MSABI_LONG(0U))
   2674 #define CMSG_DATA_FLAG (1 << CMSG_DATA)
   2675 #define CMSG_SIGNED_FLAG (1 << CMSG_SIGNED)
   2676 #define CMSG_ENVELOPED_FLAG (1 << CMSG_ENVELOPED)
   2677 #define CMSG_SIGNED_AND_ENVELOPED_FLAG (1 << CMSG_SIGNED_AND_ENVELOPED)
   2678 #define CMSG_HASHED_FLAG (1 << CMSG_HASHED)
   2679 #define CMSG_ENCRYPTED_FLAG (1 << CMSG_ENCRYPTED)
   2680 
   2681   typedef struct _CERT_ISSUER_SERIAL_NUMBER {
   2682     CERT_NAME_BLOB Issuer;
   2683     CRYPT_INTEGER_BLOB SerialNumber;
   2684   } CERT_ISSUER_SERIAL_NUMBER,*PCERT_ISSUER_SERIAL_NUMBER;
   2685 
   2686   typedef struct _CERT_ID {
   2687     DWORD dwIdChoice;
   2688     __C89_NAMELESS union {
   2689       CERT_ISSUER_SERIAL_NUMBER IssuerSerialNumber;
   2690       CRYPT_HASH_BLOB KeyId;
   2691       CRYPT_HASH_BLOB HashId;
   2692     };
   2693   } CERT_ID,*PCERT_ID;
   2694 
   2695 #define CERT_ID_ISSUER_SERIAL_NUMBER 1
   2696 #define CERT_ID_KEY_IDENTIFIER 2
   2697 #define CERT_ID_SHA1_HASH 3
   2698 
   2699   typedef struct _CMSG_SIGNER_ENCODE_INFO {
   2700     DWORD cbSize;
   2701     PCERT_INFO pCertInfo;
   2702     __C89_NAMELESS union {
   2703       HCRYPTPROV hCryptProv;
   2704       NCRYPT_KEY_HANDLE hNCryptKey;
   2705     };
   2706     DWORD dwKeySpec;
   2707     CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
   2708     void *pvHashAuxInfo;
   2709     DWORD cAuthAttr;
   2710     PCRYPT_ATTRIBUTE rgAuthAttr;
   2711     DWORD cUnauthAttr;
   2712     PCRYPT_ATTRIBUTE rgUnauthAttr;
   2713 #ifdef CMSG_SIGNER_ENCODE_INFO_HAS_CMS_FIELDS
   2714     CERT_ID SignerId;
   2715     CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm;
   2716     void *pvHashEncryptionAuxInfo;
   2717 #endif
   2718   } CMSG_SIGNER_ENCODE_INFO,*PCMSG_SIGNER_ENCODE_INFO;
   2719 
   2720   typedef struct _CMSG_SIGNED_ENCODE_INFO {
   2721     DWORD cbSize;
   2722     DWORD cSigners;
   2723     PCMSG_SIGNER_ENCODE_INFO rgSigners;
   2724     DWORD cCertEncoded;
   2725     PCERT_BLOB rgCertEncoded;
   2726     DWORD cCrlEncoded;
   2727     PCRL_BLOB rgCrlEncoded;
   2728 #ifdef CMSG_SIGNED_ENCODE_INFO_HAS_CMS_FIELDS
   2729     DWORD cAttrCertEncoded;
   2730     PCERT_BLOB rgAttrCertEncoded;
   2731 #endif
   2732   } CMSG_SIGNED_ENCODE_INFO,*PCMSG_SIGNED_ENCODE_INFO;
   2733 
   2734   typedef struct _CMSG_RECIPIENT_ENCODE_INFO CMSG_RECIPIENT_ENCODE_INFO,*PCMSG_RECIPIENT_ENCODE_INFO;
   2735 
   2736   typedef struct _CMSG_ENVELOPED_ENCODE_INFO {
   2737     DWORD cbSize;
   2738     HCRYPTPROV_LEGACY hCryptProv;
   2739     CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm;
   2740     void *pvEncryptionAuxInfo;
   2741     DWORD cRecipients;
   2742     PCERT_INFO *rgpRecipients;
   2743 #ifdef CMSG_ENVELOPED_ENCODE_INFO_HAS_CMS_FIELDS
   2744     PCMSG_RECIPIENT_ENCODE_INFO rgCmsRecipients;
   2745     DWORD cCertEncoded;
   2746     PCERT_BLOB rgCertEncoded;
   2747     DWORD cCrlEncoded;
   2748     PCRL_BLOB rgCrlEncoded;
   2749     DWORD cAttrCertEncoded;
   2750     PCERT_BLOB rgAttrCertEncoded;
   2751     DWORD cUnprotectedAttr;
   2752     PCRYPT_ATTRIBUTE rgUnprotectedAttr;
   2753 #endif
   2754   } CMSG_ENVELOPED_ENCODE_INFO,*PCMSG_ENVELOPED_ENCODE_INFO;
   2755 
   2756   typedef struct _CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO {
   2757     DWORD cbSize;
   2758     CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
   2759     void *pvKeyEncryptionAuxInfo;
   2760     HCRYPTPROV_LEGACY hCryptProv;
   2761     CRYPT_BIT_BLOB RecipientPublicKey;
   2762     CERT_ID RecipientId;
   2763   } CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO,*PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO;
   2764 
   2765   typedef struct _CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO {
   2766     DWORD cbSize;
   2767     CRYPT_BIT_BLOB RecipientPublicKey;
   2768     CERT_ID RecipientId;
   2769     FILETIME Date;
   2770     PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
   2771   } CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO,*PCMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO;
   2772 
   2773   typedef struct _CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO {
   2774     DWORD cbSize;
   2775     CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
   2776     void *pvKeyEncryptionAuxInfo;
   2777     CRYPT_ALGORITHM_IDENTIFIER KeyWrapAlgorithm;
   2778     void *pvKeyWrapAuxInfo;
   2779     HCRYPTPROV_LEGACY hCryptProv;
   2780     DWORD dwKeySpec;
   2781     DWORD dwKeyChoice;
   2782     __C89_NAMELESS union {
   2783       PCRYPT_ALGORITHM_IDENTIFIER pEphemeralAlgorithm;
   2784       PCERT_ID pSenderId;
   2785     };
   2786     CRYPT_DATA_BLOB UserKeyingMaterial;
   2787     DWORD cRecipientEncryptedKeys;
   2788     PCMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO *rgpRecipientEncryptedKeys;
   2789   } CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO,*PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO;
   2790 
   2791 #define CMSG_KEY_AGREE_EPHEMERAL_KEY_CHOICE 1
   2792 #define CMSG_KEY_AGREE_STATIC_KEY_CHOICE 2
   2793 
   2794   typedef struct _CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO {
   2795     DWORD cbSize;
   2796     CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
   2797     void *pvKeyEncryptionAuxInfo;
   2798     HCRYPTPROV hCryptProv;
   2799     DWORD dwKeyChoice;
   2800     __C89_NAMELESS union {
   2801       HCRYPTKEY hKeyEncryptionKey;
   2802       void *pvKeyEncryptionKey;
   2803     };
   2804     CRYPT_DATA_BLOB KeyId;
   2805     FILETIME Date;
   2806     PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
   2807   } CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO,*PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO;
   2808 
   2809 #define CMSG_MAIL_LIST_HANDLE_KEY_CHOICE 1
   2810 
   2811 #define CMSG_KEY_TRANS_RECIPIENT 1
   2812 #define CMSG_KEY_AGREE_RECIPIENT 2
   2813 #define CMSG_MAIL_LIST_RECIPIENT 3
   2814 
   2815 #define CMSG_RC4_NO_SALT_FLAG 0x40000000
   2816 #define CMSG_SP3_COMPATIBLE_ENCRYPT_FLAG 0x80000000
   2817 
   2818   struct _CMSG_RECIPIENT_ENCODE_INFO {
   2819     DWORD dwRecipientChoice;
   2820     __C89_NAMELESS union {
   2821       PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO pKeyTrans;
   2822       PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO pKeyAgree;
   2823       PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO pMailList;
   2824     };
   2825   };
   2826 
   2827   typedef struct _CMSG_RC2_AUX_INFO {
   2828     DWORD cbSize;
   2829     DWORD dwBitLen;
   2830   } CMSG_RC2_AUX_INFO,*PCMSG_RC2_AUX_INFO;
   2831 
   2832   typedef struct _CMSG_SP3_COMPATIBLE_AUX_INFO {
   2833     DWORD cbSize;
   2834     DWORD dwFlags;
   2835   } CMSG_SP3_COMPATIBLE_AUX_INFO,*PCMSG_SP3_COMPATIBLE_AUX_INFO;
   2836 
   2837   typedef struct _CMSG_RC4_AUX_INFO {
   2838     DWORD cbSize;
   2839     DWORD dwBitLen;
   2840   } CMSG_RC4_AUX_INFO,*PCMSG_RC4_AUX_INFO;
   2841 
   2842   typedef struct _CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO {
   2843     DWORD cbSize;
   2844     CMSG_SIGNED_ENCODE_INFO SignedInfo;
   2845     CMSG_ENVELOPED_ENCODE_INFO EnvelopedInfo;
   2846   } CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO,*PCMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO;
   2847 
   2848   typedef struct _CMSG_HASHED_ENCODE_INFO {
   2849     DWORD cbSize;
   2850     HCRYPTPROV_LEGACY hCryptProv;
   2851     CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
   2852     void *pvHashAuxInfo;
   2853   } CMSG_HASHED_ENCODE_INFO,*PCMSG_HASHED_ENCODE_INFO;
   2854 
   2855   typedef struct _CMSG_ENCRYPTED_ENCODE_INFO {
   2856     DWORD cbSize;
   2857     CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm;
   2858     void *pvEncryptionAuxInfo;
   2859   } CMSG_ENCRYPTED_ENCODE_INFO,*PCMSG_ENCRYPTED_ENCODE_INFO;
   2860 
   2861   typedef WINBOOL (WINAPI *PFN_CMSG_STREAM_OUTPUT) (const void *pvArg, BYTE *pbData, DWORD cbData, WINBOOL fFinal);
   2862 
   2863 #define CMSG_INDEFINITE_LENGTH (0xffffffff)
   2864 
   2865   typedef struct _CMSG_STREAM_INFO {
   2866     DWORD cbContent;
   2867     PFN_CMSG_STREAM_OUTPUT pfnStreamOutput;
   2868     void *pvArg;
   2869   } CMSG_STREAM_INFO,*PCMSG_STREAM_INFO;
   2870 
   2871 #define CMSG_BARE_CONTENT_FLAG 0x1
   2872 #define CMSG_LENGTH_ONLY_FLAG 0x2
   2873 #define CMSG_DETACHED_FLAG 0x4
   2874 #define CMSG_AUTHENTICATED_ATTRIBUTES_FLAG 0x8
   2875 #define CMSG_CONTENTS_OCTETS_FLAG 0x10
   2876 #define CMSG_MAX_LENGTH_FLAG 0x20
   2877 #define CMSG_CMS_ENCAPSULATED_CONTENT_FLAG 0x40
   2878 #define CMSG_CRYPT_RELEASE_CONTEXT_FLAG 0x8000
   2879 
   2880   WINIMPM HCRYPTMSG WINAPI CryptMsgOpenToEncode (DWORD dwMsgEncodingType, DWORD dwFlags, DWORD dwMsgType, void const *pvMsgEncodeInfo, LPSTR pszInnerContentObjID, PCMSG_STREAM_INFO pStreamInfo);
   2881   WINIMPM DWORD WINAPI CryptMsgCalculateEncodedLength (DWORD dwMsgEncodingType, DWORD dwFlags, DWORD dwMsgType, void const *pvMsgEncodeInfo, LPSTR pszInnerContentObjID, DWORD cbData);
   2882   WINIMPM HCRYPTMSG WINAPI CryptMsgOpenToDecode (DWORD dwMsgEncodingType, DWORD dwFlags, DWORD dwMsgType, HCRYPTPROV_LEGACY hCryptProv, PCERT_INFO pRecipientInfo, PCMSG_STREAM_INFO pStreamInfo);
   2883   WINIMPM HCRYPTMSG WINAPI CryptMsgDuplicate (HCRYPTMSG hCryptMsg);
   2884   WINIMPM WINBOOL WINAPI CryptMsgClose (HCRYPTMSG hCryptMsg);
   2885   WINIMPM WINBOOL WINAPI CryptMsgUpdate (HCRYPTMSG hCryptMsg, const BYTE *pbData, DWORD cbData, WINBOOL fFinal);
   2886   WINIMPM WINBOOL WINAPI CryptMsgGetParam (HCRYPTMSG hCryptMsg, DWORD dwParamType, DWORD dwIndex, void *pvData, DWORD *pcbData);
   2887 
   2888 #define CMSG_TYPE_PARAM 1
   2889 #define CMSG_CONTENT_PARAM 2
   2890 #define CMSG_BARE_CONTENT_PARAM 3
   2891 #define CMSG_INNER_CONTENT_TYPE_PARAM 4
   2892 #define CMSG_SIGNER_COUNT_PARAM 5
   2893 #define CMSG_SIGNER_INFO_PARAM 6
   2894 #define CMSG_SIGNER_CERT_INFO_PARAM 7
   2895 #define CMSG_SIGNER_HASH_ALGORITHM_PARAM 8
   2896 #define CMSG_SIGNER_AUTH_ATTR_PARAM 9
   2897 #define CMSG_SIGNER_UNAUTH_ATTR_PARAM 10
   2898 #define CMSG_CERT_COUNT_PARAM 11
   2899 #define CMSG_CERT_PARAM 12
   2900 #define CMSG_CRL_COUNT_PARAM 13
   2901 #define CMSG_CRL_PARAM 14
   2902 #define CMSG_ENVELOPE_ALGORITHM_PARAM 15
   2903 #define CMSG_RECIPIENT_COUNT_PARAM 17
   2904 #define CMSG_RECIPIENT_INDEX_PARAM 18
   2905 #define CMSG_RECIPIENT_INFO_PARAM 19
   2906 #define CMSG_HASH_ALGORITHM_PARAM 20
   2907 #define CMSG_HASH_DATA_PARAM 21
   2908 #define CMSG_COMPUTED_HASH_PARAM 22
   2909 #define CMSG_ENCRYPT_PARAM 26
   2910 #define CMSG_ENCRYPTED_DIGEST 27
   2911 #define CMSG_ENCODED_SIGNER 28
   2912 #define CMSG_ENCODED_MESSAGE 29
   2913 #define CMSG_VERSION_PARAM 30
   2914 #define CMSG_ATTR_CERT_COUNT_PARAM 31
   2915 #define CMSG_ATTR_CERT_PARAM 32
   2916 #define CMSG_CMS_RECIPIENT_COUNT_PARAM 33
   2917 #define CMSG_CMS_RECIPIENT_INDEX_PARAM 34
   2918 #define CMSG_CMS_RECIPIENT_ENCRYPTED_KEY_INDEX_PARAM 35
   2919 #define CMSG_CMS_RECIPIENT_INFO_PARAM 36
   2920 #define CMSG_UNPROTECTED_ATTR_PARAM 37
   2921 #define CMSG_SIGNER_CERT_ID_PARAM 38
   2922 #define CMSG_CMS_SIGNER_INFO_PARAM 39
   2923 
   2924   typedef struct _CMSG_SIGNER_INFO {
   2925     DWORD dwVersion;
   2926     CERT_NAME_BLOB Issuer;
   2927     CRYPT_INTEGER_BLOB SerialNumber;
   2928     CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
   2929     CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm;
   2930     CRYPT_DATA_BLOB EncryptedHash;
   2931     CRYPT_ATTRIBUTES AuthAttrs;
   2932     CRYPT_ATTRIBUTES UnauthAttrs;
   2933   } CMSG_SIGNER_INFO,*PCMSG_SIGNER_INFO;
   2934 
   2935   typedef struct _CMSG_CMS_SIGNER_INFO {
   2936     DWORD dwVersion;
   2937     CERT_ID SignerId;
   2938     CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
   2939     CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm;
   2940     CRYPT_DATA_BLOB EncryptedHash;
   2941     CRYPT_ATTRIBUTES AuthAttrs;
   2942     CRYPT_ATTRIBUTES UnauthAttrs;
   2943   } CMSG_CMS_SIGNER_INFO,*PCMSG_CMS_SIGNER_INFO;
   2944 
   2945   typedef CRYPT_ATTRIBUTES CMSG_ATTR;
   2946   typedef CRYPT_ATTRIBUTES *PCMSG_ATTR;
   2947 
   2948 #define CMSG_SIGNED_DATA_V1 1
   2949 #define CMSG_SIGNED_DATA_V3 3
   2950 #define CMSG_SIGNED_DATA_PKCS_1_5_VERSION CMSG_SIGNED_DATA_V1
   2951 #define CMSG_SIGNED_DATA_CMS_VERSION CMSG_SIGNED_DATA_V3
   2952 
   2953 #define CMSG_SIGNER_INFO_V1 1
   2954 #define CMSG_SIGNER_INFO_V3 3
   2955 #define CMSG_SIGNER_INFO_PKCS_1_5_VERSION CMSG_SIGNER_INFO_V1
   2956 #define CMSG_SIGNER_INFO_CMS_VERSION CMSG_SIGNER_INFO_V3
   2957 
   2958 #define CMSG_HASHED_DATA_V0 0
   2959 #define CMSG_HASHED_DATA_V2 2
   2960 #define CMSG_HASHED_DATA_PKCS_1_5_VERSION CMSG_HASHED_DATA_V0
   2961 #define CMSG_HASHED_DATA_CMS_VERSION CMSG_HASHED_DATA_V2
   2962 
   2963 #define CMSG_ENVELOPED_DATA_V0 0
   2964 #define CMSG_ENVELOPED_DATA_V2 2
   2965 #define CMSG_ENVELOPED_DATA_PKCS_1_5_VERSION CMSG_ENVELOPED_DATA_V0
   2966 #define CMSG_ENVELOPED_DATA_CMS_VERSION CMSG_ENVELOPED_DATA_V2
   2967 
   2968   typedef struct _CMSG_KEY_TRANS_RECIPIENT_INFO {
   2969     DWORD dwVersion;
   2970     CERT_ID RecipientId;
   2971     CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
   2972     CRYPT_DATA_BLOB EncryptedKey;
   2973   } CMSG_KEY_TRANS_RECIPIENT_INFO,*PCMSG_KEY_TRANS_RECIPIENT_INFO;
   2974 
   2975   typedef struct _CMSG_RECIPIENT_ENCRYPTED_KEY_INFO {
   2976     CERT_ID RecipientId;
   2977     CRYPT_DATA_BLOB EncryptedKey;
   2978     FILETIME Date;
   2979     PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
   2980   } CMSG_RECIPIENT_ENCRYPTED_KEY_INFO,*PCMSG_RECIPIENT_ENCRYPTED_KEY_INFO;
   2981 
   2982   typedef struct _CMSG_KEY_AGREE_RECIPIENT_INFO {
   2983     DWORD dwVersion;
   2984     DWORD dwOriginatorChoice;
   2985     __C89_NAMELESS union {
   2986       CERT_ID OriginatorCertId;
   2987       CERT_PUBLIC_KEY_INFO OriginatorPublicKeyInfo;
   2988     };
   2989     CRYPT_DATA_BLOB UserKeyingMaterial;
   2990     CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
   2991     DWORD cRecipientEncryptedKeys;
   2992     PCMSG_RECIPIENT_ENCRYPTED_KEY_INFO *rgpRecipientEncryptedKeys;
   2993   } CMSG_KEY_AGREE_RECIPIENT_INFO,*PCMSG_KEY_AGREE_RECIPIENT_INFO;
   2994 
   2995 #define CMSG_KEY_AGREE_ORIGINATOR_CERT 1
   2996 #define CMSG_KEY_AGREE_ORIGINATOR_PUBLIC_KEY 2
   2997 
   2998   typedef struct _CMSG_MAIL_LIST_RECIPIENT_INFO {
   2999     DWORD dwVersion;
   3000     CRYPT_DATA_BLOB KeyId;
   3001     CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
   3002     CRYPT_DATA_BLOB EncryptedKey;
   3003     FILETIME Date;
   3004     PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
   3005   } CMSG_MAIL_LIST_RECIPIENT_INFO,*PCMSG_MAIL_LIST_RECIPIENT_INFO;
   3006 
   3007   typedef struct _CMSG_CMS_RECIPIENT_INFO {
   3008     DWORD dwRecipientChoice;
   3009     __C89_NAMELESS union {
   3010       PCMSG_KEY_TRANS_RECIPIENT_INFO pKeyTrans;
   3011       PCMSG_KEY_AGREE_RECIPIENT_INFO pKeyAgree;
   3012       PCMSG_MAIL_LIST_RECIPIENT_INFO pMailList;
   3013     };
   3014   } CMSG_CMS_RECIPIENT_INFO,*PCMSG_CMS_RECIPIENT_INFO;
   3015 
   3016 #define CMSG_ENVELOPED_RECIPIENT_V0 0
   3017 #define CMSG_ENVELOPED_RECIPIENT_V2 2
   3018 #define CMSG_ENVELOPED_RECIPIENT_V3 3
   3019 #define CMSG_ENVELOPED_RECIPIENT_V4 4
   3020 #define CMSG_KEY_TRANS_PKCS_1_5_VERSION CMSG_ENVELOPED_RECIPIENT_V0
   3021 #define CMSG_KEY_TRANS_CMS_VERSION CMSG_ENVELOPED_RECIPIENT_V2
   3022 #define CMSG_KEY_AGREE_VERSION CMSG_ENVELOPED_RECIPIENT_V3
   3023 #define CMSG_MAIL_LIST_VERSION CMSG_ENVELOPED_RECIPIENT_V4
   3024 
   3025   WINIMPM WINBOOL WINAPI CryptMsgControl (HCRYPTMSG hCryptMsg, DWORD dwFlags, DWORD dwCtrlType, void const *pvCtrlPara);
   3026 
   3027 #define CMSG_CTRL_VERIFY_SIGNATURE 1
   3028 #define CMSG_CTRL_DECRYPT 2
   3029 #define CMSG_CTRL_VERIFY_HASH 5
   3030 #define CMSG_CTRL_ADD_SIGNER 6
   3031 #define CMSG_CTRL_DEL_SIGNER 7
   3032 #define CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR 8
   3033 #define CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR 9
   3034 #define CMSG_CTRL_ADD_CERT 10
   3035 #define CMSG_CTRL_DEL_CERT 11
   3036 #define CMSG_CTRL_ADD_CRL 12
   3037 #define CMSG_CTRL_DEL_CRL 13
   3038 #define CMSG_CTRL_ADD_ATTR_CERT 14
   3039 #define CMSG_CTRL_DEL_ATTR_CERT 15
   3040 #define CMSG_CTRL_KEY_TRANS_DECRYPT 16
   3041 #define CMSG_CTRL_KEY_AGREE_DECRYPT 17
   3042 #define CMSG_CTRL_MAIL_LIST_DECRYPT 18
   3043 #define CMSG_CTRL_VERIFY_SIGNATURE_EX 19
   3044 #define CMSG_CTRL_ADD_CMS_SIGNER_INFO 20
   3045 #define CMSG_CTRL_ENABLE_STRONG_SIGNATURE 21
   3046 
   3047   typedef struct _CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA {
   3048     DWORD cbSize;
   3049     HCRYPTPROV_LEGACY hCryptProv;
   3050     DWORD dwSignerIndex;
   3051     DWORD dwSignerType;
   3052     void *pvSigner;
   3053   } CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA,*PCMSG_CTRL_VERIFY_SIGNATURE_EX_PARA;
   3054 
   3055 #define CMSG_VERIFY_SIGNER_PUBKEY 1
   3056 #define CMSG_VERIFY_SIGNER_CERT 2
   3057 #define CMSG_VERIFY_SIGNER_CHAIN 3
   3058 #define CMSG_VERIFY_SIGNER_NULL 4
   3059 
   3060   typedef struct _CMSG_CTRL_DECRYPT_PARA {
   3061     DWORD cbSize;
   3062     __C89_NAMELESS union {
   3063       HCRYPTPROV hCryptProv;
   3064       NCRYPT_KEY_HANDLE hNCryptKey;
   3065     };
   3066     DWORD dwKeySpec;
   3067     DWORD dwRecipientIndex;
   3068   } CMSG_CTRL_DECRYPT_PARA,*PCMSG_CTRL_DECRYPT_PARA;
   3069 
   3070   typedef struct _CMSG_CTRL_KEY_TRANS_DECRYPT_PARA {
   3071     DWORD cbSize;
   3072     __C89_NAMELESS union {
   3073       HCRYPTPROV hCryptProv;
   3074       NCRYPT_KEY_HANDLE hNCryptKey;
   3075     };
   3076     DWORD dwKeySpec;
   3077     PCMSG_KEY_TRANS_RECIPIENT_INFO pKeyTrans;
   3078     DWORD dwRecipientIndex;
   3079   } CMSG_CTRL_KEY_TRANS_DECRYPT_PARA,*PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA;
   3080 
   3081   typedef struct _CMSG_CTRL_KEY_AGREE_DECRYPT_PARA {
   3082     DWORD cbSize;
   3083     __C89_NAMELESS union {
   3084       HCRYPTPROV hCryptProv;
   3085       NCRYPT_KEY_HANDLE hNCryptKey;
   3086     };
   3087     DWORD dwKeySpec;
   3088     PCMSG_KEY_AGREE_RECIPIENT_INFO pKeyAgree;
   3089     DWORD dwRecipientIndex;
   3090     DWORD dwRecipientEncryptedKeyIndex;
   3091     CRYPT_BIT_BLOB OriginatorPublicKey;
   3092   } CMSG_CTRL_KEY_AGREE_DECRYPT_PARA,*PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA;
   3093 
   3094   typedef struct _CMSG_CTRL_MAIL_LIST_DECRYPT_PARA {
   3095     DWORD cbSize;
   3096     HCRYPTPROV hCryptProv;
   3097     PCMSG_MAIL_LIST_RECIPIENT_INFO pMailList;
   3098     DWORD dwRecipientIndex;
   3099     DWORD dwKeyChoice;
   3100     __C89_NAMELESS union {
   3101       HCRYPTKEY hKeyEncryptionKey;
   3102       void *pvKeyEncryptionKey;
   3103     };
   3104   } CMSG_CTRL_MAIL_LIST_DECRYPT_PARA,*PCMSG_CTRL_MAIL_LIST_DECRYPT_PARA;
   3105 
   3106   typedef struct _CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA {
   3107     DWORD cbSize;
   3108     DWORD dwSignerIndex;
   3109     CRYPT_DATA_BLOB blob;
   3110   } CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA,*PCMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA;
   3111 
   3112   typedef struct _CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA {
   3113     DWORD cbSize;
   3114     DWORD dwSignerIndex;
   3115     DWORD dwUnauthAttrIndex;
   3116   } CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA,*PCMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA;
   3117 
   3118 #define CMSG_VERIFY_COUNTER_SIGN_ENABLE_STRONG_FLAG 0x1
   3119 
   3120   WINBOOL WINAPI CryptMsgVerifyCountersignatureEncoded (HCRYPTPROV_LEGACY hCryptProv, DWORD dwEncodingType, PBYTE pbSignerInfo, DWORD cbSignerInfo, PBYTE pbSignerInfoCountersignature, DWORD cbSignerInfoCountersignature, PCERT_INFO pciCountersigner);
   3121   WINBOOL WINAPI CryptMsgVerifyCountersignatureEncodedEx (HCRYPTPROV_LEGACY hCryptProv, DWORD dwEncodingType, PBYTE pbSignerInfo, DWORD cbSignerInfo, PBYTE pbSignerInfoCountersignature, DWORD cbSignerInfoCountersignature, DWORD dwSignerType, void *pvSigner, DWORD dwFlags, void *pvExtra);
   3122   WINBOOL WINAPI CryptMsgCountersign (HCRYPTMSG hCryptMsg, DWORD dwIndex, DWORD cCountersigners, PCMSG_SIGNER_ENCODE_INFO rgCountersigners);
   3123   WINBOOL WINAPI CryptMsgCountersignEncoded (DWORD dwEncodingType, PBYTE pbSignerInfo, DWORD cbSignerInfo, DWORD cCountersigners, PCMSG_SIGNER_ENCODE_INFO rgCountersigners, PBYTE pbCountersignature, PDWORD pcbCountersignature);
   3124 
   3125   typedef void *(WINAPI *PFN_CMSG_ALLOC) (size_t cb);
   3126   typedef void (WINAPI *PFN_CMSG_FREE) (void *pv);
   3127 
   3128 #define CMSG_OID_GEN_ENCRYPT_KEY_FUNC "CryptMsgDllGenEncryptKey"
   3129 #define CMSG_OID_EXPORT_ENCRYPT_KEY_FUNC "CryptMsgDllExportEncryptKey"
   3130 #define CMSG_OID_IMPORT_ENCRYPT_KEY_FUNC "CryptMsgDllImportEncryptKey"
   3131 
   3132   typedef WINBOOL (WINAPI *PFN_CMSG_GEN_ENCRYPT_KEY) (HCRYPTPROV *phCryptProv, PCRYPT_ALGORITHM_IDENTIFIER paiEncrypt, PVOID pvEncryptAuxInfo, PCERT_PUBLIC_KEY_INFO pPublicKeyInfo, PFN_CMSG_ALLOC pfnAlloc, HCRYPTKEY *phEncryptKey, PBYTE *ppbEncryptParameters, PDWORD pcbEncryptParameters);
   3133   typedef WINBOOL (WINAPI *PFN_CMSG_EXPORT_ENCRYPT_KEY) (HCRYPTPROV hCryptProv, HCRYPTKEY hEncryptKey, PCERT_PUBLIC_KEY_INFO pPublicKeyInfo, PBYTE pbData, PDWORD pcbData);
   3134   typedef WINBOOL (WINAPI *PFN_CMSG_IMPORT_ENCRYPT_KEY) (HCRYPTPROV hCryptProv, DWORD dwKeySpec, PCRYPT_ALGORITHM_IDENTIFIER paiEncrypt, PCRYPT_ALGORITHM_IDENTIFIER paiPubKey, PBYTE pbEncodedKey, DWORD cbEncodedKey, HCRYPTKEY *phEncryptKey);
   3135 
   3136 #define CMSG_DEFAULT_INSTALLABLE_FUNC_OID ((LPCSTR) 1)
   3137 
   3138   typedef struct _CMSG_CONTENT_ENCRYPT_INFO {
   3139     DWORD cbSize;
   3140     HCRYPTPROV_LEGACY hCryptProv;
   3141     CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm;
   3142     void *pvEncryptionAuxInfo;
   3143     DWORD cRecipients;
   3144     PCMSG_RECIPIENT_ENCODE_INFO rgCmsRecipients;
   3145     PFN_CMSG_ALLOC pfnAlloc;
   3146     PFN_CMSG_FREE pfnFree;
   3147     DWORD dwEncryptFlags;
   3148     __C89_NAMELESS union {
   3149       HCRYPTKEY hContentEncryptKey;
   3150       BCRYPT_KEY_HANDLE hCNGContentEncryptKey;
   3151     };
   3152     DWORD dwFlags;
   3153     WINBOOL fCNG;
   3154     BYTE *pbCNGContentEncryptKeyObject;
   3155     BYTE *pbContentEncryptKey;
   3156     DWORD cbContentEncryptKey;
   3157   } CMSG_CONTENT_ENCRYPT_INFO,*PCMSG_CONTENT_ENCRYPT_INFO;
   3158 
   3159 #define CMSG_CONTENT_ENCRYPT_PAD_ENCODED_LEN_FLAG 0x1
   3160 
   3161 #define CMSG_CONTENT_ENCRYPT_FREE_PARA_FLAG 0x1
   3162 #define CMSG_CONTENT_ENCRYPT_FREE_OBJID_FLAG 0x2
   3163 #define CMSG_CONTENT_ENCRYPT_RELEASE_CONTEXT_FLAG 0x8000
   3164 
   3165 #define CMSG_OID_GEN_CONTENT_ENCRYPT_KEY_FUNC "CryptMsgDllGenContentEncryptKey"
   3166 #define CMSG_OID_CAPI1_GEN_CONTENT_ENCRYPT_KEY_FUNC CMSG_OID_GEN_CONTENT_ENCRYPT_KEY_FUNC
   3167 #define CMSG_OID_CNG_GEN_CONTENT_ENCRYPT_KEY_FUNC "CryptMsgDllCNGGenContentEncryptKey"
   3168 
   3169   typedef WINBOOL (WINAPI *PFN_CMSG_GEN_CONTENT_ENCRYPT_KEY) (PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo, DWORD dwFlags, void *pvReserved);
   3170 
   3171   typedef struct _CMSG_KEY_TRANS_ENCRYPT_INFO {
   3172     DWORD cbSize;
   3173     DWORD dwRecipientIndex;
   3174     CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
   3175     CRYPT_DATA_BLOB EncryptedKey;
   3176     DWORD dwFlags;
   3177   } CMSG_KEY_TRANS_ENCRYPT_INFO,*PCMSG_KEY_TRANS_ENCRYPT_INFO;
   3178 
   3179 #define CMSG_KEY_TRANS_ENCRYPT_FREE_PARA_FLAG 0x1
   3180 #define CMSG_KEY_TRANS_ENCRYPT_FREE_OBJID_FLAG 0x2
   3181 
   3182 #define CMSG_OID_EXPORT_KEY_TRANS_FUNC "CryptMsgDllExportKeyTrans"
   3183 #define CMSG_OID_CAPI1_EXPORT_KEY_TRANS_FUNC CMSG_OID_EXPORT_KEY_TRANS_FUNC
   3184 #define CMSG_OID_CNG_EXPORT_KEY_TRANS_FUNC "CryptMsgDllCNGExportKeyTrans"
   3185 
   3186   typedef WINBOOL (WINAPI *PFN_CMSG_EXPORT_KEY_TRANS) (PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo, PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO pKeyTransEncodeInfo, PCMSG_KEY_TRANS_ENCRYPT_INFO pKeyTransEncryptInfo, DWORD dwFlags, void *pvReserved);
   3187 
   3188   typedef struct _CMSG_KEY_AGREE_KEY_ENCRYPT_INFO {
   3189     DWORD cbSize;
   3190     CRYPT_DATA_BLOB EncryptedKey;
   3191   } CMSG_KEY_AGREE_KEY_ENCRYPT_INFO,*PCMSG_KEY_AGREE_KEY_ENCRYPT_INFO;
   3192 
   3193   typedef struct _CMSG_KEY_AGREE_ENCRYPT_INFO {
   3194     DWORD cbSize;
   3195     DWORD dwRecipientIndex;
   3196     CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
   3197     CRYPT_DATA_BLOB UserKeyingMaterial;
   3198     DWORD dwOriginatorChoice;
   3199     __C89_NAMELESS union {
   3200       CERT_ID OriginatorCertId;
   3201       CERT_PUBLIC_KEY_INFO OriginatorPublicKeyInfo;
   3202     };
   3203     DWORD cKeyAgreeKeyEncryptInfo;
   3204     PCMSG_KEY_AGREE_KEY_ENCRYPT_INFO *rgpKeyAgreeKeyEncryptInfo;
   3205     DWORD dwFlags;
   3206   } CMSG_KEY_AGREE_ENCRYPT_INFO,*PCMSG_KEY_AGREE_ENCRYPT_INFO;
   3207 
   3208 #define CMSG_KEY_AGREE_ENCRYPT_FREE_PARA_FLAG 0x1
   3209 #define CMSG_KEY_AGREE_ENCRYPT_FREE_MATERIAL_FLAG 0x2
   3210 #define CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_ALG_FLAG 0x4
   3211 #define CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_PARA_FLAG 0x8
   3212 #define CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_BITS_FLAG 0x10
   3213 #define CMSG_KEY_AGREE_ENCRYPT_FREE_OBJID_FLAG 0x20
   3214 
   3215 #define CMSG_OID_EXPORT_KEY_AGREE_FUNC "CryptMsgDllExportKeyAgree"
   3216 #define CMSG_OID_CAPI1_EXPORT_KEY_AGREE_FUNC CMSG_OID_EXPORT_KEY_AGREE_FUNC
   3217 #define CMSG_OID_CNG_EXPORT_KEY_AGREE_FUNC "CryptMsgDllCNGExportKeyAgree"
   3218 
   3219   typedef WINBOOL (WINAPI *PFN_CMSG_EXPORT_KEY_AGREE) (PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo, PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO pKeyAgreeEncodeInfo, PCMSG_KEY_AGREE_ENCRYPT_INFO pKeyAgreeEncryptInfo, DWORD dwFlags, void *pvReserved);
   3220 
   3221   typedef struct _CMSG_MAIL_LIST_ENCRYPT_INFO {
   3222     DWORD cbSize;
   3223     DWORD dwRecipientIndex;
   3224     CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
   3225     CRYPT_DATA_BLOB EncryptedKey;
   3226     DWORD dwFlags;
   3227   } CMSG_MAIL_LIST_ENCRYPT_INFO,*PCMSG_MAIL_LIST_ENCRYPT_INFO;
   3228 
   3229 #define CMSG_MAIL_LIST_ENCRYPT_FREE_PARA_FLAG 0x1
   3230 #define CMSG_MAIL_LIST_ENCRYPT_FREE_OBJID_FLAG 0x2
   3231 
   3232 #define CMSG_OID_EXPORT_MAIL_LIST_FUNC "CryptMsgDllExportMailList"
   3233 #define CMSG_OID_CAPI1_EXPORT_MAIL_LIST_FUNC CMSG_OID_EXPORT_MAIL_LIST_FUNC
   3234 #define CMSG_OID_IMPORT_KEY_TRANS_FUNC "CryptMsgDllImportKeyTrans"
   3235 #define CMSG_OID_CAPI1_IMPORT_KEY_TRANS_FUNC CMSG_OID_IMPORT_KEY_TRANS_FUNC
   3236 #define CMSG_OID_IMPORT_KEY_AGREE_FUNC "CryptMsgDllImportKeyAgree"
   3237 #define CMSG_OID_CAPI1_IMPORT_KEY_AGREE_FUNC CMSG_OID_IMPORT_KEY_AGREE_FUNC
   3238 #define CMSG_OID_IMPORT_MAIL_LIST_FUNC "CryptMsgDllImportMailList"
   3239 #define CMSG_OID_CAPI1_IMPORT_MAIL_LIST_FUNC CMSG_OID_IMPORT_MAIL_LIST_FUNC
   3240 
   3241   typedef WINBOOL (WINAPI *PFN_CMSG_EXPORT_MAIL_LIST) (PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo, PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO pMailListEncodeInfo, PCMSG_MAIL_LIST_ENCRYPT_INFO pMailListEncryptInfo, DWORD dwFlags, void *pvReserved);
   3242   typedef WINBOOL (WINAPI *PFN_CMSG_IMPORT_KEY_TRANS) (PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm, PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA pKeyTransDecryptPara, DWORD dwFlags, void *pvReserved, HCRYPTKEY *phContentEncryptKey);
   3243   typedef WINBOOL (WINAPI *PFN_CMSG_IMPORT_KEY_AGREE) (PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm, PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA pKeyAgreeDecryptPara, DWORD dwFlags, void *pvReserved, HCRYPTKEY *phContentEncryptKey);
   3244   typedef WINBOOL (WINAPI *PFN_CMSG_IMPORT_MAIL_LIST) (PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm, PCMSG_CTRL_MAIL_LIST_DECRYPT_PARA pMailListDecryptPara, DWORD dwFlags, void *pvReserved, HCRYPTKEY *phContentEncryptKey);
   3245 
   3246   typedef struct _CMSG_CNG_CONTENT_DECRYPT_INFO {
   3247     DWORD cbSize;
   3248     CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm;
   3249     PFN_CMSG_ALLOC pfnAlloc;
   3250     PFN_CMSG_FREE pfnFree;
   3251     NCRYPT_KEY_HANDLE hNCryptKey;
   3252     BYTE *pbContentEncryptKey;
   3253     DWORD cbContentEncryptKey;
   3254     BCRYPT_KEY_HANDLE hCNGContentEncryptKey;
   3255     BYTE *pbCNGContentEncryptKeyObject;
   3256   } CMSG_CNG_CONTENT_DECRYPT_INFO,*PCMSG_CNG_CONTENT_DECRYPT_INFO;
   3257 
   3258 #define CMSG_OID_CNG_IMPORT_KEY_TRANS_FUNC "CryptMsgDllCNGImportKeyTrans"
   3259 #define CMSG_OID_CNG_IMPORT_KEY_AGREE_FUNC "CryptMsgDllCNGImportKeyAgree"
   3260 #define CMSG_OID_CNG_IMPORT_CONTENT_ENCRYPT_KEY_FUNC "CryptMsgDllCNGImportContentEncryptKey"
   3261 
   3262   typedef WINBOOL (WINAPI *PFN_CMSG_CNG_IMPORT_KEY_TRANS) (PCMSG_CNG_CONTENT_DECRYPT_INFO pCNGContentDecryptInfo, PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA pKeyTransDecryptPara, DWORD dwFlags, void *pvReserved);
   3263   typedef WINBOOL (WINAPI *PFN_CMSG_CNG_IMPORT_KEY_AGREE) (PCMSG_CNG_CONTENT_DECRYPT_INFO pCNGContentDecryptInfo, PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA pKeyAgreeDecryptPara, DWORD dwFlags, void *pvReserved);
   3264   typedef WINBOOL (WINAPI *PFN_CMSG_CNG_IMPORT_CONTENT_ENCRYPT_KEY) (PCMSG_CNG_CONTENT_DECRYPT_INFO pCNGContentDecryptInfo, DWORD dwFlags, void *pvReserved);
   3265 #endif
   3266 
   3267 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_APP)
   3268   typedef void *HCERTSTORE;
   3269 
   3270   typedef struct _CERT_CONTEXT {
   3271     DWORD dwCertEncodingType;
   3272     BYTE *pbCertEncoded;
   3273     DWORD cbCertEncoded;
   3274     PCERT_INFO pCertInfo;
   3275     HCERTSTORE hCertStore;
   3276   } CERT_CONTEXT,*PCERT_CONTEXT;
   3277 
   3278   typedef const CERT_CONTEXT *PCCERT_CONTEXT;
   3279 #endif
   3280 
   3281 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
   3282   typedef struct _CRL_CONTEXT {
   3283     DWORD dwCertEncodingType;
   3284     BYTE *pbCrlEncoded;
   3285     DWORD cbCrlEncoded;
   3286     PCRL_INFO pCrlInfo;
   3287     HCERTSTORE hCertStore;
   3288   } CRL_CONTEXT,*PCRL_CONTEXT;
   3289 
   3290   typedef const CRL_CONTEXT *PCCRL_CONTEXT;
   3291 
   3292   typedef struct _CTL_CONTEXT {
   3293     DWORD dwMsgAndCertEncodingType;
   3294     BYTE *pbCtlEncoded;
   3295     DWORD cbCtlEncoded;
   3296     PCTL_INFO pCtlInfo;
   3297     HCERTSTORE hCertStore;
   3298     HCRYPTMSG hCryptMsg;
   3299     BYTE *pbCtlContent;
   3300     DWORD cbCtlContent;
   3301   } CTL_CONTEXT,*PCTL_CONTEXT;
   3302 
   3303   typedef const CTL_CONTEXT *PCCTL_CONTEXT;
   3304 
   3305 #define CERT_KEY_PROV_HANDLE_PROP_ID 1
   3306 #define CERT_KEY_PROV_INFO_PROP_ID 2
   3307 #define CERT_SHA1_HASH_PROP_ID 3
   3308 #define CERT_MD5_HASH_PROP_ID 4
   3309 #define CERT_HASH_PROP_ID CERT_SHA1_HASH_PROP_ID
   3310 #define CERT_KEY_CONTEXT_PROP_ID 5
   3311 #define CERT_KEY_SPEC_PROP_ID 6
   3312 #define CERT_IE30_RESERVED_PROP_ID 7
   3313 #define CERT_PUBKEY_HASH_RESERVED_PROP_ID 8
   3314 #define CERT_ENHKEY_USAGE_PROP_ID 9
   3315 #define CERT_CTL_USAGE_PROP_ID CERT_ENHKEY_USAGE_PROP_ID
   3316 #define CERT_NEXT_UPDATE_LOCATION_PROP_ID 10
   3317 #define CERT_FRIENDLY_NAME_PROP_ID 11
   3318 #define CERT_PVK_FILE_PROP_ID 12
   3319 #define CERT_DESCRIPTION_PROP_ID 13
   3320 #define CERT_ACCESS_STATE_PROP_ID 14
   3321 #define CERT_SIGNATURE_HASH_PROP_ID 15
   3322 #define CERT_SMART_CARD_DATA_PROP_ID 16
   3323 #define CERT_EFS_PROP_ID 17
   3324 #define CERT_FORTEZZA_DATA_PROP_ID 18
   3325 #define CERT_ARCHIVED_PROP_ID 19
   3326 #define CERT_KEY_IDENTIFIER_PROP_ID 20
   3327 #define CERT_AUTO_ENROLL_PROP_ID 21
   3328 #define CERT_PUBKEY_ALG_PARA_PROP_ID 22
   3329 #define CERT_CROSS_CERT_DIST_POINTS_PROP_ID 23
   3330 #define CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID 24
   3331 #define CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID 25
   3332 #define CERT_ENROLLMENT_PROP_ID 26
   3333 #define CERT_DATE_STAMP_PROP_ID 27
   3334 #define CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID 28
   3335 #define CERT_SUBJECT_NAME_MD5_HASH_PROP_ID 29
   3336 #define CERT_EXTENDED_ERROR_INFO_PROP_ID 30
   3337 #define CERT_RENEWAL_PROP_ID 64
   3338 #define CERT_ARCHIVED_KEY_HASH_PROP_ID 65
   3339 #define CERT_AUTO_ENROLL_RETRY_PROP_ID 66
   3340 #define CERT_AIA_URL_RETRIEVED_PROP_ID 67
   3341 #define CERT_AUTHORITY_INFO_ACCESS_PROP_ID 68
   3342 #define CERT_BACKED_UP_PROP_ID 69
   3343 #define CERT_OCSP_RESPONSE_PROP_ID 70
   3344 #define CERT_REQUEST_ORIGINATOR_PROP_ID 71
   3345 #define CERT_SOURCE_LOCATION_PROP_ID 72
   3346 #define CERT_SOURCE_URL_PROP_ID 73
   3347 #define CERT_NEW_KEY_PROP_ID 74
   3348 #define CERT_OCSP_CACHE_PREFIX_PROP_ID 75
   3349 #define CERT_SMART_CARD_ROOT_INFO_PROP_ID 76
   3350 #define CERT_NO_AUTO_EXPIRE_CHECK_PROP_ID 77
   3351 #define CERT_NCRYPT_KEY_HANDLE_PROP_ID 78
   3352 #define CERT_HCRYPTPROV_OR_NCRYPT_KEY_HANDLE_PROP_ID 79
   3353 #define CERT_SUBJECT_INFO_ACCESS_PROP_ID 80
   3354 #define CERT_CA_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID 81
   3355 #define CERT_CA_DISABLE_CRL_PROP_ID 82
   3356 #define CERT_ROOT_PROGRAM_CERT_POLICIES_PROP_ID 83
   3357 #define CERT_ROOT_PROGRAM_NAME_CONSTRAINTS_PROP_ID 84
   3358 #define CERT_SUBJECT_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID 85
   3359 #define CERT_SUBJECT_DISABLE_CRL_PROP_ID 86
   3360 #define CERT_CEP_PROP_ID 87
   3361 #define CERT_SIGN_HASH_CNG_ALG_PROP_ID 89
   3362 #define CERT_SCARD_PIN_ID_PROP_ID 90
   3363 #define CERT_SCARD_PIN_INFO_PROP_ID 91
   3364 #define CERT_SUBJECT_PUB_KEY_BIT_LENGTH_PROP_ID 92
   3365 #define CERT_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID 93
   3366 #define CERT_ISSUER_PUB_KEY_BIT_LENGTH_PROP_ID 94
   3367 #define CERT_ISSUER_CHAIN_SIGN_HASH_CNG_ALG_PROP_ID 95
   3368 #define CERT_ISSUER_CHAIN_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID 96
   3369 #define CERT_NO_EXPIRE_NOTIFICATION_PROP_ID 97
   3370 #define CERT_AUTH_ROOT_SHA256_HASH_PROP_ID 98
   3371 #define CERT_NCRYPT_KEY_HANDLE_TRANSFER_PROP_ID 99
   3372 #define CERT_HCRYPTPROV_TRANSFER_PROP_ID 100
   3373 #define CERT_SMART_CARD_READER_PROP_ID 101
   3374 #define CERT_SEND_AS_TRUSTED_ISSUER_PROP_ID 102
   3375 #define CERT_KEY_REPAIR_ATTEMPTED_PROP_ID 103
   3376 #define CERT_DISALLOWED_FILETIME_PROP_ID 104
   3377 #define CERT_ROOT_PROGRAM_CHAIN_POLICIES_PROP_ID 105
   3378 #define CERT_SMART_CARD_READER_NON_REMOVABLE_PROP_ID 106
   3379 
   3380 #define CERT_FIRST_RESERVED_PROP_ID 107
   3381 #define CERT_LAST_RESERVED_PROP_ID 0x00007fff
   3382 #define CERT_FIRST_USER_PROP_ID 0x8000
   3383 #define CERT_LAST_USER_PROP_ID 0x0000ffff
   3384 
   3385 #define IS_CERT_HASH_PROP_ID(X) (CERT_SHA1_HASH_PROP_ID == (X) || CERT_MD5_HASH_PROP_ID == (X) || CERT_SIGNATURE_HASH_PROP_ID == (X))
   3386 #define IS_PUBKEY_HASH_PROP_ID(X) (CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID == (X) || CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID == (X))
   3387 #define IS_CHAIN_HASH_PROP_ID(X) (CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID == (X) || CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID == (X) || CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID == (X) || CERT_SUBJECT_NAME_MD5_HASH_PROP_ID == (X))
   3388 #define IS_STRONG_SIGN_PROP_ID(X) (CERT_SIGN_HASH_CNG_ALG_PROP_ID == (X) || CERT_SUBJECT_PUB_KEY_BIT_LENGTH_PROP_ID == (X) || CERT_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID == (X))
   3389 
   3390 #define szOID_CERT_PROP_ID_PREFIX "1.3.6.1.4.1.311.10.11."
   3391 #define _szPROP_ID(PropId) #PropId
   3392 #define szOID_CERT_PROP_ID(PropId) szOID_CERT_PROP_ID_PREFIX _szPROP_ID (PropId)
   3393 
   3394 #define __CRYPT32WTEXT(quote) L##quote
   3395 #define _CRYPT32WTEXT(quote) __CRYPT32WTEXT (quote)
   3396 #define wszOID_CERT_PROP_ID(PropId) _CRYPT32WTEXT (szOID_CERT_PROP_ID_PREFIX) _CRYPT32WTEXT (_szPROP_ID (PropId))
   3397 
   3398 #define szOID_CERT_KEY_IDENTIFIER_PROP_ID "1.3.6.1.4.1.311.10.11.20"
   3399 #define szOID_CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID "1.3.6.1.4.1.311.10.11.28"
   3400 #define szOID_CERT_SUBJECT_NAME_MD5_HASH_PROP_ID "1.3.6.1.4.1.311.10.11.29"
   3401 #define szOID_CERT_MD5_HASH_PROP_ID "1.3.6.1.4.1.311.10.11.4"
   3402 #define szOID_CERT_SIGNATURE_HASH_PROP_ID "1.3.6.1.4.1.311.10.11.15"
   3403 #define szOID_DISALLOWED_HASH szOID_CERT_SIGNATURE_HASH_PROP_ID
   3404 #define szOID_CERT_DISALLOWED_FILETIME_PROP_ID "1.3.6.1.4.1.311.10.11.104"
   3405 
   3406 #define CERT_ACCESS_STATE_WRITE_PERSIST_FLAG 0x1
   3407 #define CERT_ACCESS_STATE_SYSTEM_STORE_FLAG 0x2
   3408 #define CERT_ACCESS_STATE_LM_SYSTEM_STORE_FLAG 0x4
   3409 #define CERT_ACCESS_STATE_GP_SYSTEM_STORE_FLAG 0x8
   3410 #define CERT_ACCESS_STATE_SHARED_USER_FLAG 0x10
   3411 
   3412 #define szOID_ROOT_PROGRAM_AUTO_UPDATE_CA_REVOCATION "1.3.6.1.4.1.311.60.3.1"
   3413 #define szOID_ROOT_PROGRAM_AUTO_UPDATE_END_REVOCATION "1.3.6.1.4.1.311.60.3.2"
   3414 #define szOID_ROOT_PROGRAM_NO_OCSP_FAILOVER_TO_CRL "1.3.6.1.4.1.311.60.3.3"
   3415 
   3416   typedef struct _CRYPT_KEY_PROV_PARAM {
   3417     DWORD dwParam;
   3418     BYTE *pbData;
   3419     DWORD cbData;
   3420     DWORD dwFlags;
   3421   } CRYPT_KEY_PROV_PARAM,*PCRYPT_KEY_PROV_PARAM;
   3422 
   3423   typedef struct _CRYPT_KEY_PROV_INFO {
   3424     LPWSTR pwszContainerName;
   3425     LPWSTR pwszProvName;
   3426     DWORD dwProvType;
   3427     DWORD dwFlags;
   3428     DWORD cProvParam;
   3429     PCRYPT_KEY_PROV_PARAM rgProvParam;
   3430     DWORD dwKeySpec;
   3431   } CRYPT_KEY_PROV_INFO,*PCRYPT_KEY_PROV_INFO;
   3432 
   3433 #define CERT_SET_KEY_PROV_HANDLE_PROP_ID 0x1
   3434 #define CERT_SET_KEY_CONTEXT_PROP_ID 0x1
   3435 
   3436 #define CERT_NCRYPT_KEY_SPEC 0xffffffff
   3437 
   3438   typedef struct _CERT_KEY_CONTEXT {
   3439     DWORD cbSize;
   3440     __C89_NAMELESS union {
   3441       HCRYPTPROV hCryptProv;
   3442       NCRYPT_KEY_HANDLE hNCryptKey;
   3443     };
   3444     DWORD dwKeySpec;
   3445   } CERT_KEY_CONTEXT,*PCERT_KEY_CONTEXT;
   3446 
   3447   typedef struct _ROOT_INFO_LUID {
   3448     DWORD LowPart;
   3449     LONG HighPart;
   3450   } ROOT_INFO_LUID,*PROOT_INFO_LUID;
   3451 
   3452   typedef struct _CRYPT_SMART_CARD_ROOT_INFO {
   3453     BYTE rgbCardID [16];
   3454     ROOT_INFO_LUID luid;
   3455   } CRYPT_SMART_CARD_ROOT_INFO,*PCRYPT_SMART_CARD_ROOT_INFO;
   3456 
   3457 #define CERT_STORE_PROV_MSG ((LPCSTR) 1)
   3458 #define CERT_STORE_PROV_MEMORY ((LPCSTR) 2)
   3459 #define CERT_STORE_PROV_FILE ((LPCSTR) 3)
   3460 #define CERT_STORE_PROV_REG ((LPCSTR) 4)
   3461 #define CERT_STORE_PROV_PKCS7 ((LPCSTR) 5)
   3462 #define CERT_STORE_PROV_SERIALIZED ((LPCSTR) 6)
   3463 #define CERT_STORE_PROV_FILENAME_A ((LPCSTR) 7)
   3464 #define CERT_STORE_PROV_FILENAME_W ((LPCSTR) 8)
   3465 #define CERT_STORE_PROV_FILENAME CERT_STORE_PROV_FILENAME_W
   3466 #define CERT_STORE_PROV_SYSTEM_A ((LPCSTR) 9)
   3467 #define CERT_STORE_PROV_SYSTEM_W ((LPCSTR) 10)
   3468 #define CERT_STORE_PROV_SYSTEM CERT_STORE_PROV_SYSTEM_W
   3469 #define CERT_STORE_PROV_COLLECTION ((LPCSTR) 11)
   3470 #define CERT_STORE_PROV_SYSTEM_REGISTRY_A ((LPCSTR) 12)
   3471 #define CERT_STORE_PROV_SYSTEM_REGISTRY_W ((LPCSTR) 13)
   3472 #define CERT_STORE_PROV_SYSTEM_REGISTRY CERT_STORE_PROV_SYSTEM_REGISTRY_W
   3473 #define CERT_STORE_PROV_PHYSICAL_W ((LPCSTR) 14)
   3474 #define CERT_STORE_PROV_PHYSICAL CERT_STORE_PROV_PHYSICAL_W
   3475 #define CERT_STORE_PROV_SMART_CARD_W ((LPCSTR) 15)
   3476 #define CERT_STORE_PROV_SMART_CARD CERT_STORE_PROV_SMART_CARD_W
   3477 #define CERT_STORE_PROV_LDAP_W ((LPCSTR) 16)
   3478 #define CERT_STORE_PROV_LDAP CERT_STORE_PROV_LDAP_W
   3479 #define CERT_STORE_PROV_PKCS12 ((LPCSTR) 17)
   3480 
   3481 #define sz_CERT_STORE_PROV_MEMORY "Memory"
   3482 #define sz_CERT_STORE_PROV_FILENAME_W "File"
   3483 #define sz_CERT_STORE_PROV_FILENAME sz_CERT_STORE_PROV_FILENAME_W
   3484 #define sz_CERT_STORE_PROV_SYSTEM_W "System"
   3485 #define sz_CERT_STORE_PROV_SYSTEM sz_CERT_STORE_PROV_SYSTEM_W
   3486 #define sz_CERT_STORE_PROV_PKCS7 "PKCS7"
   3487 #define sz_CERT_STORE_PROV_PKCS12 "PKCS12"
   3488 #define sz_CERT_STORE_PROV_SERIALIZED "Serialized"
   3489 
   3490 #define sz_CERT_STORE_PROV_COLLECTION "Collection"
   3491 #define sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W "SystemRegistry"
   3492 #define sz_CERT_STORE_PROV_SYSTEM_REGISTRY sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W
   3493 #define sz_CERT_STORE_PROV_PHYSICAL_W "Physical"
   3494 #define sz_CERT_STORE_PROV_PHYSICAL sz_CERT_STORE_PROV_PHYSICAL_W
   3495 
   3496 #define sz_CERT_STORE_PROV_SMART_CARD_W "SmartCard"
   3497 #define sz_CERT_STORE_PROV_SMART_CARD sz_CERT_STORE_PROV_SMART_CARD_W