2 * Unit tests for rsaenh functions
4 * Copyright (c) 2004 Michael Jung
5 * Copyright (c) 2006 Juan Lang
6 * Copyright (c) 2007 Vijay Kiran Kamuju
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #include "wine/test.h"
32 static HCRYPTPROV hProv;
33 static const char szContainer[] = "winetest";
34 static const char szProvider[] = MS_ENHANCED_PROV_A;
36 typedef struct _ctdatatype {
37 unsigned char origstr[32];
38 unsigned char decstr[32];
44 static const cryptdata cTestData[4] = {
46 {'a','b','c','d','e','f','g','h',0x2,0x2,'k','l',0},
49 {'a','b','c','d','e','f','g','h',0x2,0x2,0},
52 {'a','b','c','d','e','f','g','h',0},
55 {'a','b','c','d','e','f','g','h','i','j','k','l',0},
60 * 1. Take the MD5 Hash of the container name (with an extra null byte)
61 * 2. Turn the hash into a 4 DWORD hex value
63 * 4. Add the MachineGuid
66 static void uniquecontainer(char *unique)
68 /* MD5 hash of "winetest\0" in 4 DWORD hex */
69 static const char szContainer_md5[] = "9d20fd8d05ed2b8455d125d0bf6d6a70";
70 static const char szCryptography[] = "Software\\Microsoft\\Cryptography";
71 static const char szMachineGuid[] = "MachineGuid";
74 DWORD size = MAX_PATH;
76 /* Get the MachineGUID */
77 RegOpenKeyA(HKEY_LOCAL_MACHINE, szCryptography, &hkey);
78 RegQueryValueExA(hkey, szMachineGuid, NULL, NULL, (LPBYTE)guid, &size);
81 lstrcpy(unique, szContainer_md5);
83 lstrcat(unique, guid);
86 static void printBytes(const char *heading, const BYTE *pb, size_t cb)
89 printf("%s: ",heading);
91 printf("0x%02x,",pb[i]);
95 static BOOL (WINAPI *pCryptDuplicateHash) (HCRYPTHASH, DWORD*, DWORD, HCRYPTHASH*);
98 static void trace_hex(BYTE *pbData, DWORD dwLen) {
102 for (i = 0; i < dwLen-7; i+=8) {
103 sprintf(szTemp, "0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x,\n",
104 pbData[i], pbData[i+1], pbData[i+2], pbData[i+3], pbData[i+4], pbData[i+5],
105 pbData[i+6], pbData[i+7]);
108 for (j=0; i<dwLen; j++,i++) {
109 sprintf(szTemp+6*j, "0x%02x, \n", pbData[i]);
115 static int init_base_environment(void)
120 pCryptDuplicateHash = (void *)GetProcAddress(GetModuleHandleA("advapi32.dll"), "CryptDuplicateHash");
122 hProv = (HCRYPTPROV)INVALID_HANDLE_VALUE;
124 result = CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
125 ok(!result && GetLastError()==NTE_BAD_FLAGS, "%d, %08x\n", result, GetLastError());
127 if (!CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, 0))
129 ok(GetLastError()==NTE_BAD_KEYSET, "%08x\n", GetLastError());
130 if (GetLastError()!=NTE_BAD_KEYSET) return 0;
131 result = CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL,
133 ok(result, "%08x\n", GetLastError());
134 if (!result) return 0;
135 result = CryptGenKey(hProv, AT_KEYEXCHANGE, 0, &hKey);
136 ok(result, "%08x\n", GetLastError());
137 if (result) CryptDestroyKey(hKey);
138 result = CryptGenKey(hProv, AT_SIGNATURE, 0, &hKey);
139 ok(result, "%08x\n", GetLastError());
140 if (result) CryptDestroyKey(hKey);
145 static void clean_up_base_environment(void)
149 result = CryptReleaseContext(hProv, 1);
150 ok(!result && GetLastError()==NTE_BAD_FLAGS, "%08x\n", GetLastError());
152 CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
155 static int init_aes_environment(void)
160 pCryptDuplicateHash = (void *)GetProcAddress(GetModuleHandleA("advapi32.dll"), "CryptDuplicateHash");
162 hProv = (HCRYPTPROV)INVALID_HANDLE_VALUE;
164 /* we are using NULL as provider name for RSA_AES provider as the provider
165 * names are different in Windows XP and Vista. Its different as to what
166 * its defined in the SDK on Windows XP.
167 * This provider is available on Windows XP, Windows 2003 and Vista. */
169 result = CryptAcquireContext(&hProv, szContainer, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
170 ok(!result && GetLastError()==NTE_BAD_FLAGS, "%d, %08x\n", result, GetLastError());
172 if (!CryptAcquireContext(&hProv, szContainer, NULL, PROV_RSA_AES, 0))
174 ok(GetLastError()==NTE_BAD_KEYSET, "%08x\n", GetLastError());
175 if (GetLastError()!=NTE_BAD_KEYSET) return 0;
176 result = CryptAcquireContext(&hProv, szContainer, NULL, PROV_RSA_AES,
178 ok(result, "%08x\n", GetLastError());
179 if (!result) return 0;
180 result = CryptGenKey(hProv, AT_KEYEXCHANGE, 0, &hKey);
181 ok(result, "%08x\n", GetLastError());
182 if (result) CryptDestroyKey(hKey);
183 result = CryptGenKey(hProv, AT_SIGNATURE, 0, &hKey);
184 ok(result, "%08x\n", GetLastError());
185 if (result) CryptDestroyKey(hKey);
190 static void clean_up_aes_environment(void)
194 result = CryptReleaseContext(hProv, 1);
195 ok(!result && GetLastError()==NTE_BAD_FLAGS, "%08x\n", GetLastError());
197 CryptAcquireContext(&hProv, szContainer, NULL, PROV_RSA_AES, CRYPT_DELETEKEYSET);
200 static void test_prov(void)
205 dwLen = (DWORD)sizeof(DWORD);
206 SetLastError(0xdeadbeef);
207 result = CryptGetProvParam(hProv, PP_SIG_KEYSIZE_INC, (BYTE*)&dwInc, &dwLen, 0);
208 if (!result && GetLastError() == NTE_BAD_TYPE)
209 skip("PP_SIG_KEYSIZE_INC is not supported (win9x or NT)\n");
211 ok(result && dwInc==8, "%08x, %d\n", GetLastError(), dwInc);
213 dwLen = (DWORD)sizeof(DWORD);
214 SetLastError(0xdeadbeef);
215 result = CryptGetProvParam(hProv, PP_KEYX_KEYSIZE_INC, (BYTE*)&dwInc, &dwLen, 0);
216 if (!result && GetLastError() == NTE_BAD_TYPE)
217 skip("PP_KEYX_KEYSIZE_INC is not supported (win9x or NT)\n");
219 ok(result && dwInc==8, "%08x, %d\n", GetLastError(), dwInc);
222 static void test_gen_random(void)
225 BYTE rnd1[16], rnd2[16];
227 memset(rnd1, 0, sizeof(rnd1));
228 memset(rnd2, 0, sizeof(rnd2));
230 result = CryptGenRandom(hProv, sizeof(rnd1), rnd1);
231 if (!result && GetLastError() == NTE_FAIL) {
232 /* rsaenh compiled without OpenSSL */
236 ok(result, "%08x\n", GetLastError());
238 result = CryptGenRandom(hProv, sizeof(rnd2), rnd2);
239 ok(result, "%08x\n", GetLastError());
241 ok(memcmp(rnd1, rnd2, sizeof(rnd1)), "CryptGenRandom generates non random data\n");
244 static BOOL derive_key(ALG_ID aiAlgid, HCRYPTKEY *phKey, DWORD len)
248 unsigned char pbData[2000];
252 for (i=0; i<2000; i++) pbData[i] = (unsigned char)i;
253 result = CryptCreateHash(hProv, CALG_MD2, 0, 0, &hHash);
255 /* rsaenh compiled without OpenSSL */
256 ok(GetLastError()==NTE_BAD_ALGID, "%08x\n", GetLastError());
259 ok(result, "%08x\n", GetLastError());
260 if (!result) return FALSE;
261 result = CryptHashData(hHash, (BYTE*)pbData, sizeof(pbData), 0);
262 ok(result, "%08x\n", GetLastError());
263 if (!result) return FALSE;
264 result = CryptDeriveKey(hProv, aiAlgid, hHash, (len << 16) | CRYPT_EXPORTABLE, phKey);
265 ok(result, "%08x\n", GetLastError());
266 if (!result) return FALSE;
268 result = CryptGetHashParam(hHash, HP_HASHVAL, pbData, &len, 0);
269 ok(result, "%08x\n", GetLastError());
270 CryptDestroyHash(hHash);
274 static void test_hashes(void)
276 static const unsigned char md2hash[16] = {
277 0x12, 0xcb, 0x1b, 0x08, 0xc8, 0x48, 0xa4, 0xa9,
278 0xaa, 0xf3, 0xf1, 0x9f, 0xfc, 0x29, 0x28, 0x68 };
279 static const unsigned char md4hash[16] = {
280 0x8e, 0x2a, 0x58, 0xbf, 0xf2, 0xf5, 0x26, 0x23,
281 0x79, 0xd2, 0x92, 0x36, 0x1b, 0x23, 0xe3, 0x81 };
282 static const unsigned char empty_md5hash[16] = {
283 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
284 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e };
285 static const unsigned char md5hash[16] = {
286 0x15, 0x76, 0xa9, 0x4d, 0x6c, 0xb3, 0x34, 0xdd,
287 0x12, 0x6c, 0xb1, 0xc2, 0x7f, 0x19, 0xe0, 0xf2 };
288 static const unsigned char sha1hash[20] = {
289 0xf1, 0x0c, 0xcf, 0xde, 0x60, 0xc1, 0x7d, 0xb2, 0x6e, 0x7d,
290 0x85, 0xd3, 0x56, 0x65, 0xc7, 0x66, 0x1d, 0xbb, 0xeb, 0x2c };
291 unsigned char pbData[2048];
293 HCRYPTHASH hHash, hHashClone;
294 BYTE pbHashValue[36];
298 for (i=0; i<2048; i++) pbData[i] = (unsigned char)i;
301 result = CryptCreateHash(hProv, CALG_MD2, 0, 0, &hHash);
303 /* rsaenh compiled without OpenSSL */
304 ok(GetLastError() == NTE_BAD_ALGID, "%08x\n", GetLastError());
306 result = CryptHashData(hHash, (BYTE*)pbData, sizeof(pbData), 0);
307 ok(result, "%08x\n", GetLastError());
310 result = CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&hashlen, &len, 0);
311 ok(result && (hashlen == 16), "%08x, hashlen: %d\n", GetLastError(), hashlen);
314 result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue, &len, 0);
315 ok(result, "%08x\n", GetLastError());
317 ok(!memcmp(pbHashValue, md2hash, 16), "Wrong MD2 hash!\n");
319 result = CryptDestroyHash(hHash);
320 ok(result, "%08x\n", GetLastError());
324 result = CryptCreateHash(hProv, CALG_MD4, 0, 0, &hHash);
325 ok(result, "%08x\n", GetLastError());
327 result = CryptHashData(hHash, (BYTE*)pbData, sizeof(pbData), 0);
328 ok(result, "%08x\n", GetLastError());
331 result = CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&hashlen, &len, 0);
332 ok(result && (hashlen == 16), "%08x, hashlen: %d\n", GetLastError(), hashlen);
335 result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue, &len, 0);
336 ok(result, "%08x\n", GetLastError());
338 ok(!memcmp(pbHashValue, md4hash, 16), "Wrong MD4 hash!\n");
340 result = CryptDestroyHash(hHash);
341 ok(result, "%08x\n", GetLastError());
344 result = CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
345 ok(result, "%08x\n", GetLastError());
348 result = CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&hashlen, &len, 0);
349 ok(result && (hashlen == 16), "%08x, hashlen: %d\n", GetLastError(), hashlen);
351 result = CryptHashData(hHash, (BYTE*)pbData, sizeof(pbData), 0);
352 ok(result, "%08x\n", GetLastError());
355 result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue, &len, 0);
356 ok(result, "%08x\n", GetLastError());
358 ok(!memcmp(pbHashValue, md5hash, 16), "Wrong MD5 hash!\n");
360 result = CryptDestroyHash(hHash);
361 ok(result, "%08x\n", GetLastError());
363 result = CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
364 ok(result, "%08x\n", GetLastError());
366 /* The hash is available even if CryptHashData hasn't been called */
368 result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue, &len, 0);
369 ok(result, "%08x\n", GetLastError());
371 ok(!memcmp(pbHashValue, empty_md5hash, 16), "Wrong MD5 hash!\n");
373 /* It's also stable: getting it twice results in the same value */
374 result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue, &len, 0);
375 ok(result, "%08x\n", GetLastError());
377 ok(!memcmp(pbHashValue, empty_md5hash, 16), "Wrong MD5 hash!\n");
379 /* Can't add data after the hash been retrieved */
380 SetLastError(0xdeadbeef);
381 result = CryptHashData(hHash, (BYTE*)pbData, sizeof(pbData), 0);
382 ok(!result && GetLastError() == NTE_BAD_HASH_STATE, "%08x\n", GetLastError());
384 /* You can still retrieve the hash, its value just hasn't changed */
385 result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue, &len, 0);
386 ok(result, "%08x\n", GetLastError());
388 ok(!memcmp(pbHashValue, empty_md5hash, 16), "Wrong MD5 hash!\n");
390 result = CryptDestroyHash(hHash);
391 ok(result, "%08x\n", GetLastError());
394 result = CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash);
395 ok(result, "%08x\n", GetLastError());
397 result = CryptHashData(hHash, (BYTE*)pbData, 5, 0);
398 ok(result, "%08x\n", GetLastError());
400 if(pCryptDuplicateHash) {
401 result = pCryptDuplicateHash(hHash, 0, 0, &hHashClone);
402 ok(result, "%08x\n", GetLastError());
404 result = CryptHashData(hHashClone, (BYTE*)pbData+5, sizeof(pbData)-5, 0);
405 ok(result, "%08x\n", GetLastError());
408 result = CryptGetHashParam(hHashClone, HP_HASHSIZE, (BYTE*)&hashlen, &len, 0);
409 ok(result && (hashlen == 20), "%08x, hashlen: %d\n", GetLastError(), hashlen);
412 result = CryptGetHashParam(hHashClone, HP_HASHVAL, pbHashValue, &len, 0);
413 ok(result, "%08x\n", GetLastError());
415 ok(!memcmp(pbHashValue, sha1hash, 20), "Wrong SHA1 hash!\n");
417 result = CryptDestroyHash(hHashClone);
418 ok(result, "%08x\n", GetLastError());
421 result = CryptDestroyHash(hHash);
422 ok(result, "%08x\n", GetLastError());
425 static void test_block_cipher_modes(void)
427 static const BYTE plain[23] = {
428 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
429 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };
430 static const BYTE ecb[24] = {
431 0xc0, 0x9a, 0xe4, 0x2f, 0x0a, 0x47, 0x67, 0x11, 0xf2, 0xb2, 0x5d, 0x5f,
432 0x08, 0xff, 0x49, 0xa4, 0x45, 0x3a, 0x68, 0x14, 0xca, 0x18, 0xe5, 0xf4 };
433 static const BYTE cbc[24] = {
434 0xc0, 0x9a, 0xe4, 0x2f, 0x0a, 0x47, 0x67, 0x11, 0x10, 0xf5, 0xda, 0x61,
435 0x4e, 0x3d, 0xab, 0xc0, 0x97, 0x85, 0x01, 0x12, 0x97, 0xa4, 0xf7, 0xd3 };
436 static const BYTE cfb[24] = {
437 0x29, 0xb5, 0x67, 0x85, 0x0b, 0x1b, 0xec, 0x07, 0x67, 0x2d, 0xa1, 0xa4,
438 0x1a, 0x47, 0x24, 0x6a, 0x54, 0xe1, 0xe0, 0x92, 0xf9, 0x0e, 0xf6, 0xeb };
444 result = derive_key(CALG_RC2, &hKey, 40);
447 memcpy(abData, plain, sizeof(abData));
449 dwMode = CRYPT_MODE_ECB;
450 result = CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, 0);
451 ok(result, "%08x\n", GetLastError());
454 result = CryptEncrypt(hKey, 0, TRUE, 0, NULL, &dwLen, 24);
455 ok(result, "CryptEncrypt failed: %08x\n", GetLastError());
456 ok(dwLen == 24, "Unexpected length %d\n", dwLen);
458 SetLastError(ERROR_SUCCESS);
460 result = CryptEncrypt(hKey, 0, TRUE, 0, abData, &dwLen, 24);
461 ok(result && dwLen == 24 && !memcmp(ecb, abData, sizeof(ecb)),
462 "%08x, dwLen: %d\n", GetLastError(), dwLen);
464 result = CryptDecrypt(hKey, 0, TRUE, 0, abData, &dwLen);
465 ok(result && dwLen == 23 && !memcmp(plain, abData, sizeof(plain)),
466 "%08x, dwLen: %d\n", GetLastError(), dwLen);
468 dwMode = CRYPT_MODE_CBC;
469 result = CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, 0);
470 ok(result, "%08x\n", GetLastError());
473 result = CryptEncrypt(hKey, 0, TRUE, 0, NULL, &dwLen, 24);
474 ok(result, "CryptEncrypt failed: %08x\n", GetLastError());
475 ok(dwLen == 24, "Unexpected length %d\n", dwLen);
478 result = CryptEncrypt(hKey, 0, TRUE, 0, abData, &dwLen, 24);
479 ok(result && dwLen == 24 && !memcmp(cbc, abData, sizeof(cbc)),
480 "%08x, dwLen: %d\n", GetLastError(), dwLen);
482 result = CryptDecrypt(hKey, 0, TRUE, 0, abData, &dwLen);
483 ok(result && dwLen == 23 && !memcmp(plain, abData, sizeof(plain)),
484 "%08x, dwLen: %d\n", GetLastError(), dwLen);
486 dwMode = CRYPT_MODE_CFB;
487 result = CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, 0);
488 ok(result, "%08x\n", GetLastError());
491 result = CryptEncrypt(hKey, 0, FALSE, 0, abData, &dwLen, 24);
492 ok(result && dwLen == 16, "%08x, dwLen: %d\n", GetLastError(), dwLen);
495 result = CryptEncrypt(hKey, 0, TRUE, 0, abData+16, &dwLen, 8);
496 ok(result && dwLen == 8 && !memcmp(cfb, abData, sizeof(cfb)),
497 "%08x, dwLen: %d\n", GetLastError(), dwLen);
500 result = CryptDecrypt(hKey, 0, FALSE, 0, abData, &dwLen);
501 ok(result && dwLen == 8, "%08x, dwLen: %d\n", GetLastError(), dwLen);
504 result = CryptDecrypt(hKey, 0, TRUE, 0, abData+8, &dwLen);
505 ok(result && dwLen == 15 && !memcmp(plain, abData, sizeof(plain)),
506 "%08x, dwLen: %d\n", GetLastError(), dwLen);
508 dwMode = CRYPT_MODE_OFB;
509 result = CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, 0);
510 ok(result, "%08x\n", GetLastError());
513 result = CryptEncrypt(hKey, 0, TRUE, 0, abData, &dwLen, 24);
514 ok(!result && GetLastError() == NTE_BAD_ALGID, "%08x\n", GetLastError());
516 CryptDestroyKey(hKey);
519 static void test_3des112(void)
524 unsigned char pbData[16];
527 result = derive_key(CALG_3DES_112, &hKey, 0);
529 /* rsaenh compiled without OpenSSL */
530 ok(GetLastError() == NTE_BAD_ALGID, "%08x\n", GetLastError());
534 for (i=0; i<sizeof(pbData); i++) pbData[i] = (unsigned char)i;
537 result = CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwLen, 16);
538 ok(result, "%08x\n", GetLastError());
540 result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwLen);
541 ok(result, "%08x\n", GetLastError());
545 memcpy(pbData,cTestData[i].origstr,cTestData[i].strlen);
547 dwLen = cTestData[i].enclen;
548 result = CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwLen, cTestData[i].buflen);
549 ok(result, "%08x\n", GetLastError());
550 ok(dwLen==cTestData[i].buflen,"length incorrect, got %d, expected %d\n",dwLen,cTestData[i].buflen);
552 result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwLen);
553 ok(result, "%08x\n", GetLastError());
554 ok(dwLen==cTestData[i].enclen,"length incorrect, got %d, expected %d\n",dwLen,cTestData[i].enclen);
555 ok(memcmp(pbData,cTestData[i].decstr,cTestData[1].enclen)==0,"decryption incorrect %d\n",i);
556 if((dwLen != cTestData[i].enclen) ||
557 memcmp(pbData,cTestData[i].decstr,cTestData[i].enclen))
559 printBytes("expected",cTestData[i].decstr,cTestData[i].strlen);
560 printBytes("got",pbData,dwLen);
563 result = CryptDestroyKey(hKey);
564 ok(result, "%08x\n", GetLastError());
567 static void test_des(void)
572 unsigned char pbData[16];
575 result = derive_key(CALG_DES, &hKey, 56);
577 /* rsaenh compiled without OpenSSL */
578 ok(GetLastError()==NTE_BAD_ALGID, "%08x\n", GetLastError());
582 dwMode = CRYPT_MODE_ECB;
583 result = CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, 0);
584 ok(result, "%08x\n", GetLastError());
586 dwLen = sizeof(DWORD);
587 result = CryptGetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, &dwLen, 0);
588 ok(result, "%08x\n", GetLastError());
590 for (i=0; i<sizeof(pbData); i++) pbData[i] = (unsigned char)i;
593 result = CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwLen, 16);
594 ok(result, "%08x\n", GetLastError());
596 result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwLen);
597 ok(result, "%08x\n", GetLastError());
601 memcpy(pbData,cTestData[i].origstr,cTestData[i].strlen);
603 dwLen = cTestData[i].enclen;
604 result = CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwLen, cTestData[i].buflen);
605 ok(result, "%08x\n", GetLastError());
606 ok(dwLen==cTestData[i].buflen,"length incorrect, got %d, expected %d\n",dwLen,cTestData[i].buflen);
608 result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwLen);
609 ok(result, "%08x\n", GetLastError());
610 ok(dwLen==cTestData[i].enclen,"length incorrect, got %d, expected %d\n",dwLen,cTestData[i].enclen);
611 ok(memcmp(pbData,cTestData[i].decstr,cTestData[i].enclen)==0,"decryption incorrect %d\n",i);
612 if((dwLen != cTestData[i].enclen) ||
613 memcmp(pbData,cTestData[i].decstr,cTestData[i].enclen))
615 printBytes("expected",cTestData[i].decstr,cTestData[i].strlen);
616 printBytes("got",pbData,dwLen);
620 result = CryptDestroyKey(hKey);
621 ok(result, "%08x\n", GetLastError());
624 static void test_3des(void)
629 unsigned char pbData[16];
630 static const BYTE des3[16] = {
631 0x7b, 0xba, 0xdd, 0xa2, 0x39, 0xd3, 0x7b, 0xb3,
632 0xc7, 0x51, 0x81, 0x41, 0x53, 0xe8, 0xcf, 0xeb };
635 result = derive_key(CALG_3DES, &hKey, 0);
638 for (i=0; i<sizeof(pbData); i++) pbData[i] = (unsigned char)i;
641 result = CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwLen, 16);
642 ok(result, "%08x\n", GetLastError());
644 ok(!memcmp(pbData, des3, sizeof(des3)), "3DES encryption failed!\n");
646 result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwLen);
647 ok(result, "%08x\n", GetLastError());
651 memcpy(pbData,cTestData[i].origstr,cTestData[i].strlen);
653 dwLen = cTestData[i].enclen;
654 result = CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwLen, cTestData[i].buflen);
655 ok(result, "%08x\n", GetLastError());
656 ok(dwLen==cTestData[i].buflen,"length incorrect, got %d, expected %d\n",dwLen,cTestData[i].buflen);
658 result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwLen);
659 ok(result, "%08x\n", GetLastError());
660 ok(dwLen==cTestData[i].enclen,"length incorrect, got %d, expected %d\n",dwLen,cTestData[i].enclen);
661 ok(memcmp(pbData,cTestData[i].decstr,cTestData[i].enclen)==0,"decryption incorrect %d\n",i);
662 if((dwLen != cTestData[i].enclen) ||
663 memcmp(pbData,cTestData[i].decstr,cTestData[i].enclen))
665 printBytes("expected",cTestData[i].decstr,cTestData[i].strlen);
666 printBytes("got",pbData,dwLen);
669 result = CryptDestroyKey(hKey);
670 ok(result, "%08x\n", GetLastError());
673 static void test_aes(int keylen)
678 unsigned char pbData[16];
684 result = derive_key(CALG_AES_256, &hKey, 0);
687 result = derive_key(CALG_AES_192, &hKey, 0);
691 result = derive_key(CALG_AES_128, &hKey, 0);
696 for (i=0; i<sizeof(pbData); i++) pbData[i] = (unsigned char)i;
699 result = CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwLen, 16);
700 ok(result, "%08x\n", GetLastError());
702 result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwLen);
703 ok(result, "%08x\n", GetLastError());
707 memcpy(pbData,cTestData[i].origstr,cTestData[i].strlen);
709 dwLen = cTestData[i].enclen;
710 result = CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwLen, cTestData[i].buflen);
711 ok(result, "%08x\n", GetLastError());
712 ok(dwLen==cTestData[i].buflen,"length incorrect, got %d, expected %d\n",dwLen,cTestData[i].buflen);
714 result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwLen);
715 ok(result, "%08x\n", GetLastError());
716 ok(dwLen==cTestData[i].enclen,"length incorrect, got %d, expected %d\n",dwLen,cTestData[i].enclen);
717 ok(memcmp(pbData,cTestData[i].decstr,cTestData[1].enclen)==0,"decryption incorrect %d\n",i);
718 if((dwLen != cTestData[i].enclen) ||
719 memcmp(pbData,cTestData[i].decstr,cTestData[i].enclen))
721 printBytes("expected",cTestData[i].decstr,cTestData[i].strlen);
722 printBytes("got",pbData,dwLen);
725 result = CryptDestroyKey(hKey);
726 ok(result, "%08x\n", GetLastError());
729 static void test_rc2(void)
731 static const BYTE rc2encrypted[16] = {
732 0x02, 0x34, 0x7d, 0xf6, 0x1d, 0xc5, 0x9b, 0x8b,
733 0x2e, 0x0d, 0x63, 0x80, 0x72, 0xc1, 0xc2, 0xb1 };
734 static const BYTE rc2_128_encrypted[] = {
735 0x82,0x81,0xf7,0xff,0xdd,0xd7,0x88,0x8c,0x2a,0x2a,0xc0,0xce,0x4c,0x89,
740 DWORD dwLen, dwKeyLen, dwDataLen, dwMode, dwModeBits;
742 unsigned char pbData[2000], pbHashValue[16];
745 for (i=0; i<2000; i++) pbData[i] = (unsigned char)i;
748 result = CryptCreateHash(hProv, CALG_MD2, 0, 0, &hHash);
750 ok(GetLastError()==NTE_BAD_ALGID, "%08x\n", GetLastError());
752 CRYPT_INTEGER_BLOB salt;
754 result = CryptHashData(hHash, (BYTE*)pbData, sizeof(pbData), 0);
755 ok(result, "%08x\n", GetLastError());
758 result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue, &dwLen, 0);
759 ok(result, "%08x\n", GetLastError());
761 result = CryptDeriveKey(hProv, CALG_RC2, hHash, 56 << 16, &hKey);
762 ok(result, "%08x\n", GetLastError());
764 dwLen = sizeof(DWORD);
765 result = CryptGetKeyParam(hKey, KP_KEYLEN, (BYTE*)&dwKeyLen, &dwLen, 0);
766 ok(result, "%08x\n", GetLastError());
768 dwMode = CRYPT_MODE_CBC;
769 result = CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, 0);
770 ok(result, "%08x\n", GetLastError());
772 dwLen = sizeof(DWORD);
773 result = CryptGetKeyParam(hKey, KP_MODE_BITS, (BYTE*)&dwModeBits, &dwLen, 0);
774 ok(result, "%08x\n", GetLastError());
776 dwLen = sizeof(DWORD);
777 result = CryptGetKeyParam(hKey, KP_PERMISSIONS, (BYTE*)&dwModeBits, &dwLen, 0);
778 ok(result, "%08x\n", GetLastError());
780 dwLen = sizeof(DWORD);
781 result = CryptGetKeyParam(hKey, KP_BLOCKLEN, (BYTE*)&dwModeBits, &dwLen, 0);
782 ok(result, "%08x\n", GetLastError());
784 result = CryptGetKeyParam(hKey, KP_IV, NULL, &dwLen, 0);
785 ok(result, "%08x\n", GetLastError());
786 pbTemp = HeapAlloc(GetProcessHeap(), 0, dwLen);
787 CryptGetKeyParam(hKey, KP_IV, pbTemp, &dwLen, 0);
788 HeapFree(GetProcessHeap(), 0, pbTemp);
790 result = CryptGetKeyParam(hKey, KP_SALT, NULL, &dwLen, 0);
791 ok(result, "%08x\n", GetLastError());
792 pbTemp = HeapAlloc(GetProcessHeap(), 0, dwLen);
793 CryptGetKeyParam(hKey, KP_SALT, pbTemp, &dwLen, 0);
794 HeapFree(GetProcessHeap(), 0, pbTemp);
796 dwLen = sizeof(DWORD);
797 CryptGetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, &dwLen, 0);
799 result = CryptDestroyHash(hHash);
800 ok(result, "%08x\n", GetLastError());
803 result = CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen, 24);
804 ok(result, "%08x\n", GetLastError());
806 ok(!memcmp(pbData, rc2encrypted, 8), "RC2 encryption failed!\n");
808 result = CryptGetKeyParam(hKey, KP_IV, NULL, &dwLen, 0);
809 ok(result, "%08x\n", GetLastError());
810 pbTemp = HeapAlloc(GetProcessHeap(), 0, dwLen);
811 CryptGetKeyParam(hKey, KP_IV, pbTemp, &dwLen, 0);
812 HeapFree(GetProcessHeap(), 0, pbTemp);
814 result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen);
815 ok(result, "%08x\n", GetLastError());
817 /* What sizes salt can I set? */
818 salt.pbData = pbData;
822 result = CryptSetKeyParam(hKey, KP_SALT_EX, (BYTE *)&salt, 0);
823 ok(result, "setting salt failed for size %d: %08x\n", i, GetLastError());
826 SetLastError(0xdeadbeef);
827 result = CryptSetKeyParam(hKey, KP_SALT_EX, (BYTE *)&salt, 0);
828 ok(!result && GetLastError() == NTE_BAD_DATA, "%08x\n", GetLastError());
830 result = CryptDestroyKey(hKey);
831 ok(result, "%08x\n", GetLastError());
834 /* Again, but test setting the effective key len */
835 for (i=0; i<2000; i++) pbData[i] = (unsigned char)i;
837 result = CryptCreateHash(hProv, CALG_MD2, 0, 0, &hHash);
839 ok(GetLastError()==NTE_BAD_ALGID, "%08x\n", GetLastError());
841 result = CryptHashData(hHash, (BYTE*)pbData, sizeof(pbData), 0);
842 ok(result, "%08x\n", GetLastError());
845 result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue, &dwLen, 0);
846 ok(result, "%08x\n", GetLastError());
848 result = CryptDeriveKey(hProv, CALG_RC2, hHash, 56 << 16, &hKey);
849 ok(result, "%08x\n", GetLastError());
851 SetLastError(0xdeadbeef);
852 result = CryptSetKeyParam(hKey, KP_EFFECTIVE_KEYLEN, NULL, 0);
853 ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "%08x\n", GetLastError());
855 SetLastError(0xdeadbeef);
856 result = CryptSetKeyParam(hKey, KP_EFFECTIVE_KEYLEN, (LPBYTE)&dwKeyLen, 0);
857 ok(!result && GetLastError()==NTE_BAD_DATA, "%08x\n", GetLastError());
859 SetLastError(0xdeadbeef);
860 result = CryptSetKeyParam(hKey, KP_EFFECTIVE_KEYLEN, (LPBYTE)&dwKeyLen, 0);
862 dwLen = sizeof(dwKeyLen);
863 CryptGetKeyParam(hKey, KP_KEYLEN, (BYTE *)&dwKeyLen, &dwLen, 0);
864 ok(dwKeyLen == 56, "%d (%08x)\n", dwKeyLen, GetLastError());
865 CryptGetKeyParam(hKey, KP_EFFECTIVE_KEYLEN, (BYTE *)&dwKeyLen, &dwLen, 0);
866 ok(dwKeyLen == 56, "%d (%08x)\n", dwKeyLen, GetLastError());
869 result = CryptSetKeyParam(hKey, KP_EFFECTIVE_KEYLEN, (LPBYTE)&dwKeyLen, 0);
870 ok(result, "%d\n", GetLastError());
872 dwLen = sizeof(dwKeyLen);
873 CryptGetKeyParam(hKey, KP_KEYLEN, (BYTE *)&dwKeyLen, &dwLen, 0);
874 ok(dwKeyLen == 56, "%d (%08x)\n", dwKeyLen, GetLastError());
875 CryptGetKeyParam(hKey, KP_EFFECTIVE_KEYLEN, (BYTE *)&dwKeyLen, &dwLen, 0);
876 ok(dwKeyLen == 128, "%d (%08x)\n", dwKeyLen, GetLastError());
878 result = CryptDestroyHash(hHash);
879 ok(result, "%08x\n", GetLastError());
882 result = CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen, 24);
883 ok(result, "%08x\n", GetLastError());
885 ok(!memcmp(pbData, rc2_128_encrypted, sizeof(rc2_128_encrypted)),
886 "RC2 encryption failed!\n");
888 /* Oddly enough this succeeds, though it should have no effect */
890 result = CryptSetKeyParam(hKey, KP_EFFECTIVE_KEYLEN, (LPBYTE)&dwKeyLen, 0);
891 ok(result, "%d\n", GetLastError());
893 result = CryptDestroyKey(hKey);
894 ok(result, "%08x\n", GetLastError());
898 static void test_rc4(void)
900 static const BYTE rc4[16] = {
901 0x17, 0x0c, 0x44, 0x8e, 0xae, 0x90, 0xcd, 0xb0,
902 0x7f, 0x87, 0xf5, 0x7a, 0xec, 0xb2, 0x2e, 0x35 };
906 DWORD dwDataLen = 5, dwKeyLen, dwLen = sizeof(DWORD), dwMode;
907 unsigned char pbData[2000], *pbTemp;
908 unsigned char pszBuffer[256];
911 for (i=0; i<2000; i++) pbData[i] = (unsigned char)i;
914 result = CryptCreateHash(hProv, CALG_MD2, 0, 0, &hHash);
916 /* rsaenh compiled without OpenSSL */
917 ok(GetLastError() == NTE_BAD_ALGID, "%08x\n", GetLastError());
919 CRYPT_INTEGER_BLOB salt;
921 result = CryptHashData(hHash, (BYTE*)pbData, sizeof(pbData), 0);
922 ok(result, "%08x\n", GetLastError());
925 result = CryptGetHashParam(hHash, HP_HASHVAL, pszBuffer, &dwLen, 0);
926 ok(result, "%08x\n", GetLastError());
928 result = CryptDeriveKey(hProv, CALG_RC4, hHash, 56 << 16, &hKey);
929 ok(result, "%08x\n", GetLastError());
931 dwLen = sizeof(DWORD);
932 result = CryptGetKeyParam(hKey, KP_KEYLEN, (BYTE*)&dwKeyLen, &dwLen, 0);
933 ok(result, "%08x\n", GetLastError());
935 dwLen = sizeof(DWORD);
936 result = CryptGetKeyParam(hKey, KP_BLOCKLEN, (BYTE*)&dwKeyLen, &dwLen, 0);
937 ok(result, "%08x\n", GetLastError());
939 result = CryptGetKeyParam(hKey, KP_IV, NULL, &dwLen, 0);
940 ok(result, "%08x\n", GetLastError());
941 pbTemp = HeapAlloc(GetProcessHeap(), 0, dwLen);
942 CryptGetKeyParam(hKey, KP_IV, pbTemp, &dwLen, 0);
943 HeapFree(GetProcessHeap(), 0, pbTemp);
945 result = CryptGetKeyParam(hKey, KP_SALT, NULL, &dwLen, 0);
946 ok(result, "%08x\n", GetLastError());
947 pbTemp = HeapAlloc(GetProcessHeap(), 0, dwLen);
948 CryptGetKeyParam(hKey, KP_SALT, pbTemp, &dwLen, 0);
949 HeapFree(GetProcessHeap(), 0, pbTemp);
951 dwLen = sizeof(DWORD);
952 CryptGetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, &dwLen, 0);
954 result = CryptDestroyHash(hHash);
955 ok(result, "%08x\n", GetLastError());
958 result = CryptEncrypt(hKey, 0, TRUE, 0, NULL, &dwDataLen, 24);
959 ok(result, "%08x\n", GetLastError());
961 result = CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen, 24);
962 ok(result, "%08x\n", GetLastError());
964 ok(!memcmp(pbData, rc4, dwDataLen), "RC4 encryption failed!\n");
966 result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen);
967 ok(result, "%08x\n", GetLastError());
969 /* What sizes salt can I set? */
970 salt.pbData = pbData;
974 result = CryptSetKeyParam(hKey, KP_SALT_EX, (BYTE *)&salt, 0);
975 ok(result, "setting salt failed for size %d: %08x\n", i, GetLastError());
978 SetLastError(0xdeadbeef);
979 result = CryptSetKeyParam(hKey, KP_SALT_EX, (BYTE *)&salt, 0);
980 ok(!result && GetLastError() == NTE_BAD_DATA, "%08x\n", GetLastError());
982 result = CryptDestroyKey(hKey);
983 ok(result, "%08x\n", GetLastError());
987 static void test_hmac(void) {
991 /* Using CALG_MD2 here fails on Windows 2003, why ? */
992 HMAC_INFO hmacInfo = { CALG_MD5, NULL, 0, NULL, 0 };
995 static const BYTE hmac[16] = {
996 0x1a, 0x7d, 0x49, 0xc5, 0x9b, 0x2d, 0x0b, 0x9c,
997 0xcf, 0x10, 0x6b, 0xb6, 0x7d, 0x0f, 0x13, 0x32 };
1000 for (i=0; i<sizeof(abData)/sizeof(BYTE); i++) abData[i] = (BYTE)i;
1002 if (!derive_key(CALG_RC2, &hKey, 56)) return;
1004 result = CryptCreateHash(hProv, CALG_HMAC, hKey, 0, &hHash);
1005 ok(result, "%08x\n", GetLastError());
1006 if (!result) return;
1008 result = CryptSetHashParam(hHash, HP_HMAC_INFO, (BYTE*)&hmacInfo, 0);
1009 ok(result, "%08x\n", GetLastError());
1011 result = CryptHashData(hHash, (BYTE*)abData, sizeof(abData), 0);
1012 ok(result, "%08x\n", GetLastError());
1014 dwLen = sizeof(abData)/sizeof(BYTE);
1015 result = CryptGetHashParam(hHash, HP_HASHVAL, abData, &dwLen, 0);
1016 ok(result, "%08x\n", GetLastError());
1018 ok(!memcmp(abData, hmac, sizeof(hmac)), "HMAC failed!\n");
1020 result = CryptDestroyHash(hHash);
1021 ok(result, "%08x\n", GetLastError());
1023 result = CryptDestroyKey(hKey);
1024 ok(result, "%08x\n", GetLastError());
1026 /* Provoke errors */
1027 result = CryptCreateHash(hProv, CALG_HMAC, 0, 0, &hHash);
1028 ok(!result && GetLastError() == NTE_BAD_KEY, "%08x\n", GetLastError());
1031 static void test_mac(void) {
1036 BYTE abData[256], abEnc[264];
1037 static const BYTE mac[8] = { 0x0d, 0x3e, 0x15, 0x6b, 0x85, 0x63, 0x5c, 0x11 };
1040 for (i=0; i<sizeof(abData)/sizeof(BYTE); i++) abData[i] = (BYTE)i;
1041 for (i=0; i<sizeof(abData)/sizeof(BYTE); i++) abEnc[i] = (BYTE)i;
1043 if (!derive_key(CALG_RC2, &hKey, 56)) return;
1046 result = CryptEncrypt(hKey, 0, TRUE, 0, abEnc, &dwLen, 264);
1047 ok (result && dwLen == 264, "%08x, dwLen: %d\n", GetLastError(), dwLen);
1049 result = CryptCreateHash(hProv, CALG_MAC, hKey, 0, &hHash);
1050 ok(result, "%08x\n", GetLastError());
1051 if (!result) return;
1053 result = CryptHashData(hHash, (BYTE*)abData, sizeof(abData), 0);
1054 ok(result, "%08x\n", GetLastError());
1056 dwLen = sizeof(abData)/sizeof(BYTE);
1057 result = CryptGetHashParam(hHash, HP_HASHVAL, abData, &dwLen, 0);
1058 ok(result && dwLen == 8, "%08x, dwLen: %d\n", GetLastError(), dwLen);
1060 ok(!memcmp(abData, mac, sizeof(mac)), "MAC failed!\n");
1062 result = CryptDestroyHash(hHash);
1063 ok(result, "%08x\n", GetLastError());
1065 result = CryptDestroyKey(hKey);
1066 ok(result, "%08x\n", GetLastError());
1068 /* Provoke errors */
1069 if (!derive_key(CALG_RC4, &hKey, 56)) return;
1071 result = CryptCreateHash(hProv, CALG_MAC, hKey, 0, &hHash);
1072 ok(!result && GetLastError() == NTE_BAD_KEY, "%08x\n", GetLastError());
1074 result = CryptDestroyKey(hKey);
1075 ok(result, "%08x\n", GetLastError());
1078 static BYTE abPlainPrivateKey[596] = {
1079 0x07, 0x02, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00,
1080 0x52, 0x53, 0x41, 0x32, 0x00, 0x04, 0x00, 0x00,
1081 0x01, 0x00, 0x01, 0x00, 0x9b, 0x64, 0xef, 0xce,
1082 0x31, 0x7c, 0xad, 0x56, 0xe2, 0x1e, 0x9b, 0x96,
1083 0xb3, 0xf0, 0x29, 0x88, 0x6e, 0xa8, 0xc2, 0x11,
1084 0x33, 0xd6, 0xcc, 0x8c, 0x69, 0xb2, 0x1a, 0xfd,
1085 0xfc, 0x23, 0x21, 0x30, 0x4d, 0x29, 0x45, 0xb6,
1086 0x3a, 0x67, 0x11, 0x80, 0x1a, 0x91, 0xf2, 0x9f,
1087 0x01, 0xac, 0xc0, 0x11, 0x50, 0x5f, 0xcd, 0xb9,
1088 0xad, 0x76, 0x9f, 0x6e, 0x91, 0x55, 0x71, 0xda,
1089 0x97, 0x96, 0x96, 0x22, 0x75, 0xb4, 0x83, 0x44,
1090 0x89, 0x9e, 0xf8, 0x44, 0x40, 0x7c, 0xd6, 0xcd,
1091 0x9d, 0x88, 0xd6, 0x88, 0xbc, 0x56, 0xb7, 0x64,
1092 0xe9, 0x2c, 0x24, 0x2f, 0x0d, 0x78, 0x55, 0x1c,
1093 0xb2, 0x67, 0xb1, 0x5e, 0xbc, 0x0c, 0xcf, 0x1c,
1094 0xe9, 0xd3, 0x9e, 0xa2, 0x15, 0x24, 0x73, 0xd6,
1095 0xdb, 0x6f, 0x83, 0xb2, 0xf8, 0xbc, 0xe7, 0x47,
1096 0x3b, 0x01, 0xef, 0x49, 0x08, 0x98, 0xd6, 0xa3,
1097 0xf9, 0x25, 0x57, 0xe9, 0x39, 0x3c, 0x53, 0x30,
1098 0x1b, 0xf2, 0xc9, 0x62, 0x31, 0x43, 0x5d, 0x84,
1099 0x24, 0x30, 0x21, 0x9a, 0xad, 0xdb, 0x62, 0x91,
1100 0xc8, 0x07, 0xd9, 0x2f, 0xd6, 0xb5, 0x37, 0x6f,
1101 0xfe, 0x7a, 0x12, 0xbc, 0xd9, 0xd2, 0x2b, 0xbf,
1102 0xd7, 0xb1, 0xfa, 0x7d, 0xc0, 0x48, 0xdd, 0x74,
1103 0xdd, 0x55, 0x04, 0xa1, 0x8b, 0xc1, 0x0a, 0xc4,
1104 0xa5, 0x57, 0x62, 0xee, 0x08, 0x8b, 0xf9, 0x19,
1105 0x6c, 0x52, 0x06, 0xf8, 0x73, 0x0f, 0x24, 0xc9,
1106 0x71, 0x9f, 0xc5, 0x45, 0x17, 0x3e, 0xae, 0x06,
1107 0x81, 0xa2, 0x96, 0x40, 0x06, 0xbf, 0xeb, 0x9e,
1108 0x80, 0x2b, 0x27, 0x20, 0x8f, 0x38, 0xcf, 0xeb,
1109 0xff, 0x3b, 0x38, 0x41, 0x35, 0x69, 0x66, 0x13,
1110 0x1d, 0x3c, 0x01, 0x3b, 0xf6, 0x37, 0xca, 0x9c,
1111 0x61, 0x74, 0x98, 0xcf, 0xc9, 0x6e, 0xe8, 0x90,
1112 0xc7, 0xb7, 0x33, 0xc0, 0x07, 0x3c, 0xf8, 0xc8,
1113 0xf6, 0xf2, 0xd7, 0xf0, 0x21, 0x62, 0x58, 0x8a,
1114 0x55, 0xbf, 0xa1, 0x2d, 0x3d, 0xa6, 0x69, 0xc5,
1115 0x02, 0x19, 0x31, 0xf0, 0x94, 0x0f, 0x45, 0x5c,
1116 0x95, 0x1b, 0x53, 0xbc, 0xf5, 0xb0, 0x1a, 0x8f,
1117 0xbf, 0x40, 0xe0, 0xc7, 0x73, 0xe7, 0x72, 0x6e,
1118 0xeb, 0xb1, 0x0f, 0x38, 0xc5, 0xf8, 0xee, 0x04,
1119 0xed, 0x34, 0x1a, 0x10, 0xf9, 0x53, 0x34, 0xf3,
1120 0x3e, 0xe6, 0x5c, 0xd1, 0x47, 0x65, 0xcd, 0xbd,
1121 0xf1, 0x06, 0xcb, 0xb4, 0xb1, 0x26, 0x39, 0x9f,
1122 0x71, 0xfe, 0x3d, 0xf8, 0x62, 0xab, 0x22, 0x8b,
1123 0x0e, 0xdc, 0xb9, 0xe8, 0x74, 0x06, 0xfc, 0x8c,
1124 0x25, 0xa1, 0xa9, 0xcf, 0x07, 0xf9, 0xac, 0x21,
1125 0x01, 0x7b, 0x1c, 0xdc, 0x94, 0xbd, 0x47, 0xe1,
1126 0xa0, 0x86, 0x59, 0x35, 0x6a, 0x6f, 0xb9, 0x70,
1127 0x26, 0x7c, 0x3c, 0xfd, 0xbd, 0x81, 0x39, 0x36,
1128 0x42, 0xc2, 0xbd, 0xbe, 0x84, 0x27, 0x9a, 0x69,
1129 0x81, 0xda, 0x99, 0x27, 0xc2, 0x4f, 0x62, 0x33,
1130 0xf4, 0x79, 0x30, 0xc5, 0x63, 0x54, 0x71, 0xf1,
1131 0x47, 0x22, 0x25, 0x9b, 0x6c, 0x00, 0x2f, 0x1c,
1132 0xf4, 0x1f, 0x85, 0xbc, 0xf6, 0x67, 0x6a, 0xe3,
1133 0xf6, 0x55, 0x8a, 0xef, 0xd0, 0x0b, 0xd3, 0xa2,
1134 0xc5, 0x51, 0x70, 0x15, 0x0a, 0xf0, 0x98, 0x4c,
1135 0xb7, 0x19, 0x62, 0x0e, 0x2d, 0x2a, 0x4a, 0x7d,
1136 0x7a, 0x0a, 0xc4, 0x17, 0xe3, 0x5d, 0x20, 0x52,
1137 0xa9, 0x98, 0xc3, 0xaa, 0x11, 0xf6, 0xbf, 0x4c,
1138 0x94, 0x99, 0x81, 0x89, 0xf0, 0x7f, 0x66, 0xaa,
1139 0xc8, 0x88, 0xd7, 0x31, 0x84, 0x71, 0xb6, 0x64,
1140 0x09, 0x76, 0x0b, 0x7f, 0x1a, 0x1f, 0x2e, 0xfe,
1141 0xcd, 0x59, 0x2a, 0x54, 0x11, 0x84, 0xd4, 0x6a,
1142 0x61, 0xdf, 0xaa, 0x76, 0x66, 0x9d, 0x82, 0x11,
1143 0x56, 0x3d, 0xd2, 0x52, 0xe6, 0x42, 0x5a, 0x77,
1144 0x92, 0x98, 0x34, 0xf3, 0x56, 0x6c, 0x96, 0x10,
1145 0x40, 0x59, 0x16, 0xcb, 0x77, 0x61, 0xe3, 0xbf,
1146 0x4b, 0xd4, 0x39, 0xfb, 0xb1, 0x4e, 0xc1, 0x74,
1147 0xec, 0x7a, 0xea, 0x3d, 0x68, 0xbb, 0x0b, 0xe6,
1148 0xc6, 0x06, 0xbf, 0xdd, 0x7f, 0x94, 0x42, 0xc0,
1149 0x0f, 0xe4, 0x92, 0x33, 0x6c, 0x6e, 0x1b, 0xba,
1150 0x73, 0xf9, 0x79, 0x84, 0xdf, 0x45, 0x00, 0xe4,
1151 0x94, 0x88, 0x9d, 0x08, 0x89, 0xcf, 0xf2, 0xa4,
1152 0xc5, 0x47, 0x45, 0x85, 0x86, 0xa5, 0xcc, 0xa8,
1153 0xf2, 0x5d, 0x58, 0x07
1156 static void test_import_private(void)
1159 HCRYPTKEY hKeyExchangeKey, hSessionKey;
1161 static BYTE abSessionKey[148] = {
1162 0x01, 0x02, 0x00, 0x00, 0x01, 0x68, 0x00, 0x00,
1163 0x00, 0xa4, 0x00, 0x00, 0xb8, 0xa4, 0xdf, 0x5e,
1164 0x9e, 0xb1, 0xbf, 0x85, 0x3d, 0x24, 0x2d, 0x1e,
1165 0x69, 0xb7, 0x67, 0x13, 0x8e, 0x78, 0xf2, 0xdf,
1166 0xc6, 0x69, 0xce, 0x46, 0x7e, 0xf2, 0xf2, 0x33,
1167 0x20, 0x6f, 0xa1, 0xa5, 0x59, 0x83, 0x25, 0xcb,
1168 0x3a, 0xb1, 0x8a, 0x12, 0x63, 0x02, 0x3c, 0xfb,
1169 0x4a, 0xfa, 0xef, 0x8e, 0xf7, 0x29, 0x57, 0xb1,
1170 0x9e, 0xa7, 0xf3, 0x02, 0xfd, 0xca, 0xdf, 0x5a,
1171 0x1f, 0x71, 0xb6, 0x26, 0x09, 0x24, 0x39, 0xda,
1172 0xc0, 0xde, 0x2a, 0x0e, 0xcd, 0x1f, 0xe5, 0xb6,
1173 0x4f, 0x82, 0xa0, 0xa9, 0x90, 0xd3, 0xd9, 0x6a,
1174 0x43, 0x14, 0x2a, 0xf7, 0xac, 0xd5, 0xa0, 0x54,
1175 0x93, 0xc4, 0xb9, 0xe7, 0x24, 0x84, 0x4d, 0x69,
1176 0x5e, 0xcc, 0x2a, 0x32, 0xb5, 0xfb, 0xe4, 0xb4,
1177 0x08, 0xd5, 0x36, 0x58, 0x59, 0x40, 0xfb, 0x29,
1178 0x7f, 0xa7, 0x17, 0x25, 0xc4, 0x0d, 0x78, 0x37,
1179 0x04, 0x8c, 0x49, 0x92
1181 static BYTE abEncryptedMessage[12] = {
1182 0x40, 0x64, 0x28, 0xe8, 0x8a, 0xe7, 0xa4, 0xd4,
1183 0x1c, 0xfd, 0xde, 0x71
1186 dwLen = (DWORD)sizeof(abPlainPrivateKey);
1187 result = CryptImportKey(hProv, abPlainPrivateKey, dwLen, 0, 0, &hKeyExchangeKey);
1189 /* rsaenh compiled without OpenSSL */
1190 ok(GetLastError() == NTE_FAIL, "%08x\n", GetLastError());
1194 dwLen = (DWORD)sizeof(abSessionKey);
1195 result = CryptImportKey(hProv, abSessionKey, dwLen, hKeyExchangeKey, 0, &hSessionKey);
1196 ok(result, "%08x\n", GetLastError());
1197 if (!result) return;
1199 dwLen = (DWORD)sizeof(abEncryptedMessage);
1200 result = CryptDecrypt(hSessionKey, 0, TRUE, 0, abEncryptedMessage, &dwLen);
1201 ok(result && dwLen == 12 && !memcmp(abEncryptedMessage, "Wine rocks!",12),
1202 "%08x, len: %d\n", GetLastError(), dwLen);
1203 CryptDestroyKey(hSessionKey);
1205 if (!derive_key(CALG_RC4, &hSessionKey, 56)) return;
1207 dwLen = (DWORD)sizeof(abSessionKey);
1208 result = CryptExportKey(hSessionKey, hKeyExchangeKey, SIMPLEBLOB, 0, abSessionKey, &dwLen);
1209 ok(result, "%08x\n", GetLastError());
1210 CryptDestroyKey(hSessionKey);
1211 if (!result) return;
1213 dwLen = (DWORD)sizeof(abSessionKey);
1214 result = CryptImportKey(hProv, abSessionKey, dwLen, hKeyExchangeKey, 0, &hSessionKey);
1215 ok(result, "%08x\n", GetLastError());
1216 if (!result) return;
1218 CryptDestroyKey(hSessionKey);
1219 CryptDestroyKey(hKeyExchangeKey);
1222 static void test_verify_signature(void) {
1224 HCRYPTKEY hPubSignKey;
1225 BYTE abData[] = "Wine rocks!";
1227 BYTE abPubKey[148] = {
1228 0x06, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00,
1229 0x52, 0x53, 0x41, 0x31, 0x00, 0x04, 0x00, 0x00,
1230 0x01, 0x00, 0x01, 0x00, 0x71, 0x64, 0x9f, 0x19,
1231 0x89, 0x1c, 0x21, 0xcc, 0x36, 0xa3, 0xc9, 0x27,
1232 0x08, 0x8a, 0x09, 0xc6, 0xbe, 0xeb, 0xd3, 0xf8,
1233 0x19, 0xa9, 0x92, 0x57, 0xe4, 0xb9, 0x5d, 0xda,
1234 0x88, 0x93, 0xe4, 0x6b, 0x38, 0x77, 0x14, 0x8a,
1235 0x96, 0xc0, 0xb6, 0x4e, 0x42, 0xf5, 0x01, 0xdc,
1236 0xf0, 0xeb, 0x3c, 0xc7, 0x7b, 0xc4, 0xfd, 0x7c,
1237 0xde, 0x93, 0x34, 0x0a, 0x92, 0xe5, 0x97, 0x9c,
1238 0x3e, 0x65, 0xb8, 0x91, 0x2f, 0xe3, 0xf3, 0x89,
1239 0xcd, 0x6c, 0x26, 0xa4, 0x6c, 0xc7, 0x6d, 0x0b,
1240 0x2c, 0xa2, 0x0b, 0x29, 0xe2, 0xfc, 0x30, 0xfa,
1241 0x20, 0xdb, 0x4c, 0xb8, 0x91, 0xb8, 0x69, 0x63,
1242 0x96, 0x41, 0xc2, 0xb4, 0x60, 0xeb, 0xcd, 0xff,
1243 0x3a, 0x1f, 0x94, 0xb1, 0x23, 0xcf, 0x0f, 0x49,
1244 0xad, 0xd5, 0x33, 0x85, 0x71, 0xaf, 0x12, 0x87,
1245 0x84, 0xef, 0xa0, 0xea, 0xe1, 0xc1, 0xd4, 0xc7,
1246 0xe1, 0x21, 0x50, 0xac
1248 /* md2 with hash oid */
1249 BYTE abSignatureMD2[128] = {
1250 0x4a, 0x4e, 0xb7, 0x5e, 0x32, 0xda, 0xdb, 0x67,
1251 0x9f, 0x77, 0x84, 0x32, 0x00, 0xba, 0x5f, 0x6b,
1252 0x0d, 0xcf, 0xd9, 0x99, 0xbd, 0x96, 0x31, 0xda,
1253 0x23, 0x4c, 0xd9, 0x4a, 0x90, 0x84, 0x20, 0x59,
1254 0x51, 0xdc, 0xd4, 0x93, 0x3a, 0xae, 0x0a, 0x0a,
1255 0xa1, 0x76, 0xfa, 0xb5, 0x68, 0xee, 0xc7, 0x34,
1256 0x41, 0xd3, 0xe7, 0x5a, 0x0e, 0x22, 0x61, 0x40,
1257 0xea, 0x24, 0x56, 0xf1, 0x91, 0x5a, 0xf7, 0xa7,
1258 0x5b, 0xf4, 0x98, 0x6b, 0xc3, 0xef, 0xad, 0xc0,
1259 0x5e, 0x6b, 0x87, 0x76, 0xcb, 0x1f, 0x62, 0x06,
1260 0x7c, 0xf6, 0x48, 0x97, 0x81, 0x8d, 0xef, 0x51,
1261 0x51, 0xdc, 0x21, 0x91, 0x57, 0x1e, 0x79, 0x6f,
1262 0x49, 0xb5, 0xde, 0x31, 0x07, 0x45, 0x99, 0x46,
1263 0xc3, 0x4f, 0xca, 0x2d, 0x0e, 0x4c, 0x10, 0x25,
1264 0xcb, 0x1a, 0x98, 0x63, 0x41, 0x93, 0x47, 0xc0,
1265 0xb2, 0xbc, 0x10, 0x3c, 0xe7, 0xd4, 0x3c, 0x1e
1267 /* md2 without hash oid */
1268 BYTE abSignatureMD2NoOID[128] = {
1269 0x0c, 0x21, 0x3e, 0x60, 0xf9, 0xd0, 0x36, 0x2d,
1270 0xe1, 0x10, 0x45, 0x45, 0x85, 0x03, 0x29, 0x19,
1271 0xef, 0x19, 0xd9, 0xa6, 0x7e, 0x9c, 0x0d, 0xbd,
1272 0x03, 0x0e, 0xb9, 0x51, 0x9e, 0x74, 0x79, 0xc4,
1273 0xde, 0x25, 0xf2, 0x35, 0x74, 0x55, 0xbc, 0x65,
1274 0x7e, 0x33, 0x28, 0xa8, 0x1e, 0x72, 0xaa, 0x99,
1275 0xdd, 0xf5, 0x26, 0x20, 0x29, 0xf8, 0xa6, 0xdf,
1276 0x28, 0x4b, 0x1c, 0xdb, 0xa1, 0x41, 0x56, 0xbc,
1277 0xf9, 0x9c, 0x66, 0xc0, 0x37, 0x41, 0x55, 0xa0,
1278 0xe2, 0xec, 0xbf, 0x71, 0xf0, 0x5d, 0x25, 0x01,
1279 0x75, 0x91, 0xe2, 0x81, 0xb2, 0x9f, 0x57, 0xa7,
1280 0x5c, 0xd2, 0xfa, 0x66, 0xdb, 0x71, 0x2b, 0x1f,
1281 0xad, 0x30, 0xde, 0xea, 0x49, 0x73, 0x30, 0x6a,
1282 0x22, 0x54, 0x49, 0x4e, 0xae, 0xf6, 0x88, 0xc9,
1283 0xff, 0x71, 0xba, 0xbf, 0x27, 0xc5, 0xfa, 0x06,
1284 0xe2, 0x91, 0x71, 0x8a, 0x7e, 0x0c, 0xc2, 0x07
1286 /* md4 with hash oid */
1287 BYTE abSignatureMD4[128] = {
1288 0x1c, 0x78, 0xaa, 0xea, 0x74, 0xf4, 0x83, 0x51,
1289 0xae, 0x66, 0xe3, 0xa9, 0x1c, 0x03, 0x39, 0x1b,
1290 0xac, 0x7e, 0x4e, 0x85, 0x7e, 0x1c, 0x38, 0xd2,
1291 0x82, 0x43, 0xb3, 0x6f, 0x6f, 0x46, 0x45, 0x8e,
1292 0x17, 0x74, 0x58, 0x29, 0xca, 0xe1, 0x03, 0x13,
1293 0x45, 0x79, 0x34, 0xdf, 0x5c, 0xd6, 0xc3, 0xf9,
1294 0x7a, 0x1c, 0x9d, 0xff, 0x6f, 0x03, 0x7d, 0x0f,
1295 0x59, 0x1a, 0x2d, 0x0e, 0x94, 0xb4, 0x75, 0x96,
1296 0xd1, 0x48, 0x63, 0x6e, 0xb2, 0xc4, 0x5c, 0xd9,
1297 0xab, 0x49, 0xb4, 0x90, 0xd9, 0x57, 0x04, 0x6e,
1298 0x4c, 0xb6, 0xea, 0x00, 0x94, 0x4a, 0x34, 0xa0,
1299 0xd9, 0x63, 0xef, 0x2c, 0xde, 0x5b, 0xb9, 0xbe,
1300 0x35, 0xc8, 0xc1, 0x31, 0xb5, 0x31, 0x15, 0x18,
1301 0x90, 0x39, 0xf5, 0x2a, 0x34, 0x6d, 0xb4, 0xab,
1302 0x09, 0x34, 0x69, 0x54, 0x4d, 0x11, 0x2f, 0xf3,
1303 0xa2, 0x36, 0x0e, 0xa8, 0x45, 0xe7, 0x36, 0xac
1305 /* md4 without hash oid */
1306 BYTE abSignatureMD4NoOID[128] = {
1307 0xd3, 0x60, 0xb2, 0xb0, 0x22, 0x0a, 0x99, 0xda,
1308 0x04, 0x85, 0x64, 0xc6, 0xc6, 0xdb, 0x11, 0x24,
1309 0xe9, 0x68, 0x2d, 0xf7, 0x09, 0xef, 0xb6, 0xa0,
1310 0xa2, 0xfe, 0x45, 0xee, 0x85, 0x49, 0xcd, 0x36,
1311 0xf7, 0xc7, 0x9d, 0x2b, 0x4c, 0x68, 0xda, 0x85,
1312 0x8c, 0x50, 0xcc, 0x4f, 0x4b, 0xe1, 0x82, 0xc3,
1313 0xbe, 0xa3, 0xf1, 0x78, 0x6b, 0x60, 0x42, 0x3f,
1314 0x67, 0x22, 0x14, 0xe4, 0xe1, 0xa4, 0x6e, 0xa9,
1315 0x4e, 0xf1, 0xd4, 0xb0, 0xce, 0x82, 0xac, 0x06,
1316 0xba, 0x2c, 0xbc, 0xf7, 0xcb, 0xf6, 0x0c, 0x3f,
1317 0xf6, 0x79, 0xfe, 0xb3, 0xd8, 0x5a, 0xbc, 0xdb,
1318 0x05, 0x41, 0xa4, 0x07, 0x57, 0x9e, 0xa2, 0x96,
1319 0xfc, 0x60, 0x4b, 0xf7, 0x6f, 0x86, 0x26, 0x1f,
1320 0xc2, 0x2c, 0x67, 0x08, 0xcd, 0x7f, 0x91, 0xe9,
1321 0x16, 0xb5, 0x0e, 0xd9, 0xc4, 0xc4, 0x97, 0xeb,
1322 0x91, 0x3f, 0x20, 0x6c, 0xf0, 0x68, 0x86, 0x7f
1324 /* md5 with hash oid */
1325 BYTE abSignatureMD5[128] = {
1326 0x4f, 0xe0, 0x8c, 0x9b, 0x43, 0xdd, 0x02, 0xe5,
1327 0xf4, 0xa1, 0xdd, 0x88, 0x4c, 0x9c, 0x40, 0x0f,
1328 0x6c, 0x43, 0x86, 0x64, 0x00, 0xe6, 0xac, 0xf7,
1329 0xd0, 0x92, 0xaa, 0xc4, 0x62, 0x9a, 0x48, 0x98,
1330 0x1a, 0x56, 0x6d, 0x75, 0xec, 0x04, 0x89, 0xec,
1331 0x69, 0x93, 0xd6, 0x61, 0x37, 0xb2, 0x36, 0xb5,
1332 0xb2, 0xba, 0xf2, 0xf5, 0x21, 0x0c, 0xf1, 0x04,
1333 0xc8, 0x2d, 0xf5, 0xa0, 0x8d, 0x6d, 0x10, 0x0b,
1334 0x68, 0x63, 0xf2, 0x08, 0x68, 0xdc, 0xbd, 0x95,
1335 0x25, 0x7d, 0xee, 0x63, 0x5c, 0x3b, 0x98, 0x4c,
1336 0xea, 0x41, 0xdc, 0x6a, 0x8b, 0x6c, 0xbb, 0x29,
1337 0x2b, 0x1c, 0x5c, 0x8b, 0x7d, 0x94, 0x24, 0xa9,
1338 0x7a, 0x62, 0x94, 0xf3, 0x3a, 0x6a, 0xb2, 0x4c,
1339 0x33, 0x59, 0x00, 0xcd, 0x7d, 0x37, 0x79, 0x90,
1340 0x31, 0xd1, 0xd9, 0x84, 0x12, 0xe5, 0x08, 0x5e,
1341 0xb3, 0x60, 0x61, 0x27, 0x78, 0x37, 0x63, 0x01
1343 /* md5 without hash oid */
1344 BYTE abSignatureMD5NoOID[128] = {
1345 0xc6, 0xad, 0x5c, 0x2b, 0x9b, 0xe0, 0x99, 0x2f,
1346 0x5e, 0x55, 0x04, 0x32, 0x65, 0xe0, 0xb5, 0x75,
1347 0x01, 0x9a, 0x11, 0x4d, 0x0e, 0x9a, 0xe1, 0x9f,
1348 0xc7, 0xbf, 0x77, 0x6d, 0xa9, 0xfd, 0xcc, 0x9d,
1349 0x8b, 0xd1, 0x31, 0xed, 0x5a, 0xd2, 0xe5, 0x5f,
1350 0x42, 0x3b, 0xb5, 0x3c, 0x32, 0x30, 0x88, 0x49,
1351 0xcb, 0x67, 0xb8, 0x2e, 0xc9, 0xf5, 0x2b, 0xc8,
1352 0x35, 0x71, 0xb5, 0x1b, 0x32, 0x3f, 0x44, 0x4c,
1353 0x66, 0x93, 0xcb, 0xe8, 0x48, 0x7c, 0x14, 0x23,
1354 0xfb, 0x12, 0xa5, 0xb7, 0x86, 0x94, 0x6b, 0x19,
1355 0x17, 0x20, 0xc6, 0xb8, 0x09, 0xe8, 0xbb, 0xdb,
1356 0x00, 0x2b, 0x96, 0x4a, 0x93, 0x00, 0x26, 0xd3,
1357 0x07, 0xa0, 0x06, 0xce, 0x5a, 0x13, 0x69, 0x6b,
1358 0x62, 0x5a, 0x56, 0x61, 0x6a, 0xd8, 0x11, 0x3b,
1359 0xd5, 0x67, 0xc7, 0x4d, 0xf6, 0x66, 0x63, 0xc5,
1360 0xe3, 0x8f, 0x7c, 0x7c, 0xb1, 0x3e, 0x55, 0x43
1362 /* sha with hash oid */
1363 BYTE abSignatureSHA[128] = {
1364 0x5a, 0x4c, 0x66, 0xc9, 0x30, 0x67, 0xcb, 0x91,
1365 0x3c, 0x4d, 0xd5, 0x8d, 0xea, 0x4e, 0x85, 0xcd,
1366 0xd9, 0x68, 0x3a, 0xf3, 0x24, 0x3c, 0x99, 0x24,
1367 0x25, 0x32, 0x93, 0x3d, 0xd6, 0x2f, 0x86, 0x94,
1368 0x23, 0x09, 0xee, 0x02, 0xd4, 0x15, 0xdc, 0x5f,
1369 0x0e, 0x44, 0x45, 0x13, 0x5f, 0x18, 0x5d, 0x1a,
1370 0xd7, 0x0b, 0xd1, 0x23, 0xd6, 0x35, 0x98, 0x52,
1371 0x57, 0x45, 0x74, 0x92, 0xe3, 0x50, 0xb4, 0x20,
1372 0x28, 0x2a, 0x11, 0xbf, 0x49, 0xb4, 0x2c, 0xc5,
1373 0xd4, 0x1a, 0x27, 0x4e, 0xdf, 0xa0, 0xb5, 0x7a,
1374 0xc8, 0x14, 0xdd, 0x9b, 0xb6, 0xca, 0xd6, 0xff,
1375 0xb2, 0x6b, 0xd8, 0x98, 0x67, 0x80, 0xab, 0x53,
1376 0x52, 0xbb, 0xe1, 0x2a, 0xce, 0x79, 0x2f, 0x00,
1377 0x53, 0x26, 0xd8, 0xa7, 0x43, 0xca, 0x72, 0x0e,
1378 0x68, 0x97, 0x37, 0x71, 0x87, 0xc2, 0x6a, 0x98,
1379 0xbb, 0x6c, 0xa0, 0x01, 0xff, 0x04, 0x9d, 0xa6
1381 /* sha without hash oid */
1382 BYTE abSignatureSHANoOID[128] = {
1383 0x86, 0xa6, 0x2b, 0x9a, 0x04, 0xda, 0x47, 0xc6,
1384 0x4f, 0x97, 0x8a, 0x8a, 0xf4, 0xfa, 0x63, 0x1a,
1385 0x32, 0x89, 0x56, 0x41, 0x37, 0x91, 0x15, 0x2f,
1386 0x2d, 0x1c, 0x8f, 0xdc, 0x88, 0x40, 0xbb, 0x37,
1387 0x3e, 0x06, 0x33, 0x1b, 0xde, 0xda, 0x7c, 0x65,
1388 0x91, 0x35, 0xca, 0x45, 0x17, 0x0e, 0x24, 0xbe,
1389 0x9e, 0xf6, 0x4e, 0x8a, 0xa4, 0x3e, 0xca, 0xe6,
1390 0x11, 0x36, 0xb8, 0x3a, 0xf0, 0xde, 0x71, 0xfe,
1391 0xdd, 0xb3, 0xcb, 0x6c, 0x39, 0xe0, 0x5f, 0x0c,
1392 0x9e, 0xa8, 0x40, 0x26, 0x9c, 0x81, 0xe9, 0xc4,
1393 0x15, 0x90, 0xbf, 0x4f, 0xd2, 0xc1, 0xa1, 0x80,
1394 0x52, 0xfd, 0xf6, 0x3d, 0x99, 0x1b, 0x9c, 0x8a,
1395 0x27, 0x1b, 0x0c, 0x9a, 0xf3, 0xf9, 0xa2, 0x00,
1396 0x3e, 0x5b, 0xdf, 0xc2, 0xb4, 0x71, 0xa5, 0xbd,
1397 0xf8, 0xae, 0x63, 0xbb, 0x4a, 0xc9, 0xdd, 0x67,
1398 0xc1, 0x3e, 0x93, 0xee, 0xf1, 0x1f, 0x24, 0x5b
1401 result = CryptImportKey(hProv, abPubKey, 148, 0, 0, &hPubSignKey);
1402 ok(result, "%08x\n", GetLastError());
1403 if (!result) return;
1405 result = CryptCreateHash(hProv, CALG_MD2, 0, 0, &hHash);
1406 ok(result, "%08x\n", GetLastError());
1407 if (!result) return;
1409 result = CryptHashData(hHash, abData, (DWORD)sizeof(abData), 0);
1410 ok(result, "%08x\n", GetLastError());
1411 if (!result) return;
1413 /*check that a NULL pointer signature is correctly handled*/
1414 result = CryptVerifySignature(hHash, NULL, 128, hPubSignKey, NULL, 0);
1415 ok(!result && ERROR_INVALID_PARAMETER == GetLastError(),
1416 "Expected ERROR_INVALID_PARAMETER error, got %08x\n", GetLastError());
1419 /* check that we get a bad signature error when the signature is too short*/
1420 result = CryptVerifySignature(hHash, abSignatureMD2, 64, hPubSignKey, NULL, 0);
1421 ok(!result && NTE_BAD_SIGNATURE == GetLastError(),
1422 "Expected NTE_BAD_SIGNATURE error, got %08x\n", GetLastError());
1425 result = CryptVerifySignature(hHash, abSignatureMD2, 128, hPubSignKey, NULL, 0);
1426 ok(result, "%08x\n", GetLastError());
1427 if (!result) return;
1429 result = CryptVerifySignature(hHash, abSignatureMD2NoOID, 128, hPubSignKey, NULL, CRYPT_NOHASHOID);
1430 ok(result, "%08x\n", GetLastError());
1431 if (!result) return;
1433 /* Next test fails on WinXP SP2. It seems that CPVerifySignature doesn't care about
1434 * the OID at all. */
1435 /*result = CryptVerifySignature(hHash, abSignatureMD2NoOID, 128, hPubSignKey, NULL, 0);
1436 ok(!result && GetLastError()==NTE_BAD_SIGNATURE, "%08lx\n", GetLastError());
1437 if (result) return;*/
1439 CryptDestroyHash(hHash);
1441 result = CryptCreateHash(hProv, CALG_MD4, 0, 0, &hHash);
1442 ok(result, "%08x\n", GetLastError());
1443 if (!result) return;
1445 result = CryptHashData(hHash, abData, (DWORD)sizeof(abData), 0);
1446 ok(result, "%08x\n", GetLastError());
1447 if (!result) return;
1449 result = CryptVerifySignature(hHash, abSignatureMD4, 128, hPubSignKey, NULL, 0);
1450 ok(result, "%08x\n", GetLastError());
1451 if (!result) return;
1453 result = CryptVerifySignature(hHash, abSignatureMD4NoOID, 128, hPubSignKey, NULL, CRYPT_NOHASHOID);
1454 ok(result, "%08x\n", GetLastError());
1455 if (!result) return;
1457 CryptDestroyHash(hHash);
1459 result = CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
1460 ok(result, "%08x\n", GetLastError());
1461 if (!result) return;
1463 result = CryptHashData(hHash, abData, (DWORD)sizeof(abData), 0);
1464 ok(result, "%08x\n", GetLastError());
1465 if (!result) return;
1467 result = CryptVerifySignature(hHash, abSignatureMD5, 128, hPubSignKey, NULL, 0);
1468 ok(result, "%08x\n", GetLastError());
1469 if (!result) return;
1471 result = CryptVerifySignature(hHash, abSignatureMD5NoOID, 128, hPubSignKey, NULL, CRYPT_NOHASHOID);
1472 ok(result, "%08x\n", GetLastError());
1473 if (!result) return;
1475 CryptDestroyHash(hHash);
1477 result = CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash);
1478 ok(result, "%08x\n", GetLastError());
1479 if (!result) return;
1481 result = CryptHashData(hHash, abData, (DWORD)sizeof(abData), 0);
1482 ok(result, "%08x\n", GetLastError());
1483 if (!result) return;
1485 result = CryptVerifySignature(hHash, abSignatureSHA, 128, hPubSignKey, NULL, 0);
1486 ok(result, "%08x\n", GetLastError());
1487 if (!result) return;
1489 result = CryptVerifySignature(hHash, abSignatureSHANoOID, 128, hPubSignKey, NULL, CRYPT_NOHASHOID);
1490 ok(result, "%08x\n", GetLastError());
1491 if (!result) return;
1493 CryptDestroyHash(hHash);
1494 CryptDestroyKey(hPubSignKey);
1497 static void test_rsa_encrypt(void)
1500 BYTE abData[2048] = "Wine rocks!";
1504 /* It is allowed to use the key exchange key for encryption/decryption */
1505 result = CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hRSAKey);
1506 ok (result, "%08x\n", GetLastError());
1507 if (!result) return;
1510 result = CryptEncrypt(hRSAKey, 0, TRUE, 0, NULL, &dwLen, (DWORD)sizeof(abData));
1511 ok(result, "CryptEncrypt failed: %08x\n", GetLastError());
1512 ok(dwLen == 128, "Unexpected length %d\n", dwLen);
1514 result = CryptEncrypt(hRSAKey, 0, TRUE, 0, abData, &dwLen, (DWORD)sizeof(abData));
1515 ok (result, "%08x\n", GetLastError());
1516 if (!result) return;
1518 result = CryptDecrypt(hRSAKey, 0, TRUE, 0, abData, &dwLen);
1519 ok (result && dwLen == 12 && !memcmp(abData, "Wine rocks!", 12), "%08x\n", GetLastError());
1521 CryptDestroyKey(hRSAKey);
1523 /* It is not allowed to use the signature key for encryption/decryption */
1524 result = CryptGetUserKey(hProv, AT_SIGNATURE, &hRSAKey);
1525 ok (result, "%08x\n", GetLastError());
1526 if (!result) return;
1529 result = CryptEncrypt(hRSAKey, 0, TRUE, 0, abData, &dwLen, (DWORD)sizeof(abData));
1530 ok (!result && GetLastError() == NTE_BAD_KEY, "%08x\n", GetLastError());
1532 CryptDestroyKey(hRSAKey);
1535 static void test_import_export(void)
1537 DWORD dwLen, dwDataLen;
1538 HCRYPTKEY hPublicKey;
1541 BYTE emptyKey[2048];
1542 static BYTE abPlainPublicKey[84] = {
1543 0x06, 0x02, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00,
1544 0x52, 0x53, 0x41, 0x31, 0x00, 0x02, 0x00, 0x00,
1545 0x01, 0x00, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11,
1546 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1547 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1548 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1549 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1550 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1551 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1552 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1553 0x11, 0x11, 0x11, 0x11
1557 result = CryptImportKey(hProv, abPlainPublicKey, dwLen, 0, 0, &hPublicKey);
1558 ok(result, "failed to import the public key\n");
1560 dwDataLen=sizeof(algID);
1561 result = CryptGetKeyParam(hPublicKey, KP_ALGID, (LPBYTE)&algID, &dwDataLen, 0);
1562 ok(result, "failed to get the KP_ALGID from the imported public key\n");
1563 ok(algID == CALG_RSA_KEYX, "Expected CALG_RSA_KEYX, got %x\n", algID);
1565 result = CryptExportKey(hPublicKey, 0, PUBLICKEYBLOB, 0, emptyKey, &dwLen);
1566 ok(result, "failed to export the fresh imported public key\n");
1567 ok(dwLen == 84, "Expected exported key to be 84 bytes long but got %d bytes.\n",dwLen);
1568 ok(!memcmp(emptyKey, abPlainPublicKey, dwLen), "exported key is different from the imported key\n");
1570 CryptDestroyKey(hPublicKey);
1573 static void test_schannel_provider(void)
1576 HCRYPTKEY hRSAKey, hMasterSecret, hServerWriteKey, hServerWriteMACKey;
1577 HCRYPTHASH hMasterHash, hTLS1PRF, hHMAC;
1580 SCHANNEL_ALG saSChannelAlg;
1581 CRYPT_DATA_BLOB data_blob;
1582 HMAC_INFO hmacInfo = { CALG_MD5, NULL, 0, NULL, 0 };
1583 BYTE abTLS1Master[140] = {
1584 0x01, 0x02, 0x00, 0x00, 0x06, 0x4c, 0x00, 0x00,
1585 0x00, 0xa4, 0x00, 0x00, 0x5b, 0x13, 0xc7, 0x68,
1586 0xd8, 0x55, 0x23, 0x5d, 0xbc, 0xa6, 0x9d, 0x97,
1587 0x0e, 0xcd, 0x6b, 0xcf, 0xc0, 0xdc, 0xc5, 0x53,
1588 0x28, 0xa0, 0xca, 0xc1, 0x63, 0x4e, 0x3a, 0x24,
1589 0x22, 0xe5, 0x4d, 0x15, 0xbb, 0xa5, 0x06, 0xc3,
1590 0x98, 0x25, 0xdc, 0x35, 0xd3, 0xdb, 0xab, 0xb8,
1591 0x44, 0x1b, 0xfe, 0x63, 0x88, 0x7c, 0x2e, 0x6d,
1592 0x34, 0xd9, 0x0f, 0x7e, 0x2f, 0xc2, 0xb2, 0x6e,
1593 0x56, 0xfa, 0xab, 0xb2, 0x88, 0xf6, 0x15, 0x6e,
1594 0xa8, 0xcd, 0x70, 0x16, 0x94, 0x61, 0x07, 0x40,
1595 0x9e, 0x25, 0x22, 0xf8, 0x64, 0x9f, 0xcc, 0x0b,
1596 0xf1, 0x92, 0x4d, 0xfe, 0xc3, 0x5d, 0x52, 0xdb,
1597 0x0f, 0xff, 0x12, 0x0f, 0x49, 0x43, 0x7d, 0xc6,
1598 0x52, 0x61, 0xb0, 0x06, 0xc8, 0x1b, 0x90, 0xac,
1599 0x09, 0x7e, 0x4b, 0x95, 0x69, 0x3b, 0x0d, 0x41,
1600 0x1b, 0x4c, 0x65, 0x75, 0x4d, 0x85, 0x16, 0xc4,
1601 0xd3, 0x1e, 0x82, 0xb3
1603 BYTE abServerSecret[33] = "Super Secret Server Secret 12345";
1604 BYTE abClientSecret[33] = "Super Secret Client Secret 12345";
1605 BYTE abHashedHandshakes[37] = "123456789012345678901234567890123456";
1606 BYTE abClientFinished[16] = "client finished";
1607 BYTE abData[16] = "Wine rocks!";
1609 static const BYTE abEncryptedData[16] = {
1610 0x13, 0xd2, 0xdd, 0xeb, 0x6c, 0x3f, 0xbe, 0xb2,
1611 0x04, 0x86, 0xb5, 0xe5, 0x08, 0xe5, 0xf3, 0x0d
1613 static const BYTE abPRF[16] = {
1614 0xa8, 0xb2, 0xa6, 0xef, 0x83, 0x4e, 0x74, 0xb1,
1615 0xf3, 0xb1, 0x51, 0x5a, 0x1a, 0x2b, 0x11, 0x31
1617 static const BYTE abMD5[16] = {
1618 0xe1, 0x65, 0x3f, 0xdb, 0xbb, 0x3d, 0x99, 0x3c,
1619 0x3d, 0xca, 0x6a, 0x6f, 0xfa, 0x15, 0x4e, 0xaa
1622 result = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_SCHANNEL, CRYPT_VERIFYCONTEXT|CRYPT_NEWKEYSET);
1623 ok (result, "%08x\n", GetLastError());
1625 CryptReleaseContext(hProv, 0);
1627 result = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_SCHANNEL, CRYPT_VERIFYCONTEXT);
1628 ok (result, "%08x\n", GetLastError());
1629 if (!result) return;
1631 /* To get deterministic results, we import the TLS1 master secret (which
1632 * is typically generated from a random generator). Therefore, we need
1634 dwLen = (DWORD)sizeof(abPlainPrivateKey);
1635 result = CryptImportKey(hProv, abPlainPrivateKey, dwLen, 0, 0, &hRSAKey);
1636 ok (result, "%08x\n", GetLastError());
1637 if (!result) return;
1639 dwLen = (DWORD)sizeof(abTLS1Master);
1640 result = CryptImportKey(hProv, abTLS1Master, dwLen, hRSAKey, 0, &hMasterSecret);
1641 ok (result, "%08x\n", GetLastError());
1642 if (!result) return;
1644 /* Setting the TLS1 client and server random parameters, as well as the
1645 * MAC and encryption algorithm parameters. */
1646 data_blob.cbData = 33;
1647 data_blob.pbData = abClientSecret;
1648 result = CryptSetKeyParam(hMasterSecret, KP_CLIENT_RANDOM, (BYTE*)&data_blob, 0);
1649 ok (result, "%08x\n", GetLastError());
1650 if (!result) return;
1652 data_blob.cbData = 33;
1653 data_blob.pbData = abServerSecret;
1654 result = CryptSetKeyParam(hMasterSecret, KP_SERVER_RANDOM, (BYTE*)&data_blob, 0);
1655 ok (result, "%08x\n", GetLastError());
1656 if (!result) return;
1658 saSChannelAlg.dwUse = SCHANNEL_ENC_KEY;
1659 saSChannelAlg.Algid = CALG_DES;
1660 saSChannelAlg.cBits = 64;
1661 saSChannelAlg.dwFlags = 0;
1662 saSChannelAlg.dwReserved = 0;
1663 result = CryptSetKeyParam(hMasterSecret, KP_SCHANNEL_ALG, (PBYTE)&saSChannelAlg, 0);
1664 ok (result, "%08x\n", GetLastError());
1665 if (!result) return;
1667 saSChannelAlg.dwUse = SCHANNEL_MAC_KEY;
1668 saSChannelAlg.Algid = CALG_MD5;
1669 saSChannelAlg.cBits = 128;
1670 saSChannelAlg.dwFlags = 0;
1671 saSChannelAlg.dwReserved = 0;
1672 result = CryptSetKeyParam(hMasterSecret, KP_SCHANNEL_ALG, (PBYTE)&saSChannelAlg, 0);
1673 ok (result, "%08x\n", GetLastError());
1674 if (!result) return;
1676 /* Deriving a hash from the master secret. This is due to the CryptoAPI architecture.
1677 * (Keys can only be derived from hashes, not from other keys.) */
1678 result = CryptCreateHash(hProv, CALG_SCHANNEL_MASTER_HASH, hMasterSecret, 0, &hMasterHash);
1679 ok (result, "%08x\n", GetLastError());
1680 if (!result) return;
1682 /* Deriving the server write encryption key from the master hash */
1683 result = CryptDeriveKey(hProv, CALG_SCHANNEL_ENC_KEY, hMasterHash, CRYPT_SERVER, &hServerWriteKey);
1684 ok (result, "%08x\n", GetLastError());
1685 if (!result) return;
1687 /* Encrypting some data with the server write encryption key and checking the result. */
1689 result = CryptEncrypt(hServerWriteKey, 0, TRUE, 0, abData, &dwLen, 16);
1690 ok (result && (dwLen == 16) && !memcmp(abData, abEncryptedData, 16), "%08x\n", GetLastError());
1692 /* Second test case: Test the TLS1 pseudo random number function. */
1693 result = CryptCreateHash(hProv, CALG_TLS1PRF, hMasterSecret, 0, &hTLS1PRF);
1694 ok (result, "%08x\n", GetLastError());
1695 if (!result) return;
1697 /* Set the label and seed parameters for the random number function */
1698 data_blob.cbData = 36;
1699 data_blob.pbData = abHashedHandshakes;
1700 result = CryptSetHashParam(hTLS1PRF, HP_TLS1PRF_SEED, (BYTE*)&data_blob, 0);
1701 ok (result, "%08x\n", GetLastError());
1702 if (!result) return;
1704 data_blob.cbData = 15;
1705 data_blob.pbData = abClientFinished;
1706 result = CryptSetHashParam(hTLS1PRF, HP_TLS1PRF_LABEL, (BYTE*)&data_blob, 0);
1707 ok (result, "%08x\n", GetLastError());
1708 if (!result) return;
1710 /* Generate some pseudo random bytes and check if they are correct. */
1711 dwLen = (DWORD)sizeof(abData);
1712 result = CryptGetHashParam(hTLS1PRF, HP_HASHVAL, abData, &dwLen, 0);
1713 ok (result && (dwLen==(DWORD)sizeof(abData)) && !memcmp(abData, abPRF, sizeof(abData)),
1714 "%08x\n", GetLastError());
1716 /* Third test case. Derive the server write mac key. Derive an HMAC object from this one.
1717 * Hash some data with the HMAC. Compare results. */
1718 result = CryptDeriveKey(hProv, CALG_SCHANNEL_MAC_KEY, hMasterHash, CRYPT_SERVER, &hServerWriteMACKey);
1719 ok (result, "%08x\n", GetLastError());
1720 if (!result) return;
1722 result = CryptCreateHash(hProv, CALG_HMAC, hServerWriteMACKey, 0, &hHMAC);
1723 ok (result, "%08x\n", GetLastError());
1724 if (!result) return;
1726 result = CryptSetHashParam(hHMAC, HP_HMAC_INFO, (PBYTE)&hmacInfo, 0);
1727 ok (result, "%08x\n", GetLastError());
1728 if (!result) return;
1730 result = CryptHashData(hHMAC, abData, (DWORD)sizeof(abData), 0);
1731 ok (result, "%08x\n", GetLastError());
1732 if (!result) return;
1734 dwLen = (DWORD)sizeof(abMD5Hash);
1735 result = CryptGetHashParam(hHMAC, HP_HASHVAL, abMD5Hash, &dwLen, 0);
1736 ok (result && (dwLen == 16) && !memcmp(abMD5Hash, abMD5, 16), "%08x\n", GetLastError());
1738 CryptDestroyHash(hHMAC);
1739 CryptDestroyHash(hTLS1PRF);
1740 CryptDestroyHash(hMasterHash);
1741 CryptDestroyKey(hServerWriteMACKey);
1742 CryptDestroyKey(hServerWriteKey);
1743 CryptDestroyKey(hRSAKey);
1744 CryptDestroyKey(hMasterSecret);
1745 CryptReleaseContext(hProv, 0);
1746 CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_SCHANNEL, CRYPT_DELETEKEYSET);
1749 static void test_enum_container(void)
1751 BYTE abContainerName[MAX_PATH + 2]; /* Larger than maximum name len */
1753 BOOL result, fFound = FALSE;
1755 /* If PP_ENUMCONTAINERS is queried with CRYPT_FIRST and abData == NULL, it returns
1756 * the maximum legal length of container names (which is MAX_PATH + 1 == 261) */
1757 result = CryptGetProvParam(hProv, PP_ENUMCONTAINERS, NULL, &dwBufferLen, CRYPT_FIRST);
1758 ok (result && dwBufferLen == MAX_PATH + 1, "%08x\n", GetLastError());
1760 /* If the result fits into abContainerName dwBufferLen is left untouched */
1761 dwBufferLen = (DWORD)sizeof(abContainerName);
1762 result = CryptGetProvParam(hProv, PP_ENUMCONTAINERS, abContainerName, &dwBufferLen, CRYPT_FIRST);
1763 ok (result && dwBufferLen == (DWORD)sizeof(abContainerName), "%08x\n", GetLastError());
1765 /* We only check, if the currently open 'winetest' container is among the enumerated. */
1767 if (!strcmp((const char*)abContainerName, "winetest")) fFound = TRUE;
1768 dwBufferLen = (DWORD)sizeof(abContainerName);
1769 } while (CryptGetProvParam(hProv, PP_ENUMCONTAINERS, abContainerName, &dwBufferLen, 0));
1771 ok (fFound && GetLastError() == ERROR_NO_MORE_ITEMS, "%d, %08x\n", fFound, GetLastError());
1774 static BYTE signBlob[] = {
1775 0x07,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x52,0x53,0x41,0x32,0x00,0x02,0x00,0x00,
1776 0x01,0x00,0x01,0x00,0xf1,0x82,0x9e,0x84,0xb5,0x79,0x9a,0xbe,0x4d,0x06,0x20,0x21,
1777 0xb1,0x89,0x0c,0xca,0xb0,0x35,0x72,0x18,0xc6,0x92,0xa8,0xe2,0xb1,0xe1,0xf6,0x56,
1778 0x53,0x99,0x47,0x10,0x6e,0x1c,0x81,0xaf,0xb8,0xf9,0x5f,0xfe,0x76,0x7f,0x2c,0x93,
1779 0xec,0x54,0x7e,0x5e,0xc2,0x25,0x3c,0x50,0x56,0x10,0x20,0x72,0x4a,0x93,0x03,0x12,
1780 0x29,0x98,0xcc,0xc9,0x47,0xbf,0xbf,0x93,0xcc,0xb0,0xe5,0x53,0x14,0xc8,0x7e,0x1f,
1781 0xa4,0x03,0x2d,0x8e,0x84,0x7a,0xd2,0xeb,0xf7,0x92,0x5e,0xa2,0xc7,0x6b,0x35,0x7d,
1782 0xcb,0x60,0xae,0xfb,0x07,0x78,0x11,0x73,0xb5,0x79,0xe5,0x7e,0x96,0xe3,0x50,0x95,
1783 0x80,0x0e,0x1c,0xf6,0x56,0xc6,0xe9,0x0a,0xaf,0x03,0xc6,0xdc,0x9a,0x81,0xcf,0x7a,
1784 0x63,0x16,0x43,0xcd,0xab,0x74,0xa1,0x7d,0xe7,0xe0,0x75,0x6d,0xbd,0x19,0xae,0x0b,
1785 0xa3,0x7f,0x6a,0x7b,0x05,0x4e,0xbc,0xec,0x18,0xfc,0x19,0xc2,0x00,0xf0,0x6a,0x2e,
1786 0xc4,0x31,0x73,0xba,0x07,0xcc,0x9d,0x57,0xeb,0xc7,0x7c,0x00,0x7d,0x5d,0x11,0x16,
1787 0x42,0x4b,0xe5,0x3a,0xf5,0xc7,0xf8,0xee,0xc3,0x2c,0x0d,0x86,0x03,0xe2,0xaf,0xb2,
1788 0xd2,0x91,0xdb,0x71,0xcd,0xdf,0x81,0x5f,0x06,0xfc,0x48,0x0d,0xb6,0x88,0x9f,0xc1,
1789 0x5e,0x24,0xa2,0x05,0x4f,0x30,0x2e,0x8f,0x8b,0x0d,0x76,0xa1,0x84,0xda,0x7b,0x44,
1790 0x70,0x85,0xf1,0x50,0xb1,0x21,0x3d,0xe2,0x57,0x3d,0xd0,0x01,0x93,0x49,0x8e,0xc5,
1791 0x0b,0x8b,0x0d,0x7b,0x08,0xe9,0x14,0xec,0x20,0x0d,0xea,0x02,0x00,0x63,0xe8,0x0a,
1792 0x52,0xe8,0xfb,0x21,0xbd,0x37,0xde,0x4c,0x4d,0xc2,0xf6,0xb9,0x0d,0x2a,0xc3,0xe2,
1793 0xc9,0xdf,0x48,0x3e,0x55,0x3d,0xe3,0xc0,0x22,0x37,0xf9,0x52,0xc0,0xd7,0x61,0x22,
1794 0xb6,0x85,0x86,0x07 };
1796 static void test_null_provider(void)
1801 DWORD keySpec, dataLen,dwParam;
1802 char szName[MAX_PATH];
1804 result = CryptAcquireContext(NULL, szContainer, NULL, 0, 0);
1805 ok(!result && GetLastError() == NTE_BAD_PROV_TYPE,
1806 "Expected NTE_BAD_PROV_TYPE, got %08x\n", GetLastError());
1807 result = CryptAcquireContext(NULL, szContainer, NULL, PROV_RSA_FULL, 0);
1808 ok(!result && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == NTE_BAD_KEYSET),
1809 "Expected ERROR_INVALID_PARAMETER or NTE_BAD_KEYSET, got %08x\n", GetLastError());
1810 result = CryptAcquireContext(NULL, szContainer, NULL, PROV_RSA_FULL,
1811 CRYPT_DELETEKEYSET);
1812 ok(!result && ( GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == NTE_BAD_KEYSET),
1813 "Expected ERROR_INVALID_PARAMETER or NTE_BAD_KEYSET, got %08x\n", GetLastError());
1814 result = CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
1815 CRYPT_DELETEKEYSET);
1816 ok(!result && GetLastError() == NTE_BAD_KEYSET,
1817 "Expected NTE_BAD_KEYSET, got %08x\n", GetLastError());
1818 result = CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL, 0);
1819 ok(!result && GetLastError() == NTE_BAD_KEYSET,
1820 "Expected NTE_BAD_KEYSET, got %08x\n", GetLastError());
1822 /* Delete the default container. */
1823 CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
1824 /* Once you've deleted the default container you can't open it as if it
1827 result = CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, 0);
1828 ok(!result && GetLastError() == NTE_BAD_KEYSET,
1829 "Expected NTE_BAD_KEYSET, got %08x\n", GetLastError());
1830 /* But you can always open the default container for CRYPT_VERIFYCONTEXT. */
1831 result = CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL,
1832 CRYPT_VERIFYCONTEXT);
1833 ok(result, "CryptAcquireContext failed: %08x\n", GetLastError());
1834 if (!result) return;
1835 dataLen = sizeof(keySpec);
1836 result = CryptGetProvParam(prov, PP_KEYSPEC, (LPBYTE)&keySpec, &dataLen, 0);
1838 ok(keySpec == (AT_KEYEXCHANGE | AT_SIGNATURE),
1839 "Expected AT_KEYEXCHANGE | AT_SIGNATURE, got %08x\n", keySpec);
1840 /* Even though PP_KEYSPEC says both AT_KEYEXCHANGE and AT_SIGNATURE are
1841 * supported, you can't get the keys from this container.
1843 result = CryptGetUserKey(prov, AT_KEYEXCHANGE, &key);
1844 ok(!result && GetLastError() == NTE_NO_KEY,
1845 "Expected NTE_NO_KEY, got %08x\n", GetLastError());
1846 result = CryptGetUserKey(prov, AT_SIGNATURE, &key);
1847 ok(!result && GetLastError() == NTE_NO_KEY,
1848 "Expected NTE_NO_KEY, got %08x\n", GetLastError());
1849 result = CryptReleaseContext(prov, 0);
1850 ok(result, "CryptReleaseContext failed: %08x\n", GetLastError());
1851 /* You can create a new default container. */
1852 result = CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL,
1854 ok(result, "CryptAcquireContext failed: %08x\n", GetLastError());
1855 /* But you still can't get the keys (until one's been generated.) */
1856 result = CryptGetUserKey(prov, AT_KEYEXCHANGE, &key);
1857 ok(!result && GetLastError() == NTE_NO_KEY,
1858 "Expected NTE_NO_KEY, got %08x\n", GetLastError());
1859 result = CryptGetUserKey(prov, AT_SIGNATURE, &key);
1860 ok(!result && GetLastError() == NTE_NO_KEY,
1861 "Expected NTE_NO_KEY, got %08x\n", GetLastError());
1862 CryptReleaseContext(prov, 0);
1863 CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
1865 CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
1866 CRYPT_DELETEKEYSET);
1867 result = CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL, 0);
1868 ok(!result && GetLastError() == NTE_BAD_KEYSET,
1869 "Expected NTE_BAD_KEYSET, got %08x\n", GetLastError());
1870 result = CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
1871 CRYPT_VERIFYCONTEXT);
1872 ok(!result && GetLastError() == NTE_BAD_FLAGS,
1873 "Expected NTE_BAD_FLAGS, got %08x\n", GetLastError());
1874 result = CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
1876 ok(result, "CryptAcquireContext failed: %08x\n", GetLastError());
1877 if (!result) return;
1878 /* Test provider parameters getter */
1879 dataLen = sizeof(dwParam);
1880 result = CryptGetProvParam(prov, PP_PROVTYPE, (LPBYTE)&dwParam, &dataLen, 0);
1881 ok(result && dataLen == sizeof(dwParam) && dwParam == PROV_RSA_FULL,
1882 "Expected PROV_RSA_FULL, got 0x%08X\n",dwParam);
1883 dataLen = sizeof(dwParam);
1884 result = CryptGetProvParam(prov, PP_KEYSET_TYPE, (LPBYTE)&dwParam, &dataLen, 0);
1885 ok(result && dataLen == sizeof(dwParam) && dwParam == 0,
1886 "Expected 0, got 0x%08X\n",dwParam);
1887 dataLen = sizeof(dwParam);
1888 result = CryptGetProvParam(prov, PP_KEYSTORAGE, (LPBYTE)&dwParam, &dataLen, 0);
1889 ok(result && dataLen == sizeof(dwParam) && (dwParam & CRYPT_SEC_DESCR),
1890 "Expected CRYPT_SEC_DESCR to be set, got 0x%08X\n",dwParam);
1891 dataLen = sizeof(keySpec);
1892 SetLastError(0xdeadbeef);
1893 result = CryptGetProvParam(prov, PP_KEYSPEC, (LPBYTE)&keySpec, &dataLen, 0);
1894 if (!result && GetLastError() == NTE_BAD_TYPE)
1895 skip("PP_KEYSPEC is not supported (win9x or NT)\n");
1897 ok(result && keySpec == (AT_KEYEXCHANGE | AT_SIGNATURE),
1898 "Expected AT_KEYEXCHANGE | AT_SIGNATURE, got %08x\n", keySpec);
1899 /* PP_CONTAINER parameter */
1900 dataLen = sizeof(szName);
1901 result = CryptGetProvParam(prov, PP_CONTAINER, (LPBYTE)szName, &dataLen, 0);
1902 ok(result && dataLen == strlen(szContainer)+1 && strcmp(szContainer,szName) == 0,
1903 "failed getting PP_CONTAINER. result = %s. Error 0x%08X. returned length = %d\n",
1904 (result)? "TRUE":"FALSE",GetLastError(),dataLen);
1905 /* PP_UNIQUE_CONTAINER parameter */
1906 dataLen = sizeof(szName);
1907 SetLastError(0xdeadbeef);
1908 result = CryptGetProvParam(prov, PP_UNIQUE_CONTAINER, (LPBYTE)szName, &dataLen, 0);
1909 if (!result && GetLastError() == NTE_BAD_TYPE)
1911 skip("PP_UNIQUE_CONTAINER is not supported (win9x or NT)\n");
1915 char container[MAX_PATH];
1917 ok(result, "failed getting PP_UNIQUE_CONTAINER : 0x%08X\n", GetLastError());
1918 uniquecontainer(container);
1921 ok(dataLen == strlen(container)+1, "Expected a param length of 70, got %d\n", dataLen);
1922 ok(!strcmp(container, szName), "Wrong container name : %s\n", szName);
1925 result = CryptGetUserKey(prov, AT_KEYEXCHANGE, &key);
1926 ok(!result && GetLastError() == NTE_NO_KEY,
1927 "Expected NTE_NO_KEY, got %08x\n", GetLastError());
1928 result = CryptGetUserKey(prov, AT_SIGNATURE, &key);
1929 ok(!result && GetLastError() == NTE_NO_KEY,
1930 "Expected NTE_NO_KEY, got %08x\n", GetLastError());
1932 /* Importing a key exchange blob.. */
1933 result = CryptImportKey(prov, abPlainPrivateKey, sizeof(abPlainPrivateKey),
1935 ok(result, "CryptImportKey failed: %08x\n", GetLastError());
1936 CryptDestroyKey(key);
1937 /* allows access to the key exchange key.. */
1938 result = CryptGetUserKey(prov, AT_KEYEXCHANGE, &key);
1939 ok(result, "CryptGetUserKey failed: %08x\n", GetLastError());
1940 CryptDestroyKey(key);
1941 /* but not to the private key. */
1942 result = CryptGetUserKey(prov, AT_SIGNATURE, &key);
1943 ok(!result && GetLastError() == NTE_NO_KEY,
1944 "Expected NTE_NO_KEY, got %08x\n", GetLastError());
1945 CryptReleaseContext(prov, 0);
1946 CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
1947 CRYPT_DELETEKEYSET);
1949 /* Whereas importing a sign blob.. */
1950 result = CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
1952 ok(result, "CryptAcquireContext failed: %08x\n", GetLastError());
1953 if (!result) return;
1954 result = CryptImportKey(prov, signBlob, sizeof(signBlob), 0, 0, &key);
1955 ok(result, "CryptGenKey failed: %08x\n", GetLastError());
1956 CryptDestroyKey(key);
1957 /* doesn't allow access to the key exchange key.. */
1958 result = CryptGetUserKey(prov, AT_KEYEXCHANGE, &key);
1959 ok(!result && GetLastError() == NTE_NO_KEY,
1960 "Expected NTE_NO_KEY, got %08x\n", GetLastError());
1961 /* but does to the private key. */
1962 result = CryptGetUserKey(prov, AT_SIGNATURE, &key);
1963 ok(result, "CryptGetUserKey failed: %08x\n", GetLastError());
1964 CryptDestroyKey(key);
1965 CryptReleaseContext(prov, 0);
1967 CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
1968 CRYPT_DELETEKEYSET);
1971 /* test for the bug in accessing the user key in a container
1973 result = CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
1975 ok(result, "CryptAcquireContext failed: %08x\n", GetLastError());
1976 result = CryptGenKey(prov, AT_KEYEXCHANGE, 0, &key);
1977 ok(result, "CryptGenKey with AT_KEYEXCHANGE failed with error %08x\n", GetLastError());
1978 CryptDestroyKey(key);
1979 CryptReleaseContext(prov,0);
1980 result = CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,0);
1981 ok(result, "CryptAcquireContext failed: 0x%08x\n", GetLastError());
1982 result = CryptGetUserKey(prov, AT_KEYEXCHANGE, &key);
1983 ok (result, "CryptGetUserKey failed with error %08x\n", GetLastError());
1984 CryptDestroyKey(key);
1985 CryptReleaseContext(prov, 0);
1987 CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
1988 CRYPT_DELETEKEYSET);
1990 /* test the machine key set */
1991 CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
1992 CRYPT_DELETEKEYSET|CRYPT_MACHINE_KEYSET);
1993 result = CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
1994 CRYPT_NEWKEYSET|CRYPT_MACHINE_KEYSET);
1995 ok(result, "CryptAcquireContext with CRYPT_MACHINE_KEYSET failed: %08x\n", GetLastError());
1996 CryptReleaseContext(prov, 0);
1997 result = CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
1998 CRYPT_MACHINE_KEYSET);
1999 ok(result, "CryptAcquireContext with CRYPT_MACHINE_KEYSET failed: %08x\n", GetLastError());
2000 CryptReleaseContext(prov,0);
2001 result = CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
2002 CRYPT_DELETEKEYSET|CRYPT_MACHINE_KEYSET);
2003 ok(result, "CryptAcquireContext with CRYPT_DELETEKEYSET|CRYPT_MACHINE_KEYSET failed: %08x\n",
2005 result = CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
2006 CRYPT_MACHINE_KEYSET);
2007 ok(!result && GetLastError() == NTE_BAD_KEYSET ,
2008 "Expected NTE_BAD_KEYSET, got %08x\n", GetLastError());
2014 if (!init_base_environment())
2026 test_block_cipher_modes();
2027 test_import_private();
2028 test_verify_signature();
2030 test_import_export();
2031 test_enum_container();
2032 clean_up_base_environment();
2033 test_schannel_provider();
2034 test_null_provider();
2035 if (!init_aes_environment())
2040 clean_up_aes_environment();