Skip to content
Snippets Groups Projects
Commit 96ebad1a authored by Michael Jung's avatar Michael Jung Committed by Alexandre Julliard
Browse files

Implemented CPSignHash and CPVerifySignature.

Added tests for CPVerifySignature.
Fixed minor bugs in implglue.c.
parent 3e60f767
No related branches found
No related tags found
No related merge requests found
......@@ -198,6 +198,10 @@ BOOL setup_key_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext, DWORD dwKeyLen, DW
case CALG_DES:
des_setup(abKeyValue, 8, 0, &pKeyContext->des);
break;
case CALG_RSA_SIGN:
case CALG_RSA_KEYX:
break;
default:
SetLastError(NTE_BAD_ALGID);
......@@ -289,7 +293,7 @@ BOOL encrypt_block_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext, CONST BYTE *in
SetLastError(NTE_FAIL);
return FALSE;
}
reverse_bytes((BYTE*)in, inlen);
reverse_bytes((BYTE*)out, outlen);
} else {
reverse_bytes((BYTE*)in, inlen);
if (rsa_exptmod(in, inlen, out, &outlen, PK_PRIVATE, &pKeyContext->rsa) != CRYPT_OK) {
......@@ -302,11 +306,17 @@ BOOL encrypt_block_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext, CONST BYTE *in
case CALG_RSA_SIGN:
outlen = inlen = (mp_count_bits(&pKeyContext->rsa.N)+7)/8;
if (enc) {
rsa_exptmod(in, inlen, out, &outlen, PK_PRIVATE, &pKeyContext->rsa);
reverse_bytes((BYTE*)in, inlen);
if (rsa_exptmod(in, inlen, out, &outlen, PK_PRIVATE, &pKeyContext->rsa) != CRYPT_OK) {
SetLastError(NTE_FAIL);
return FALSE;
}
reverse_bytes((BYTE*)out, outlen);
} else {
reverse_bytes((BYTE*)in, inlen);
rsa_exptmod(in, inlen, out, &outlen, PK_PUBLIC, &pKeyContext->rsa);
if (rsa_exptmod(in, inlen, out, &outlen, PK_PUBLIC, &pKeyContext->rsa) != CRYPT_OK) {
SetLastError(NTE_FAIL);
return FALSE;
}
}
break;
......
This diff is collapsed.
......@@ -56,6 +56,9 @@ static int init_environment(void)
hProv = (HCRYPTPROV)INVALID_HANDLE_VALUE;
result = CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
ok(!result && GetLastError()==NTE_BAD_FLAGS, "%d, %08lx\n", result, GetLastError());
if (!CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, 0))
{
ok(GetLastError()==NTE_BAD_KEYSET, "%08lx\n", GetLastError());
......@@ -823,6 +826,260 @@ static void test_import_private()
if (!result) return;
}
static void test_verify_signature() {
HCRYPTHASH hHash;
HCRYPTKEY hPubSignKey;
BYTE abData[] = "Wine rocks!";
BOOL result;
BYTE abPubKey[148] = {
0x06, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00,
0x52, 0x53, 0x41, 0x31, 0x00, 0x04, 0x00, 0x00,
0x01, 0x00, 0x01, 0x00, 0x71, 0x64, 0x9f, 0x19,
0x89, 0x1c, 0x21, 0xcc, 0x36, 0xa3, 0xc9, 0x27,
0x08, 0x8a, 0x09, 0xc6, 0xbe, 0xeb, 0xd3, 0xf8,
0x19, 0xa9, 0x92, 0x57, 0xe4, 0xb9, 0x5d, 0xda,
0x88, 0x93, 0xe4, 0x6b, 0x38, 0x77, 0x14, 0x8a,
0x96, 0xc0, 0xb6, 0x4e, 0x42, 0xf5, 0x01, 0xdc,
0xf0, 0xeb, 0x3c, 0xc7, 0x7b, 0xc4, 0xfd, 0x7c,
0xde, 0x93, 0x34, 0x0a, 0x92, 0xe5, 0x97, 0x9c,
0x3e, 0x65, 0xb8, 0x91, 0x2f, 0xe3, 0xf3, 0x89,
0xcd, 0x6c, 0x26, 0xa4, 0x6c, 0xc7, 0x6d, 0x0b,
0x2c, 0xa2, 0x0b, 0x29, 0xe2, 0xfc, 0x30, 0xfa,
0x20, 0xdb, 0x4c, 0xb8, 0x91, 0xb8, 0x69, 0x63,
0x96, 0x41, 0xc2, 0xb4, 0x60, 0xeb, 0xcd, 0xff,
0x3a, 0x1f, 0x94, 0xb1, 0x23, 0xcf, 0x0f, 0x49,
0xad, 0xd5, 0x33, 0x85, 0x71, 0xaf, 0x12, 0x87,
0x84, 0xef, 0xa0, 0xea, 0xe1, 0xc1, 0xd4, 0xc7,
0xe1, 0x21, 0x50, 0xac
};
/* md2 with hash oid */
BYTE abSignatureMD2[128] = {
0x4a, 0x4e, 0xb7, 0x5e, 0x32, 0xda, 0xdb, 0x67,
0x9f, 0x77, 0x84, 0x32, 0x00, 0xba, 0x5f, 0x6b,
0x0d, 0xcf, 0xd9, 0x99, 0xbd, 0x96, 0x31, 0xda,
0x23, 0x4c, 0xd9, 0x4a, 0x90, 0x84, 0x20, 0x59,
0x51, 0xdc, 0xd4, 0x93, 0x3a, 0xae, 0x0a, 0x0a,
0xa1, 0x76, 0xfa, 0xb5, 0x68, 0xee, 0xc7, 0x34,
0x41, 0xd3, 0xe7, 0x5a, 0x0e, 0x22, 0x61, 0x40,
0xea, 0x24, 0x56, 0xf1, 0x91, 0x5a, 0xf7, 0xa7,
0x5b, 0xf4, 0x98, 0x6b, 0xc3, 0xef, 0xad, 0xc0,
0x5e, 0x6b, 0x87, 0x76, 0xcb, 0x1f, 0x62, 0x06,
0x7c, 0xf6, 0x48, 0x97, 0x81, 0x8d, 0xef, 0x51,
0x51, 0xdc, 0x21, 0x91, 0x57, 0x1e, 0x79, 0x6f,
0x49, 0xb5, 0xde, 0x31, 0x07, 0x45, 0x99, 0x46,
0xc3, 0x4f, 0xca, 0x2d, 0x0e, 0x4c, 0x10, 0x25,
0xcb, 0x1a, 0x98, 0x63, 0x41, 0x93, 0x47, 0xc0,
0xb2, 0xbc, 0x10, 0x3c, 0xe7, 0xd4, 0x3c, 0x1e
};
/* md2 without hash oid */
BYTE abSignatureMD2NoOID[128] = {
0x0c, 0x21, 0x3e, 0x60, 0xf9, 0xd0, 0x36, 0x2d,
0xe1, 0x10, 0x45, 0x45, 0x85, 0x03, 0x29, 0x19,
0xef, 0x19, 0xd9, 0xa6, 0x7e, 0x9c, 0x0d, 0xbd,
0x03, 0x0e, 0xb9, 0x51, 0x9e, 0x74, 0x79, 0xc4,
0xde, 0x25, 0xf2, 0x35, 0x74, 0x55, 0xbc, 0x65,
0x7e, 0x33, 0x28, 0xa8, 0x1e, 0x72, 0xaa, 0x99,
0xdd, 0xf5, 0x26, 0x20, 0x29, 0xf8, 0xa6, 0xdf,
0x28, 0x4b, 0x1c, 0xdb, 0xa1, 0x41, 0x56, 0xbc,
0xf9, 0x9c, 0x66, 0xc0, 0x37, 0x41, 0x55, 0xa0,
0xe2, 0xec, 0xbf, 0x71, 0xf0, 0x5d, 0x25, 0x01,
0x75, 0x91, 0xe2, 0x81, 0xb2, 0x9f, 0x57, 0xa7,
0x5c, 0xd2, 0xfa, 0x66, 0xdb, 0x71, 0x2b, 0x1f,
0xad, 0x30, 0xde, 0xea, 0x49, 0x73, 0x30, 0x6a,
0x22, 0x54, 0x49, 0x4e, 0xae, 0xf6, 0x88, 0xc9,
0xff, 0x71, 0xba, 0xbf, 0x27, 0xc5, 0xfa, 0x06,
0xe2, 0x91, 0x71, 0x8a, 0x7e, 0x0c, 0xc2, 0x07
};
/* md4 with hash oid */
BYTE abSignatureMD4[128] = {
0x1c, 0x78, 0xaa, 0xea, 0x74, 0xf4, 0x83, 0x51,
0xae, 0x66, 0xe3, 0xa9, 0x1c, 0x03, 0x39, 0x1b,
0xac, 0x7e, 0x4e, 0x85, 0x7e, 0x1c, 0x38, 0xd2,
0x82, 0x43, 0xb3, 0x6f, 0x6f, 0x46, 0x45, 0x8e,
0x17, 0x74, 0x58, 0x29, 0xca, 0xe1, 0x03, 0x13,
0x45, 0x79, 0x34, 0xdf, 0x5c, 0xd6, 0xc3, 0xf9,
0x7a, 0x1c, 0x9d, 0xff, 0x6f, 0x03, 0x7d, 0x0f,
0x59, 0x1a, 0x2d, 0x0e, 0x94, 0xb4, 0x75, 0x96,
0xd1, 0x48, 0x63, 0x6e, 0xb2, 0xc4, 0x5c, 0xd9,
0xab, 0x49, 0xb4, 0x90, 0xd9, 0x57, 0x04, 0x6e,
0x4c, 0xb6, 0xea, 0x00, 0x94, 0x4a, 0x34, 0xa0,
0xd9, 0x63, 0xef, 0x2c, 0xde, 0x5b, 0xb9, 0xbe,
0x35, 0xc8, 0xc1, 0x31, 0xb5, 0x31, 0x15, 0x18,
0x90, 0x39, 0xf5, 0x2a, 0x34, 0x6d, 0xb4, 0xab,
0x09, 0x34, 0x69, 0x54, 0x4d, 0x11, 0x2f, 0xf3,
0xa2, 0x36, 0x0e, 0xa8, 0x45, 0xe7, 0x36, 0xac
};
/* md4 without hash oid */
BYTE abSignatureMD4NoOID[128] = {
0xd3, 0x60, 0xb2, 0xb0, 0x22, 0x0a, 0x99, 0xda,
0x04, 0x85, 0x64, 0xc6, 0xc6, 0xdb, 0x11, 0x24,
0xe9, 0x68, 0x2d, 0xf7, 0x09, 0xef, 0xb6, 0xa0,
0xa2, 0xfe, 0x45, 0xee, 0x85, 0x49, 0xcd, 0x36,
0xf7, 0xc7, 0x9d, 0x2b, 0x4c, 0x68, 0xda, 0x85,
0x8c, 0x50, 0xcc, 0x4f, 0x4b, 0xe1, 0x82, 0xc3,
0xbe, 0xa3, 0xf1, 0x78, 0x6b, 0x60, 0x42, 0x3f,
0x67, 0x22, 0x14, 0xe4, 0xe1, 0xa4, 0x6e, 0xa9,
0x4e, 0xf1, 0xd4, 0xb0, 0xce, 0x82, 0xac, 0x06,
0xba, 0x2c, 0xbc, 0xf7, 0xcb, 0xf6, 0x0c, 0x3f,
0xf6, 0x79, 0xfe, 0xb3, 0xd8, 0x5a, 0xbc, 0xdb,
0x05, 0x41, 0xa4, 0x07, 0x57, 0x9e, 0xa2, 0x96,
0xfc, 0x60, 0x4b, 0xf7, 0x6f, 0x86, 0x26, 0x1f,
0xc2, 0x2c, 0x67, 0x08, 0xcd, 0x7f, 0x91, 0xe9,
0x16, 0xb5, 0x0e, 0xd9, 0xc4, 0xc4, 0x97, 0xeb,
0x91, 0x3f, 0x20, 0x6c, 0xf0, 0x68, 0x86, 0x7f
};
/* md5 with hash oid */
BYTE abSignatureMD5[128] = {
0x4f, 0xe0, 0x8c, 0x9b, 0x43, 0xdd, 0x02, 0xe5,
0xf4, 0xa1, 0xdd, 0x88, 0x4c, 0x9c, 0x40, 0x0f,
0x6c, 0x43, 0x86, 0x64, 0x00, 0xe6, 0xac, 0xf7,
0xd0, 0x92, 0xaa, 0xc4, 0x62, 0x9a, 0x48, 0x98,
0x1a, 0x56, 0x6d, 0x75, 0xec, 0x04, 0x89, 0xec,
0x69, 0x93, 0xd6, 0x61, 0x37, 0xb2, 0x36, 0xb5,
0xb2, 0xba, 0xf2, 0xf5, 0x21, 0x0c, 0xf1, 0x04,
0xc8, 0x2d, 0xf5, 0xa0, 0x8d, 0x6d, 0x10, 0x0b,
0x68, 0x63, 0xf2, 0x08, 0x68, 0xdc, 0xbd, 0x95,
0x25, 0x7d, 0xee, 0x63, 0x5c, 0x3b, 0x98, 0x4c,
0xea, 0x41, 0xdc, 0x6a, 0x8b, 0x6c, 0xbb, 0x29,
0x2b, 0x1c, 0x5c, 0x8b, 0x7d, 0x94, 0x24, 0xa9,
0x7a, 0x62, 0x94, 0xf3, 0x3a, 0x6a, 0xb2, 0x4c,
0x33, 0x59, 0x00, 0xcd, 0x7d, 0x37, 0x79, 0x90,
0x31, 0xd1, 0xd9, 0x84, 0x12, 0xe5, 0x08, 0x5e,
0xb3, 0x60, 0x61, 0x27, 0x78, 0x37, 0x63, 0x01
};
/* md5 without hash oid */
BYTE abSignatureMD5NoOID[128] = {
0xc6, 0xad, 0x5c, 0x2b, 0x9b, 0xe0, 0x99, 0x2f,
0x5e, 0x55, 0x04, 0x32, 0x65, 0xe0, 0xb5, 0x75,
0x01, 0x9a, 0x11, 0x4d, 0x0e, 0x9a, 0xe1, 0x9f,
0xc7, 0xbf, 0x77, 0x6d, 0xa9, 0xfd, 0xcc, 0x9d,
0x8b, 0xd1, 0x31, 0xed, 0x5a, 0xd2, 0xe5, 0x5f,
0x42, 0x3b, 0xb5, 0x3c, 0x32, 0x30, 0x88, 0x49,
0xcb, 0x67, 0xb8, 0x2e, 0xc9, 0xf5, 0x2b, 0xc8,
0x35, 0x71, 0xb5, 0x1b, 0x32, 0x3f, 0x44, 0x4c,
0x66, 0x93, 0xcb, 0xe8, 0x48, 0x7c, 0x14, 0x23,
0xfb, 0x12, 0xa5, 0xb7, 0x86, 0x94, 0x6b, 0x19,
0x17, 0x20, 0xc6, 0xb8, 0x09, 0xe8, 0xbb, 0xdb,
0x00, 0x2b, 0x96, 0x4a, 0x93, 0x00, 0x26, 0xd3,
0x07, 0xa0, 0x06, 0xce, 0x5a, 0x13, 0x69, 0x6b,
0x62, 0x5a, 0x56, 0x61, 0x6a, 0xd8, 0x11, 0x3b,
0xd5, 0x67, 0xc7, 0x4d, 0xf6, 0x66, 0x63, 0xc5,
0xe3, 0x8f, 0x7c, 0x7c, 0xb1, 0x3e, 0x55, 0x43
};
/* sha with hash oid */
BYTE abSignatureSHA[128] = {
0x5a, 0x4c, 0x66, 0xc9, 0x30, 0x67, 0xcb, 0x91,
0x3c, 0x4d, 0xd5, 0x8d, 0xea, 0x4e, 0x85, 0xcd,
0xd9, 0x68, 0x3a, 0xf3, 0x24, 0x3c, 0x99, 0x24,
0x25, 0x32, 0x93, 0x3d, 0xd6, 0x2f, 0x86, 0x94,
0x23, 0x09, 0xee, 0x02, 0xd4, 0x15, 0xdc, 0x5f,
0x0e, 0x44, 0x45, 0x13, 0x5f, 0x18, 0x5d, 0x1a,
0xd7, 0x0b, 0xd1, 0x23, 0xd6, 0x35, 0x98, 0x52,
0x57, 0x45, 0x74, 0x92, 0xe3, 0x50, 0xb4, 0x20,
0x28, 0x2a, 0x11, 0xbf, 0x49, 0xb4, 0x2c, 0xc5,
0xd4, 0x1a, 0x27, 0x4e, 0xdf, 0xa0, 0xb5, 0x7a,
0xc8, 0x14, 0xdd, 0x9b, 0xb6, 0xca, 0xd6, 0xff,
0xb2, 0x6b, 0xd8, 0x98, 0x67, 0x80, 0xab, 0x53,
0x52, 0xbb, 0xe1, 0x2a, 0xce, 0x79, 0x2f, 0x00,
0x53, 0x26, 0xd8, 0xa7, 0x43, 0xca, 0x72, 0x0e,
0x68, 0x97, 0x37, 0x71, 0x87, 0xc2, 0x6a, 0x98,
0xbb, 0x6c, 0xa0, 0x01, 0xff, 0x04, 0x9d, 0xa6
};
/* sha without hash oid */
BYTE abSignatureSHANoOID[128] = {
0x86, 0xa6, 0x2b, 0x9a, 0x04, 0xda, 0x47, 0xc6,
0x4f, 0x97, 0x8a, 0x8a, 0xf4, 0xfa, 0x63, 0x1a,
0x32, 0x89, 0x56, 0x41, 0x37, 0x91, 0x15, 0x2f,
0x2d, 0x1c, 0x8f, 0xdc, 0x88, 0x40, 0xbb, 0x37,
0x3e, 0x06, 0x33, 0x1b, 0xde, 0xda, 0x7c, 0x65,
0x91, 0x35, 0xca, 0x45, 0x17, 0x0e, 0x24, 0xbe,
0x9e, 0xf6, 0x4e, 0x8a, 0xa4, 0x3e, 0xca, 0xe6,
0x11, 0x36, 0xb8, 0x3a, 0xf0, 0xde, 0x71, 0xfe,
0xdd, 0xb3, 0xcb, 0x6c, 0x39, 0xe0, 0x5f, 0x0c,
0x9e, 0xa8, 0x40, 0x26, 0x9c, 0x81, 0xe9, 0xc4,
0x15, 0x90, 0xbf, 0x4f, 0xd2, 0xc1, 0xa1, 0x80,
0x52, 0xfd, 0xf6, 0x3d, 0x99, 0x1b, 0x9c, 0x8a,
0x27, 0x1b, 0x0c, 0x9a, 0xf3, 0xf9, 0xa2, 0x00,
0x3e, 0x5b, 0xdf, 0xc2, 0xb4, 0x71, 0xa5, 0xbd,
0xf8, 0xae, 0x63, 0xbb, 0x4a, 0xc9, 0xdd, 0x67,
0xc1, 0x3e, 0x93, 0xee, 0xf1, 0x1f, 0x24, 0x5b
};
result = CryptImportKey(hProv, abPubKey, 148, 0, 0, &hPubSignKey);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptCreateHash(hProv, CALG_MD2, 0, 0, &hHash);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptHashData(hHash, abData, (DWORD)sizeof(abData), 0);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptVerifySignature(hHash, abSignatureMD2, 128, hPubSignKey, NULL, 0);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptVerifySignature(hHash, abSignatureMD2NoOID, 128, hPubSignKey, NULL, CRYPT_NOHASHOID);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
/* Next test fails on WinXP SP2. It seems that CPVerifySignature doesn't care about
* the OID at all. */
/*result = CryptVerifySignature(hHash, abSignatureMD2NoOID, 128, hPubSignKey, NULL, 0);
ok(!result && GetLastError()==NTE_BAD_SIGNATURE, "%08lx\n", GetLastError());
if (result) return;*/
result = CryptCreateHash(hProv, CALG_MD4, 0, 0, &hHash);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptHashData(hHash, abData, (DWORD)sizeof(abData), 0);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptVerifySignature(hHash, abSignatureMD4, 128, hPubSignKey, NULL, 0);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptVerifySignature(hHash, abSignatureMD4NoOID, 128, hPubSignKey, NULL, CRYPT_NOHASHOID);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptHashData(hHash, abData, (DWORD)sizeof(abData), 0);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptVerifySignature(hHash, abSignatureMD5, 128, hPubSignKey, NULL, 0);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptVerifySignature(hHash, abSignatureMD5NoOID, 128, hPubSignKey, NULL, CRYPT_NOHASHOID);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptHashData(hHash, abData, (DWORD)sizeof(abData), 0);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptVerifySignature(hHash, abSignatureSHA, 128, hPubSignKey, NULL, 0);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
result = CryptVerifySignature(hHash, abSignatureSHANoOID, 128, hPubSignKey, NULL, CRYPT_NOHASHOID);
ok(result, "%08lx\n", GetLastError());
if (!result) return;
}
START_TEST(rsaenh)
{
if (!init_environment())
......@@ -839,5 +1096,6 @@ START_TEST(rsaenh)
test_mac();
test_block_cipher_modes();
test_import_private();
test_verify_signature();
clean_up_environment();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment