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