summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2022-11-19 11:48:24 +0000
committertb <>2022-11-19 11:48:24 +0000
commitb78141471e53d13ea11d14dd53817687e84a5a92 (patch)
tree66ea6e90a022076705b4988bf215c0e9eb93ad45 /src
parent97ff0b8011f923270c9adb50e24c2b4c4a533238 (diff)
downloadopenbsd-b78141471e53d13ea11d14dd53817687e84a5a92.tar.gz
openbsd-b78141471e53d13ea11d14dd53817687e84a5a92.tar.bz2
openbsd-b78141471e53d13ea11d14dd53817687e84a5a92.zip
Rework DSA_sign() and DSA_verify()
Change DSA_sign() to single exit and check the signed i2d_DSA_SIG() return value before assigning it to an unsigned int. In DSA_verify() let d2i_DSA_SIG() handle the allocation, split error check of i2d_DSA_SIG() from signature check and change an unnecessary freezero() to free. ok jsing
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/dsa/dsa_asn1.c51
1 files changed, 31 insertions, 20 deletions
diff --git a/src/lib/libcrypto/dsa/dsa_asn1.c b/src/lib/libcrypto/dsa/dsa_asn1.c
index b6482e5064..87b930d5ad 100644
--- a/src/lib/libcrypto/dsa/dsa_asn1.c
+++ b/src/lib/libcrypto/dsa/dsa_asn1.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: dsa_asn1.c,v 1.26 2022/11/19 06:33:00 tb Exp $ */ 1/* $OpenBSD: dsa_asn1.c,v 1.27 2022/11/19 11:48:24 tb Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2000. 3 * project 2000.
4 */ 4 */
@@ -399,18 +399,27 @@ DSAparams_dup(DSA *dsa)
399 399
400int 400int
401DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig, 401DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig,
402 unsigned int *siglen, DSA *dsa) 402 unsigned int *out_siglen, DSA *dsa)
403{ 403{
404 DSA_SIG *s; 404 DSA_SIG *s;
405 int siglen;
406 int ret = 0;
405 407
406 s = DSA_do_sign(dgst, dlen, dsa); 408 *out_siglen = 0;
407 if (s == NULL) { 409
408 *siglen = 0; 410 if ((s = DSA_do_sign(dgst, dlen, dsa)) == NULL)
409 return 0; 411 goto err;
410 } 412
411 *siglen = i2d_DSA_SIG(s,&sig); 413 if ((siglen = i2d_DSA_SIG(s, &sig)) < 0)
414 goto err;
415
416 *out_siglen = siglen;
417
418 ret = 1;
419 err:
412 DSA_SIG_free(s); 420 DSA_SIG_free(s);
413 return 1; 421
422 return ret;
414} 423}
415 424
416/* 425/*
@@ -424,24 +433,26 @@ int
424DSA_verify(int type, const unsigned char *dgst, int dgst_len, 433DSA_verify(int type, const unsigned char *dgst, int dgst_len,
425 const unsigned char *sigbuf, int siglen, DSA *dsa) 434 const unsigned char *sigbuf, int siglen, DSA *dsa)
426{ 435{
427 DSA_SIG *s; 436 DSA_SIG *s = NULL;
428 unsigned char *der = NULL; 437 unsigned char *der = NULL;
429 const unsigned char *p = sigbuf; 438 const unsigned char *p;
430 int derlen = -1;
431 int ret = -1; 439 int ret = -1;
432 440
433 s = DSA_SIG_new(); 441 p = sigbuf;
434 if (s == NULL) 442 if ((s = d2i_DSA_SIG(NULL, &p, siglen)) == NULL)
435 return ret;
436 if (d2i_DSA_SIG(&s, &p, siglen) == NULL)
437 goto err; 443 goto err;
444
438 /* Ensure signature uses DER and doesn't have trailing garbage */ 445 /* Ensure signature uses DER and doesn't have trailing garbage */
439 derlen = i2d_DSA_SIG(s, &der); 446 if (i2d_DSA_SIG(s, &der) != siglen)
440 if (derlen != siglen || memcmp(sigbuf, der, derlen))
441 goto err; 447 goto err;
448
449 if (memcmp(der, sigbuf, siglen) != 0)
450 goto err;
451
442 ret = DSA_do_verify(dgst, dgst_len, s, dsa); 452 ret = DSA_do_verify(dgst, dgst_len, s, dsa);
443err: 453 err:
444 freezero(der, derlen); 454 free(der);
445 DSA_SIG_free(s); 455 DSA_SIG_free(s);
456
446 return ret; 457 return ret;
447} 458}