summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authortb <>2021-05-02 15:33:33 +0000
committertb <>2021-05-02 15:33:33 +0000
commit6ab028bc39915d979c8830d8bac5e57a83cc1933 (patch)
treed61dde604f2447b8e5efcd530167e07079cda8ec /src/lib
parent0bac90bf9260abb7c553c80cd5ca2f5eaf383a4b (diff)
downloadopenbsd-6ab028bc39915d979c8830d8bac5e57a83cc1933.tar.gz
openbsd-6ab028bc39915d979c8830d8bac5e57a83cc1933.tar.bz2
openbsd-6ab028bc39915d979c8830d8bac5e57a83cc1933.zip
Make TS_compute_imprint a bit more robust.
Instead of using the output parameters directly, null them out at the beginning and work with local variables which are only assigned to the output parameters on success. This way we avoid leaking stale pointers back to the caller. requested/ok jsing
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/ts/ts_rsp_verify.c48
1 files changed, 28 insertions, 20 deletions
diff --git a/src/lib/libcrypto/ts/ts_rsp_verify.c b/src/lib/libcrypto/ts/ts_rsp_verify.c
index 27515adf68..c745a2c51f 100644
--- a/src/lib/libcrypto/ts/ts_rsp_verify.c
+++ b/src/lib/libcrypto/ts/ts_rsp_verify.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ts_rsp_verify.c,v 1.19 2021/05/01 13:13:45 tb Exp $ */ 1/* $OpenBSD: ts_rsp_verify.c,v 1.20 2021/05/02 15:33:33 tb Exp $ */
2/* Written by Zoltan Glozik (zglozik@stones.com) for the OpenSSL 2/* Written by Zoltan Glozik (zglozik@stones.com) for the OpenSSL
3 * project 2002. 3 * project 2002.
4 */ 4 */
@@ -593,35 +593,40 @@ TS_check_policy(ASN1_OBJECT *req_oid, TS_TST_INFO *tst_info)
593} 593}
594 594
595static int 595static int
596TS_compute_imprint(BIO *data, TS_TST_INFO *tst_info, X509_ALGOR **md_alg, 596TS_compute_imprint(BIO *data, TS_TST_INFO *tst_info, X509_ALGOR **out_md_alg,
597 unsigned char **imprint, unsigned *imprint_len) 597 unsigned char **out_imprint, unsigned int *out_imprint_len)
598{ 598{
599 TS_MSG_IMPRINT *msg_imprint = TS_TST_INFO_get_msg_imprint(tst_info); 599 TS_MSG_IMPRINT *msg_imprint;
600 X509_ALGOR *md_alg_resp = TS_MSG_IMPRINT_get_algo(msg_imprint); 600 X509_ALGOR *md_alg_resp;
601 X509_ALGOR *md_alg = NULL;
602 unsigned char *imprint = NULL;
603 unsigned int imprint_len = 0;
601 const EVP_MD *md; 604 const EVP_MD *md;
602 EVP_MD_CTX md_ctx; 605 EVP_MD_CTX md_ctx;
603 unsigned char buffer[4096]; 606 unsigned char buffer[4096];
604 int length; 607 int length;
605 608
606 *md_alg = NULL; 609 *out_md_alg = NULL;
607 *imprint = NULL; 610 *out_imprint = NULL;
611 *out_imprint_len = 0;
608 612
609 /* Return the MD algorithm of the response. */ 613 /* Retrieve the MD algorithm of the response. */
610 if (!(*md_alg = X509_ALGOR_dup(md_alg_resp))) 614 msg_imprint = TS_TST_INFO_get_msg_imprint(tst_info);
615 md_alg_resp = TS_MSG_IMPRINT_get_algo(msg_imprint);
616 if ((md_alg = X509_ALGOR_dup(md_alg_resp)) == NULL)
611 goto err; 617 goto err;
612 618
613 /* Getting the MD object. */ 619 /* Getting the MD object. */
614 if (!(md = EVP_get_digestbyobj((*md_alg)->algorithm))) { 620 if ((md = EVP_get_digestbyobj((md_alg)->algorithm)) == NULL) {
615 TSerror(TS_R_UNSUPPORTED_MD_ALGORITHM); 621 TSerror(TS_R_UNSUPPORTED_MD_ALGORITHM);
616 goto err; 622 goto err;
617 } 623 }
618 624
619 /* Compute message digest. */ 625 /* Compute message digest. */
620 length = EVP_MD_size(md); 626 if ((length = EVP_MD_size(md)) < 0)
621 if (length < 0)
622 goto err; 627 goto err;
623 *imprint_len = length; 628 imprint_len = length;
624 if (!(*imprint = malloc(*imprint_len))) { 629 if ((imprint = malloc(imprint_len)) == NULL) {
625 TSerror(ERR_R_MALLOC_FAILURE); 630 TSerror(ERR_R_MALLOC_FAILURE);
626 goto err; 631 goto err;
627 } 632 }
@@ -632,17 +637,20 @@ TS_compute_imprint(BIO *data, TS_TST_INFO *tst_info, X509_ALGOR **md_alg,
632 if (!EVP_DigestUpdate(&md_ctx, buffer, length)) 637 if (!EVP_DigestUpdate(&md_ctx, buffer, length))
633 goto err; 638 goto err;
634 } 639 }
635 if (!EVP_DigestFinal(&md_ctx, *imprint, NULL)) 640 if (!EVP_DigestFinal(&md_ctx, imprint, NULL))
636 goto err; 641 goto err;
637 642
643 *out_md_alg = md_alg;
644 md_alg = NULL;
645 *out_imprint = imprint;
646 imprint = NULL;
647 *out_imprint_len = imprint_len;
648
638 return 1; 649 return 1;
639 650
640err: 651err:
641 X509_ALGOR_free(*md_alg); 652 X509_ALGOR_free(md_alg);
642 *md_alg = NULL; 653 free(imprint);
643 free(*imprint);
644 *imprint = NULL;
645 *imprint_len = 0;
646 return 0; 654 return 0;
647} 655}
648 656