diff --git a/lib/nettle/int/dsa-fips.h b/lib/nettle/int/dsa-fips.h index 08fac25..82d545e 100644 --- a/lib/nettle/int/dsa-fips.h +++ b/lib/nettle/int/dsa-fips.h @@ -80,7 +80,7 @@ int _dsa_validate_dss_g(struct dsa_public_key *pub, unsigned domain_seed_size, const uint8_t *domain_seed, unsigned index); -unsigned _dsa_check_qp_sizes(unsigned q_bits, unsigned p_bits); +unsigned _dsa_check_qp_sizes(unsigned q_bits, unsigned p_bits, unsigned generate); /* The following low-level functions can be used for DH key exchange as well */ diff --git a/lib/nettle/int/dsa-keygen-fips186.c b/lib/nettle/int/dsa-keygen-fips186.c index 2712ddb..1ac9441 100644 --- a/lib/nettle/int/dsa-keygen-fips186.c +++ b/lib/nettle/int/dsa-keygen-fips186.c @@ -36,11 +36,11 @@ #include -unsigned _dsa_check_qp_sizes(unsigned q_bits, unsigned p_bits) +unsigned _dsa_check_qp_sizes(unsigned q_bits, unsigned p_bits, unsigned generate) { switch (q_bits) { case 160: - if (_gnutls_fips_mode_enabled() != 0) + if (_gnutls_fips_mode_enabled() != 0 && generate != 0) return 0; if (p_bits != 1024) @@ -77,7 +77,7 @@ _dsa_generate_dss_pq(struct dsa_public_key *pub, uint8_t *storage = NULL; unsigned storage_length = 0; - ret = _dsa_check_qp_sizes(q_bits, p_bits); + ret = _dsa_check_qp_sizes(q_bits, p_bits, 1); if (ret == 0) { return 0; } @@ -375,7 +375,7 @@ dsa_generate_dss_pqg(struct dsa_public_key *pub, uint8_t domain_seed[MAX_PVP_SEED_SIZE*3]; unsigned domain_seed_size = 0; - ret = _dsa_check_qp_sizes(q_bits, p_bits); + ret = _dsa_check_qp_sizes(q_bits, p_bits, 1); if (ret == 0) return 0; diff --git a/lib/nettle/int/dsa-validate.c b/lib/nettle/int/dsa-validate.c index 3f55755..daa39da 100644 --- a/lib/nettle/int/dsa-validate.c +++ b/lib/nettle/int/dsa-validate.c @@ -83,7 +83,7 @@ _dsa_validate_dss_g(struct dsa_public_key *pub, p_bits = mpz_sizeinbase(pub->p, 2); q_bits = mpz_sizeinbase(pub->q, 2); - ret = _dsa_check_qp_sizes(q_bits, p_bits); + ret = _dsa_check_qp_sizes(q_bits, p_bits, 0); if (ret == 0) { return 0; } @@ -151,7 +151,7 @@ _dsa_validate_dss_pq(struct dsa_public_key *pub, p_bits = mpz_sizeinbase(pub->p, 2); q_bits = mpz_sizeinbase(pub->q, 2); - ret = _dsa_check_qp_sizes(q_bits, p_bits); + ret = _dsa_check_qp_sizes(q_bits, p_bits, 0); if (ret == 0) { return 0; }