rsaenh/tests: Add round-trip test of RSA.
This commit is contained in:
parent
1004b57c55
commit
b1beb212db
|
@ -2032,6 +2032,66 @@ static void test_schannel_provider(void)
|
||||||
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_SCHANNEL, CRYPT_DELETEKEYSET);
|
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_SCHANNEL, CRYPT_DELETEKEYSET);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test that a key can be used to encrypt data and exported, and that, when
|
||||||
|
* the exported key is imported again, can be used to decrypt the original
|
||||||
|
* data again.
|
||||||
|
*/
|
||||||
|
static void test_rsa_round_trip(void)
|
||||||
|
{
|
||||||
|
static const char test_string[] = "Well this is a fine how-do-you-do.";
|
||||||
|
HCRYPTPROV prov;
|
||||||
|
HCRYPTKEY signKey, keyExchangeKey;
|
||||||
|
BOOL result;
|
||||||
|
BYTE data[256], *exportedKey;
|
||||||
|
DWORD dataLen, keyLen;
|
||||||
|
|
||||||
|
CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
|
||||||
|
CRYPT_DELETEKEYSET);
|
||||||
|
|
||||||
|
/* Generate a new key... */
|
||||||
|
result = CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
|
||||||
|
CRYPT_NEWKEYSET);
|
||||||
|
ok(result, "CryptAcquireContext failed: %08x\n", GetLastError());
|
||||||
|
result = CryptGenKey(prov, CALG_RSA_KEYX, CRYPT_EXPORTABLE, &signKey);
|
||||||
|
ok(result, "CryptGenKey with CALG_RSA_KEYX failed with error %08x\n", GetLastError());
|
||||||
|
result = CryptGetUserKey(prov, AT_KEYEXCHANGE, &keyExchangeKey);
|
||||||
|
ok(result, "CryptGetUserKey failed: %08x\n", GetLastError());
|
||||||
|
/* encrypt some data with it... */
|
||||||
|
memcpy(data, test_string, strlen(test_string) + 1);
|
||||||
|
dataLen = strlen(test_string) + 1;
|
||||||
|
result = CryptEncrypt(keyExchangeKey, 0, TRUE, 0, data, &dataLen,
|
||||||
|
sizeof(data));
|
||||||
|
ok(result, "CryptEncrypt failed: %08x\n", GetLastError());
|
||||||
|
/* export the key... */
|
||||||
|
result = CryptExportKey(keyExchangeKey, 0, PRIVATEKEYBLOB, 0, NULL,
|
||||||
|
&keyLen);
|
||||||
|
ok(result, "CryptExportKey failed: %08x\n", GetLastError());
|
||||||
|
exportedKey = HeapAlloc(GetProcessHeap(), 0, keyLen);
|
||||||
|
result = CryptExportKey(keyExchangeKey, 0, PRIVATEKEYBLOB, 0, exportedKey,
|
||||||
|
&keyLen);
|
||||||
|
/* destroy the key... */
|
||||||
|
CryptDestroyKey(keyExchangeKey);
|
||||||
|
CryptDestroyKey(signKey);
|
||||||
|
/* import the key again... */
|
||||||
|
result = CryptImportKey(prov, exportedKey, keyLen, 0, 0, &keyExchangeKey);
|
||||||
|
ok(result, "CryptImportKey failed: %08x\n", GetLastError());
|
||||||
|
HeapFree(GetProcessHeap(), 0, exportedKey);
|
||||||
|
/* and decrypt the data encrypted with the original key with the imported
|
||||||
|
* key.
|
||||||
|
*/
|
||||||
|
result = CryptDecrypt(keyExchangeKey, 0, TRUE, 0, data, &dataLen);
|
||||||
|
ok(result, "CryptDecrypt failed: %08x\n", GetLastError());
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
ok(dataLen == sizeof(test_string), "unexpected size %d\n", dataLen);
|
||||||
|
ok(!memcmp(data, test_string, sizeof(test_string)), "unexpected value");
|
||||||
|
}
|
||||||
|
CryptReleaseContext(prov, 0);
|
||||||
|
|
||||||
|
CryptAcquireContext(&prov, szContainer, NULL, PROV_RSA_FULL,
|
||||||
|
CRYPT_DELETEKEYSET);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_enum_container(void)
|
static void test_enum_container(void)
|
||||||
{
|
{
|
||||||
BYTE abContainerName[MAX_PATH + 2]; /* Larger than maximum name len */
|
BYTE abContainerName[MAX_PATH + 2]; /* Larger than maximum name len */
|
||||||
|
@ -2494,6 +2554,7 @@ START_TEST(rsaenh)
|
||||||
test_key_initialization();
|
test_key_initialization();
|
||||||
test_schannel_provider();
|
test_schannel_provider();
|
||||||
test_null_provider();
|
test_null_provider();
|
||||||
|
test_rsa_round_trip();
|
||||||
if (!init_aes_environment())
|
if (!init_aes_environment())
|
||||||
return;
|
return;
|
||||||
test_aes(128);
|
test_aes(128);
|
||||||
|
|
Loading…
Reference in New Issue