[PATCH 4/4] tests: Fix tests to account for differentiated flags
Lucas Mulling
lucas.mulling at suse.com
Wed Feb 26 21:19:25 CET 2025
* tests/basic.c (check_one_cipher, check_pubkey_sign,
check_pubkey_sign_ecdsa): Fix formatting, include test index in fail
print, mark tests that use random-override with FLAG_NOFIPS, as
random-override is not allowed in fips mode.
* tests/pkcs1v2.c (check_oaep, check_pss, check_v15crypt): Skip tests
that use random-override.
* tests/t-dsa.c (one_test_sexp): Skip tests that set the RSA salt in
fips mode. Setting the rsa salt is not allowed in fips mode.
* tests/t-ecdsa.c (one_test_sexp): Skip tests that set the
salt in fips mode. Setting the salt is not allowed in fips mode.
* tests/t-ed25519.c (one_test): Skip tests that set the
salt in fips mode. Setting the salt is not allowed in fips mode.
* tests/t-ed448.c (one_test): Skip tests that set the
salt in fips mode. Setting the salt is not allowed in fips mode.
* tests/t-fips-service-ind.c (check_pk_g_t_n_c,
check_pk_hash_sign_verify): Check for correct differentiation of
igninvflag, the flag itself does nothing but its not allowed in fips
mode.
* tests/t-rsa-pss.c (one_test_sexp): Skip tests that set the RSA salt in
fips mode. Setting the RSA salt is not allowed in fips mode.
Signed-off-by: Lucas Mulling <lucas.mulling at suse.com>
---
tests/basic.c | 47 +++++++++++++++++++--------------
tests/pkcs1v2.c | 23 ++++++++++++++---
tests/t-dsa.c | 4 +++
tests/t-ecdsa.c | 4 +++
tests/t-ed25519.c | 4 +++
tests/t-ed448.c | 7 +++++
tests/t-fips-service-ind.c | 53 +++++++++++++++++++++++++++++---------
tests/t-rsa-pss.c | 4 +++
8 files changed, 112 insertions(+), 34 deletions(-)
diff --git a/tests/basic.c b/tests/basic.c
index f32e41db..5cd464d9 100644
--- a/tests/basic.c
+++ b/tests/basic.c
@@ -12533,7 +12533,7 @@ check_one_cipher (int algo, int mode, int flags)
0, 61))
goto out;
}
- else if (mode == GCRY_CIPHER_MODE_CTR)
+ else if (mode == GCRY_CIPHER_MODE_CTR)
{
/* 32bit overflow test (big-endian counter) */
if (check_one_cipher_ctr_overflow (algo, mode, flags, key, 64, plain,
@@ -17215,7 +17215,7 @@ check_pubkey_sign (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
" (hash sha1 #11223344556677889900AABBCCDDEEFF10203040#)\n"
" (random-override #4253647587980912233445566778899019283747#))\n",
GCRY_PK_RSA,
- 0 },
+ 0, FLAG_NOFIPS },
{ "(data\n (flags pss)\n"
" (hash-algo sha1)\n"
" (value #11223344556677889900AA#))\n",
@@ -17226,7 +17226,7 @@ check_pubkey_sign (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
" (value #11223344556677889900AA#)\n"
" (random-override #4253647587980912233445566778899019283747#))\n",
GCRY_PK_RSA,
- 0 },
+ 0, FLAG_NOFIPS},
{ "(data\n (flags pss)\n"
" (hash-algo sha256)\n"
" (value #11223344556677889900AABBCCDDEEFF#)\n"
@@ -17234,7 +17234,7 @@ check_pubkey_sign (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
" (random-override #42536475879809122334455667788990192837465564738291"
"00122334455667#))\n",
GCRY_PK_RSA,
- 0 },
+ 0, FLAG_NOFIPS },
{ "(data\n (flags pss)\n"
" (hash-algo sha256)\n"
" (value #11223344556677889900AABBCCDDEEFF#)\n"
@@ -17273,7 +17273,11 @@ check_pubkey_sign (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
goto next;
}
if (gcry_err_code (rc) != datas[dataidx].expected_rc)
- fail ("gcry_pk_sign %d failed: %s\n", dataidx, gpg_strerror (rc));
+ {
+ show_sexp("hash: ", hash);
+ show_sexp("skey: ", skey);
+ fail ("gcry_pk_sign %d failed: %s\n", dataidx, gpg_strerror (rc));
+ }
if (!rc)
verify_one_signature (pkey, hash, badhash, sig);
@@ -17402,7 +17406,7 @@ check_pubkey_sign_ecdsa (int n, gcry_sexp_t skey, gcry_sexp_t pkey,
goto next;
}
if (gcry_err_code (rc) != datas[dataidx].expected_rc)
- fail ("gcry_pk_sign failed: %s\n", gpg_strerror (rc));
+ fail ("gcry_pk_sign (%d) failed: %s\n", dataidx, gpg_strerror (rc));
if (!rc && verbose > 1)
show_sexp ("ECDSA signature:\n", sig);
@@ -17483,7 +17487,7 @@ check_pubkey_crypt (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
"(flags oaep)(hash-algo sha1)(label \"test\")",
1,
0,
- 0 },
+ 0, FLAG_NOFIPS },
{ 0,
"(data\n (flags )\n" " (value #11223344556677889900AA#))\n",
NULL,
@@ -17556,14 +17560,18 @@ check_pubkey_crypt (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
die ("converting data failed: %s\n", gpg_strerror (rc));
rc = gcry_pk_encrypt (&ciph, data, pkey);
- if (in_fips_mode && (flags & FLAG_NOFIPS))
+ if (in_fips_mode && (flags & FLAG_NOFIPS || datas[dataidx].flags & FLAG_NOFIPS))
{
if (!rc)
fail ("gcry_pk_encrypt did not fail as expected in FIPS mode\n");
goto next;
}
if (gcry_err_code (rc) != datas[dataidx].encrypt_expected_rc)
- fail ("gcry_pk_encrypt failed: %s\n", gpg_strerror (rc));
+ {
+ show_sexp("data: ", data);
+ show_sexp("pkey: ", pkey);
+ fail ("gcry_pk_encrypt (%d) failed: %s\n", flags, gpg_strerror (rc));
+ }
if (!rc)
{
@@ -17605,16 +17613,17 @@ check_pubkey_crypt (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
ciph = list;
}
rc = gcry_pk_decrypt (&plain, ciph, skey);
- if (!rc && (datas[dataidx].flags & FLAG_SPECIAL))
- {
- /* It may happen that OAEP formatted data which is
- decrypted as pkcs#1 data returns a valid pkcs#1
- frame. However, the returned value will not be
- identical - thus we expect a mismatch and test further on
- whether this mismatch actually happened. */
- expect_mismatch = 1;
- }
- else if (gcry_err_code (rc) != datas[dataidx].decrypt_expected_rc)
+
+ if (!rc && (datas[dataidx].flags & FLAG_SPECIAL))
+ {
+ /* It may happen that OAEP formatted data which is
+ decrypted as pkcs#1 data returns a valid pkcs#1
+ frame. However, the returned value will not be
+ identical - thus we expect a mismatch and test further on
+ whether this mismatch actually happened. */
+ expect_mismatch = 1;
+ }
+ else if (gcry_err_code (rc) != datas[dataidx].decrypt_expected_rc)
{
if (verbose)
{
diff --git a/tests/pkcs1v2.c b/tests/pkcs1v2.c
index 9874b81c..25156d65 100644
--- a/tests/pkcs1v2.c
+++ b/tests/pkcs1v2.c
@@ -186,8 +186,15 @@ check_oaep (void)
err = gcry_pk_encrypt (&ciph, plain, pub_key);
if (err)
{
- show_sexp ("plain:\n", ciph);
- fail ("gcry_pk_encrypt failed: %s\n", gpg_strerror (err));
+ /* SKIP the test in fips mode, random-override is not allowed */
+ if (in_fips_mode && gcry_err_code (err) == GPG_ERR_INV_FLAG)
+ {
+ gcry_sexp_release (plain);
+ continue;
+ }
+ show_sexp ("plain:\n", plain);
+ show_sexp ("pub_key:\n", pub_key);
+ fail ("gcry_pk_encrypt failed: (%d) %s\n", mno, gpg_strerror (err));
}
else
{
@@ -320,6 +327,11 @@ check_pss (void)
err = gcry_pk_sign (&sig, sigtmpl, sec_key);
if (err)
{
+ if (in_fips_mode && gcry_err_code (err) == GPG_ERR_INV_FLAG)
+ {
+ gcry_sexp_release (sigtmpl);
+ continue;
+ }
show_sexp ("sigtmpl:\n", sigtmpl);
fail ("gcry_pk_sign failed: %s\n", gpg_strerror (err));
}
@@ -448,7 +460,12 @@ check_v15crypt (void)
err = gcry_pk_encrypt (&ciph, plain, pub_key);
if (err)
{
- show_sexp ("plain:\n", ciph);
+ if (in_fips_mode && gcry_err_code (err) == GPG_ERR_INV_FLAG)
+ {
+ gcry_sexp_release (plain);
+ continue;
+ }
+ show_sexp ("plain:\n", plain);
fail ("gcry_pk_encrypt failed: %s\n", gpg_strerror (err));
}
else
diff --git a/tests/t-dsa.c b/tests/t-dsa.c
index 8ed3b65b..3f8ad97e 100644
--- a/tests/t-dsa.c
+++ b/tests/t-dsa.c
@@ -322,6 +322,10 @@ one_test_sexp (const char *sha_alg,
err = gcry_pk_random_override_new (&ctx, buffer2, buflen2);
if (err)
{
+ /* Setting rsa salt is not allowed in FIPS mode */
+ if (in_fips_mode && gpg_err_code (err) == GPG_ERR_INV_OP)
+ goto leave;
+
fail ("error setting salt for test: %s",
gpg_strerror (err));
goto leave;
diff --git a/tests/t-ecdsa.c b/tests/t-ecdsa.c
index d36d217b..73f283ac 100644
--- a/tests/t-ecdsa.c
+++ b/tests/t-ecdsa.c
@@ -357,6 +357,10 @@ one_test_sexp (const char *curvename, const char *sha_alg,
err = gcry_pk_random_override_new (&ctx, buffer2, buflen2);
if (err)
{
+ /* Setting salt is not allowed in FIPS mode */
+ if (in_fips_mode && gpg_err_code (err) == GPG_ERR_INV_OP)
+ goto leave;
+
fail ("error setting salt for test: %s",
gpg_strerror (err));
goto leave;
diff --git a/tests/t-ed25519.c b/tests/t-ed25519.c
index ce828b27..3b78c365 100644
--- a/tests/t-ed25519.c
+++ b/tests/t-ed25519.c
@@ -265,6 +265,10 @@ one_test (int testno, const char *sk, const char *pk,
err = gcry_pk_input_data_push (&ctx, buffer, buflen);
if (err)
{
+ /* Setting salt is not allowed in FIPS mode */
+ if (!no_fips && gpg_err_code (err) == GPG_ERR_INV_OP)
+ goto leave;
+
fail ("error setting input data for test: %s",
gpg_strerror (err));
goto leave;
diff --git a/tests/t-ed448.c b/tests/t-ed448.c
index b68fd855..0761c9a0 100644
--- a/tests/t-ed448.c
+++ b/tests/t-ed448.c
@@ -37,6 +37,7 @@ static int sign_with_pk;
static int no_verify;
static int custom_data_file;
+static int in_fips_mode;
static void
show_note (const char *format, ...)
@@ -261,6 +262,9 @@ one_test (int testno, int ph, const char *sk, const char *pk,
err = gcry_pk_input_data_push (&ctx, buffer, buflen);
if (err)
{
+ /* Setting salt is not allowed in FIPS mode */
+ if (in_fips_mode && gpg_err_code (err) == GPG_ERR_INV_OP)
+ goto leave;
fail ("error setting input data for test: %s",
gpg_strerror (err));
goto leave;
@@ -517,6 +521,9 @@ main (int argc, char **argv)
xgcry_control ((GCRYCTL_ENABLE_QUICK_RANDOM, 0));
xgcry_control ((GCRYCTL_INITIALIZATION_FINISHED, 0));
+ if (gcry_fips_mode_active ())
+ in_fips_mode = 1;
+
start_timer ();
check_ed448 (fname);
stop_timer ();
diff --git a/tests/t-fips-service-ind.c b/tests/t-fips-service-ind.c
index f8485176..95807783 100644
--- a/tests/t-fips-service-ind.c
+++ b/tests/t-fips-service-ind.c
@@ -47,6 +47,9 @@ check_pk_g_t_n_c (int reject)
static struct {
const char *keyparms;
int expect_failure;
+ int expect_failure_testkey;
+ int expect_failure_nbits;
+ int expect_failure_curve;
} tv[] = {
{
"(genkey (ecc (curve nistp256)))",
@@ -54,8 +57,12 @@ check_pk_g_t_n_c (int reject)
},
{ /* non-compliant curve */
"(genkey (ecc (curve secp256k1)))",
- 1
- }
+ 1, 1, 1, 1
+ },
+ { /* non-compliant igninvflag */
+ "(genkey (ecc (curve nistp256) (flags igninvflag)))",
+ 1, 0, 0, 0
+ },
};
int tvidx;
gpg_error_t err;
@@ -138,14 +145,14 @@ check_pk_g_t_n_c (int reject)
goto next;
}
- if (in_fips_mode && !tv[tvidx].expect_failure && ec)
+ if (in_fips_mode && !tv[tvidx].expect_failure_testkey && ec)
{
/* Success with the FIPS service indicator == 0 expected, but != 0. */
fail ("gcry_pk_testkey test %d unexpectedly set the indicator in FIPS mode.\n",
tvidx);
goto next;
}
- else if (in_fips_mode && tv[tvidx].expect_failure && !ec)
+ else if (in_fips_mode && tv[tvidx].expect_failure_testkey && !ec)
{
/* Success with the FIPS service indicator != 0 expected, but == 0. */
fail ("gcry_pk_testkey test %d unexpectedly cleared the indicator in FIPS mode.\n",
@@ -169,14 +176,14 @@ check_pk_g_t_n_c (int reject)
goto next;
}
- if (in_fips_mode && !tv[tvidx].expect_failure && ec)
+ if (in_fips_mode && !tv[tvidx].expect_failure_nbits && ec)
{
/* Success with the FIPS service indicator == 0 expected, but != 0. */
fail ("gcry_pk_get_nbits test %d unexpectedly set the indicator in FIPS mode.\n",
tvidx);
goto next;
}
- else if (in_fips_mode && tv[tvidx].expect_failure && !ec)
+ else if (in_fips_mode && tv[tvidx].expect_failure_nbits && !ec)
{
/* Success with the FIPS service indicator != 0 expected, but == 0. */
fail ("gcry_pk_get_nbits test %d unexpectedly cleared the indicator in FIPS mode.\n",
@@ -200,14 +207,14 @@ check_pk_g_t_n_c (int reject)
goto next;
}
- if (in_fips_mode && !tv[tvidx].expect_failure && ec)
+ if (in_fips_mode && !tv[tvidx].expect_failure_curve && ec)
{
/* Success with the FIPS service indicator == 0 expected, but != 0. */
fail ("gcry_pk_get_curve test %d unexpectedly set the indicator in FIPS mode.\n",
tvidx);
goto next;
}
- else if (in_fips_mode && tv[tvidx].expect_failure && !ec)
+ else if (in_fips_mode && tv[tvidx].expect_failure_curve && !ec)
{
/* Success with the FIPS service indicator != 0 expected, but == 0. */
fail ("gcry_pk_get_curve test %d unexpectedly cleared the indicator in FIPS mode.\n",
@@ -404,6 +411,7 @@ check_pk_hash_sign_verify (void)
const char *k;
int expect_failure;
int expect_failure_hash;
+ int expect_failure_verify;
} tv[] = {
{ /* non-compliant hash */
GCRY_MD_BLAKE2B_512,
@@ -414,18 +422,28 @@ check_pk_hash_sign_verify (void)
"ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9#)))",
"(data(flags raw)(hash %s %b)(label %b))",
"94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de",
- 1, 1
+ 1, 1, 1
},
{ /* non-compliant curve */
GCRY_MD_SHA256,
"(private-key (ecc (curve secp256k1)"
" (d #c2cdf0a8b0a83b35ace53f097b5e6e6a0a1f2d40535eff1cf434f52a43d59d8f#)))",
-
"(public-key (ecc (curve secp256k1)"
" (q #046fcc37ea5e9e09fec6c83e5fbd7a745e3eee81d16ebd861c9e66f55518c19798"
"4e9f113c07f875691df8afc1029496fc4cb9509b39dcd38f251a83359cc8b4f7#)))",
"(data(flags raw)(hash %s %b)(label %b))",
"94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de",
+ 1, 0, 1
+ },
+ { /* non-compliant igninvflag */
+ GCRY_MD_SHA256,
+ "(private-key (ecc (curve nistp256) (flags igninvflag)"
+ " (d #519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464#)))",
+ "(public-key (ecc (curve nistp256)"
+ " (q #041ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83"
+ "ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9#)))",
+ "(data(flags raw)(hash %s %b)(label %b))",
+ "94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de",
1, 0
},
{
@@ -438,6 +456,17 @@ check_pk_hash_sign_verify (void)
"(data(flags raw)(hash %s %b)(label %b))",
"94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de",
0, 0
+ },
+ {
+ GCRY_MD_GOSTR3411_94, /* non-compliant hash */
+ "(private-key (ecc (curve nistp256)"
+ " (d #519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464#)))",
+ "(public-key (ecc (curve nistp256)"
+ " (q #041ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83"
+ "ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9#)))",
+ "(data(flags raw)(hash %s %b)(label %b))",
+ "94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de",
+ 1, 1, 1
}
};
int tvidx;
@@ -573,14 +602,14 @@ check_pk_hash_sign_verify (void)
goto next;
}
- if (in_fips_mode && !tv[tvidx].expect_failure && ec)
+ if (in_fips_mode && !tv[tvidx].expect_failure_verify && ec)
{
/* Success with the FIPS service indicator == 0 expected, but != 0. */
fail ("gcry_pk_hash test %d unexpectedly set the indicator in FIPS mode.\n",
tvidx);
goto next;
}
- else if (in_fips_mode && tv[tvidx].expect_failure && !ec)
+ else if (in_fips_mode && tv[tvidx].expect_failure_verify && !ec)
{
/* Success with the FIPS service indicator != 0 expected, but == 0. */
fail ("gcry_pk_hash_verify test %d unexpectedly cleared the indicator in FIPS mode.\n",
diff --git a/tests/t-rsa-pss.c b/tests/t-rsa-pss.c
index 82dd54b3..2206c291 100644
--- a/tests/t-rsa-pss.c
+++ b/tests/t-rsa-pss.c
@@ -283,6 +283,10 @@ one_test_sexp (const char *n, const char *e, const char *d,
err = gcry_pk_random_override_new (&ctx, buffer2, buflen2);
if (err)
{
+ /* Setting rsa salt is not allowed in FIPS mode */
+ if (in_fips_mode && gpg_err_code (err) == GPG_ERR_INV_OP)
+ goto leave;
+
fail ("error setting salt for test: %s",
gpg_strerror (err));
goto leave;
--
2.48.1
More information about the Gcrypt-devel
mailing list