diff options
author | tb <> | 2021-05-02 15:33:33 +0000 |
---|---|---|
committer | tb <> | 2021-05-02 15:33:33 +0000 |
commit | 6ab028bc39915d979c8830d8bac5e57a83cc1933 (patch) | |
tree | d61dde604f2447b8e5efcd530167e07079cda8ec /src/lib | |
parent | 0bac90bf9260abb7c553c80cd5ca2f5eaf383a4b (diff) | |
download | openbsd-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.c | 48 |
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 | ||
595 | static int | 595 | static int |
596 | TS_compute_imprint(BIO *data, TS_TST_INFO *tst_info, X509_ALGOR **md_alg, | 596 | TS_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 | ||
640 | err: | 651 | err: |
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 | ||