summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2023-03-04 21:06:17 +0000
committertb <>2023-03-04 21:06:17 +0000
commitf09e38cd3517c1f0da9ca1c87cb3d08add98865c (patch)
treea91936f1168cf10d99aab8b857ff9c06247bb271 /src
parent7923ccd455e02b2cd273c05d55b39515b4c05b77 (diff)
downloadopenbsd-f09e38cd3517c1f0da9ca1c87cb3d08add98865c.tar.gz
openbsd-f09e38cd3517c1f0da9ca1c87cb3d08add98865c.tar.bz2
openbsd-f09e38cd3517c1f0da9ca1c87cb3d08add98865c.zip
Call dsa_check_keys() before signing or verifying
We already had some checks on both sides, but they were less precise and differed between the functions. The code here is messy enough, so any simplification is helpful... ok beck jsing
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/dsa/dsa_ossl.c32
1 files changed, 9 insertions, 23 deletions
diff --git a/src/lib/libcrypto/dsa/dsa_ossl.c b/src/lib/libcrypto/dsa/dsa_ossl.c
index fd5fac64bb..d32168a48e 100644
--- a/src/lib/libcrypto/dsa/dsa_ossl.c
+++ b/src/lib/libcrypto/dsa/dsa_ossl.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: dsa_ossl.c,v 1.48 2023/02/13 09:21:35 tb Exp $ */ 1/* $OpenBSD: dsa_ossl.c,v 1.49 2023/03/04 21:06:17 tb Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -102,8 +102,8 @@ dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
102 DSA_SIG *ret = NULL; 102 DSA_SIG *ret = NULL;
103 int noredo = 0; 103 int noredo = 0;
104 104
105 if (dsa->p == NULL || dsa->q == NULL || dsa->g == NULL) { 105 if (!dsa_check_key(dsa)) {
106 reason = DSA_R_MISSING_PARAMETERS; 106 reason = DSA_R_INVALID_PARAMETERS;
107 goto err; 107 goto err;
108 } 108 }
109 109
@@ -218,10 +218,8 @@ dsa_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp)
218 int q_bits; 218 int q_bits;
219 int ret = 0; 219 int ret = 0;
220 220
221 if (dsa->p == NULL || dsa->q == NULL || dsa->g == NULL) { 221 if (!dsa_check_key(dsa))
222 DSAerror(DSA_R_MISSING_PARAMETERS); 222 goto err;
223 return 0;
224 }
225 223
226 if ((r = BN_new()) == NULL) 224 if ((r = BN_new()) == NULL)
227 goto err; 225 goto err;
@@ -325,21 +323,8 @@ dsa_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig, DSA *dsa)
325 int qbits; 323 int qbits;
326 int ret = -1; 324 int ret = -1;
327 325
328 if (dsa->p == NULL || dsa->q == NULL || dsa->g == NULL) { 326 if (!dsa_check_key(dsa))
329 DSAerror(DSA_R_MISSING_PARAMETERS); 327 goto err;
330 return -1;
331 }
332
333 /* FIPS 186-3 allows only three different sizes for q. */
334 qbits = BN_num_bits(dsa->q);
335 if (qbits != 160 && qbits != 224 && qbits != 256) {
336 DSAerror(DSA_R_BAD_Q_VALUE);
337 return -1;
338 }
339 if (BN_num_bits(dsa->p) > OPENSSL_DSA_MAX_MODULUS_BITS) {
340 DSAerror(DSA_R_MODULUS_TOO_LARGE);
341 return -1;
342 }
343 328
344 if ((ctx = BN_CTX_new()) == NULL) 329 if ((ctx = BN_CTX_new()) == NULL)
345 goto err; 330 goto err;
@@ -370,8 +355,9 @@ dsa_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig, DSA *dsa)
370 355
371 /* 356 /*
372 * If the digest length is greater than the size of q use the 357 * If the digest length is greater than the size of q use the
373 * BN_num_bits(dsa->q) leftmost bits of the digest, see FIPS 186-3, 4.2. 358 * BN_num_bits(dsa->q) leftmost bits of the digest, see FIPS 186-4, 4.2.
374 */ 359 */
360 qbits = BN_num_bits(dsa->q);
375 if (dgst_len > (qbits >> 3)) 361 if (dgst_len > (qbits >> 3))
376 dgst_len = (qbits >> 3); 362 dgst_len = (qbits >> 3);
377 363