1 /** 2 * WinPR: Windows Portable Runtime 3 * Cryptography API (CryptoAPI) 4 * 5 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 */ 19 20 #ifndef WINPR_CRYPTO_H 21 #define WINPR_CRYPTO_H 22 23 #include <winpr/winpr.h> 24 #include <winpr/wtypes.h> 25 26 #include <winpr/error.h> 27 28 #ifdef _WIN32 29 30 #include <wincrypt.h> 31 32 #endif 33 34 #ifndef ALG_TYPE_RESERVED7 35 #define ALG_TYPE_RESERVED7 (7 << 9) 36 #endif 37 38 #if (NTDDI_VERSION <= 0x05010200) 39 #define ALG_SID_SHA_256 12 40 #define ALG_SID_SHA_384 13 41 #define ALG_SID_SHA_512 14 42 #define CALG_SHA_256 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_256) 43 #define CALG_SHA_384 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_384) 44 #define CALG_SHA_512 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_512) 45 #endif 46 47 #ifndef _WIN32 48 49 /* ncrypt.h */ 50 51 typedef ULONG_PTR NCRYPT_HANDLE; 52 typedef ULONG_PTR NCRYPT_PROV_HANDLE; 53 typedef ULONG_PTR NCRYPT_KEY_HANDLE; 54 typedef ULONG_PTR NCRYPT_HASH_HANDLE; 55 typedef ULONG_PTR NCRYPT_SECRET_HANDLE; 56 57 /* wincrypt.h */ 58 59 #define GET_ALG_CLASS(x) (x & (7 << 13)) 60 #define GET_ALG_TYPE(x) (x & (15 << 9)) 61 #define GET_ALG_SID(x) (x & (511)) 62 63 #define ALG_CLASS_ANY (0) 64 #define ALG_CLASS_SIGNATURE (1 << 13) 65 #define ALG_CLASS_MSG_ENCRYPT (2 << 13) 66 #define ALG_CLASS_DATA_ENCRYPT (3 << 13) 67 #define ALG_CLASS_HASH (4 << 13) 68 #define ALG_CLASS_KEY_EXCHANGE (5 << 13) 69 #define ALG_CLASS_ALL (7 << 13) 70 71 #define ALG_TYPE_ANY (0) 72 #define ALG_TYPE_DSS (1 << 9) 73 #define ALG_TYPE_RSA (2 << 9) 74 #define ALG_TYPE_BLOCK (3 << 9) 75 #define ALG_TYPE_STREAM (4 << 9) 76 #define ALG_TYPE_DH (5 << 9) 77 #define ALG_TYPE_SECURECHANNEL (6 << 9) 78 79 #define ALG_SID_ANY (0) 80 81 #define ALG_SID_RSA_ANY 0 82 #define ALG_SID_RSA_PKCS 1 83 #define ALG_SID_RSA_MSATWORK 2 84 #define ALG_SID_RSA_ENTRUST 3 85 #define ALG_SID_RSA_PGP 4 86 87 #define ALG_SID_DSS_ANY 0 88 #define ALG_SID_DSS_PKCS 1 89 #define ALG_SID_DSS_DMS 2 90 91 #define ALG_SID_DES 1 92 #define ALG_SID_3DES 3 93 #define ALG_SID_DESX 4 94 #define ALG_SID_IDEA 5 95 #define ALG_SID_CAST 6 96 #define ALG_SID_SAFERSK64 7 97 #define ALG_SID_SAFERSK128 8 98 #define ALG_SID_3DES_112 9 99 #define ALG_SID_CYLINK_MEK 12 100 #define ALG_SID_RC5 13 101 102 #define ALG_SID_AES_128 14 103 #define ALG_SID_AES_192 15 104 #define ALG_SID_AES_256 16 105 #define ALG_SID_AES 17 106 107 #define ALG_SID_SKIPJACK 10 108 #define ALG_SID_TEK 11 109 110 #define CRYPT_MODE_CBCI 6 111 #define CRYPT_MODE_CFBP 7 112 #define CRYPT_MODE_OFBP 8 113 #define CRYPT_MODE_CBCOFM 9 114 #define CRYPT_MODE_CBCOFMI 10 115 116 #define ALG_SID_RC2 2 117 118 #define ALG_SID_RC4 1 119 #define ALG_SID_SEAL 2 120 121 #define ALG_SID_DH_SANDF 1 122 #define ALG_SID_DH_EPHEM 2 123 #define ALG_SID_AGREED_KEY_ANY 3 124 #define ALG_SID_KEA 4 125 126 #define ALG_SID_ECDH 5 127 128 #define ALG_SID_MD2 1 129 #define ALG_SID_MD4 2 130 #define ALG_SID_MD5 3 131 #define ALG_SID_SHA 4 132 #define ALG_SID_SHA1 4 133 #define ALG_SID_MAC 5 134 #define ALG_SID_RIPEMD 6 135 #define ALG_SID_RIPEMD160 7 136 #define ALG_SID_SSL3SHAMD5 8 137 #define ALG_SID_HMAC 9 138 #define ALG_SID_TLS1PRF 10 139 140 #define ALG_SID_HASH_REPLACE_OWF 11 141 142 #define ALG_SID_SHA_256 12 143 #define ALG_SID_SHA_384 13 144 #define ALG_SID_SHA_512 14 145 146 #define ALG_SID_SSL3_MASTER 1 147 #define ALG_SID_SCHANNEL_MASTER_HASH 2 148 #define ALG_SID_SCHANNEL_MAC_KEY 3 149 #define ALG_SID_PCT1_MASTER 4 150 #define ALG_SID_SSL2_MASTER 5 151 #define ALG_SID_TLS1_MASTER 6 152 #define ALG_SID_SCHANNEL_ENC_KEY 7 153 154 #define ALG_SID_ECMQV 1 155 156 #define CALG_MD2 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD2) 157 #define CALG_MD4 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD4) 158 #define CALG_MD5 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5) 159 #define CALG_SHA (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA) 160 #define CALG_SHA1 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1) 161 #define CALG_MAC (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MAC) 162 #define CALG_RSA_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_RSA | ALG_SID_RSA_ANY) 163 #define CALG_DSS_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_DSS_ANY) 164 165 #define CALG_NO_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_ANY | ALG_SID_ANY) 166 167 #define CALG_RSA_KEYX (ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_RSA | ALG_SID_RSA_ANY) 168 #define CALG_DES (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_DES) 169 #define CALG_3DES_112 (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_3DES_112) 170 #define CALG_3DES (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_3DES) 171 #define CALG_DESX (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_DESX) 172 #define CALG_RC2 (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_RC2) 173 #define CALG_RC4 (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_STREAM | ALG_SID_RC4) 174 #define CALG_SEAL (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_STREAM | ALG_SID_SEAL) 175 #define CALG_DH_SF (ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_DH_SANDF) 176 #define CALG_DH_EPHEM (ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_DH_EPHEM) 177 #define CALG_AGREEDKEY_ANY (ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_AGREED_KEY_ANY) 178 #define CALG_KEA_KEYX (ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_KEA) 179 #define CALG_HUGHES_MD5 (ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_ANY | ALG_SID_MD5) 180 #define CALG_SKIPJACK (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_SKIPJACK) 181 #define CALG_TEK (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_TEK) 182 #define CALG_CYLINK_MEK (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_CYLINK_MEK) 183 #define CALG_SSL3_SHAMD5 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SSL3SHAMD5) 184 #define CALG_SSL3_MASTER (ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SSL3_MASTER) 185 #define CALG_SCHANNEL_MASTER_HASH \ 186 (ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SCHANNEL_MASTER_HASH) 187 #define CALG_SCHANNEL_MAC_KEY \ 188 (ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SCHANNEL_MAC_KEY) 189 #define CALG_SCHANNEL_ENC_KEY \ 190 (ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SCHANNEL_ENC_KEY) 191 #define CALG_PCT1_MASTER (ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_PCT1_MASTER) 192 #define CALG_SSL2_MASTER (ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SSL2_MASTER) 193 #define CALG_TLS1_MASTER (ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_TLS1_MASTER) 194 #define CALG_RC5 (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_RC5) 195 #define CALG_HMAC (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HMAC) 196 #define CALG_TLS1PRF (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_TLS1PRF) 197 198 #define CALG_HASH_REPLACE_OWF (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HASH_REPLACE_OWF) 199 #define CALG_AES_128 (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_128) 200 #define CALG_AES_192 (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_192) 201 #define CALG_AES_256 (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_256) 202 #define CALG_AES (ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES) 203 204 #define CALG_SHA_256 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_256) 205 #define CALG_SHA_384 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_384) 206 #define CALG_SHA_512 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_512) 207 208 #define CALG_ECDH (ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_ECDH) 209 #define CALG_ECMQV (ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_ANY | ALG_SID_ECMQV) 210 211 typedef struct _CRYPTOAPI_BLOB 212 { 213 DWORD cbData; 214 BYTE* pbData; 215 } CRYPT_INTEGER_BLOB, *PCRYPT_INTEGER_BLOB, CRYPT_UINT_BLOB, *PCRYPT_UINT_BLOB, CRYPT_OBJID_BLOB, 216 *PCRYPT_OBJID_BLOB, CERT_NAME_BLOB, *PCERT_NAME_BLOB, CERT_RDN_VALUE_BLOB, 217 *PCERT_RDN_VALUE_BLOB, CERT_BLOB, *PCERT_BLOB, CRL_BLOB, *PCRL_BLOB, DATA_BLOB, *PDATA_BLOB, 218 CRYPT_DATA_BLOB, *PCRYPT_DATA_BLOB, CRYPT_HASH_BLOB, *PCRYPT_HASH_BLOB, CRYPT_DIGEST_BLOB, 219 *PCRYPT_DIGEST_BLOB, CRYPT_DER_BLOB, *PCRYPT_DER_BLOB, CRYPT_ATTR_BLOB, *PCRYPT_ATTR_BLOB; 220 221 typedef struct _CRYPT_ALGORITHM_IDENTIFIER 222 { 223 LPSTR pszObjId; 224 CRYPT_OBJID_BLOB Parameters; 225 } CRYPT_ALGORITHM_IDENTIFIER, *PCRYPT_ALGORITHM_IDENTIFIER; 226 227 typedef struct _CRYPT_BIT_BLOB 228 { 229 DWORD cbData; 230 BYTE* pbData; 231 DWORD cUnusedBits; 232 } CRYPT_BIT_BLOB, *PCRYPT_BIT_BLOB; 233 234 typedef struct _CERT_PUBLIC_KEY_INFO 235 { 236 CRYPT_ALGORITHM_IDENTIFIER Algorithm; 237 CRYPT_BIT_BLOB PublicKey; 238 } CERT_PUBLIC_KEY_INFO, *PCERT_PUBLIC_KEY_INFO; 239 240 typedef struct _CERT_EXTENSION 241 { 242 LPSTR pszObjId; 243 BOOL fCritical; 244 CRYPT_OBJID_BLOB Value; 245 } CERT_EXTENSION, *PCERT_EXTENSION; 246 typedef const CERT_EXTENSION* PCCERT_EXTENSION; 247 248 typedef struct _CERT_INFO 249 { 250 DWORD dwVersion; 251 CRYPT_INTEGER_BLOB SerialNumber; 252 CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm; 253 CERT_NAME_BLOB Issuer; 254 FILETIME NotBefore; 255 FILETIME NotAfter; 256 CERT_NAME_BLOB Subject; 257 CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo; 258 CRYPT_BIT_BLOB IssuerUniqueId; 259 CRYPT_BIT_BLOB SubjectUniqueId; 260 DWORD cExtension; 261 PCERT_EXTENSION rgExtension; 262 } CERT_INFO, *PCERT_INFO; 263 264 typedef void* HCERTSTORE; 265 typedef ULONG_PTR HCRYPTPROV; 266 typedef ULONG_PTR HCRYPTPROV_LEGACY; 267 268 typedef struct _CERT_CONTEXT 269 { 270 DWORD dwCertEncodingType; 271 BYTE* pbCertEncoded; 272 DWORD cbCertEncoded; 273 PCERT_INFO pCertInfo; 274 HCERTSTORE hCertStore; 275 } CERT_CONTEXT, *PCERT_CONTEXT; 276 typedef const CERT_CONTEXT* PCCERT_CONTEXT; 277 278 #define CERT_ENCODING_TYPE_MASK 0x0000FFFF 279 #define CMSG_ENCODING_TYPE_MASK 0xFFFF0000 280 #define GET_CERT_ENCODING_TYPE(x) (x & CERT_ENCODING_TYPE_MASK) 281 #define GET_CMSG_ENCODING_TYPE(x) (x & CMSG_ENCODING_TYPE_MASK) 282 283 #define CRYPT_ASN_ENCODING 0x00000001 284 #define CRYPT_NDR_ENCODING 0x00000002 285 #define X509_ASN_ENCODING 0x00000001 286 #define X509_NDR_ENCODING 0x00000002 287 #define PKCS_7_ASN_ENCODING 0x00010000 288 #define PKCS_7_NDR_ENCODING 0x00020000 289 290 #define CERT_COMPARE_MASK 0xFFFF 291 #define CERT_COMPARE_SHIFT 16 292 #define CERT_COMPARE_ANY 0 293 #define CERT_COMPARE_SHA1_HASH 1 294 #define CERT_COMPARE_NAME 2 295 #define CERT_COMPARE_ATTR 3 296 #define CERT_COMPARE_MD5_HASH 4 297 #define CERT_COMPARE_PROPERTY 5 298 #define CERT_COMPARE_PUBLIC_KEY 6 299 #define CERT_COMPARE_HASH CERT_COMPARE_SHA1_HASH 300 #define CERT_COMPARE_NAME_STR_A 7 301 #define CERT_COMPARE_NAME_STR_W 8 302 #define CERT_COMPARE_KEY_SPEC 9 303 #define CERT_COMPARE_ENHKEY_USAGE 10 304 #define CERT_COMPARE_CTL_USAGE CERT_COMPARE_ENHKEY_USAGE 305 #define CERT_COMPARE_SUBJECT_CERT 11 306 #define CERT_COMPARE_ISSUER_OF 12 307 #define CERT_COMPARE_EXISTING 13 308 #define CERT_COMPARE_SIGNATURE_HASH 14 309 #define CERT_COMPARE_KEY_IDENTIFIER 15 310 #define CERT_COMPARE_CERT_ID 16 311 #define CERT_COMPARE_CROSS_CERT_DIST_POINTS 17 312 #define CERT_COMPARE_PUBKEY_MD5_HASH 18 313 #define CERT_COMPARE_SUBJECT_INFO_ACCESS 19 314 #define CERT_COMPARE_HASH_STR 20 315 #define CERT_COMPARE_HAS_PRIVATE_KEY 21 316 317 #define CERT_FIND_ANY (CERT_COMPARE_ANY << CERT_COMPARE_SHIFT) 318 #define CERT_FIND_SHA1_HASH (CERT_COMPARE_SHA1_HASH << CERT_COMPARE_SHIFT) 319 #define CERT_FIND_MD5_HASH (CERT_COMPARE_MD5_HASH << CERT_COMPARE_SHIFT) 320 #define CERT_FIND_SIGNATURE_HASH (CERT_COMPARE_SIGNATURE_HASH << CERT_COMPARE_SHIFT) 321 #define CERT_FIND_KEY_IDENTIFIER (CERT_COMPARE_KEY_IDENTIFIER << CERT_COMPARE_SHIFT) 322 #define CERT_FIND_HASH CERT_FIND_SHA1_HASH 323 #define CERT_FIND_PROPERTY (CERT_COMPARE_PROPERTY << CERT_COMPARE_SHIFT) 324 #define CERT_FIND_PUBLIC_KEY (CERT_COMPARE_PUBLIC_KEY << CERT_COMPARE_SHIFT) 325 #define CERT_FIND_SUBJECT_NAME (CERT_COMPARE_NAME << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG) 326 #define CERT_FIND_SUBJECT_ATTR (CERT_COMPARE_ATTR << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG) 327 #define CERT_FIND_ISSUER_NAME (CERT_COMPARE_NAME << CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG) 328 #define CERT_FIND_ISSUER_ATTR (CERT_COMPARE_ATTR << CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG) 329 #define CERT_FIND_SUBJECT_STR_A \ 330 (CERT_COMPARE_NAME_STR_A << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG) 331 #define CERT_FIND_SUBJECT_STR_W \ 332 (CERT_COMPARE_NAME_STR_W << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG) 333 #define CERT_FIND_SUBJECT_STR CERT_FIND_SUBJECT_STR_W 334 #define CERT_FIND_ISSUER_STR_A \ 335 (CERT_COMPARE_NAME_STR_A << CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG) 336 #define CERT_FIND_ISSUER_STR_W \ 337 (CERT_COMPARE_NAME_STR_W << CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG) 338 #define CERT_FIND_ISSUER_STR CERT_FIND_ISSUER_STR_W 339 #define CERT_FIND_KEY_SPEC (CERT_COMPARE_KEY_SPEC << CERT_COMPARE_SHIFT) 340 #define CERT_FIND_ENHKEY_USAGE (CERT_COMPARE_ENHKEY_USAGE << CERT_COMPARE_SHIFT) 341 #define CERT_FIND_CTL_USAGE CERT_FIND_ENHKEY_USAGE 342 #define CERT_FIND_SUBJECT_CERT (CERT_COMPARE_SUBJECT_CERT << CERT_COMPARE_SHIFT) 343 #define CERT_FIND_ISSUER_OF (CERT_COMPARE_ISSUER_OF << CERT_COMPARE_SHIFT) 344 #define CERT_FIND_EXISTING (CERT_COMPARE_EXISTING << CERT_COMPARE_SHIFT) 345 #define CERT_FIND_CERT_ID (CERT_COMPARE_CERT_ID << CERT_COMPARE_SHIFT) 346 #define CERT_FIND_CROSS_CERT_DIST_POINTS (CERT_COMPARE_CROSS_CERT_DIST_POINTS << CERT_COMPARE_SHIFT) 347 #define CERT_FIND_PUBKEY_MD5_HASH (CERT_COMPARE_PUBKEY_MD5_HASH << CERT_COMPARE_SHIFT) 348 #define CERT_FIND_SUBJECT_INFO_ACCESS (CERT_COMPARE_SUBJECT_INFO_ACCESS << CERT_COMPARE_SHIFT) 349 #define CERT_FIND_HASH_STR (CERT_COMPARE_HASH_STR << CERT_COMPARE_SHIFT) 350 #define CERT_FIND_HAS_PRIVATE_KEY (CERT_COMPARE_HAS_PRIVATE_KEY << CERT_COMPARE_SHIFT) 351 352 #define CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG 0x1 353 #define CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG 0x2 354 #define CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG 0x4 355 #define CERT_FIND_NO_ENHKEY_USAGE_FLAG 0x8 356 #define CERT_FIND_OR_ENHKEY_USAGE_FLAG 0x10 357 #define CERT_FIND_VALID_ENHKEY_USAGE_FLAG 0x20 358 #define CERT_FIND_OPTIONAL_CTL_USAGE_FLAG CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG 359 #define CERT_FIND_EXT_ONLY_CTL_USAGE_FLAG CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG 360 #define CERT_FIND_PROP_ONLY_CTL_USAGE_FLAG CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG 361 #define CERT_FIND_NO_CTL_USAGE_FLAG CERT_FIND_NO_ENHKEY_USAGE_FLAG 362 #define CERT_FIND_OR_CTL_USAGE_FLAG CERT_FIND_OR_ENHKEY_USAGE_FLAG 363 #define CERT_FIND_VALID_CTL_USAGE_FLAG CERT_FIND_VALID_ENHKEY_USAGE_FLAG 364 365 #define CERT_NAME_EMAIL_TYPE 1 366 #define CERT_NAME_RDN_TYPE 2 367 #define CERT_NAME_ATTR_TYPE 3 368 #define CERT_NAME_SIMPLE_DISPLAY_TYPE 4 369 #define CERT_NAME_FRIENDLY_DISPLAY_TYPE 5 370 #define CERT_NAME_DNS_TYPE 6 371 #define CERT_NAME_URL_TYPE 7 372 #define CERT_NAME_UPN_TYPE 8 373 374 #define CERT_NAME_ISSUER_FLAG 0x1 375 #define CERT_NAME_DISABLE_IE4_UTF8_FLAG 0x00010000 376 377 #define CERT_NAME_SEARCH_ALL_NAMES_FLAG 0x2 378 379 #define CERT_STORE_PROV_MSG ((LPCSTR)1) 380 #define CERT_STORE_PROV_MEMORY ((LPCSTR)2) 381 #define CERT_STORE_PROV_FILE ((LPCSTR)3) 382 #define CERT_STORE_PROV_REG ((LPCSTR)4) 383 #define CERT_STORE_PROV_PKCS7 ((LPCSTR)5) 384 #define CERT_STORE_PROV_SERIALIZED ((LPCSTR)6) 385 #define CERT_STORE_PROV_FILENAME_A ((LPCSTR)7) 386 #define CERT_STORE_PROV_FILENAME_W ((LPCSTR)8) 387 #define CERT_STORE_PROV_FILENAME CERT_STORE_PROV_FILENAME_W 388 #define CERT_STORE_PROV_SYSTEM_A ((LPCSTR)9) 389 #define CERT_STORE_PROV_SYSTEM_W ((LPCSTR)10) 390 #define CERT_STORE_PROV_SYSTEM CERT_STORE_PROV_SYSTEM_W 391 #define CERT_STORE_PROV_COLLECTION ((LPCSTR)11) 392 #define CERT_STORE_PROV_SYSTEM_REGISTRY_A ((LPCSTR)12) 393 #define CERT_STORE_PROV_SYSTEM_REGISTRY_W ((LPCSTR)13) 394 #define CERT_STORE_PROV_SYSTEM_REGISTRY CERT_STORE_PROV_SYSTEM_REGISTRY_W 395 #define CERT_STORE_PROV_PHYSICAL_W ((LPCSTR)14) 396 #define CERT_STORE_PROV_PHYSICAL CERT_STORE_PROV_PHYSICAL_W 397 #define CERT_STORE_PROV_SMART_CARD_W ((LPCSTR)15) 398 #define CERT_STORE_PROV_SMART_CARD CERT_STORE_PROV_SMART_CARD_W 399 #define CERT_STORE_PROV_LDAP_W ((LPCSTR)16) 400 #define CERT_STORE_PROV_LDAP CERT_STORE_PROV_LDAP_W 401 #define CERT_STORE_PROV_PKCS12 ((LPCSTR)17) 402 #define sz_CERT_STORE_PROV_MEMORY "Memory" 403 #define sz_CERT_STORE_PROV_FILENAME_W "File" 404 #define sz_CERT_STORE_PROV_FILENAME sz_CERT_STORE_PROV_FILENAME_W 405 #define sz_CERT_STORE_PROV_SYSTEM_W "System" 406 #define sz_CERT_STORE_PROV_SYSTEM sz_CERT_STORE_PROV_SYSTEM_W 407 #define sz_CERT_STORE_PROV_PKCS7 "PKCS7" 408 #define sz_CERT_STORE_PROV_PKCS12 "PKCS12" 409 #define sz_CERT_STORE_PROV_SERIALIZED "Serialized" 410 #define sz_CERT_STORE_PROV_COLLECTION "Collection" 411 #define sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W "SystemRegistry" 412 #define sz_CERT_STORE_PROV_SYSTEM_REGISTRY sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W 413 #define sz_CERT_STORE_PROV_PHYSICAL_W "Physical" 414 #define sz_CERT_STORE_PROV_PHYSICAL sz_CERT_STORE_PROV_PHYSICAL_W 415 #define sz_CERT_STORE_PROV_SMART_CARD_W "SmartCard" 416 #define sz_CERT_STORE_PROV_SMART_CARD sz_CERT_STORE_PROV_SMART_CARD_W 417 #define sz_CERT_STORE_PROV_LDAP_W "Ldap" 418 #define sz_CERT_STORE_PROV_LDAP sz_CERT_STORE_PROV_LDAP_W 419 420 #define CERT_STORE_SIGNATURE_FLAG 0x00000001 421 #define CERT_STORE_TIME_VALIDITY_FLAG 0x00000002 422 #define CERT_STORE_REVOCATION_FLAG 0x00000004 423 #define CERT_STORE_NO_CRL_FLAG 0x00010000 424 #define CERT_STORE_NO_ISSUER_FLAG 0x00020000 425 #define CERT_STORE_BASE_CRL_FLAG 0x00000100 426 #define CERT_STORE_DELTA_CRL_FLAG 0x00000200 427 428 #define CERT_STORE_NO_CRYPT_RELEASE_FLAG 0x00000001 429 #define CERT_STORE_SET_LOCALIZED_NAME_FLAG 0x00000002 430 #define CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG 0x00000004 431 #define CERT_STORE_DELETE_FLAG 0x00000010 432 #define CERT_STORE_UNSAFE_PHYSICAL_FLAG 0x00000020 433 #define CERT_STORE_SHARE_STORE_FLAG 0x00000040 434 #define CERT_STORE_SHARE_CONTEXT_FLAG 0x00000080 435 #define CERT_STORE_MANIFOLD_FLAG 0x00000100 436 #define CERT_STORE_ENUM_ARCHIVED_FLAG 0x00000200 437 #define CERT_STORE_UPDATE_KEYID_FLAG 0x00000400 438 #define CERT_STORE_BACKUP_RESTORE_FLAG 0x00000800 439 #define CERT_STORE_READONLY_FLAG 0x00008000 440 #define CERT_STORE_OPEN_EXISTING_FLAG 0x00004000 441 #define CERT_STORE_CREATE_NEW_FLAG 0x00002000 442 #define CERT_STORE_MAXIMUM_ALLOWED_FLAG 0x00001000 443 444 #define CERT_SYSTEM_STORE_MASK 0xFFFF0000 445 #define CERT_SYSTEM_STORE_RELOCATE_FLAG 0x80000000 446 #define CERT_SYSTEM_STORE_UNPROTECTED_FLAG 0x40000000 447 #define CERT_SYSTEM_STORE_DEFER_READ_FLAG 0x20000000 448 #define CERT_SYSTEM_STORE_LOCATION_MASK 0x00FF0000 449 #define CERT_SYSTEM_STORE_LOCATION_SHIFT 16 450 #define CERT_SYSTEM_STORE_CURRENT_USER_ID 1 451 #define CERT_SYSTEM_STORE_LOCAL_MACHINE_ID 2 452 #define CERT_SYSTEM_STORE_CURRENT_SERVICE_ID 4 453 #define CERT_SYSTEM_STORE_SERVICES_ID 5 454 #define CERT_SYSTEM_STORE_USERS_ID 6 455 #define CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY_ID 7 456 #define CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY_ID 8 457 #define CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE_ID 9 458 459 #define CERT_SYSTEM_STORE_CURRENT_USER \ 460 (CERT_SYSTEM_STORE_CURRENT_USER_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT) 461 #define CERT_SYSTEM_STORE_LOCAL_MACHINE \ 462 (CERT_SYSTEM_STORE_LOCAL_MACHINE_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT) 463 #define CERT_SYSTEM_STORE_CURRENT_SERVICE \ 464 (CERT_SYSTEM_STORE_CURRENT_SERVICE_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT) 465 #define CERT_SYSTEM_STORE_SERVICES \ 466 (CERT_SYSTEM_STORE_SERVICES_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT) 467 #define CERT_SYSTEM_STORE_USERS (CERT_SYSTEM_STORE_USERS_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT) 468 #define CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY \ 469 (CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT) 470 #define CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY \ 471 (CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT) 472 #define CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE \ 473 (CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT) 474 475 HCERTSTORE CertOpenStore(LPCSTR lpszStoreProvider, DWORD dwMsgAndCertEncodingType, 476 HCRYPTPROV_LEGACY hCryptProv, DWORD dwFlags, const void* pvPara); 477 478 WINPR_API HCERTSTORE CertOpenSystemStoreW(HCRYPTPROV_LEGACY hProv, LPCWSTR szSubsystemProtocol); 479 WINPR_API HCERTSTORE CertOpenSystemStoreA(HCRYPTPROV_LEGACY hProv, LPCSTR szSubsystemProtocol); 480 481 WINPR_API BOOL CertCloseStore(HCERTSTORE hCertStore, DWORD dwFlags); 482 483 #ifdef UNICODE 484 #define CertOpenSystemStore CertOpenSystemStoreW 485 #else 486 #define CertOpenSystemStore CertOpenSystemStoreA 487 #endif 488 489 #ifdef __cplusplus 490 extern "C" 491 { 492 #endif 493 494 WINPR_API PCCERT_CONTEXT CertFindCertificateInStore(HCERTSTORE hCertStore, 495 DWORD dwCertEncodingType, DWORD dwFindFlags, 496 DWORD dwFindType, const void* pvFindPara, 497 PCCERT_CONTEXT pPrevCertContext); 498 499 WINPR_API PCCERT_CONTEXT CertEnumCertificatesInStore(HCERTSTORE hCertStore, 500 PCCERT_CONTEXT pPrevCertContext); 501 502 WINPR_API DWORD CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags, 503 void* pvTypePara, LPWSTR pszNameString, DWORD cchNameString); 504 WINPR_API DWORD CertGetNameStringA(PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags, 505 void* pvTypePara, LPSTR pszNameString, DWORD cchNameString); 506 507 #ifdef __cplusplus 508 } 509 #endif 510 511 #ifdef UNICODE 512 #define CertGetNameString CertGetNameStringW 513 #else 514 #define CertGetNameString CertGetNameStringA 515 #endif 516 517 /** 518 * Data Protection API (DPAPI) 519 */ 520 521 #define CRYPTPROTECTMEMORY_BLOCK_SIZE 16 522 523 #define CRYPTPROTECTMEMORY_SAME_PROCESS 0x00000000 524 #define CRYPTPROTECTMEMORY_CROSS_PROCESS 0x00000001 525 #define CRYPTPROTECTMEMORY_SAME_LOGON 0x00000002 526 527 #define CRYPTPROTECT_PROMPT_ON_UNPROTECT 0x00000001 528 #define CRYPTPROTECT_PROMPT_ON_PROTECT 0x00000002 529 #define CRYPTPROTECT_PROMPT_RESERVED 0x00000004 530 #define CRYPTPROTECT_PROMPT_STRONG 0x00000008 531 #define CRYPTPROTECT_PROMPT_REQUIRE_STRONG 0x00000010 532 533 #define CRYPTPROTECT_UI_FORBIDDEN 0x1 534 #define CRYPTPROTECT_LOCAL_MACHINE 0x4 535 #define CRYPTPROTECT_CRED_SYNC 0x8 536 #define CRYPTPROTECT_AUDIT 0x10 537 #define CRYPTPROTECT_NO_RECOVERY 0x20 538 #define CRYPTPROTECT_VERIFY_PROTECTION 0x40 539 #define CRYPTPROTECT_CRED_REGENERATE 0x80 540 541 #define CRYPTPROTECT_FIRST_RESERVED_FLAGVAL 0x0FFFFFFF 542 #define CRYPTPROTECT_LAST_RESERVED_FLAGVAL 0xFFFFFFFF 543 544 typedef struct _CRYPTPROTECT_PROMPTSTRUCT 545 { 546 DWORD cbSize; 547 DWORD dwPromptFlags; 548 HWND hwndApp; 549 LPCWSTR szPrompt; 550 } CRYPTPROTECT_PROMPTSTRUCT, *PCRYPTPROTECT_PROMPTSTRUCT; 551 552 #define CRYPTPROTECT_DEFAULT_PROVIDER \ 553 { \ 554 0xdf9d8cd0, 0x1501, 0x11d1, \ 555 { \ 556 0x8c, 0x7a, 0x00, 0xc0, 0x4f, 0xc2, 0x97, 0xeb \ 557 } \ 558 } 559 560 #ifdef __cplusplus 561 extern "C" 562 { 563 #endif 564 565 WINPR_API BOOL CryptProtectMemory(LPVOID pData, DWORD cbData, DWORD dwFlags); 566 WINPR_API BOOL CryptUnprotectMemory(LPVOID pData, DWORD cbData, DWORD dwFlags); 567 568 WINPR_API BOOL CryptProtectData(DATA_BLOB* pDataIn, LPCWSTR szDataDescr, 569 DATA_BLOB* pOptionalEntropy, PVOID pvReserved, 570 CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct, DWORD dwFlags, 571 DATA_BLOB* pDataOut); 572 WINPR_API BOOL CryptUnprotectData(DATA_BLOB* pDataIn, LPWSTR* ppszDataDescr, 573 DATA_BLOB* pOptionalEntropy, PVOID pvReserved, 574 CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct, DWORD dwFlags, 575 DATA_BLOB* pDataOut); 576 577 #ifdef __cplusplus 578 } 579 #endif 580 581 #define CRYPT_STRING_BASE64HEADER 0x00000000 582 #define CRYPT_STRING_BASE64 0x00000001 583 #define CRYPT_STRING_BINARY 0x00000002 584 #define CRYPT_STRING_BASE64REQUESTHEADER 0x00000003 585 #define CRYPT_STRING_HEX 0x00000004 586 #define CRYPT_STRING_HEXASCII 0x00000005 587 #define CRYPT_STRING_BASE64_ANY 0x00000006 588 #define CRYPT_STRING_ANY 0x00000007 589 #define CRYPT_STRING_HEX_ANY 0x00000008 590 #define CRYPT_STRING_BASE64X509CRLHEADER 0x00000009 591 #define CRYPT_STRING_HEXADDR 0x0000000A 592 #define CRYPT_STRING_HEXASCIIADDR 0x0000000B 593 #define CRYPT_STRING_HEXRAW 0x0000000C 594 595 #define CRYPT_STRING_HASHDATA 0x10000000 596 #define CRYPT_STRING_STRICT 0x20000000 597 #define CRYPT_STRING_NOCRLF 0x40000000 598 #define CRYPT_STRING_NOCR 0x80000000 599 600 BOOL CryptStringToBinaryW(LPCWSTR pszString, DWORD cchString, DWORD dwFlags, BYTE* pbBinary, 601 DWORD* pcbBinary, DWORD* pdwSkip, DWORD* pdwFlags); 602 BOOL CryptStringToBinaryA(LPCSTR pszString, DWORD cchString, DWORD dwFlags, BYTE* pbBinary, 603 DWORD* pcbBinary, DWORD* pdwSkip, DWORD* pdwFlags); 604 605 BOOL CryptBinaryToStringW(CONST BYTE* pbBinary, DWORD cbBinary, DWORD dwFlags, LPWSTR pszString, 606 DWORD* pcchString); 607 BOOL CryptBinaryToStringA(CONST BYTE* pbBinary, DWORD cbBinary, DWORD dwFlags, LPSTR pszString, 608 DWORD* pcchString); 609 610 #ifdef UNICODE 611 #define CryptStringToBinary CryptStringToBinaryW 612 #define CryptBinaryToString CryptBinaryToStringW 613 #else 614 #define CryptStringToBinary CryptStringToBinaryA 615 #define CryptBinaryToString CryptBinaryToStringA 616 #endif 617 618 #endif 619 620 #ifndef ALG_SID_ECSDA 621 #define ALG_SID_ECDSA 3 622 #define CALG_ECDSA (ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_ECDSA) 623 #endif 624 625 /** 626 * Custom Crypto API Abstraction Layer 627 */ 628 629 #define WINPR_MD4_DIGEST_LENGTH 16 630 #define WINPR_MD5_DIGEST_LENGTH 16 631 #define WINPR_SHA1_DIGEST_LENGTH 20 632 #define WINPR_SHA224_DIGEST_LENGTH 28 633 #define WINPR_SHA256_DIGEST_LENGTH 32 634 #define WINPR_SHA384_DIGEST_LENGTH 48 635 #define WINPR_SHA512_DIGEST_LENGTH 64 636 #define WINPR_RIPEMD160_DIGEST_LENGTH 20 637 #define WINPR_SHA3_224_DIGEST_LENGTH 28 638 #define WINPR_SHA3_256_DIGEST_LENGTH 32 639 #define WINPR_SHA3_384_DIGEST_LENGTH 48 640 #define WINPR_SHA3_512_DIGEST_LENGTH 64 641 #define WINPR_SHAKE128_DIGEST_LENGTH 16 642 #define WINPR_SHAKE256_DIGEST_LENGTH 32 643 644 /** 645 * HMAC 646 */ 647 typedef enum 648 { 649 WINPR_MD_NONE = 0, 650 WINPR_MD_MD2 = 1, 651 WINPR_MD_MD4 = 2, 652 WINPR_MD_MD5 = 3, 653 WINPR_MD_SHA1 = 4, 654 WINPR_MD_SHA224 = 5, 655 WINPR_MD_SHA256 = 6, 656 WINPR_MD_SHA384 = 7, 657 WINPR_MD_SHA512 = 8, 658 WINPR_MD_RIPEMD160 = 9, 659 WINPR_MD_SHA3_224 = 10, 660 WINPR_MD_SHA3_256 = 11, 661 WINPR_MD_SHA3_384 = 12, 662 WINPR_MD_SHA3_512 = 13, 663 WINPR_MD_SHAKE128 = 14, 664 WINPR_MD_SHAKE256 = 15 665 } WINPR_MD_TYPE; 666 667 typedef struct _winpr_hmac_ctx_private_st WINPR_HMAC_CTX; 668 669 #ifdef __cplusplus 670 extern "C" 671 { 672 #endif 673 674 WINPR_API WINPR_MD_TYPE winpr_md_type_from_string(const char* name); 675 WINPR_API const char* winpr_md_type_to_string(WINPR_MD_TYPE md); 676 677 WINPR_API WINPR_HMAC_CTX* winpr_HMAC_New(void); 678 WINPR_API BOOL winpr_HMAC_Init(WINPR_HMAC_CTX* ctx, WINPR_MD_TYPE md, const BYTE* key, 679 size_t keylen); 680 WINPR_API BOOL winpr_HMAC_Update(WINPR_HMAC_CTX* ctx, const BYTE* input, size_t ilen); 681 WINPR_API BOOL winpr_HMAC_Final(WINPR_HMAC_CTX* ctx, BYTE* output, size_t ilen); 682 WINPR_API void winpr_HMAC_Free(WINPR_HMAC_CTX* ctx); 683 WINPR_API BOOL winpr_HMAC(WINPR_MD_TYPE md, const BYTE* key, size_t keylen, const BYTE* input, 684 size_t ilen, BYTE* output, size_t olen); 685 686 #ifdef __cplusplus 687 } 688 #endif 689 690 /** 691 * Generic Digest API 692 */ 693 694 typedef struct _winpr_digest_ctx_private_st WINPR_DIGEST_CTX; 695 696 #ifdef __cplusplus 697 extern "C" 698 { 699 #endif 700 701 WINPR_API WINPR_DIGEST_CTX* winpr_Digest_New(void); 702 WINPR_API BOOL winpr_Digest_Init_Allow_FIPS(WINPR_DIGEST_CTX* ctx, WINPR_MD_TYPE md); 703 WINPR_API BOOL winpr_Digest_Init(WINPR_DIGEST_CTX* ctx, WINPR_MD_TYPE md); 704 WINPR_API BOOL winpr_Digest_Update(WINPR_DIGEST_CTX* ctx, const BYTE* input, size_t ilen); 705 WINPR_API BOOL winpr_Digest_Final(WINPR_DIGEST_CTX* ctx, BYTE* output, size_t ilen); 706 WINPR_API void winpr_Digest_Free(WINPR_DIGEST_CTX* ctx); 707 WINPR_API BOOL winpr_Digest_Allow_FIPS(WINPR_MD_TYPE md, const BYTE* input, size_t ilen, 708 BYTE* output, size_t olen); 709 WINPR_API BOOL winpr_Digest(WINPR_MD_TYPE md, const BYTE* input, size_t ilen, BYTE* output, 710 size_t olen); 711 712 #ifdef __cplusplus 713 } 714 #endif 715 716 /** 717 * Random Number Generation 718 */ 719 720 #ifdef __cplusplus 721 extern "C" 722 { 723 #endif 724 725 WINPR_API int winpr_RAND(BYTE* output, size_t len); 726 WINPR_API int winpr_RAND_pseudo(BYTE* output, size_t len); 727 728 #ifdef __cplusplus 729 } 730 #endif 731 732 /** 733 * RC4 734 */ 735 736 typedef struct _winpr_rc4_ctx_private_st WINPR_RC4_CTX; 737 738 #ifdef __cplusplus 739 extern "C" 740 { 741 #endif 742 743 WINPR_API WINPR_RC4_CTX* winpr_RC4_New_Allow_FIPS(const BYTE* key, size_t keylen); 744 WINPR_API WINPR_RC4_CTX* winpr_RC4_New(const BYTE* key, size_t keylen); 745 WINPR_API BOOL winpr_RC4_Update(WINPR_RC4_CTX* ctx, size_t length, const BYTE* input, 746 BYTE* output); 747 WINPR_API void winpr_RC4_Free(WINPR_RC4_CTX* ctx); 748 749 #ifdef __cplusplus 750 } 751 #endif 752 753 /** 754 * Generic Cipher API 755 */ 756 757 #define WINPR_AES_BLOCK_SIZE 16 758 759 /* cipher operation types */ 760 #define WINPR_ENCRYPT 0 761 #define WINPR_DECRYPT 1 762 763 /* cipher types */ 764 #define WINPR_CIPHER_NONE 0 765 #define WINPR_CIPHER_NULL 1 766 #define WINPR_CIPHER_AES_128_ECB 2 767 #define WINPR_CIPHER_AES_192_ECB 3 768 #define WINPR_CIPHER_AES_256_ECB 4 769 #define WINPR_CIPHER_AES_128_CBC 5 770 #define WINPR_CIPHER_AES_192_CBC 6 771 #define WINPR_CIPHER_AES_256_CBC 7 772 #define WINPR_CIPHER_AES_128_CFB128 8 773 #define WINPR_CIPHER_AES_192_CFB128 9 774 #define WINPR_CIPHER_AES_256_CFB128 10 775 #define WINPR_CIPHER_AES_128_CTR 11 776 #define WINPR_CIPHER_AES_192_CTR 12 777 #define WINPR_CIPHER_AES_256_CTR 13 778 #define WINPR_CIPHER_AES_128_GCM 14 779 #define WINPR_CIPHER_AES_192_GCM 15 780 #define WINPR_CIPHER_AES_256_GCM 16 781 #define WINPR_CIPHER_CAMELLIA_128_ECB 17 782 #define WINPR_CIPHER_CAMELLIA_192_ECB 18 783 #define WINPR_CIPHER_CAMELLIA_256_ECB 19 784 #define WINPR_CIPHER_CAMELLIA_128_CBC 20 785 #define WINPR_CIPHER_CAMELLIA_192_CBC 21 786 #define WINPR_CIPHER_CAMELLIA_256_CBC 22 787 #define WINPR_CIPHER_CAMELLIA_128_CFB128 23 788 #define WINPR_CIPHER_CAMELLIA_192_CFB128 24 789 #define WINPR_CIPHER_CAMELLIA_256_CFB128 25 790 #define WINPR_CIPHER_CAMELLIA_128_CTR 26 791 #define WINPR_CIPHER_CAMELLIA_192_CTR 27 792 #define WINPR_CIPHER_CAMELLIA_256_CTR 28 793 #define WINPR_CIPHER_CAMELLIA_128_GCM 29 794 #define WINPR_CIPHER_CAMELLIA_192_GCM 30 795 #define WINPR_CIPHER_CAMELLIA_256_GCM 31 796 #define WINPR_CIPHER_DES_ECB 32 797 #define WINPR_CIPHER_DES_CBC 33 798 #define WINPR_CIPHER_DES_EDE_ECB 34 799 #define WINPR_CIPHER_DES_EDE_CBC 35 800 #define WINPR_CIPHER_DES_EDE3_ECB 36 801 #define WINPR_CIPHER_DES_EDE3_CBC 37 802 #define WINPR_CIPHER_BLOWFISH_ECB 38 803 #define WINPR_CIPHER_BLOWFISH_CBC 39 804 #define WINPR_CIPHER_BLOWFISH_CFB64 40 805 #define WINPR_CIPHER_BLOWFISH_CTR 41 806 #define WINPR_CIPHER_ARC4_128 42 807 #define WINPR_CIPHER_AES_128_CCM 43 808 #define WINPR_CIPHER_AES_192_CCM 44 809 #define WINPR_CIPHER_AES_256_CCM 45 810 #define WINPR_CIPHER_CAMELLIA_128_CCM 46 811 #define WINPR_CIPHER_CAMELLIA_192_CCM 47 812 #define WINPR_CIPHER_CAMELLIA_256_CCM 48 813 814 typedef struct _winpr_cipher_ctx_private_st WINPR_CIPHER_CTX; 815 816 #ifdef __cplusplus 817 extern "C" 818 { 819 #endif 820 821 WINPR_API WINPR_CIPHER_CTX* winpr_Cipher_New(int cipher, int op, const BYTE* key, 822 const BYTE* iv); 823 WINPR_API BOOL winpr_Cipher_Update(WINPR_CIPHER_CTX* ctx, const BYTE* input, size_t ilen, 824 BYTE* output, size_t* olen); 825 WINPR_API BOOL winpr_Cipher_Final(WINPR_CIPHER_CTX* ctx, BYTE* output, size_t* olen); 826 WINPR_API void winpr_Cipher_Free(WINPR_CIPHER_CTX* ctx); 827 828 #ifdef __cplusplus 829 } 830 #endif 831 832 /** 833 * Key Generation 834 */ 835 836 #ifdef __cplusplus 837 extern "C" 838 { 839 #endif 840 841 WINPR_API int winpr_Cipher_BytesToKey(int cipher, int md, const BYTE* salt, const BYTE* data, 842 int datal, int count, BYTE* key, BYTE* iv); 843 844 #ifdef __cplusplus 845 } 846 #endif 847 848 #endif /* WINPR_CRYPTO_H */ 849