mirror of https://github.com/openssl/openssl.git
				
				
				
			Fix PKCS#7 so that it still works with non fetchable digest algorithms.
Fixes #12684 Partially fixes #12697 Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org> Reviewed-by: Shane Lontis <shane.lontis@oracle.com> (Merged from https://github.com/openssl/openssl/pull/12740)
This commit is contained in:
		
							parent
							
								
									8e32ea633f
								
							
						
					
					
						commit
						bd1bbbfe51
					
				|  | @ -64,6 +64,7 @@ static int pkcs7_bio_add_digest(BIO **pbio, X509_ALGOR *alg, | |||
|     BIO *btmp; | ||||
|     const char *name; | ||||
|     EVP_MD *fetched = NULL; | ||||
|     const EVP_MD *md; | ||||
| 
 | ||||
|     if ((btmp = BIO_new(BIO_f_md())) == NULL) { | ||||
|         PKCS7err(PKCS7_F_PKCS7_BIO_ADD_DIGEST, ERR_R_BIO_LIB); | ||||
|  | @ -71,13 +72,22 @@ static int pkcs7_bio_add_digest(BIO **pbio, X509_ALGOR *alg, | |||
|     } | ||||
| 
 | ||||
|     name = OBJ_nid2sn(OBJ_obj2nid(alg->algorithm)); | ||||
| 
 | ||||
|     (void)ERR_set_mark(); | ||||
|     fetched = EVP_MD_fetch(ctx->libctx, name, ctx->propq); | ||||
|     if (fetched == NULL) { | ||||
|     if (fetched != NULL) | ||||
|         md = fetched; | ||||
|     else | ||||
|         md = EVP_get_digestbyname(name); | ||||
| 
 | ||||
|     if (md == NULL) { | ||||
|         (void)ERR_clear_last_mark(); | ||||
|         PKCS7err(PKCS7_F_PKCS7_BIO_ADD_DIGEST, PKCS7_R_UNKNOWN_DIGEST_TYPE); | ||||
|         goto err; | ||||
|     } | ||||
|     (void)ERR_pop_to_mark(); | ||||
| 
 | ||||
|     BIO_set_md(btmp, fetched); | ||||
|     BIO_set_md(btmp, md); | ||||
|     EVP_MD_free(fetched); | ||||
|     if (*pbio == NULL) | ||||
|         *pbio = btmp; | ||||
|  | @ -389,6 +399,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert) | |||
|     X509_ALGOR *xa; | ||||
|     ASN1_OCTET_STRING *data_body = NULL; | ||||
|     EVP_MD *evp_md = NULL; | ||||
|     const EVP_MD *md; | ||||
|     EVP_CIPHER *evp_cipher = NULL; | ||||
|     EVP_CIPHER_CTX *evp_ctx = NULL; | ||||
|     X509_ALGOR *enc_alg = NULL; | ||||
|  | @ -480,14 +491,23 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert) | |||
|             } | ||||
| 
 | ||||
|             name = OBJ_nid2sn(OBJ_obj2nid(xa->algorithm)); | ||||
| 
 | ||||
|             (void)ERR_set_mark(); | ||||
|             evp_md = EVP_MD_fetch(p7_ctx->libctx, name, p7_ctx->propq); | ||||
|             if (evp_md == NULL) { | ||||
|             if (evp_md != NULL) | ||||
|                 md = evp_md; | ||||
|             else | ||||
|                 md = EVP_get_digestbyname(name); | ||||
| 
 | ||||
|             if (md == NULL) { | ||||
|                 (void)ERR_clear_last_mark(); | ||||
|                 PKCS7err(PKCS7_F_PKCS7_DATADECODE, | ||||
|                          PKCS7_R_UNKNOWN_DIGEST_TYPE); | ||||
|                 goto err; | ||||
|             } | ||||
|             (void)ERR_pop_to_mark(); | ||||
| 
 | ||||
|             BIO_set_md(btmp, evp_md); | ||||
|             BIO_set_md(btmp, md); | ||||
|             EVP_MD_free(evp_md); | ||||
|             if (out == NULL) | ||||
|                 out = btmp; | ||||
|  | @ -1023,6 +1043,7 @@ int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, | |||
| { | ||||
|     ASN1_OCTET_STRING *os; | ||||
|     EVP_MD_CTX *mdc_tmp, *mdc; | ||||
|     const EVP_MD *md; | ||||
|     EVP_MD *fetched_md = NULL; | ||||
|     int ret = 0, i; | ||||
|     int md_type; | ||||
|  | @ -1097,9 +1118,19 @@ int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, | |||
|             goto err; | ||||
|         } | ||||
| 
 | ||||
|         (void)ERR_set_mark(); | ||||
|         fetched_md = EVP_MD_fetch(ctx->libctx, OBJ_nid2sn(md_type), ctx->propq); | ||||
|         if (fetched_md == NULL || !EVP_VerifyInit_ex(mdc_tmp, fetched_md, NULL)) | ||||
| 
 | ||||
|         if (fetched_md != NULL) | ||||
|             md = fetched_md; | ||||
|         else | ||||
|             md = EVP_get_digestbynid(md_type); | ||||
| 
 | ||||
|         if (md == NULL || !EVP_VerifyInit_ex(mdc_tmp, md, NULL)) { | ||||
|             (void)ERR_clear_last_mark(); | ||||
|             goto err; | ||||
|         } | ||||
|         (void)ERR_pop_to_mark(); | ||||
| 
 | ||||
|         alen = ASN1_item_i2d((ASN1_VALUE *)sk, &abuf, | ||||
|                              ASN1_ITEM_rptr(PKCS7_ATTR_VERIFY)); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue