summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cipher/dsa.c31
-rw-r--r--tests/benchmark.c7
-rw-r--r--tests/dsa-rfc6979.c2
-rw-r--r--tests/fips186-dsa.c4
4 files changed, 38 insertions, 6 deletions
diff --git a/cipher/dsa.c b/cipher/dsa.c
index f1d30ad8..d5b00912 100644
--- a/cipher/dsa.c
+++ b/cipher/dsa.c
@@ -145,6 +145,17 @@ static void (*progress_cb) (void *,const char *, int, int, int );
static void *progress_cb_data;
+/* Check the DSA key length is acceptable for key generation or usage */
+static gpg_err_code_t
+dsa_check_keysize (unsigned int nbits)
+{
+ if (fips_mode () && nbits < 2048)
+ return GPG_ERR_INV_VALUE;
+
+ return 0;
+}
+
+
void
_gcry_register_pk_dsa_progress (void (*cb) (void *, const char *,
int, int, int),
@@ -419,6 +430,10 @@ generate_fips186 (DSA_secret_key *sk, unsigned int nbits, unsigned int qbits,
else
return GPG_ERR_INV_VALUE;
+ ec = dsa_check_keysize (nbits);
+ if (ec)
+ return ec;
+
if (domain->p && domain->q && domain->g)
{
/* Domain parameters are given; use them. */
@@ -1066,9 +1081,13 @@ dsa_sign (gcry_sexp_t *r_sig, gcry_sexp_t s_data, gcry_sexp_t keyparms)
DSA_secret_key sk = {NULL, NULL, NULL, NULL, NULL};
gcry_mpi_t sig_r = NULL;
gcry_mpi_t sig_s = NULL;
+ unsigned int nbits = dsa_get_nbits (keyparms);
+
+ rc = dsa_check_keysize (nbits);
+ if (rc)
+ return rc;
- _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_SIGN,
- dsa_get_nbits (keyparms));
+ _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_SIGN, nbits);
/* Extract the data. */
rc = _gcry_pk_util_data_to_mpi (s_data, &data, &ctx);
@@ -1136,9 +1155,13 @@ dsa_verify (gcry_sexp_t s_sig, gcry_sexp_t s_data, gcry_sexp_t s_keyparms)
gcry_mpi_t sig_s = NULL;
gcry_mpi_t data = NULL;
DSA_public_key pk = { NULL, NULL, NULL, NULL };
+ unsigned int nbits = dsa_get_nbits (s_keyparms);
+
+ rc = dsa_check_keysize (nbits);
+ if (rc)
+ return rc;
- _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_VERIFY,
- dsa_get_nbits (s_keyparms));
+ _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_VERIFY, nbits);
/* Extract the data. */
rc = _gcry_pk_util_data_to_mpi (s_data, &data, &ctx);
diff --git a/tests/benchmark.c b/tests/benchmark.c
index 24141371..5208366a 100644
--- a/tests/benchmark.c
+++ b/tests/benchmark.c
@@ -1427,6 +1427,12 @@ dsa_bench (int iterations, int print_header)
printf ("DSA %d/%d -", p_sizes[i], q_sizes[i]);
fflush (stdout);
+ if (in_fips_mode && !(p_sizes[i] == 2048 || p_sizes[i] == 3072))
+ {
+ puts ("[skipped in fips mode]");
+ goto next;
+ }
+
start_timer ();
for (j=0; j < iterations; j++)
{
@@ -1460,6 +1466,7 @@ dsa_bench (int iterations, int print_header)
printf (" %s\n", elapsed_time (1));
fflush (stdout);
+ next:
gcry_sexp_release (sig);
gcry_sexp_release (data);
sig = NULL;
diff --git a/tests/dsa-rfc6979.c b/tests/dsa-rfc6979.c
index 0f124575..7fa4b7bd 100644
--- a/tests/dsa-rfc6979.c
+++ b/tests/dsa-rfc6979.c
@@ -132,7 +132,7 @@ check_dsa_rfc6979 (void)
" 92195A38B90523E2542EE61871C0440CB87C322FC4B4D2EC5E1E7EC766E1BE8D"
" 4CE935437DC11C3C8FD426338933EBFE739CB3465F4D3668C5E473508253B1E6"
" 82F65CBDC4FAE93C2EA212390E54905A86E2223170B44EAA7DA5DD9FFCFB7F3B#)"
- " ))", 1
+ " ))", 0
},
{
"DSA, 2048 bits",
diff --git a/tests/fips186-dsa.c b/tests/fips186-dsa.c
index eb74cc2b..3d59dfd3 100644
--- a/tests/fips186-dsa.c
+++ b/tests/fips186-dsa.c
@@ -564,7 +564,9 @@ main (int argc, char **argv)
xgcry_control ((GCRYCTL_ENABLE_QUICK_RANDOM, 0));
- check_dsa_gen_186_2 ();
+ if ( !gcry_fips_mode_active () )
+ check_dsa_gen_186_2 ();
+
check_dsa_gen_186_3 ();