diff options
author | tb <> | 2022-11-19 11:48:24 +0000 |
---|---|---|
committer | tb <> | 2022-11-19 11:48:24 +0000 |
commit | b78141471e53d13ea11d14dd53817687e84a5a92 (patch) | |
tree | 66ea6e90a022076705b4988bf215c0e9eb93ad45 /src | |
parent | 97ff0b8011f923270c9adb50e24c2b4c4a533238 (diff) | |
download | openbsd-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.c | 51 |
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 | ||
400 | int | 400 | int |
401 | DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig, | 401 | DSA_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 | |||
424 | DSA_verify(int type, const unsigned char *dgst, int dgst_len, | 433 | DSA_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); |
443 | err: | 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 | } |