summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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