| File: | out/../deps/openssl/openssl/crypto/cms/cms_ess.c |
| Warning: | line 219, column 24 Access to field 'digestAlgorithm' results in a dereference of a null pointer (loaded from variable 'si') |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* | |||
| 2 | * Copyright 2008-2021 The OpenSSL Project Authors. All Rights Reserved. | |||
| 3 | * | |||
| 4 | * Licensed under the Apache License 2.0 (the "License"). You may not use | |||
| 5 | * this file except in compliance with the License. You can obtain a copy | |||
| 6 | * in the file LICENSE in the source distribution or at | |||
| 7 | * https://www.openssl.org/source/license.html | |||
| 8 | */ | |||
| 9 | ||||
| 10 | #include "internal/cryptlib.h" | |||
| 11 | #include <openssl/asn1t.h> | |||
| 12 | #include <openssl/pem.h> | |||
| 13 | #include <openssl/rand.h> | |||
| 14 | #include <openssl/x509v3.h> | |||
| 15 | #include <openssl/err.h> | |||
| 16 | #include <openssl/cms.h> | |||
| 17 | #include <openssl/ess.h> | |||
| 18 | #include "crypto/ess.h" | |||
| 19 | #include "crypto/x509.h" | |||
| 20 | #include "cms_local.h" | |||
| 21 | ||||
| 22 | IMPLEMENT_ASN1_FUNCTIONS(CMS_ReceiptRequest)CMS_ReceiptRequest *d2i_CMS_ReceiptRequest(CMS_ReceiptRequest **a, const unsigned char **in, long len) { return (CMS_ReceiptRequest *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, (CMS_ReceiptRequest_it ())); } int i2d_CMS_ReceiptRequest(const CMS_ReceiptRequest * a, unsigned char **out) { return ASN1_item_i2d((const ASN1_VALUE *)a, out, (CMS_ReceiptRequest_it())); } CMS_ReceiptRequest * CMS_ReceiptRequest_new(void) { return (CMS_ReceiptRequest *)ASN1_item_new ((CMS_ReceiptRequest_it())); } void CMS_ReceiptRequest_free(CMS_ReceiptRequest *a) { ASN1_item_free((ASN1_VALUE *)a, (CMS_ReceiptRequest_it ())); } | |||
| 23 | ||||
| 24 | /* ESS services */ | |||
| 25 | ||||
| 26 | int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr) | |||
| 27 | { | |||
| 28 | ASN1_STRING *str; | |||
| 29 | CMS_ReceiptRequest *rr; | |||
| 30 | ASN1_OBJECT *obj = OBJ_nid2obj(NID_id_smime_aa_receiptRequest212); | |||
| 31 | ||||
| 32 | if (prr != NULL((void*)0)) | |||
| 33 | *prr = NULL((void*)0); | |||
| 34 | str = CMS_signed_get0_data_by_OBJ(si, obj, -3, V_ASN1_SEQUENCE16); | |||
| 35 | if (str == NULL((void*)0)) | |||
| 36 | return 0; | |||
| 37 | ||||
| 38 | rr = ASN1_item_unpack(str, ASN1_ITEM_rptr(CMS_ReceiptRequest)(CMS_ReceiptRequest_it())); | |||
| 39 | if (rr == NULL((void*)0)) | |||
| 40 | return -1; | |||
| 41 | if (prr != NULL((void*)0)) | |||
| 42 | *prr = rr; | |||
| 43 | else | |||
| 44 | CMS_ReceiptRequest_free(rr); | |||
| 45 | return 1; | |||
| 46 | } | |||
| 47 | ||||
| 48 | /* | |||
| 49 | * Returns 0 if attribute is not found, 1 if found, | |||
| 50 | * or -1 on attribute parsing failure. | |||
| 51 | */ | |||
| 52 | static int ossl_cms_signerinfo_get_signing_cert(const CMS_SignerInfo *si, | |||
| 53 | ESS_SIGNING_CERT **psc) | |||
| 54 | { | |||
| 55 | ASN1_STRING *str; | |||
| 56 | ESS_SIGNING_CERT *sc; | |||
| 57 | ASN1_OBJECT *obj = OBJ_nid2obj(NID_id_smime_aa_signingCertificate223); | |||
| 58 | ||||
| 59 | if (psc != NULL((void*)0)) | |||
| 60 | *psc = NULL((void*)0); | |||
| 61 | str = CMS_signed_get0_data_by_OBJ(si, obj, -3, V_ASN1_SEQUENCE16); | |||
| 62 | if (str == NULL((void*)0)) | |||
| 63 | return 0; | |||
| 64 | ||||
| 65 | sc = ASN1_item_unpack(str, ASN1_ITEM_rptr(ESS_SIGNING_CERT)(ESS_SIGNING_CERT_it())); | |||
| 66 | if (sc == NULL((void*)0)) | |||
| 67 | return -1; | |||
| 68 | if (psc != NULL((void*)0)) | |||
| 69 | *psc = sc; | |||
| 70 | else | |||
| 71 | ESS_SIGNING_CERT_free(sc); | |||
| 72 | return 1; | |||
| 73 | } | |||
| 74 | ||||
| 75 | /* | |||
| 76 | * Returns 0 if attribute is not found, 1 if found, | |||
| 77 | * or -1 on attribute parsing failure. | |||
| 78 | */ | |||
| 79 | static int ossl_cms_signerinfo_get_signing_cert_v2(const CMS_SignerInfo *si, | |||
| 80 | ESS_SIGNING_CERT_V2 **psc) | |||
| 81 | { | |||
| 82 | ASN1_STRING *str; | |||
| 83 | ESS_SIGNING_CERT_V2 *sc; | |||
| 84 | ASN1_OBJECT *obj = OBJ_nid2obj(NID_id_smime_aa_signingCertificateV21086); | |||
| 85 | ||||
| 86 | if (psc != NULL((void*)0)) | |||
| 87 | *psc = NULL((void*)0); | |||
| 88 | str = CMS_signed_get0_data_by_OBJ(si, obj, -3, V_ASN1_SEQUENCE16); | |||
| 89 | if (str == NULL((void*)0)) | |||
| 90 | return 0; | |||
| 91 | ||||
| 92 | sc = ASN1_item_unpack(str, ASN1_ITEM_rptr(ESS_SIGNING_CERT_V2)(ESS_SIGNING_CERT_V2_it())); | |||
| 93 | if (sc == NULL((void*)0)) | |||
| 94 | return -1; | |||
| 95 | if (psc != NULL((void*)0)) | |||
| 96 | *psc = sc; | |||
| 97 | else | |||
| 98 | ESS_SIGNING_CERT_V2_free(sc); | |||
| 99 | return 1; | |||
| 100 | } | |||
| 101 | ||||
| 102 | int ossl_cms_check_signing_certs(const CMS_SignerInfo *si, | |||
| 103 | const STACK_OF(X509)struct stack_st_X509 *chain) | |||
| 104 | { | |||
| 105 | ESS_SIGNING_CERT *ss = NULL((void*)0); | |||
| 106 | ESS_SIGNING_CERT_V2 *ssv2 = NULL((void*)0); | |||
| 107 | int ret = ossl_cms_signerinfo_get_signing_cert(si, &ss) >= 0 | |||
| 108 | && ossl_cms_signerinfo_get_signing_cert_v2(si, &ssv2) >= 0 | |||
| 109 | && OSSL_ESS_check_signing_certs(ss, ssv2, chain, 1) > 0; | |||
| 110 | ||||
| 111 | ESS_SIGNING_CERT_free(ss); | |||
| 112 | ESS_SIGNING_CERT_V2_free(ssv2); | |||
| 113 | return ret; | |||
| 114 | } | |||
| 115 | ||||
| 116 | CMS_ReceiptRequest *CMS_ReceiptRequest_create0_ex( | |||
| 117 | unsigned char *id, int idlen, int allorfirst, | |||
| 118 | STACK_OF(GENERAL_NAMES)struct stack_st_GENERAL_NAMES *receiptList, STACK_OF(GENERAL_NAMES)struct stack_st_GENERAL_NAMES *receiptsTo, | |||
| 119 | OSSL_LIB_CTX *libctx) | |||
| 120 | { | |||
| 121 | CMS_ReceiptRequest *rr; | |||
| 122 | ||||
| 123 | rr = CMS_ReceiptRequest_new(); | |||
| 124 | if (rr == NULL((void*)0)) | |||
| 125 | goto merr; | |||
| 126 | if (id) | |||
| 127 | ASN1_STRING_set0(rr->signedContentIdentifier, id, idlen); | |||
| 128 | else { | |||
| 129 | if (!ASN1_STRING_set(rr->signedContentIdentifier, NULL((void*)0), 32)) | |||
| 130 | goto merr; | |||
| 131 | if (RAND_bytes_ex(libctx, rr->signedContentIdentifier->data, 32, | |||
| 132 | 0) <= 0) | |||
| 133 | goto err; | |||
| 134 | } | |||
| 135 | ||||
| 136 | sk_GENERAL_NAMES_pop_free(rr->receiptsTo, GENERAL_NAMES_free)OPENSSL_sk_pop_free(ossl_check_GENERAL_NAMES_sk_type(rr->receiptsTo ),ossl_check_GENERAL_NAMES_freefunc_type(GENERAL_NAMES_free)); | |||
| 137 | rr->receiptsTo = receiptsTo; | |||
| 138 | ||||
| 139 | if (receiptList != NULL((void*)0)) { | |||
| 140 | rr->receiptsFrom->type = 1; | |||
| 141 | rr->receiptsFrom->d.receiptList = receiptList; | |||
| 142 | } else { | |||
| 143 | rr->receiptsFrom->type = 0; | |||
| 144 | rr->receiptsFrom->d.allOrFirstTier = allorfirst; | |||
| 145 | } | |||
| 146 | ||||
| 147 | return rr; | |||
| 148 | ||||
| 149 | merr: | |||
| 150 | ERR_raise(ERR_LIB_CMS, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,150,__func__), ERR_set_error)((46),((256|((0x1 << 18L) |(0x2 << 18L)))),((void*)0)); | |||
| 151 | ||||
| 152 | err: | |||
| 153 | CMS_ReceiptRequest_free(rr); | |||
| 154 | return NULL((void*)0); | |||
| 155 | ||||
| 156 | } | |||
| 157 | ||||
| 158 | CMS_ReceiptRequest *CMS_ReceiptRequest_create0( | |||
| 159 | unsigned char *id, int idlen, int allorfirst, | |||
| 160 | STACK_OF(GENERAL_NAMES)struct stack_st_GENERAL_NAMES *receiptList, STACK_OF(GENERAL_NAMES)struct stack_st_GENERAL_NAMES *receiptsTo) | |||
| 161 | { | |||
| 162 | return CMS_ReceiptRequest_create0_ex(id, idlen, allorfirst, receiptList, | |||
| 163 | receiptsTo, NULL((void*)0)); | |||
| 164 | } | |||
| 165 | ||||
| 166 | int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr) | |||
| 167 | { | |||
| 168 | unsigned char *rrder = NULL((void*)0); | |||
| 169 | int rrderlen, r = 0; | |||
| 170 | ||||
| 171 | rrderlen = i2d_CMS_ReceiptRequest(rr, &rrder); | |||
| 172 | if (rrderlen < 0) | |||
| 173 | goto merr; | |||
| 174 | ||||
| 175 | if (!CMS_signed_add1_attr_by_NID(si, NID_id_smime_aa_receiptRequest212, | |||
| 176 | V_ASN1_SEQUENCE16, rrder, rrderlen)) | |||
| 177 | goto merr; | |||
| 178 | ||||
| 179 | r = 1; | |||
| 180 | ||||
| 181 | merr: | |||
| 182 | if (!r) | |||
| 183 | ERR_raise(ERR_LIB_CMS, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,183,__func__), ERR_set_error)((46),((256|((0x1 << 18L) |(0x2 << 18L)))),((void*)0)); | |||
| 184 | ||||
| 185 | OPENSSL_free(rrder)CRYPTO_free(rrder, "../deps/openssl/openssl/crypto/cms/cms_ess.c" , 185); | |||
| 186 | ||||
| 187 | return r; | |||
| 188 | ||||
| 189 | } | |||
| 190 | ||||
| 191 | void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, | |||
| 192 | ASN1_STRING **pcid, | |||
| 193 | int *pallorfirst, | |||
| 194 | STACK_OF(GENERAL_NAMES)struct stack_st_GENERAL_NAMES **plist, | |||
| 195 | STACK_OF(GENERAL_NAMES)struct stack_st_GENERAL_NAMES **prto) | |||
| 196 | { | |||
| 197 | if (pcid != NULL((void*)0)) | |||
| 198 | *pcid = rr->signedContentIdentifier; | |||
| 199 | if (rr->receiptsFrom->type == 0) { | |||
| 200 | if (pallorfirst != NULL((void*)0)) | |||
| 201 | *pallorfirst = (int)rr->receiptsFrom->d.allOrFirstTier; | |||
| 202 | if (plist != NULL((void*)0)) | |||
| 203 | *plist = NULL((void*)0); | |||
| 204 | } else { | |||
| 205 | if (pallorfirst != NULL((void*)0)) | |||
| 206 | *pallorfirst = -1; | |||
| 207 | if (plist != NULL((void*)0)) | |||
| 208 | *plist = rr->receiptsFrom->d.receiptList; | |||
| 209 | } | |||
| 210 | if (prto != NULL((void*)0)) | |||
| 211 | *prto = rr->receiptsTo; | |||
| 212 | } | |||
| 213 | ||||
| 214 | /* Digest a SignerInfo structure for msgSigDigest attribute processing */ | |||
| 215 | ||||
| 216 | static int cms_msgSigDigest(CMS_SignerInfo *si, | |||
| 217 | unsigned char *dig, unsigned int *diglen) | |||
| 218 | { | |||
| 219 | const EVP_MD *md = EVP_get_digestbyobj(si->digestAlgorithm->algorithm)EVP_get_digestbyname(OBJ_nid2sn(OBJ_obj2nid(si->digestAlgorithm ->algorithm))); | |||
| ||||
| 220 | ||||
| 221 | if (md == NULL((void*)0)) | |||
| 222 | return 0; | |||
| 223 | if (!ossl_asn1_item_digest_ex(ASN1_ITEM_rptr(CMS_Attributes_Verify)(CMS_Attributes_Verify_it()), md, | |||
| 224 | si->signedAttrs, dig, diglen, | |||
| 225 | ossl_cms_ctx_get0_libctx(si->cms_ctx), | |||
| 226 | ossl_cms_ctx_get0_propq(si->cms_ctx))) | |||
| 227 | return 0; | |||
| 228 | return 1; | |||
| 229 | } | |||
| 230 | ||||
| 231 | /* Add a msgSigDigest attribute to a SignerInfo */ | |||
| 232 | ||||
| 233 | int ossl_cms_msgSigDigest_add1(CMS_SignerInfo *dest, CMS_SignerInfo *src) | |||
| 234 | { | |||
| 235 | unsigned char dig[EVP_MAX_MD_SIZE64]; | |||
| 236 | unsigned int diglen; | |||
| 237 | ||||
| 238 | if (!cms_msgSigDigest(src, dig, &diglen)) { | |||
| 239 | ERR_raise(ERR_LIB_CMS, CMS_R_MSGSIGDIGEST_ERROR)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,239,__func__), ERR_set_error)((46),(172),((void*)0)); | |||
| 240 | return 0; | |||
| 241 | } | |||
| 242 | if (!CMS_signed_add1_attr_by_NID(dest, NID_id_smime_aa_msgSigDigest216, | |||
| 243 | V_ASN1_OCTET_STRING4, dig, diglen)) { | |||
| 244 | ERR_raise(ERR_LIB_CMS, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,244,__func__), ERR_set_error)((46),((256|((0x1 << 18L) |(0x2 << 18L)))),((void*)0)); | |||
| 245 | return 0; | |||
| 246 | } | |||
| 247 | return 1; | |||
| 248 | } | |||
| 249 | ||||
| 250 | /* Verify signed receipt after it has already passed normal CMS verify */ | |||
| 251 | ||||
| 252 | int ossl_cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms) | |||
| 253 | { | |||
| 254 | int r = 0, i; | |||
| 255 | CMS_ReceiptRequest *rr = NULL((void*)0); | |||
| 256 | CMS_Receipt *rct = NULL((void*)0); | |||
| 257 | STACK_OF(CMS_SignerInfo)struct stack_st_CMS_SignerInfo *sis, *osis; | |||
| 258 | CMS_SignerInfo *si, *osi = NULL((void*)0); | |||
| ||||
| 259 | ASN1_OCTET_STRING *msig, **pcont; | |||
| 260 | ASN1_OBJECT *octype; | |||
| 261 | unsigned char dig[EVP_MAX_MD_SIZE64]; | |||
| 262 | unsigned int diglen; | |||
| 263 | ||||
| 264 | /* Get SignerInfos, also checks SignedData content type */ | |||
| 265 | osis = CMS_get0_SignerInfos(req_cms); | |||
| 266 | sis = CMS_get0_SignerInfos(cms); | |||
| 267 | if (!osis || !sis) | |||
| 268 | goto err; | |||
| 269 | ||||
| 270 | if (sk_CMS_SignerInfo_num(sis)OPENSSL_sk_num(ossl_check_const_CMS_SignerInfo_sk_type(sis)) != 1) { | |||
| 271 | ERR_raise(ERR_LIB_CMS, CMS_R_NEED_ONE_SIGNER)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,271,__func__), ERR_set_error)((46),(164),((void*)0)); | |||
| 272 | goto err; | |||
| 273 | } | |||
| 274 | ||||
| 275 | /* Check receipt content type */ | |||
| 276 | if (OBJ_obj2nid(CMS_get0_eContentType(cms)) != NID_id_smime_ct_receipt204) { | |||
| 277 | ERR_raise(ERR_LIB_CMS, CMS_R_NOT_A_SIGNED_RECEIPT)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,277,__func__), ERR_set_error)((46),(165),((void*)0)); | |||
| 278 | goto err; | |||
| 279 | } | |||
| 280 | ||||
| 281 | /* Extract and decode receipt content */ | |||
| 282 | pcont = CMS_get0_content(cms); | |||
| 283 | if (pcont == NULL((void*)0) || *pcont == NULL((void*)0)) { | |||
| 284 | ERR_raise(ERR_LIB_CMS, CMS_R_NO_CONTENT)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,284,__func__), ERR_set_error)((46),(127),((void*)0)); | |||
| 285 | goto err; | |||
| 286 | } | |||
| 287 | ||||
| 288 | rct = ASN1_item_unpack(*pcont, ASN1_ITEM_rptr(CMS_Receipt)(CMS_Receipt_it())); | |||
| 289 | ||||
| 290 | if (!rct) { | |||
| 291 | ERR_raise(ERR_LIB_CMS, CMS_R_RECEIPT_DECODE_ERROR)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,291,__func__), ERR_set_error)((46),(169),((void*)0)); | |||
| 292 | goto err; | |||
| 293 | } | |||
| 294 | ||||
| 295 | /* Locate original request */ | |||
| 296 | ||||
| 297 | for (i = 0; i < sk_CMS_SignerInfo_num(osis)OPENSSL_sk_num(ossl_check_const_CMS_SignerInfo_sk_type(osis)); i++) { | |||
| 298 | osi = sk_CMS_SignerInfo_value(osis, i)((CMS_SignerInfo *)OPENSSL_sk_value(ossl_check_const_CMS_SignerInfo_sk_type (osis), (i))); | |||
| 299 | if (!ASN1_STRING_cmp(osi->signature, rct->originatorSignatureValue)) | |||
| 300 | break; | |||
| 301 | } | |||
| 302 | ||||
| 303 | if (i == sk_CMS_SignerInfo_num(osis)OPENSSL_sk_num(ossl_check_const_CMS_SignerInfo_sk_type(osis))) { | |||
| 304 | ERR_raise(ERR_LIB_CMS, CMS_R_NO_MATCHING_SIGNATURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,304,__func__), ERR_set_error)((46),(166),((void*)0)); | |||
| 305 | goto err; | |||
| 306 | } | |||
| 307 | ||||
| 308 | si = sk_CMS_SignerInfo_value(sis, 0)((CMS_SignerInfo *)OPENSSL_sk_value(ossl_check_const_CMS_SignerInfo_sk_type (sis), (0))); | |||
| 309 | ||||
| 310 | /* Get msgSigDigest value and compare */ | |||
| 311 | ||||
| 312 | msig = CMS_signed_get0_data_by_OBJ(si, | |||
| 313 | OBJ_nid2obj | |||
| 314 | (NID_id_smime_aa_msgSigDigest216), -3, | |||
| 315 | V_ASN1_OCTET_STRING4); | |||
| 316 | ||||
| 317 | if (!msig) { | |||
| 318 | ERR_raise(ERR_LIB_CMS, CMS_R_NO_MSGSIGDIGEST)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,318,__func__), ERR_set_error)((46),(167),((void*)0)); | |||
| 319 | goto err; | |||
| 320 | } | |||
| 321 | ||||
| 322 | if (!cms_msgSigDigest(osi, dig, &diglen)) { | |||
| 323 | ERR_raise(ERR_LIB_CMS, CMS_R_MSGSIGDIGEST_ERROR)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,323,__func__), ERR_set_error)((46),(172),((void*)0)); | |||
| 324 | goto err; | |||
| 325 | } | |||
| 326 | ||||
| 327 | if (diglen != (unsigned int)msig->length) { | |||
| 328 | ERR_raise(ERR_LIB_CMS, CMS_R_MSGSIGDIGEST_WRONG_LENGTH)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,328,__func__), ERR_set_error)((46),(163),((void*)0)); | |||
| 329 | goto err; | |||
| 330 | } | |||
| 331 | ||||
| 332 | if (memcmp(dig, msig->data, diglen)) { | |||
| 333 | ERR_raise(ERR_LIB_CMS, CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,333,__func__), ERR_set_error)((46),(162),((void*)0)); | |||
| 334 | goto err; | |||
| 335 | } | |||
| 336 | ||||
| 337 | /* Compare content types */ | |||
| 338 | ||||
| 339 | octype = CMS_signed_get0_data_by_OBJ(osi, | |||
| 340 | OBJ_nid2obj(NID_pkcs9_contentType50), | |||
| 341 | -3, V_ASN1_OBJECT6); | |||
| 342 | if (!octype) { | |||
| 343 | ERR_raise(ERR_LIB_CMS, CMS_R_NO_CONTENT_TYPE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,343,__func__), ERR_set_error)((46),(173),((void*)0)); | |||
| 344 | goto err; | |||
| 345 | } | |||
| 346 | ||||
| 347 | /* Compare details in receipt request */ | |||
| 348 | ||||
| 349 | if (OBJ_cmp(octype, rct->contentType)) { | |||
| 350 | ERR_raise(ERR_LIB_CMS, CMS_R_CONTENT_TYPE_MISMATCH)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,350,__func__), ERR_set_error)((46),(171),((void*)0)); | |||
| 351 | goto err; | |||
| 352 | } | |||
| 353 | ||||
| 354 | /* Get original receipt request details */ | |||
| 355 | ||||
| 356 | if (CMS_get1_ReceiptRequest(osi, &rr) <= 0) { | |||
| 357 | ERR_raise(ERR_LIB_CMS, CMS_R_NO_RECEIPT_REQUEST)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,357,__func__), ERR_set_error)((46),(168),((void*)0)); | |||
| 358 | goto err; | |||
| 359 | } | |||
| 360 | ||||
| 361 | if (ASN1_STRING_cmp(rr->signedContentIdentifier, | |||
| 362 | rct->signedContentIdentifier)) { | |||
| 363 | ERR_raise(ERR_LIB_CMS, CMS_R_CONTENTIDENTIFIER_MISMATCH)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,363,__func__), ERR_set_error)((46),(170),((void*)0)); | |||
| 364 | goto err; | |||
| 365 | } | |||
| 366 | ||||
| 367 | r = 1; | |||
| 368 | ||||
| 369 | err: | |||
| 370 | CMS_ReceiptRequest_free(rr); | |||
| 371 | M_ASN1_free_of(rct, CMS_Receipt)ASN1_item_free(((void*) (1 ? rct : (CMS_Receipt*)0)), (CMS_Receipt_it ())); | |||
| 372 | return r; | |||
| 373 | ||||
| 374 | } | |||
| 375 | ||||
| 376 | /* | |||
| 377 | * Encode a Receipt into an OCTET STRING read for including into content of a | |||
| 378 | * SignedData ContentInfo. | |||
| 379 | */ | |||
| 380 | ||||
| 381 | ASN1_OCTET_STRING *ossl_cms_encode_Receipt(CMS_SignerInfo *si) | |||
| 382 | { | |||
| 383 | CMS_Receipt rct; | |||
| 384 | CMS_ReceiptRequest *rr = NULL((void*)0); | |||
| 385 | ASN1_OBJECT *ctype; | |||
| 386 | ASN1_OCTET_STRING *os = NULL((void*)0); | |||
| 387 | ||||
| 388 | /* Get original receipt request */ | |||
| 389 | ||||
| 390 | /* Get original receipt request details */ | |||
| 391 | ||||
| 392 | if (CMS_get1_ReceiptRequest(si, &rr) <= 0) { | |||
| 393 | ERR_raise(ERR_LIB_CMS, CMS_R_NO_RECEIPT_REQUEST)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,393,__func__), ERR_set_error)((46),(168),((void*)0)); | |||
| 394 | goto err; | |||
| 395 | } | |||
| 396 | ||||
| 397 | /* Get original content type */ | |||
| 398 | ||||
| 399 | ctype = CMS_signed_get0_data_by_OBJ(si, | |||
| 400 | OBJ_nid2obj(NID_pkcs9_contentType50), | |||
| 401 | -3, V_ASN1_OBJECT6); | |||
| 402 | if (!ctype) { | |||
| 403 | ERR_raise(ERR_LIB_CMS, CMS_R_NO_CONTENT_TYPE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_ess.c" ,403,__func__), ERR_set_error)((46),(173),((void*)0)); | |||
| 404 | goto err; | |||
| 405 | } | |||
| 406 | ||||
| 407 | rct.version = 1; | |||
| 408 | rct.contentType = ctype; | |||
| 409 | rct.signedContentIdentifier = rr->signedContentIdentifier; | |||
| 410 | rct.originatorSignatureValue = si->signature; | |||
| 411 | ||||
| 412 | os = ASN1_item_pack(&rct, ASN1_ITEM_rptr(CMS_Receipt)(CMS_Receipt_it()), NULL((void*)0)); | |||
| 413 | ||||
| 414 | err: | |||
| 415 | CMS_ReceiptRequest_free(rr); | |||
| 416 | return os; | |||
| 417 | } |