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