dssenh/tests: Key length tests for the DSSENH cryptographic service provider.
This commit is contained in:
parent
fbc735bef7
commit
01e937d49a
|
@ -179,7 +179,225 @@ static void test_acquire_context(void)
|
||||||
"Expected NTE_EXISTS, got %08x\n", GetLastError());
|
"Expected NTE_EXISTS, got %08x\n", GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct keylength_test {
|
||||||
|
ALG_ID algid;
|
||||||
|
DWORD flags;
|
||||||
|
BOOL expectedResult;
|
||||||
|
DWORD expectedError;
|
||||||
|
BOOL brokenResult;
|
||||||
|
DWORD brokenError;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct keylength_test baseDSS_keylength[] = {
|
||||||
|
/* AT_KEYEXCHANGE is not supported by the base DSS provider */
|
||||||
|
{AT_KEYEXCHANGE, 448 << 16, FALSE, NTE_BAD_ALGID, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{AT_KEYEXCHANGE, 512 << 16, FALSE, NTE_BAD_ALGID, TRUE}, /* success on WinNT4 */
|
||||||
|
{AT_KEYEXCHANGE, 1024 << 16, FALSE, NTE_BAD_ALGID, TRUE}, /* success on WinNT4 */
|
||||||
|
{AT_KEYEXCHANGE, 1088 << 16, FALSE, NTE_BAD_ALGID, FALSE, NTE_BAD_FLAGS},/* WinNT4 and Win2k */
|
||||||
|
/* min 512 max 1024 increment by 64 */
|
||||||
|
{AT_SIGNATURE, 448 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{AT_SIGNATURE, 512 << 16, TRUE},
|
||||||
|
{AT_SIGNATURE, 513 << 16, FALSE, NTE_FAIL, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{AT_SIGNATURE, 768 << 16, TRUE},
|
||||||
|
{AT_SIGNATURE, 1024 << 16, TRUE},
|
||||||
|
{AT_SIGNATURE, 1088 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
/* CALG_DH_EPHEM is not supported by the base DSS provider */
|
||||||
|
{CALG_DH_EPHEM, 448 << 16, FALSE, NTE_BAD_ALGID, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{CALG_DH_EPHEM, 512 << 16, FALSE, NTE_BAD_ALGID, TRUE}, /* success on WinNT4 */
|
||||||
|
{CALG_DH_EPHEM, 1024 << 16, FALSE, NTE_BAD_ALGID, TRUE}, /* success on WinNT4 */
|
||||||
|
{CALG_DH_EPHEM, 1088 << 16, FALSE, NTE_BAD_ALGID, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
/* CALG_DH_SF is not supported by the base DSS provider */
|
||||||
|
{CALG_DH_SF, 448 << 16, FALSE, NTE_BAD_ALGID, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{CALG_DH_SF, 512 << 16, FALSE, NTE_BAD_ALGID, TRUE}, /* success on WinNT4 */
|
||||||
|
{CALG_DH_SF, 1024 << 16, FALSE, NTE_BAD_ALGID, TRUE}, /* success on WinNT4 */
|
||||||
|
{CALG_DH_SF, 1088 << 16, FALSE, NTE_BAD_ALGID, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
/* min 512 max 1024, increment by 64 */
|
||||||
|
{CALG_DSS_SIGN, 448 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{CALG_DSS_SIGN, 512 << 16, TRUE},
|
||||||
|
{CALG_DSS_SIGN, 513 << 16, FALSE, NTE_FAIL, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{CALG_DSS_SIGN, 768 << 16, TRUE},
|
||||||
|
{CALG_DSS_SIGN, 1024 << 16, TRUE},
|
||||||
|
{CALG_DSS_SIGN, 1088 << 16, FALSE, NTE_BAD_FLAGS}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct keylength_test dssDH_keylength[] = {
|
||||||
|
/* min 512 max 1024, increment by 64 */
|
||||||
|
{AT_KEYEXCHANGE, 448 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{AT_KEYEXCHANGE, 512 << 16, TRUE},
|
||||||
|
{AT_KEYEXCHANGE, 513 << 16, FALSE, NTE_FAIL, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{AT_KEYEXCHANGE, 768 << 16, TRUE},
|
||||||
|
{AT_KEYEXCHANGE, 1024 << 16, TRUE},
|
||||||
|
{AT_KEYEXCHANGE, 1088 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{AT_SIGNATURE, 448 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{AT_SIGNATURE, 512 << 16, TRUE},
|
||||||
|
{AT_SIGNATURE, 513 << 16, FALSE, NTE_FAIL, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{AT_SIGNATURE, 768 << 16, TRUE},
|
||||||
|
{AT_SIGNATURE, 1024 << 16, TRUE},
|
||||||
|
{AT_SIGNATURE, 1088 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{CALG_DH_EPHEM, 448 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{CALG_DH_EPHEM, 512 << 16, TRUE},
|
||||||
|
{CALG_DH_EPHEM, 513 << 16, FALSE, NTE_FAIL, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{CALG_DH_EPHEM, 768 << 16, TRUE},
|
||||||
|
{CALG_DH_EPHEM, 1024 << 16, TRUE},
|
||||||
|
{CALG_DH_EPHEM, 1088 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{CALG_DH_SF, 448 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{CALG_DH_SF, 512 << 16, TRUE},
|
||||||
|
{CALG_DH_SF, 513 << 16, FALSE, NTE_FAIL, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{CALG_DH_SF, 768 << 16, TRUE},
|
||||||
|
{CALG_DH_SF, 1024 << 16, TRUE},
|
||||||
|
{CALG_DH_SF, 1088 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{CALG_DSS_SIGN, 448 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{CALG_DSS_SIGN, 512 << 16, TRUE},
|
||||||
|
{CALG_DSS_SIGN, 513 << 16, FALSE, NTE_FAIL, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{CALG_DSS_SIGN, 768 << 16, TRUE},
|
||||||
|
{CALG_DSS_SIGN, 1024 << 16, TRUE},
|
||||||
|
{CALG_DSS_SIGN, 1088 << 16, FALSE, NTE_BAD_FLAGS}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct keylength_test dssENH_keylength[] = {
|
||||||
|
/* min 512 max 1024 (AT_KEYEXCHANGE max 4096), increment by 64*/
|
||||||
|
{AT_KEYEXCHANGE, 448 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{AT_KEYEXCHANGE, 512 << 16, TRUE},
|
||||||
|
{AT_KEYEXCHANGE, 513 << 16, FALSE, NTE_FAIL, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{AT_KEYEXCHANGE, 768 << 16, TRUE},
|
||||||
|
{AT_KEYEXCHANGE, 1024 << 16, TRUE},
|
||||||
|
{AT_KEYEXCHANGE, 1088 << 16, TRUE},
|
||||||
|
{AT_KEYEXCHANGE, 2048 << 16, TRUE},
|
||||||
|
/* Keylength too large - test bot timeout.
|
||||||
|
{AT_KEYEXCHANGE, 3072 << 16, TRUE},
|
||||||
|
{AT_KEYEXCHANGE, 4096 << 16, TRUE}, */
|
||||||
|
{AT_KEYEXCHANGE, 4160 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{AT_SIGNATURE, 448 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{AT_SIGNATURE, 512 << 16, TRUE},
|
||||||
|
{AT_SIGNATURE, 513 << 16, FALSE, NTE_FAIL, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{AT_SIGNATURE, 768 << 16, TRUE},
|
||||||
|
{AT_SIGNATURE, 1024 << 16, TRUE},
|
||||||
|
{AT_SIGNATURE, 1032 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{CALG_DH_EPHEM, 448 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{CALG_DH_EPHEM, 512 << 16, TRUE},
|
||||||
|
{CALG_DH_EPHEM, 513 << 16, FALSE, NTE_FAIL, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{CALG_DH_EPHEM, 768 << 16, TRUE},
|
||||||
|
{CALG_DH_EPHEM, 1024 << 16, TRUE},
|
||||||
|
{CALG_DH_EPHEM, 1040 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{CALG_DH_SF, 448 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{CALG_DH_SF, 512 << 16, TRUE},
|
||||||
|
{CALG_DH_SF, 513 << 16, FALSE, NTE_FAIL, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{CALG_DH_SF, 768 << 16, TRUE},
|
||||||
|
{CALG_DH_SF, 1024 << 16, TRUE},
|
||||||
|
{CALG_DH_SF, 1032 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{CALG_DSS_SIGN, 448 << 16, FALSE, NTE_BAD_FLAGS},
|
||||||
|
{CALG_DSS_SIGN, 512 << 16, TRUE},
|
||||||
|
{CALG_DSS_SIGN, 513 << 16, FALSE, NTE_FAIL, FALSE, NTE_BAD_FLAGS}, /* WinNT4 and Win2k */
|
||||||
|
{CALG_DSS_SIGN, 768 << 16, TRUE},
|
||||||
|
{CALG_DSS_SIGN, 1024 << 16, TRUE},
|
||||||
|
{CALG_DSS_SIGN, 1088 << 16, FALSE, NTE_BAD_FLAGS}
|
||||||
|
};
|
||||||
|
|
||||||
|
static void test_keylength_array(HCRYPTPROV hProv,const struct keylength_test *tests, int testLen)
|
||||||
|
{
|
||||||
|
HCRYPTKEY key;
|
||||||
|
BOOL result;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < testLen; i++)
|
||||||
|
{
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
result = CryptGenKey(hProv, tests[i].algid, tests[i].flags, &key);
|
||||||
|
|
||||||
|
/* success */
|
||||||
|
if(tests[i].expectedResult)
|
||||||
|
{
|
||||||
|
ok(result, "Expected a key, got %08x\n", GetLastError());
|
||||||
|
result = CryptDestroyKey(key);
|
||||||
|
ok(result, "Expected no errors.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ /* error but success on older system */
|
||||||
|
if(tests[i].brokenResult)
|
||||||
|
ok((!result && GetLastError() == tests[i].expectedError) ||
|
||||||
|
broken(result), "Expected a key, got %x.\n", GetLastError());
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* error */
|
||||||
|
if(!tests[i].brokenError)
|
||||||
|
ok(!result && GetLastError() == tests[i].expectedError,
|
||||||
|
"Expected a key, got %x.\n", GetLastError());
|
||||||
|
|
||||||
|
/* error but different error on older system */
|
||||||
|
else
|
||||||
|
ok(!result && (GetLastError() == tests[i].expectedError ||
|
||||||
|
broken(GetLastError() == tests[i].brokenError)),
|
||||||
|
"Expected a key, got %x.\n", GetLastError());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TESTLEN(x) (sizeof(x) / sizeof((x)[0]))
|
||||||
|
|
||||||
|
static void test_keylength(void)
|
||||||
|
{
|
||||||
|
HCRYPTPROV hProv = 0;
|
||||||
|
BOOL result;
|
||||||
|
|
||||||
|
/* acquire base dss provider */
|
||||||
|
result = CryptAcquireContextA(
|
||||||
|
&hProv, NULL, MS_DEF_DSS_PROV_A, PROV_DSS, CRYPT_VERIFYCONTEXT);
|
||||||
|
if(!result)
|
||||||
|
{
|
||||||
|
skip("DSSENH is currently not available, skipping key length tests.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ok(result, "Expected no errors.\n");
|
||||||
|
|
||||||
|
/* perform keylength tests */
|
||||||
|
test_keylength_array(hProv, baseDSS_keylength, TESTLEN(baseDSS_keylength));
|
||||||
|
|
||||||
|
result = CryptReleaseContext(hProv, 0);
|
||||||
|
ok(result, "Expected release of CSP provider.\n");
|
||||||
|
|
||||||
|
/* acquire diffie hellman dss provider */
|
||||||
|
result = CryptAcquireContextA(
|
||||||
|
&hProv, NULL, MS_DEF_DSS_DH_PROV, PROV_DSS_DH, CRYPT_VERIFYCONTEXT);
|
||||||
|
ok(result, "Expected no errors.\n");
|
||||||
|
|
||||||
|
/* perform keylength tests */
|
||||||
|
test_keylength_array(hProv, dssDH_keylength, TESTLEN(dssDH_keylength));
|
||||||
|
|
||||||
|
result = CryptReleaseContext(hProv, 0);
|
||||||
|
ok(result, "Expected release of CSP provider.\n");
|
||||||
|
|
||||||
|
/* acquire enhanced dss provider */
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
result = CryptAcquireContextA(
|
||||||
|
&hProv, NULL, MS_ENH_DSS_DH_PROV, PROV_DSS_DH, CRYPT_VERIFYCONTEXT);
|
||||||
|
if(!result && GetLastError() == NTE_KEYSET_NOT_DEF)
|
||||||
|
{
|
||||||
|
win_skip("DSSENH and Schannel provider is broken on WinNT4\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ok(result, "Expected no errors.\n");
|
||||||
|
|
||||||
|
/* perform keylength tests */
|
||||||
|
test_keylength_array(hProv, dssENH_keylength, TESTLEN(dssENH_keylength));
|
||||||
|
|
||||||
|
result = CryptReleaseContext(hProv, 0);
|
||||||
|
ok(result, "Expected release of CSP provider.\n");
|
||||||
|
|
||||||
|
/* acquire schannel dss provider */
|
||||||
|
result = CryptAcquireContextA(
|
||||||
|
&hProv, NULL, MS_DEF_DH_SCHANNEL_PROV, PROV_DH_SCHANNEL, CRYPT_VERIFYCONTEXT);
|
||||||
|
ok(result, "Expected no errors.\n");
|
||||||
|
|
||||||
|
/* perform keylength tests */
|
||||||
|
test_keylength_array(hProv, dssENH_keylength, TESTLEN(dssENH_keylength));
|
||||||
|
|
||||||
|
result = CryptReleaseContext(hProv, 0);
|
||||||
|
ok(result, "Expected release of CSP provider.\n");
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(dssenh)
|
START_TEST(dssenh)
|
||||||
{
|
{
|
||||||
test_acquire_context();
|
test_acquire_context();
|
||||||
|
test_keylength();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue