1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2008-2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include "internal/cryptlib.h" 11e1051a39Sopenharmony_ci#include <openssl/asn1t.h> 12e1051a39Sopenharmony_ci#include <openssl/pem.h> 13e1051a39Sopenharmony_ci#include <openssl/x509v3.h> 14e1051a39Sopenharmony_ci#include <openssl/err.h> 15e1051a39Sopenharmony_ci#include <openssl/cms.h> 16e1051a39Sopenharmony_ci#include "cms_local.h" 17e1051a39Sopenharmony_ci 18e1051a39Sopenharmony_ci/* CMS DigestedData Utilities */ 19e1051a39Sopenharmony_ci 20e1051a39Sopenharmony_ciCMS_ContentInfo *ossl_cms_DigestedData_create(const EVP_MD *md, 21e1051a39Sopenharmony_ci OSSL_LIB_CTX *libctx, 22e1051a39Sopenharmony_ci const char *propq) 23e1051a39Sopenharmony_ci{ 24e1051a39Sopenharmony_ci CMS_ContentInfo *cms; 25e1051a39Sopenharmony_ci CMS_DigestedData *dd; 26e1051a39Sopenharmony_ci 27e1051a39Sopenharmony_ci cms = CMS_ContentInfo_new_ex(libctx, propq); 28e1051a39Sopenharmony_ci if (cms == NULL) 29e1051a39Sopenharmony_ci return NULL; 30e1051a39Sopenharmony_ci 31e1051a39Sopenharmony_ci dd = M_ASN1_new_of(CMS_DigestedData); 32e1051a39Sopenharmony_ci 33e1051a39Sopenharmony_ci if (dd == NULL) 34e1051a39Sopenharmony_ci goto err; 35e1051a39Sopenharmony_ci 36e1051a39Sopenharmony_ci cms->contentType = OBJ_nid2obj(NID_pkcs7_digest); 37e1051a39Sopenharmony_ci cms->d.digestedData = dd; 38e1051a39Sopenharmony_ci 39e1051a39Sopenharmony_ci dd->version = 0; 40e1051a39Sopenharmony_ci dd->encapContentInfo->eContentType = OBJ_nid2obj(NID_pkcs7_data); 41e1051a39Sopenharmony_ci 42e1051a39Sopenharmony_ci X509_ALGOR_set_md(dd->digestAlgorithm, md); 43e1051a39Sopenharmony_ci 44e1051a39Sopenharmony_ci return cms; 45e1051a39Sopenharmony_ci 46e1051a39Sopenharmony_ci err: 47e1051a39Sopenharmony_ci CMS_ContentInfo_free(cms); 48e1051a39Sopenharmony_ci return NULL; 49e1051a39Sopenharmony_ci} 50e1051a39Sopenharmony_ci 51e1051a39Sopenharmony_ciBIO *ossl_cms_DigestedData_init_bio(const CMS_ContentInfo *cms) 52e1051a39Sopenharmony_ci{ 53e1051a39Sopenharmony_ci CMS_DigestedData *dd = cms->d.digestedData; 54e1051a39Sopenharmony_ci 55e1051a39Sopenharmony_ci return ossl_cms_DigestAlgorithm_init_bio(dd->digestAlgorithm, 56e1051a39Sopenharmony_ci ossl_cms_get0_cmsctx(cms)); 57e1051a39Sopenharmony_ci} 58e1051a39Sopenharmony_ci 59e1051a39Sopenharmony_ciint ossl_cms_DigestedData_do_final(const CMS_ContentInfo *cms, BIO *chain, 60e1051a39Sopenharmony_ci int verify) 61e1051a39Sopenharmony_ci{ 62e1051a39Sopenharmony_ci EVP_MD_CTX *mctx = EVP_MD_CTX_new(); 63e1051a39Sopenharmony_ci unsigned char md[EVP_MAX_MD_SIZE]; 64e1051a39Sopenharmony_ci unsigned int mdlen; 65e1051a39Sopenharmony_ci int r = 0; 66e1051a39Sopenharmony_ci CMS_DigestedData *dd; 67e1051a39Sopenharmony_ci 68e1051a39Sopenharmony_ci if (mctx == NULL) { 69e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CMS, ERR_R_MALLOC_FAILURE); 70e1051a39Sopenharmony_ci goto err; 71e1051a39Sopenharmony_ci } 72e1051a39Sopenharmony_ci 73e1051a39Sopenharmony_ci dd = cms->d.digestedData; 74e1051a39Sopenharmony_ci 75e1051a39Sopenharmony_ci if (!ossl_cms_DigestAlgorithm_find_ctx(mctx, chain, dd->digestAlgorithm)) 76e1051a39Sopenharmony_ci goto err; 77e1051a39Sopenharmony_ci 78e1051a39Sopenharmony_ci if (EVP_DigestFinal_ex(mctx, md, &mdlen) <= 0) 79e1051a39Sopenharmony_ci goto err; 80e1051a39Sopenharmony_ci 81e1051a39Sopenharmony_ci if (verify) { 82e1051a39Sopenharmony_ci if (mdlen != (unsigned int)dd->digest->length) { 83e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CMS, CMS_R_MESSAGEDIGEST_WRONG_LENGTH); 84e1051a39Sopenharmony_ci goto err; 85e1051a39Sopenharmony_ci } 86e1051a39Sopenharmony_ci 87e1051a39Sopenharmony_ci if (memcmp(md, dd->digest->data, mdlen)) 88e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CMS, CMS_R_VERIFICATION_FAILURE); 89e1051a39Sopenharmony_ci else 90e1051a39Sopenharmony_ci r = 1; 91e1051a39Sopenharmony_ci } else { 92e1051a39Sopenharmony_ci if (!ASN1_STRING_set(dd->digest, md, mdlen)) 93e1051a39Sopenharmony_ci goto err; 94e1051a39Sopenharmony_ci r = 1; 95e1051a39Sopenharmony_ci } 96e1051a39Sopenharmony_ci 97e1051a39Sopenharmony_ci err: 98e1051a39Sopenharmony_ci EVP_MD_CTX_free(mctx); 99e1051a39Sopenharmony_ci 100e1051a39Sopenharmony_ci return r; 101e1051a39Sopenharmony_ci 102e1051a39Sopenharmony_ci} 103