Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/dlls/advapi32/tests/crypt.c
4389 views
1
/*
2
* Unit tests for crypt functions
3
*
4
* Copyright (c) 2004 Michael Jung
5
*
6
* This library is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* This library is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with this library; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19
*/
20
21
#include <stdarg.h>
22
23
#include "windef.h"
24
#include "winbase.h"
25
#include "wincrypt.h"
26
#include "winerror.h"
27
#include "winreg.h"
28
29
#include "wine/test.h"
30
31
static const char szRsaBaseProv[] = MS_DEF_PROV_A;
32
static const char szNonExistentProv[] = "Wine Nonexistent Cryptographic Provider v11.2";
33
static const char szKeySet[] = "wine_test_keyset";
34
static const char szBadKeySet[] = "wine_test_bad_keyset";
35
#define NON_DEF_PROV_TYPE 999
36
37
static BOOL (WINAPI *pCryptEnumProviderTypesA)(DWORD, DWORD*, DWORD, DWORD*, LPSTR, DWORD*);
38
static BOOL (WINAPI *pCryptEnumProvidersA)(DWORD, DWORD*, DWORD, DWORD*, LPSTR, DWORD*);
39
static BOOL (WINAPI *pCryptGetDefaultProviderA)(DWORD, DWORD*, DWORD, LPSTR, DWORD*);
40
static BOOL (WINAPI *pCryptSetProviderExA)(LPCSTR, DWORD, DWORD*, DWORD);
41
static BOOL (WINAPI *pCryptGenRandom)(HCRYPTPROV, DWORD, BYTE*);
42
static BOOL (WINAPI *pCryptDuplicateHash)(HCRYPTHASH, DWORD*, DWORD, HCRYPTHASH*);
43
static BOOL (WINAPI *pCryptHashSessionKey)(HCRYPTHASH, HCRYPTKEY, DWORD);
44
static BOOL (WINAPI *pCryptSignHashW)(HCRYPTHASH, DWORD, LPCWSTR, DWORD, BYTE*, DWORD*);
45
static BOOL (WINAPI *pCryptVerifySignatureW)(HCRYPTHASH, BYTE*, DWORD, HCRYPTKEY, LPCWSTR, DWORD);
46
static BOOLEAN (WINAPI *pSystemFunction036)(PVOID, ULONG);
47
48
static void init_function_pointers(void)
49
{
50
HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
51
52
pCryptEnumProviderTypesA = (void*)GetProcAddress(hadvapi32, "CryptEnumProviderTypesA");
53
pCryptEnumProvidersA = (void*)GetProcAddress(hadvapi32, "CryptEnumProvidersA");
54
pCryptGetDefaultProviderA = (void*)GetProcAddress(hadvapi32, "CryptGetDefaultProviderA");
55
pCryptSetProviderExA = (void*)GetProcAddress(hadvapi32, "CryptSetProviderExA");
56
pCryptGenRandom = (void*)GetProcAddress(hadvapi32, "CryptGenRandom");
57
pCryptDuplicateHash = (void*)GetProcAddress(hadvapi32, "CryptDuplicateHash");
58
pCryptHashSessionKey = (void*)GetProcAddress(hadvapi32, "CryptHashSessionKey");
59
pCryptSignHashW = (void*)GetProcAddress(hadvapi32, "CryptSignHashW");
60
pCryptVerifySignatureW = (void*)GetProcAddress(hadvapi32, "CryptVerifySignatureW");
61
pSystemFunction036 = (void*)GetProcAddress(hadvapi32, "SystemFunction036");
62
}
63
64
static void init_environment(void)
65
{
66
HCRYPTPROV hProv;
67
BOOL ret;
68
69
/* Ensure that container "wine_test_keyset" does exist */
70
if (!CryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0))
71
{
72
CryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, CRYPT_NEWKEYSET);
73
}
74
ret = CryptReleaseContext(hProv, 0);
75
ok(ret, "got %lu\n", GetLastError());
76
77
/* Ensure that container "wine_test_keyset" does exist in default PROV_RSA_FULL type provider */
78
if (!CryptAcquireContextA(&hProv, szKeySet, NULL, PROV_RSA_FULL, 0))
79
{
80
CryptAcquireContextA(&hProv, szKeySet, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET);
81
}
82
ret = CryptReleaseContext(hProv, 0);
83
ok(ret, "got %lu\n", GetLastError());
84
85
/* Ensure that container "wine_test_bad_keyset" does not exist. */
86
if (CryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv, PROV_RSA_FULL, 0))
87
{
88
ret = CryptReleaseContext(hProv, 0);
89
ok(ret, "got %lu\n", GetLastError());
90
91
CryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
92
}
93
}
94
95
static void clean_up_environment(void)
96
{
97
HCRYPTPROV hProv;
98
BOOL ret;
99
100
/* Remove container "wine_test_keyset" */
101
if (CryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0))
102
{
103
ret = CryptReleaseContext(hProv, 0);
104
ok(ret, "got %lu\n", GetLastError());
105
106
CryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
107
}
108
109
/* Remove container "wine_test_keyset" from default PROV_RSA_FULL type provider */
110
if (CryptAcquireContextA(&hProv, szKeySet, NULL, PROV_RSA_FULL, 0))
111
{
112
ret = CryptReleaseContext(hProv, 0);
113
ok(ret, "got %lu\n", GetLastError());
114
115
CryptAcquireContextA(&hProv, szKeySet, NULL, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
116
}
117
118
/* Remove container "wine_test_bad_keyset" */
119
if (CryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv, PROV_RSA_FULL, 0))
120
{
121
ret = CryptReleaseContext(hProv, 0);
122
ok(ret, "got %lu\n", GetLastError());
123
124
CryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
125
}
126
}
127
128
static void test_CryptReleaseContext(void)
129
{
130
BOOL ret;
131
HCRYPTPROV prov;
132
133
/* TODO: Add cases for ERROR_BUSY, ERROR_INVALID_HANDLE and NTE_BAD_UID */
134
135
/* NULL provider */
136
137
SetLastError(0xdeadbeef);
138
ret = CryptReleaseContext(0, 0);
139
ok(!ret, "CryptReleaseContext succeeded unexpectedly\n");
140
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %lu\n", GetLastError());
141
142
SetLastError(0xdeadbeef);
143
ret = CryptReleaseContext(0, ~0);
144
ok(!ret, "CryptReleaseContext succeeded unexpectedly\n");
145
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %lu\n", GetLastError());
146
147
/* Additional refcount */
148
149
ret = CryptAcquireContextA(&prov, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0);
150
ok(ret, "got %lu\n", GetLastError());
151
152
ret = CryptContextAddRef(prov, NULL, 0);
153
ok(ret, "got %lu\n", GetLastError());
154
155
ret = CryptContextAddRef(0, NULL, 0);
156
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %lu\n", GetLastError());
157
ret = CryptContextAddRef(0xdeadbeef, NULL, 0);
158
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %lu\n", GetLastError());
159
160
ret = CryptReleaseContext(prov, 0);
161
ok(ret, "got %lu\n", GetLastError());
162
163
/* Nonzero flags, which allow release nonetheless */
164
165
SetLastError(0xdeadbeef);
166
ret = CryptReleaseContext(prov, ~0);
167
ok(!ret, "CryptReleaseContext succeeded unexpectedly\n");
168
ok(GetLastError() == NTE_BAD_FLAGS, "got %lu\n", GetLastError());
169
170
/* Obsolete provider */
171
172
SetLastError(0xdeadbeef);
173
ret = CryptReleaseContext(prov, 0);
174
ok(!ret, "CryptReleaseContext succeeded unexpectedly\n");
175
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %lu\n", GetLastError());
176
177
SetLastError(0xdeadbeef);
178
ret = CryptReleaseContext(prov, ~0);
179
ok(!ret, "CryptReleaseContext succeeded unexpectedly\n");
180
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %lu\n", GetLastError());
181
}
182
183
static void test_acquire_context(void)
184
{
185
BOOL result;
186
HCRYPTPROV hProv;
187
DWORD GLE;
188
189
/* Provoke all kinds of error conditions (which are easy to provoke).
190
* The order of the error tests seems to match Windows XP's rsaenh.dll CSP,
191
* but since this is likely to change between CSP versions, we don't check
192
* this. Please don't change the order of tests. */
193
result = CryptAcquireContextA(&hProv, NULL, NULL, 0, 0);
194
ok(!result && GetLastError()==NTE_BAD_PROV_TYPE, "%ld\n", GetLastError());
195
196
result = CryptAcquireContextA(&hProv, NULL, NULL, 1000, 0);
197
ok(!result && GetLastError()==NTE_BAD_PROV_TYPE, "%ld\n", GetLastError());
198
199
result = CryptAcquireContextA(&hProv, NULL, NULL, NON_DEF_PROV_TYPE, 0);
200
ok(!result && GetLastError()==NTE_PROV_TYPE_NOT_DEF, "%ld\n", GetLastError());
201
202
result = CryptAcquireContextA(&hProv, szKeySet, szNonExistentProv, PROV_RSA_FULL, 0);
203
ok(!result && GetLastError()==NTE_KEYSET_NOT_DEF, "%ld\n", GetLastError());
204
205
result = CryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, NON_DEF_PROV_TYPE, 0);
206
ok(!result && GetLastError()==NTE_PROV_TYPE_NO_MATCH, "%ld\n", GetLastError());
207
208
209
if (0)
210
{
211
/* This test fails under Win2k SP4:
212
result = TRUE, GetLastError() == ERROR_INVALID_PARAMETER */
213
SetLastError(0xdeadbeef);
214
result = CryptAcquireContextA(NULL, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0);
215
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "%d/%ld\n", result, GetLastError());
216
}
217
218
/* Last not least, try to really acquire a context. */
219
hProv = 0;
220
SetLastError(0xdeadbeef);
221
result = CryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0);
222
GLE = GetLastError();
223
ok(result && (GLE == ERROR_ENVVAR_NOT_FOUND ||
224
GLE == ERROR_SUCCESS ||
225
GLE == ERROR_RING2_STACK_IN_USE ||
226
GLE == NTE_FAIL ||
227
GLE == ERROR_NOT_LOGGED_ON), "%d/%ld\n", result, GLE);
228
229
if (hProv)
230
{
231
result = CryptReleaseContext(hProv, 0);
232
ok(result, "got %lu\n", GetLastError());
233
}
234
235
/* Try again, witch an empty ("\0") szProvider parameter */
236
hProv = 0;
237
SetLastError(0xdeadbeef);
238
result = CryptAcquireContextA(&hProv, szKeySet, "", PROV_RSA_FULL, 0);
239
GLE = GetLastError();
240
ok(result && (GLE == ERROR_ENVVAR_NOT_FOUND ||
241
GLE == ERROR_SUCCESS ||
242
GLE == ERROR_RING2_STACK_IN_USE ||
243
GLE == NTE_FAIL ||
244
GLE == ERROR_NOT_LOGGED_ON), "%d/%ld\n", result, GetLastError());
245
246
if (hProv)
247
{
248
result = CryptReleaseContext(hProv, 0);
249
ok(result, "got %lu\n", GetLastError());
250
}
251
}
252
253
static void test_incorrect_api_usage(void)
254
{
255
BOOL result;
256
HCRYPTPROV hProv, hProv2;
257
HCRYPTHASH hHash, hHash2;
258
HCRYPTKEY hKey, hKey2;
259
BYTE temp = 0;
260
DWORD dwLen, dwTemp;
261
262
/* This is to document incorrect api usage in the
263
* "Uru - Ages beyond Myst Demo" installer as reported by Paul Vriens.
264
*
265
* The installer destroys a hash object after having released the context
266
* with which the hash was created. This is not allowed according to MSDN,
267
* since CryptReleaseContext destroys all hash and key objects belonging to
268
* the respective context. However, while wine used to crash, Windows is more
269
* robust here and returns an ERROR_INVALID_PARAMETER code.
270
*/
271
272
result = CryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv,
273
PROV_RSA_FULL, CRYPT_NEWKEYSET);
274
ok (result, "%08lx\n", GetLastError());
275
if (!result) return;
276
277
/* Looks like native handles are just pointers. */
278
ok(!!*(void **)hProv, "Got zero *(void **)hProv.\n");
279
280
result = CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash);
281
ok (result, "%ld\n", GetLastError());
282
if (!result) return;
283
284
result = CryptDeriveKey(0, CALG_RC4, hHash, 0, &hKey2);
285
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
286
287
result = CryptDeriveKey(hProv, CALG_RC4, 0, 0, &hKey2);
288
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
289
290
result = CryptHashData(0, &temp, 1, 0);
291
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
292
293
result = CryptGenKey(hProv, CALG_RC4, 0, &hKey);
294
ok (result, "%ld\n", GetLastError());
295
if (!result) return;
296
297
result = pCryptHashSessionKey(hHash, 0, 0);
298
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
299
300
result = pCryptHashSessionKey(0, hKey, 0);
301
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
302
303
result = CryptDestroyHash(hHash);
304
ok (result, "%08lx\n", GetLastError());
305
306
result = CryptDestroyHash(0);
307
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
308
309
result = CryptCreateHash(0xdeadbeef, CALG_SHA, 0, 0, &hHash);
310
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
311
312
result = CryptCreateHash(0, CALG_SHA, 0, 0, &hHash);
313
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
314
315
result = CryptGenKey(0, CALG_RC4, 0, &hKey);
316
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
317
318
dwLen = 0;
319
SetLastError(0xdeadbeef);
320
result = CryptDecrypt(hKey, 0, FALSE, 0, &temp, &dwLen);
321
ok (result, "%lx\n", GetLastError());
322
dwLen = 0;
323
SetLastError(0xdeadbeef);
324
result = CryptDecrypt(hKey, 0, TRUE, 0, &temp, &dwLen);
325
ok (!result && GetLastError() == NTE_BAD_LEN, "%lx\n", GetLastError());
326
dwLen = 1;
327
result = CryptDecrypt(hKey, 0, TRUE, 0, &temp, &dwLen);
328
ok (result, "%ld\n", GetLastError());
329
result = CryptDecrypt(hKey, 0xdeadbeef, TRUE, 0, &temp, &dwLen);
330
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
331
result = CryptDecrypt(0, 0, TRUE, 0, &temp, &dwLen);
332
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
333
result = CryptDecrypt(0xdeadbeef, 0, TRUE, 0, &temp, &dwLen);
334
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
335
336
result = CryptEncrypt(hKey, 0, TRUE, 0, &temp, &dwLen, sizeof(temp));
337
ok (result, "%ld\n", GetLastError());
338
result = CryptEncrypt(hKey, 0xdeadbeef, TRUE, 0, &temp, &dwLen, sizeof(temp));
339
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
340
result = CryptEncrypt(0, 0, TRUE, 0, &temp, &dwLen, sizeof(temp));
341
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
342
result = CryptEncrypt(0xdeadbeef, 0, TRUE, 0, &temp, &dwLen, sizeof(temp));
343
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
344
345
dwLen = 1;
346
result = CryptExportKey(hKey, 0xdeadbeef, 0, 0, &temp, &dwLen);
347
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
348
349
result = CryptDestroyKey(hKey);
350
ok (result, "%ld\n", GetLastError());
351
352
result = CryptGenKey(hProv, CALG_RC4, 0, &hKey2);
353
ok (result, "%ld\n", GetLastError());
354
if (!result) return;
355
356
result = CryptDestroyKey(hKey2);
357
ok (result, "%ld\n", GetLastError());
358
359
result = CryptDestroyKey(0);
360
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
361
362
dwTemp = CRYPT_MODE_ECB;
363
result = CryptSetKeyParam(hKey2, KP_MODE, (BYTE*)&dwTemp, sizeof(DWORD));
364
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
365
366
hProv2 = 0xdeadbeef;
367
result = CryptAcquireContextA(&hProv2, szBadKeySet, NULL, PROV_RSA_FULL,
368
CRYPT_DELETEKEYSET);
369
ok (result, "%ld\n", GetLastError());
370
ok (hProv2 == 0, "%Id\n", hProv2);
371
if (!result) return;
372
373
result = CryptReleaseContext(hProv, 0);
374
ok(result, "got %lu\n", GetLastError());
375
if (!result) return;
376
377
result = pCryptGenRandom(0, 1, &temp);
378
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
379
380
result = pCryptGenRandom(hProv, 1, &temp);
381
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
382
383
result = CryptContextAddRef(hProv, NULL, 0);
384
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
385
386
result = CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash2);
387
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
388
389
dwLen = 1;
390
result = CryptDecrypt(hKey, 0, TRUE, 0, &temp, &dwLen);
391
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
392
393
dwLen = 1;
394
result = CryptEncrypt(hKey, 0, TRUE, 0, &temp, &dwLen, 1);
395
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
396
397
result = CryptDeriveKey(hProv, CALG_RC4, hHash, 0, &hKey2);
398
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
399
400
result = pCryptDuplicateHash(hHash, NULL, 0, &hHash2);
401
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
402
403
result = CryptDuplicateKey(hKey, NULL, 0, &hKey2);
404
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
405
406
dwLen = 1;
407
result = CryptExportKey(hKey, 0, 0, 0, &temp, &dwLen);
408
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
409
410
result = CryptGenKey(hProv, CALG_RC4, 0, &hKey2);
411
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
412
413
dwLen = 1;
414
result = CryptGetHashParam(hHash, 0, &temp, &dwLen, 0);
415
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
416
417
dwLen = 1;
418
result = CryptGetKeyParam(hKey, 0, &temp, &dwLen, 0);
419
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
420
421
dwLen = 1;
422
result = CryptGetProvParam(hProv, 0, &temp, &dwLen, 0);
423
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
424
425
result = CryptGetUserKey(0, 0, &hKey2);
426
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
427
428
result = CryptGetUserKey(hProv, 0, &hKey2);
429
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
430
431
result = CryptHashData(hHash, &temp, 1, 0);
432
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
433
434
result = pCryptHashSessionKey(hHash, hKey, 0);
435
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
436
437
result = CryptImportKey(hProv, &temp, 1, 0, 0, &hKey2);
438
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
439
440
if (pCryptSignHashW)
441
{
442
dwLen = 1;
443
result = pCryptSignHashW(hHash, 0, NULL, 0, &temp, &dwLen);
444
ok (!result && (GetLastError() == ERROR_INVALID_PARAMETER ||
445
GetLastError() == ERROR_CALL_NOT_IMPLEMENTED), "%ld\n", GetLastError());
446
result = pCryptSignHashW(hHash, 0, NULL, 0, &temp, &dwLen);
447
ok (!result && (GetLastError() == ERROR_INVALID_PARAMETER ||
448
GetLastError() == ERROR_CALL_NOT_IMPLEMENTED), "%ld\n", GetLastError());
449
}
450
else
451
win_skip("CryptSignHashW is not available\n");
452
453
result = CryptSetKeyParam(hKey, 0, &temp, 1);
454
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
455
456
result = CryptSetHashParam(hHash, 0, &temp, 1);
457
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
458
459
result = CryptSetProvParam(0, 0, &temp, 1);
460
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
461
462
result = CryptSetProvParam(hProv, 0, &temp, 1);
463
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
464
465
if (pCryptVerifySignatureW)
466
{
467
result = pCryptVerifySignatureW(hHash, &temp, 1, hKey, NULL, 0);
468
ok (!result && (GetLastError() == ERROR_INVALID_PARAMETER ||
469
GetLastError() == ERROR_CALL_NOT_IMPLEMENTED), "%ld\n", GetLastError());
470
}
471
else
472
win_skip("CryptVerifySignatureW is not available\n");
473
474
result = CryptDestroyHash(hHash);
475
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
476
477
result = CryptDestroyKey(hKey);
478
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
479
}
480
481
static void test_garbage_data(void)
482
{
483
struct KeyBlob
484
{
485
BLOBHEADER header;
486
DWORD key_size;
487
BYTE key_data[2048];
488
} key_blob;
489
490
BOOL result;
491
HCRYPTPROV hProv;
492
HCRYPTKEY hkey = 0;
493
494
/* When verifying logins in "Marvel Heroes", the application passes garbage data
495
* in a reserved field that should always be 0 (according to documentation).
496
*
497
* This doesn't lead to any error on Windows.
498
*/
499
500
result = CryptAcquireContextA(&hProv, 0, 0, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
501
ok (result, "%08lx\n", GetLastError());
502
503
key_blob.header.bType = PLAINTEXTKEYBLOB;
504
key_blob.header.bVersion = CUR_BLOB_VERSION;
505
key_blob.header.reserved = 29806; /* Not allowed, but accepted? */
506
key_blob.header.aiKeyAlg = CALG_AES_128;
507
key_blob.key_size = 16;
508
509
result = CryptImportKey(hProv, (BYTE *)&key_blob, sizeof(BLOBHEADER) + sizeof(DWORD) + key_blob.key_size, 0, 0, &hkey);
510
ok(result, "CryptImportKey failed: %08lx\n", GetLastError());
511
512
CryptDestroyKey(hkey);
513
514
result = CryptReleaseContext(hProv, 0);
515
ok(result, "got %lu\n", GetLastError());
516
517
}
518
519
static const BYTE privKey[] = {
520
0x07, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x52, 0x53, 0x41, 0x32, 0x00,
521
0x02, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x79, 0x10, 0x1c, 0xd0, 0x6b, 0x10,
522
0x18, 0x30, 0x94, 0x61, 0xdc, 0x0e, 0xcb, 0x96, 0x4e, 0x21, 0x3f, 0x79, 0xcd,
523
0xa9, 0x17, 0x62, 0xbc, 0xbb, 0x61, 0x4c, 0xe0, 0x75, 0x38, 0x6c, 0xf3, 0xde,
524
0x60, 0x86, 0x03, 0x97, 0x65, 0xeb, 0x1e, 0x6b, 0xdb, 0x53, 0x85, 0xad, 0x68,
525
0x21, 0xf1, 0x5d, 0xe7, 0x1f, 0xe6, 0x53, 0xb4, 0xbb, 0x59, 0x3e, 0x14, 0x27,
526
0xb1, 0x83, 0xa7, 0x3a, 0x54, 0xe2, 0x8f, 0x65, 0x8e, 0x6a, 0x4a, 0xcf, 0x3b,
527
0x1f, 0x65, 0xff, 0xfe, 0xf1, 0x31, 0x3a, 0x37, 0x7a, 0x8b, 0xcb, 0xc6, 0xd4,
528
0x98, 0x50, 0x36, 0x67, 0xe4, 0xa1, 0xe8, 0x7e, 0x8a, 0xc5, 0x23, 0xf2, 0x77,
529
0xf5, 0x37, 0x61, 0x49, 0x72, 0x59, 0xe8, 0x3d, 0xf7, 0x60, 0xb2, 0x77, 0xca,
530
0x78, 0x54, 0x6d, 0x65, 0x9e, 0x03, 0x97, 0x1b, 0x61, 0xbd, 0x0c, 0xd8, 0x06,
531
0x63, 0xe2, 0xc5, 0x48, 0xef, 0xb3, 0xe2, 0x6e, 0x98, 0x7d, 0xbd, 0x4e, 0x72,
532
0x91, 0xdb, 0x31, 0x57, 0xe3, 0x65, 0x3a, 0x49, 0xca, 0xec, 0xd2, 0x02, 0x4e,
533
0x22, 0x7e, 0x72, 0x8e, 0xf9, 0x79, 0x84, 0x82, 0xdf, 0x7b, 0x92, 0x2d, 0xaf,
534
0xc9, 0xe4, 0x33, 0xef, 0x89, 0x5c, 0x66, 0x99, 0xd8, 0x80, 0x81, 0x47, 0x2b,
535
0xb1, 0x66, 0x02, 0x84, 0x59, 0x7b, 0xc3, 0xbe, 0x98, 0x45, 0x4a, 0x3d, 0xdd,
536
0xea, 0x2b, 0xdf, 0x4e, 0xb4, 0x24, 0x6b, 0xec, 0xe7, 0xd9, 0x0c, 0x45, 0xb8,
537
0xbe, 0xca, 0x69, 0x37, 0x92, 0x4c, 0x38, 0x6b, 0x96, 0x6d, 0xcd, 0x86, 0x67,
538
0x5c, 0xea, 0x54, 0x94, 0xa4, 0xca, 0xa4, 0x02, 0xa5, 0x21, 0x4d, 0xae, 0x40,
539
0x8f, 0x9d, 0x51, 0x83, 0xf2, 0x3f, 0x33, 0xc1, 0x72, 0xb4, 0x1d, 0x94, 0x6e,
540
0x7d, 0xe4, 0x27, 0x3f, 0xea, 0xff, 0xe5, 0x9b, 0xa7, 0x5e, 0x55, 0x8e, 0x0d,
541
0x69, 0x1c, 0x7a, 0xff, 0x81, 0x9d, 0x53, 0x52, 0x97, 0x9a, 0x76, 0x79, 0xda,
542
0x93, 0x32, 0x16, 0xec, 0x69, 0x51, 0x1a, 0x4e, 0xc3, 0xf1, 0x72, 0x80, 0x78,
543
0x5e, 0x66, 0x4a, 0x8d, 0x85, 0x2f, 0x3f, 0xb2, 0xa7 };
544
545
static void test_verify_sig(void)
546
{
547
BOOL ret;
548
HCRYPTPROV prov;
549
HCRYPTKEY key;
550
HCRYPTHASH hash;
551
BYTE bogus[] = { 0 };
552
553
if (!pCryptVerifySignatureW)
554
{
555
win_skip("CryptVerifySignatureW is not available\n");
556
return;
557
}
558
559
SetLastError(0xdeadbeef);
560
ret = pCryptVerifySignatureW(0, NULL, 0, 0, NULL, 0);
561
if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
562
{
563
win_skip("CryptVerifySignatureW is not implemented\n");
564
return;
565
}
566
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
567
"Expected ERROR_INVALID_PARAMETER, got %08lx\n", GetLastError());
568
ret = CryptAcquireContextA(&prov, szKeySet, NULL, PROV_RSA_FULL,
569
CRYPT_NEWKEYSET);
570
if (!ret && GetLastError() == NTE_EXISTS)
571
ret = CryptAcquireContextA(&prov, szKeySet, NULL, PROV_RSA_FULL, 0);
572
ok(ret, "CryptAcquireContextA failed: %08lx\n", GetLastError());
573
ret = CryptImportKey(prov, (LPBYTE)privKey, sizeof(privKey), 0, 0, &key);
574
ok(ret, "CryptImportKey failed: %08lx\n", GetLastError());
575
ret = CryptCreateHash(prov, CALG_MD5, 0, 0, &hash);
576
ok(ret, "CryptCreateHash failed: %08lx\n", GetLastError());
577
SetLastError(0xdeadbeef);
578
ret = pCryptVerifySignatureW(hash, NULL, 0, 0, NULL, 0);
579
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
580
"Expected ERROR_INVALID_PARAMETER, got %08lx\n", GetLastError());
581
SetLastError(0xdeadbeef);
582
ret = pCryptVerifySignatureW(0, NULL, 0, key, NULL, 0);
583
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
584
"Expected ERROR_INVALID_PARAMETER, got %08lx\n", GetLastError());
585
SetLastError(0xdeadbeef);
586
ret = pCryptVerifySignatureW(hash, NULL, 0, key, NULL, 0);
587
ok(!ret && (GetLastError() == NTE_BAD_SIGNATURE ||
588
GetLastError() == ERROR_INVALID_PARAMETER),
589
"Expected NTE_BAD_SIGNATURE or ERROR_INVALID_PARAMETER, got %08lx\n",
590
GetLastError());
591
SetLastError(0xdeadbeef);
592
ret = pCryptVerifySignatureW(hash, NULL, sizeof(bogus), key, NULL, 0);
593
ok(!ret && (GetLastError() == NTE_BAD_SIGNATURE ||
594
GetLastError() == ERROR_INVALID_PARAMETER),
595
"Expected NTE_BAD_SIGNATURE or ERROR_INVALID_PARAMETER, got %08lx\n",
596
GetLastError());
597
SetLastError(0xdeadbeef);
598
ret = pCryptVerifySignatureW(hash, bogus, 0, key, NULL, 0);
599
ok(!ret && GetLastError() == NTE_BAD_SIGNATURE,
600
"Expected NTE_BAD_SIGNATURE, got %08lx\n", GetLastError());
601
SetLastError(0xdeadbeef);
602
ret = pCryptVerifySignatureW(hash, bogus, sizeof(bogus), key, NULL, 0);
603
ok(!ret &&
604
(GetLastError() == NTE_BAD_SIGNATURE ||
605
broken(GetLastError() == NTE_BAD_HASH_STATE /* older NT4 */)),
606
"Expected NTE_BAD_SIGNATURE, got %08lx\n", GetLastError());
607
CryptDestroyKey(key);
608
CryptDestroyHash(hash);
609
610
ret = CryptReleaseContext(prov, 0);
611
ok(ret, "got %lu\n", GetLastError());
612
}
613
614
static BOOL FindProvRegVals(DWORD dwIndex, DWORD *pdwProvType, LPSTR *pszProvName,
615
DWORD *pcbProvName, DWORD *pdwProvCount)
616
{
617
HKEY hKey;
618
HKEY subkey;
619
DWORD size = sizeof(DWORD);
620
621
if (RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\Defaults\\Provider", &hKey))
622
return FALSE;
623
624
RegQueryInfoKeyA(hKey, NULL, NULL, NULL, pdwProvCount, pcbProvName,
625
NULL, NULL, NULL, NULL, NULL, NULL);
626
(*pcbProvName)++;
627
628
if (!(*pszProvName = LocalAlloc(LMEM_ZEROINIT, *pcbProvName)))
629
return FALSE;
630
631
RegEnumKeyExA(hKey, dwIndex, *pszProvName, pcbProvName, NULL, NULL, NULL, NULL);
632
(*pcbProvName)++;
633
634
RegOpenKeyA(hKey, *pszProvName, &subkey);
635
RegQueryValueExA(subkey, "Type", NULL, NULL, (LPBYTE)pdwProvType, &size);
636
637
RegCloseKey(subkey);
638
RegCloseKey(hKey);
639
640
return TRUE;
641
}
642
643
static void test_enum_providers(void)
644
{
645
/* expected results */
646
CHAR *pszProvName = NULL;
647
DWORD cbName;
648
DWORD dwType;
649
DWORD provCount;
650
DWORD dwIndex = 0;
651
652
/* actual results */
653
CHAR *provider = NULL;
654
DWORD providerLen;
655
DWORD type;
656
DWORD count;
657
DWORD result;
658
DWORD notNull = 5;
659
DWORD notZeroFlags = 5;
660
661
if(!pCryptEnumProvidersA)
662
{
663
win_skip("CryptEnumProvidersA is not available\n");
664
return;
665
}
666
667
if (!FindProvRegVals(dwIndex, &dwType, &pszProvName, &cbName, &provCount))
668
{
669
win_skip("Could not find providers in registry\n");
670
return;
671
}
672
673
/* check pdwReserved flag for NULL */
674
result = pCryptEnumProvidersA(dwIndex, &notNull, 0, &type, NULL, &providerLen);
675
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
676
677
/* check dwFlags == 0 */
678
result = pCryptEnumProvidersA(dwIndex, NULL, notZeroFlags, &type, NULL, &providerLen);
679
ok(!result && GetLastError()==NTE_BAD_FLAGS, "%ld\n", GetLastError());
680
681
/* alloc provider to half the size required
682
* cbName holds the size required */
683
providerLen = cbName / 2;
684
if (!(provider = LocalAlloc(LMEM_ZEROINIT, providerLen)))
685
return;
686
687
result = pCryptEnumProvidersA(dwIndex, NULL, 0, &type, provider, &providerLen);
688
ok(!result && GetLastError()==ERROR_MORE_DATA, "expected %i, got %ld\n",
689
ERROR_MORE_DATA, GetLastError());
690
691
LocalFree(provider);
692
693
/* loop through the providers to get the number of providers
694
* after loop ends, count should be provCount + 1 so subtract 1
695
* to get actual number of providers */
696
count = 0;
697
while(pCryptEnumProvidersA(count++, NULL, 0, &type, NULL, &providerLen))
698
;
699
count--;
700
ok(count==provCount, "expected %i, got %i\n", (int)provCount, (int)count);
701
702
/* loop past the actual number of providers to get the error
703
* ERROR_NO_MORE_ITEMS */
704
for (count = 0; count < provCount + 1; count++)
705
result = pCryptEnumProvidersA(count, NULL, 0, &type, NULL, &providerLen);
706
ok(!result && GetLastError()==ERROR_NO_MORE_ITEMS, "expected %i, got %ld\n",
707
ERROR_NO_MORE_ITEMS, GetLastError());
708
709
/* check expected versus actual values returned */
710
result = pCryptEnumProvidersA(dwIndex, NULL, 0, &type, NULL, &providerLen);
711
ok(result && providerLen==cbName, "expected %i, got %i\n", (int)cbName, (int)providerLen);
712
if (!(provider = LocalAlloc(LMEM_ZEROINIT, providerLen)))
713
return;
714
715
providerLen = -1;
716
result = pCryptEnumProvidersA(dwIndex, NULL, 0, &type, provider, &providerLen);
717
ok(result, "expected TRUE, got %ld\n", result);
718
ok(type==dwType, "expected %ld, got %ld\n", dwType, type);
719
if (pszProvName)
720
ok(!strcmp(pszProvName, provider), "expected %s, got %s\n", pszProvName, provider);
721
ok(cbName==providerLen, "expected %ld, got %ld\n", cbName, providerLen);
722
723
providerLen = -1000;
724
provider[0] = 0;
725
result = pCryptEnumProvidersA(dwIndex, NULL, 0, &type, provider, &providerLen);
726
ok(result, "expected TRUE, got %ld\n", result);
727
ok(type==dwType, "expected %ld, got %ld\n", dwType, type);
728
if (pszProvName)
729
ok(!strcmp(pszProvName, provider), "expected %s, got %s\n", pszProvName, provider);
730
ok(cbName==providerLen, "expected %ld, got %ld\n", cbName, providerLen);
731
732
LocalFree(pszProvName);
733
LocalFree(provider);
734
}
735
736
static BOOL FindProvTypesRegVals(DWORD *pdwIndex, DWORD *pdwProvType, LPSTR *pszTypeName,
737
DWORD *pcbTypeName, DWORD *pdwTypeCount)
738
{
739
HKEY hKey;
740
HKEY hSubKey;
741
PSTR ch;
742
LPSTR szName;
743
DWORD cbName;
744
BOOL ret = FALSE;
745
746
if (RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\Defaults\\Provider Types", &hKey))
747
return FALSE;
748
749
if (RegQueryInfoKeyA(hKey, NULL, NULL, NULL, pdwTypeCount, &cbName, NULL,
750
NULL, NULL, NULL, NULL, NULL))
751
goto cleanup;
752
cbName++;
753
754
if (!(szName = LocalAlloc(LMEM_ZEROINIT, cbName)))
755
goto cleanup;
756
757
while (!RegEnumKeyExA(hKey, *pdwIndex, szName, &cbName, NULL, NULL, NULL, NULL))
758
{
759
cbName++;
760
ch = szName + strlen(szName);
761
/* Convert "Type 000" to 0, etc/ */
762
*pdwProvType = *(--ch) - '0';
763
*pdwProvType += (*(--ch) - '0') * 10;
764
*pdwProvType += (*(--ch) - '0') * 100;
765
766
if (RegOpenKeyA(hKey, szName, &hSubKey))
767
break;
768
769
if (!RegQueryValueExA(hSubKey, "TypeName", NULL, NULL, NULL, pcbTypeName))
770
{
771
if (!(*pszTypeName = LocalAlloc(LMEM_ZEROINIT, *pcbTypeName)))
772
break;
773
774
if (!RegQueryValueExA(hSubKey, "TypeName", NULL, NULL, (LPBYTE)*pszTypeName, pcbTypeName))
775
{
776
ret = TRUE;
777
break;
778
}
779
780
LocalFree(*pszTypeName);
781
}
782
783
RegCloseKey(hSubKey);
784
785
(*pdwIndex)++;
786
}
787
RegCloseKey(hSubKey);
788
LocalFree(szName);
789
790
cleanup:
791
RegCloseKey(hKey);
792
793
return ret;
794
}
795
796
static void test_enum_provider_types(void)
797
{
798
/* expected values */
799
DWORD dwProvType = 0;
800
LPSTR pszTypeName = NULL;
801
DWORD cbTypeName;
802
DWORD dwTypeCount;
803
804
/* actual values */
805
DWORD index = 0;
806
DWORD provType;
807
LPSTR typeName = NULL;
808
DWORD typeNameSize;
809
DWORD typeCount;
810
DWORD result;
811
DWORD notNull = 5;
812
DWORD notZeroFlags = 5;
813
814
if(!pCryptEnumProviderTypesA)
815
{
816
win_skip("CryptEnumProviderTypesA is not available\n");
817
return;
818
}
819
820
if (!FindProvTypesRegVals(&index, &dwProvType, &pszTypeName, &cbTypeName, &dwTypeCount))
821
{
822
skip("Could not find provider types in registry\n");
823
return;
824
}
825
826
/* check pdwReserved for NULL */
827
result = pCryptEnumProviderTypesA(index, &notNull, 0, &provType, typeName, &typeNameSize);
828
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n",
829
GetLastError());
830
831
/* check dwFlags == zero */
832
result = pCryptEnumProviderTypesA(index, NULL, notZeroFlags, &provType, typeName, &typeNameSize);
833
ok(!result && GetLastError()==NTE_BAD_FLAGS, "expected ERROR_INVALID_PARAMETER, got %ld\n",
834
GetLastError());
835
836
/* This test fails under Win2k SP4:
837
* result = TRUE, GetLastError() == 0xdeadbeef */
838
if (0)
839
{
840
/* alloc provider type to half the size required
841
* cbTypeName holds the size required */
842
typeNameSize = cbTypeName / 2;
843
if (!(typeName = LocalAlloc(LMEM_ZEROINIT, typeNameSize)))
844
goto cleanup;
845
846
SetLastError(0xdeadbeef);
847
result = pCryptEnumProviderTypesA(index, NULL, 0, &provType, typeName, &typeNameSize);
848
ok(!result && GetLastError()==ERROR_MORE_DATA, "expected 0/ERROR_MORE_DATA, got %ld/%ld\n",
849
result, GetLastError());
850
851
LocalFree(typeName);
852
}
853
854
/* loop through the provider types to get the number of provider types
855
* after loop ends, count should be dwTypeCount + 1 so subtract 1
856
* to get actual number of provider types */
857
typeCount = 0;
858
while(pCryptEnumProviderTypesA(typeCount++, NULL, 0, &provType, NULL, &typeNameSize))
859
;
860
typeCount--;
861
ok(typeCount==dwTypeCount, "expected %ld, got %ld\n", dwTypeCount, typeCount);
862
863
/* loop past the actual number of provider types to get the error
864
* ERROR_NO_MORE_ITEMS */
865
for (typeCount = 0; typeCount < dwTypeCount + 1; typeCount++)
866
result = pCryptEnumProviderTypesA(typeCount, NULL, 0, &provType, NULL, &typeNameSize);
867
ok(!result && GetLastError()==ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %ld\n",
868
GetLastError());
869
870
/* check expected versus actual values returned */
871
result = pCryptEnumProviderTypesA(index, NULL, 0, &provType, NULL, &typeNameSize);
872
ok(result && typeNameSize==cbTypeName, "expected %ld, got %ld\n", cbTypeName, typeNameSize);
873
if (!(typeName = LocalAlloc(LMEM_ZEROINIT, typeNameSize)))
874
goto cleanup;
875
876
typeNameSize = 0xdeadbeef;
877
result = pCryptEnumProviderTypesA(index, NULL, 0, &provType, typeName, &typeNameSize);
878
ok(result, "expected TRUE, got %ld\n", result);
879
ok(provType==dwProvType, "expected %ld, got %ld\n", dwProvType, provType);
880
if (pszTypeName)
881
ok(!strcmp(pszTypeName, typeName), "expected %s, got %s\n", pszTypeName, typeName);
882
ok(typeNameSize==cbTypeName, "expected %ld, got %ld\n", cbTypeName, typeNameSize);
883
884
LocalFree(typeName);
885
cleanup:
886
LocalFree(pszTypeName);
887
}
888
889
static BOOL FindDfltProvRegVals(DWORD dwProvType, DWORD dwFlags, LPSTR *pszProvName, DWORD *pcbProvName)
890
{
891
HKEY hKey;
892
PSTR keyname;
893
PSTR ptr;
894
DWORD user = dwFlags & CRYPT_USER_DEFAULT;
895
896
LPCSTR machinestr = "Software\\Microsoft\\Cryptography\\Defaults\\Provider Types\\Type XXX";
897
LPCSTR userstr = "Software\\Microsoft\\Cryptography\\Provider Type XXX";
898
899
keyname = LocalAlloc(LMEM_ZEROINIT, (user ? strlen(userstr) : strlen(machinestr)) + 1);
900
if (keyname)
901
{
902
user ? strcpy(keyname, userstr) : strcpy(keyname, machinestr);
903
ptr = keyname + strlen(keyname);
904
*(--ptr) = (dwProvType % 10) + '0';
905
*(--ptr) = ((dwProvType / 10) % 10) + '0';
906
*(--ptr) = (dwProvType / 100) + '0';
907
} else
908
return FALSE;
909
910
if (RegOpenKeyA((dwFlags & CRYPT_USER_DEFAULT) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE ,keyname, &hKey))
911
{
912
LocalFree(keyname);
913
return FALSE;
914
}
915
LocalFree(keyname);
916
917
if (RegQueryValueExA(hKey, "Name", NULL, NULL, (LPBYTE)*pszProvName, pcbProvName))
918
{
919
if (GetLastError() != ERROR_MORE_DATA)
920
SetLastError(NTE_PROV_TYPE_ENTRY_BAD);
921
return FALSE;
922
}
923
924
if (!(*pszProvName = LocalAlloc(LMEM_ZEROINIT, *pcbProvName)))
925
return FALSE;
926
927
if (RegQueryValueExA(hKey, "Name", NULL, NULL, (LPBYTE)*pszProvName, pcbProvName))
928
{
929
if (GetLastError() != ERROR_MORE_DATA)
930
SetLastError(NTE_PROV_TYPE_ENTRY_BAD);
931
return FALSE;
932
}
933
934
RegCloseKey(hKey);
935
936
return TRUE;
937
}
938
939
static void test_get_default_provider(void)
940
{
941
/* expected results */
942
DWORD dwProvType = PROV_RSA_FULL;
943
DWORD dwFlags = CRYPT_MACHINE_DEFAULT;
944
LPSTR pszProvName = NULL;
945
DWORD cbProvName;
946
947
/* actual results */
948
DWORD provType = PROV_RSA_FULL;
949
DWORD flags = CRYPT_MACHINE_DEFAULT;
950
LPSTR provName = NULL;
951
DWORD provNameSize;
952
DWORD result;
953
DWORD notNull = 5;
954
955
if(!pCryptGetDefaultProviderA)
956
{
957
win_skip("CryptGetDefaultProviderA is not available\n");
958
return;
959
}
960
961
if(!FindDfltProvRegVals(dwProvType, dwFlags, &pszProvName, &cbProvName))
962
{
963
skip("Could not find default provider in registry\n");
964
return;
965
}
966
967
/* check pdwReserved for NULL */
968
result = pCryptGetDefaultProviderA(provType, &notNull, flags, provName, &provNameSize);
969
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "expected %i, got %ld\n",
970
ERROR_INVALID_PARAMETER, GetLastError());
971
972
/* check for invalid flag */
973
flags = 0xdeadbeef;
974
result = pCryptGetDefaultProviderA(provType, NULL, flags, provName, &provNameSize);
975
ok(!result && GetLastError()==NTE_BAD_FLAGS, "expected %ld, got %ld\n",
976
NTE_BAD_FLAGS, GetLastError());
977
flags = CRYPT_MACHINE_DEFAULT;
978
979
/* check for invalid prov type */
980
provType = 0xdeadbeef;
981
result = pCryptGetDefaultProviderA(provType, NULL, flags, provName, &provNameSize);
982
ok(!result && (GetLastError() == NTE_BAD_PROV_TYPE ||
983
GetLastError() == ERROR_INVALID_PARAMETER),
984
"expected NTE_BAD_PROV_TYPE or ERROR_INVALID_PARAMETER, got %ld/%ld\n",
985
result, GetLastError());
986
provType = PROV_RSA_FULL;
987
988
SetLastError(0);
989
990
/* alloc provName to half the size required
991
* cbProvName holds the size required */
992
provNameSize = cbProvName / 2;
993
if (!(provName = LocalAlloc(LMEM_ZEROINIT, provNameSize)))
994
return;
995
996
result = pCryptGetDefaultProviderA(provType, NULL, flags, provName, &provNameSize);
997
ok(!result && GetLastError()==ERROR_MORE_DATA, "expected %i, got %ld\n",
998
ERROR_MORE_DATA, GetLastError());
999
1000
LocalFree(provName);
1001
1002
/* check expected versus actual values returned */
1003
result = pCryptGetDefaultProviderA(provType, NULL, flags, NULL, &provNameSize);
1004
ok(result && provNameSize==cbProvName, "expected %ld, got %ld\n", cbProvName, provNameSize);
1005
provNameSize = cbProvName;
1006
1007
if (!(provName = LocalAlloc(LMEM_ZEROINIT, provNameSize)))
1008
return;
1009
1010
provNameSize = 0xdeadbeef;
1011
result = pCryptGetDefaultProviderA(provType, NULL, flags, provName, &provNameSize);
1012
ok(result, "expected TRUE, got %ld\n", result);
1013
if(pszProvName)
1014
ok(!strcmp(pszProvName, provName), "expected %s, got %s\n", pszProvName, provName);
1015
ok(provNameSize==cbProvName, "expected %ld, got %ld\n", cbProvName, provNameSize);
1016
1017
LocalFree(pszProvName);
1018
LocalFree(provName);
1019
}
1020
1021
static void test_set_provider_ex(void)
1022
{
1023
DWORD result;
1024
DWORD notNull = 5;
1025
LPSTR curProvName = NULL;
1026
DWORD curlen;
1027
1028
/* results */
1029
LPSTR pszProvName = NULL;
1030
DWORD cbProvName;
1031
1032
if(!pCryptGetDefaultProviderA || !pCryptSetProviderExA)
1033
{
1034
win_skip("CryptGetDefaultProviderA and/or CryptSetProviderExA are not available\n");
1035
return;
1036
}
1037
1038
/* store the current one */
1039
pCryptGetDefaultProviderA(PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT, NULL, &curlen);
1040
if (!(curProvName = LocalAlloc(LMEM_ZEROINIT, curlen)))
1041
return;
1042
result = pCryptGetDefaultProviderA(PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT, curProvName, &curlen);
1043
ok(result, "%ld\n", GetLastError());
1044
1045
/* check pdwReserved for NULL */
1046
result = pCryptSetProviderExA(MS_DEF_PROV_A, PROV_RSA_FULL, &notNull, CRYPT_MACHINE_DEFAULT);
1047
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "expected %i, got %ld\n",
1048
ERROR_INVALID_PARAMETER, GetLastError());
1049
1050
/* remove the default provider and then set it to MS_DEF_PROV/PROV_RSA_FULL */
1051
SetLastError(0xdeadbeef);
1052
result = pCryptSetProviderExA(MS_DEF_PROV_A, PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT | CRYPT_DELETE_DEFAULT);
1053
if (!result)
1054
{
1055
ok( GetLastError() == ERROR_ACCESS_DENIED || broken(GetLastError() == ERROR_INVALID_PARAMETER),
1056
"wrong error %lu\n", GetLastError() );
1057
skip("Not enough rights to remove the default provider\n");
1058
LocalFree(curProvName);
1059
return;
1060
}
1061
1062
result = pCryptSetProviderExA(MS_DEF_PROV_A, PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT);
1063
ok(result, "%ld\n", GetLastError());
1064
1065
/* call CryptGetDefaultProvider to see if they match */
1066
result = pCryptGetDefaultProviderA(PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT, NULL, &cbProvName);
1067
ok(result, "%ld\n", GetLastError());
1068
if (!(pszProvName = LocalAlloc(LMEM_ZEROINIT, cbProvName)))
1069
goto reset;
1070
1071
result = pCryptGetDefaultProviderA(PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT, pszProvName, &cbProvName);
1072
ok(result && !strcmp(MS_DEF_PROV_A, pszProvName), "expected %s, got %s\n", MS_DEF_PROV_A, pszProvName);
1073
ok(result && cbProvName==(strlen(MS_DEF_PROV_A) + 1), "expected %i, got %ld\n", (lstrlenA(MS_DEF_PROV_A) + 1), cbProvName);
1074
1075
LocalFree(pszProvName);
1076
1077
reset:
1078
/* Set the provider back to its original */
1079
result = pCryptSetProviderExA(curProvName, PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT);
1080
ok(result, "%ld\n", GetLastError());
1081
LocalFree(curProvName);
1082
}
1083
1084
static void test_machine_guid(void)
1085
{
1086
char originalGuid[40];
1087
LONG r;
1088
HKEY key;
1089
DWORD size;
1090
HCRYPTPROV hCryptProv;
1091
BOOL restoreGuid = FALSE, ret;
1092
1093
r = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography",
1094
0, KEY_ALL_ACCESS, &key);
1095
if (r != ERROR_SUCCESS)
1096
{
1097
skip("couldn't open HKLM\\Software\\Microsoft\\Cryptography\n");
1098
return;
1099
}
1100
/* Cache existing MachineGuid, and delete it */
1101
size = sizeof(originalGuid);
1102
r = RegQueryValueExA(key, "MachineGuid", NULL, NULL, (BYTE *)originalGuid,
1103
&size);
1104
if (r == ERROR_SUCCESS)
1105
{
1106
restoreGuid = TRUE;
1107
r = RegDeleteValueA(key, "MachineGuid");
1108
ok(!r || broken(r == ERROR_ACCESS_DENIED) /*win8*/, "RegDeleteValueA failed: %ld\n", r);
1109
if (r == ERROR_ACCESS_DENIED)
1110
{
1111
skip("broken virtualization on HKLM\\Software\\Microsoft\\Cryptography\n");
1112
RegCloseKey(key);
1113
return;
1114
}
1115
}
1116
else
1117
ok(r == ERROR_FILE_NOT_FOUND, "expected ERROR_FILE_NOT_FOUND, got %ld\n",
1118
r);
1119
/* Create and release a provider */
1120
ret = CryptAcquireContextA(&hCryptProv, szKeySet, NULL, PROV_RSA_FULL, 0);
1121
ok(ret || broken(!ret && GetLastError() == NTE_KEYSET_ENTRY_BAD /* NT4 */),
1122
"CryptAcquireContextA failed: %08lx\n", GetLastError());
1123
ret = CryptReleaseContext(hCryptProv, 0);
1124
ok(ret, "got %lu\n", GetLastError());
1125
1126
if (restoreGuid)
1127
RegSetValueExA(key, "MachineGuid", 0, REG_SZ, (const BYTE *)originalGuid,
1128
strlen(originalGuid)+1);
1129
RegCloseKey(key);
1130
}
1131
1132
#define key_length 16
1133
1134
static const unsigned char key[key_length] =
1135
{ 0xbf, 0xf6, 0x83, 0x4b, 0x3e, 0xa3, 0x23, 0xdd,
1136
0x96, 0x78, 0x70, 0x8e, 0xa1, 0x9d, 0x3b, 0x40 };
1137
1138
static void test_rc2_keylen(void)
1139
{
1140
struct KeyBlob
1141
{
1142
BLOBHEADER header;
1143
DWORD key_size;
1144
BYTE key_data[2048];
1145
} key_blob;
1146
1147
HCRYPTPROV provider;
1148
HCRYPTKEY hkey = 0;
1149
BOOL ret;
1150
1151
SetLastError(0xdeadbeef);
1152
ret = CryptAcquireContextA(&provider, NULL, NULL,
1153
PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
1154
ok(ret, "CryptAcquireContext error %lu\n", GetLastError());
1155
if (ret)
1156
{
1157
key_blob.header.bType = PLAINTEXTKEYBLOB;
1158
key_blob.header.bVersion = CUR_BLOB_VERSION;
1159
key_blob.header.reserved = 0;
1160
key_blob.header.aiKeyAlg = CALG_RC2;
1161
key_blob.key_size = sizeof(key);
1162
memcpy(key_blob.key_data, key, key_length);
1163
1164
/* Importing a 16-byte key works with the default provider. */
1165
SetLastError(0xdeadbeef);
1166
ret = CryptImportKey(provider, (BYTE *)&key_blob, sizeof(BLOBHEADER) + sizeof(DWORD) + key_blob.key_size,
1167
0, CRYPT_IPSEC_HMAC_KEY, &hkey);
1168
/* CRYPT_IPSEC_HMAC_KEY is not supported on W2K and lower */
1169
ok(ret ||
1170
broken(!ret && GetLastError() == NTE_BAD_FLAGS),
1171
"CryptImportKey error %08lx\n", GetLastError());
1172
if (ret)
1173
CryptDestroyKey(hkey);
1174
1175
ret = CryptReleaseContext(provider, 0);
1176
ok(ret, "got %lu\n", GetLastError());
1177
}
1178
1179
SetLastError(0xdeadbeef);
1180
ret = CryptAcquireContextA(&provider, NULL, MS_DEF_PROV_A,
1181
PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
1182
ok(ret, "CryptAcquireContext error %08lx\n", GetLastError());
1183
1184
if (ret)
1185
{
1186
/* Importing a 16-byte key doesn't work with the base provider.. */
1187
SetLastError(0xdeadbeef);
1188
ret = CryptImportKey(provider, (BYTE *)&key_blob, sizeof(BLOBHEADER) + sizeof(DWORD) + key_blob.key_size,
1189
0, 0, &hkey);
1190
ok(!ret && (GetLastError() == NTE_BAD_DATA ||
1191
GetLastError() == NTE_BAD_LEN || /* Win7 */
1192
GetLastError() == NTE_BAD_TYPE || /* W2K */
1193
GetLastError() == NTE_PERM), /* Win9x, WinMe and NT4 */
1194
"unexpected error %08lx\n", GetLastError());
1195
/* but importing an 56-bit (7-byte) key does.. */
1196
key_blob.key_size = 7;
1197
SetLastError(0xdeadbeef);
1198
ret = CryptImportKey(provider, (BYTE *)&key_blob, sizeof(BLOBHEADER) + sizeof(DWORD) + key_blob.key_size,
1199
0, 0, &hkey);
1200
ok(ret ||
1201
broken(!ret && GetLastError() == NTE_BAD_TYPE) || /* W2K */
1202
broken(!ret && GetLastError() == NTE_PERM), /* Win9x, WinMe and NT4 */
1203
"CryptAcquireContext error %08lx\n", GetLastError());
1204
if (ret)
1205
CryptDestroyKey(hkey);
1206
/* as does importing a 16-byte key with the base provider when
1207
* CRYPT_IPSEC_HMAC_KEY is specified.
1208
*/
1209
key_blob.key_size = sizeof(key);
1210
SetLastError(0xdeadbeef);
1211
ret = CryptImportKey(provider, (BYTE *)&key_blob, sizeof(BLOBHEADER) + sizeof(DWORD) + key_blob.key_size,
1212
0, CRYPT_IPSEC_HMAC_KEY, &hkey);
1213
/* CRYPT_IPSEC_HMAC_KEY is not supported on W2K and lower */
1214
ok(ret ||
1215
broken(!ret && GetLastError() == NTE_BAD_FLAGS),
1216
"CryptImportKey error %08lx\n", GetLastError());
1217
if (ret)
1218
CryptDestroyKey(hkey);
1219
1220
ret = CryptReleaseContext(provider, 0);
1221
ok(ret, "got %lu\n", GetLastError());
1222
}
1223
1224
key_blob.key_size = sizeof(key);
1225
SetLastError(0xdeadbeef);
1226
ret = CryptAcquireContextA(&provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
1227
ok(ret, "CryptAcquireContext error %08lx\n", GetLastError());
1228
1229
if (ret)
1230
{
1231
/* Importing a 16-byte key also works with the default provider when
1232
* CRYPT_IPSEC_HMAC_KEY is specified.
1233
*/
1234
SetLastError(0xdeadbeef);
1235
ret = CryptImportKey(provider, (BYTE *)&key_blob, sizeof(BLOBHEADER) + sizeof(DWORD) + key_blob.key_size,
1236
0, CRYPT_IPSEC_HMAC_KEY, &hkey);
1237
ok(ret ||
1238
broken(!ret && GetLastError() == NTE_BAD_FLAGS),
1239
"CryptImportKey error %08lx\n", GetLastError());
1240
if (ret)
1241
CryptDestroyKey(hkey);
1242
1243
/* There is no apparent limit to the size of the input key when
1244
* CRYPT_IPSEC_HMAC_KEY is specified.
1245
*/
1246
key_blob.key_size = sizeof(key_blob.key_data);
1247
SetLastError(0xdeadbeef);
1248
ret = CryptImportKey(provider, (BYTE *)&key_blob, sizeof(BLOBHEADER) + sizeof(DWORD) + key_blob.key_size,
1249
0, CRYPT_IPSEC_HMAC_KEY, &hkey);
1250
ok(ret ||
1251
broken(!ret && GetLastError() == NTE_BAD_FLAGS),
1252
"CryptImportKey error %08lx\n", GetLastError());
1253
if (ret)
1254
CryptDestroyKey(hkey);
1255
1256
ret = CryptReleaseContext(provider, 0);
1257
ok(ret, "got %lu\n", GetLastError());
1258
}
1259
}
1260
1261
static void test_SystemFunction036(void)
1262
{
1263
BOOL ret;
1264
int test;
1265
1266
if (!pSystemFunction036)
1267
{
1268
win_skip("SystemFunction036 is not available\n");
1269
return;
1270
}
1271
1272
ret = pSystemFunction036(NULL, 0);
1273
ok(ret == TRUE, "Expected SystemFunction036 to return TRUE, got %d\n", ret);
1274
1275
/* Test crashes on Windows. */
1276
if (0)
1277
{
1278
SetLastError(0xdeadbeef);
1279
ret = pSystemFunction036(NULL, 5);
1280
trace("ret = %d, GetLastError() = %ld\n", ret, GetLastError());
1281
}
1282
1283
ret = pSystemFunction036(&test, 0);
1284
ok(ret == TRUE, "Expected SystemFunction036 to return TRUE, got %d\n", ret);
1285
1286
ret = pSystemFunction036(&test, sizeof(int));
1287
ok(ret == TRUE, "Expected SystemFunction036 to return TRUE, got %d\n", ret);
1288
}
1289
1290
static void test_container_sd(void)
1291
{
1292
HCRYPTPROV prov;
1293
SECURITY_DESCRIPTOR *sd;
1294
DWORD len, err;
1295
BOOL ret;
1296
1297
ret = CryptAcquireContextA(&prov, "winetest", "Microsoft Enhanced Cryptographic Provider v1.0",
1298
PROV_RSA_FULL, CRYPT_MACHINE_KEYSET|CRYPT_NEWKEYSET);
1299
ok(ret, "got %lu\n", GetLastError());
1300
1301
len = 0;
1302
SetLastError(0xdeadbeef);
1303
ret = CryptGetProvParam(prov, PP_KEYSET_SEC_DESCR, NULL, &len, OWNER_SECURITY_INFORMATION);
1304
err = GetLastError();
1305
ok(ret, "got %lu\n", err);
1306
ok(err == ERROR_INSUFFICIENT_BUFFER || broken(err == ERROR_INVALID_PARAMETER), "got %lu\n", err);
1307
ok(len, "expected len > 0\n");
1308
1309
sd = malloc(len);
1310
ret = CryptGetProvParam(prov, PP_KEYSET_SEC_DESCR, (BYTE *)sd, &len, OWNER_SECURITY_INFORMATION);
1311
ok(ret, "got %lu\n", GetLastError());
1312
free(sd);
1313
1314
ret = CryptReleaseContext(prov, 0);
1315
ok(ret, "got %lu\n", GetLastError());
1316
1317
prov = 0xdeadbeef;
1318
ret = CryptAcquireContextA(&prov, "winetest", "Microsoft Enhanced Cryptographic Provider v1.0",
1319
PROV_RSA_FULL, CRYPT_MACHINE_KEYSET|CRYPT_DELETEKEYSET);
1320
ok(ret, "got %lu\n", GetLastError());
1321
ok(prov == 0, "got %Id\n", prov);
1322
}
1323
1324
START_TEST(crypt)
1325
{
1326
init_function_pointers();
1327
1328
test_rc2_keylen();
1329
1330
init_environment();
1331
test_CryptReleaseContext();
1332
test_acquire_context();
1333
test_incorrect_api_usage();
1334
test_garbage_data();
1335
test_verify_sig();
1336
test_machine_guid();
1337
test_container_sd();
1338
clean_up_environment();
1339
1340
test_enum_providers();
1341
test_enum_provider_types();
1342
test_get_default_provider();
1343
test_set_provider_ex();
1344
test_SystemFunction036();
1345
}
1346
1347