xref: /freebsd/crypto/openssl/crypto/cms/cms_io.c (revision b077aed3)
16f9291ceSJung-uk Kim /*
2*b077aed3SPierre Pronchery  * Copyright 2008-2022 The OpenSSL Project Authors. All Rights Reserved.
3db522d3aSSimon L. B. Nielsen  *
4*b077aed3SPierre Pronchery  * Licensed under the Apache License 2.0 (the "License").  You may not use
5e71b7053SJung-uk Kim  * this file except in compliance with the License.  You can obtain a copy
6e71b7053SJung-uk Kim  * in the file LICENSE in the source distribution or at
7e71b7053SJung-uk Kim  * https://www.openssl.org/source/license.html
8db522d3aSSimon L. B. Nielsen  */
9db522d3aSSimon L. B. Nielsen 
10db522d3aSSimon L. B. Nielsen #include <openssl/asn1t.h>
11db522d3aSSimon L. B. Nielsen #include <openssl/x509.h>
12db522d3aSSimon L. B. Nielsen #include <openssl/err.h>
13db522d3aSSimon L. B. Nielsen #include <openssl/pem.h>
14e71b7053SJung-uk Kim #include <openssl/cms.h>
1517f01e99SJung-uk Kim #include "cms_local.h"
16db522d3aSSimon L. B. Nielsen 
17*b077aed3SPierre Pronchery /* unfortunately cannot constify BIO_new_NDEF() due to this and PKCS7_stream() */
CMS_stream(unsigned char *** boundary,CMS_ContentInfo * cms)181f13597dSJung-uk Kim int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms)
191f13597dSJung-uk Kim {
201f13597dSJung-uk Kim     ASN1_OCTET_STRING **pos;
211f13597dSJung-uk Kim     pos = CMS_get0_content(cms);
22e71b7053SJung-uk Kim     if (pos == NULL)
231f13597dSJung-uk Kim         return 0;
24e71b7053SJung-uk Kim     if (*pos == NULL)
251f13597dSJung-uk Kim         *pos = ASN1_OCTET_STRING_new();
26e71b7053SJung-uk Kim     if (*pos != NULL) {
271f13597dSJung-uk Kim         (*pos)->flags |= ASN1_STRING_FLAG_NDEF;
281f13597dSJung-uk Kim         (*pos)->flags &= ~ASN1_STRING_FLAG_CONT;
291f13597dSJung-uk Kim         *boundary = &(*pos)->data;
301f13597dSJung-uk Kim         return 1;
311f13597dSJung-uk Kim     }
32*b077aed3SPierre Pronchery     ERR_raise(ERR_LIB_CMS, ERR_R_MALLOC_FAILURE);
331f13597dSJung-uk Kim     return 0;
341f13597dSJung-uk Kim }
351f13597dSJung-uk Kim 
d2i_CMS_bio(BIO * bp,CMS_ContentInfo ** cms)36db522d3aSSimon L. B. Nielsen CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms)
37db522d3aSSimon L. B. Nielsen {
38*b077aed3SPierre Pronchery     CMS_ContentInfo *ci;
39*b077aed3SPierre Pronchery     const CMS_CTX *ctx = ossl_cms_get0_cmsctx(cms == NULL ? NULL : *cms);
40*b077aed3SPierre Pronchery 
41*b077aed3SPierre Pronchery     ci = ASN1_item_d2i_bio_ex(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms,
42*b077aed3SPierre Pronchery                               ossl_cms_ctx_get0_libctx(ctx),
43*b077aed3SPierre Pronchery                               ossl_cms_ctx_get0_propq(ctx));
44*b077aed3SPierre Pronchery     if (ci != NULL) {
45*b077aed3SPierre Pronchery         ERR_set_mark();
46*b077aed3SPierre Pronchery         ossl_cms_resolve_libctx(ci);
47*b077aed3SPierre Pronchery         ERR_pop_to_mark();
48*b077aed3SPierre Pronchery     }
49*b077aed3SPierre Pronchery     return ci;
50db522d3aSSimon L. B. Nielsen }
51db522d3aSSimon L. B. Nielsen 
i2d_CMS_bio(BIO * bp,CMS_ContentInfo * cms)52db522d3aSSimon L. B. Nielsen int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms)
53db522d3aSSimon L. B. Nielsen {
54db522d3aSSimon L. B. Nielsen     return ASN1_item_i2d_bio(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms);
55db522d3aSSimon L. B. Nielsen }
56db522d3aSSimon L. B. Nielsen 
IMPLEMENT_PEM_rw(CMS,CMS_ContentInfo,PEM_STRING_CMS,CMS_ContentInfo)57*b077aed3SPierre Pronchery IMPLEMENT_PEM_rw(CMS, CMS_ContentInfo, PEM_STRING_CMS, CMS_ContentInfo)
58db522d3aSSimon L. B. Nielsen 
591f13597dSJung-uk Kim BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms)
60db522d3aSSimon L. B. Nielsen {
611f13597dSJung-uk Kim     return BIO_new_NDEF(out, (ASN1_VALUE *)cms,
621f13597dSJung-uk Kim                         ASN1_ITEM_rptr(CMS_ContentInfo));
63db522d3aSSimon L. B. Nielsen }
64db522d3aSSimon L. B. Nielsen 
651f13597dSJung-uk Kim /* CMS wrappers round generalised stream and MIME routines */
66db522d3aSSimon L. B. Nielsen 
i2d_CMS_bio_stream(BIO * out,CMS_ContentInfo * cms,BIO * in,int flags)671f13597dSJung-uk Kim int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags)
68db522d3aSSimon L. B. Nielsen {
691f13597dSJung-uk Kim     return i2d_ASN1_bio_stream(out, (ASN1_VALUE *)cms, in, flags,
701f13597dSJung-uk Kim                                ASN1_ITEM_rptr(CMS_ContentInfo));
71db522d3aSSimon L. B. Nielsen }
72db522d3aSSimon L. B. Nielsen 
PEM_write_bio_CMS_stream(BIO * out,CMS_ContentInfo * cms,BIO * in,int flags)736f9291ceSJung-uk Kim int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in,
746f9291ceSJung-uk Kim                              int flags)
751f13597dSJung-uk Kim {
761f13597dSJung-uk Kim     return PEM_write_bio_ASN1_stream(out, (ASN1_VALUE *)cms, in, flags,
776f9291ceSJung-uk Kim                                      "CMS", ASN1_ITEM_rptr(CMS_ContentInfo));
78db522d3aSSimon L. B. Nielsen }
79db522d3aSSimon L. B. Nielsen 
SMIME_write_CMS(BIO * bio,CMS_ContentInfo * cms,BIO * data,int flags)80db522d3aSSimon L. B. Nielsen int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags)
81db522d3aSSimon L. B. Nielsen {
82db522d3aSSimon L. B. Nielsen     STACK_OF(X509_ALGOR) *mdalgs;
83db522d3aSSimon L. B. Nielsen     int ctype_nid = OBJ_obj2nid(cms->contentType);
84db522d3aSSimon L. B. Nielsen     int econt_nid = OBJ_obj2nid(CMS_get0_eContentType(cms));
85*b077aed3SPierre Pronchery     const CMS_CTX *ctx = ossl_cms_get0_cmsctx(cms);
86*b077aed3SPierre Pronchery 
87db522d3aSSimon L. B. Nielsen     if (ctype_nid == NID_pkcs7_signed)
88db522d3aSSimon L. B. Nielsen         mdalgs = cms->d.signedData->digestAlgorithms;
89db522d3aSSimon L. B. Nielsen     else
90db522d3aSSimon L. B. Nielsen         mdalgs = NULL;
91db522d3aSSimon L. B. Nielsen 
92*b077aed3SPierre Pronchery     return SMIME_write_ASN1_ex(bio, (ASN1_VALUE *)cms, data, flags, ctype_nid,
93*b077aed3SPierre Pronchery                                econt_nid, mdalgs,
94*b077aed3SPierre Pronchery                                ASN1_ITEM_rptr(CMS_ContentInfo),
95*b077aed3SPierre Pronchery                                ossl_cms_ctx_get0_libctx(ctx),
96*b077aed3SPierre Pronchery                                ossl_cms_ctx_get0_propq(ctx));
97*b077aed3SPierre Pronchery }
98*b077aed3SPierre Pronchery 
SMIME_read_CMS_ex(BIO * bio,int flags,BIO ** bcont,CMS_ContentInfo ** cms)99*b077aed3SPierre Pronchery CMS_ContentInfo *SMIME_read_CMS_ex(BIO *bio, int flags, BIO **bcont,
100*b077aed3SPierre Pronchery                                    CMS_ContentInfo **cms)
101*b077aed3SPierre Pronchery {
102*b077aed3SPierre Pronchery     CMS_ContentInfo *ci;
103*b077aed3SPierre Pronchery     const CMS_CTX *ctx = ossl_cms_get0_cmsctx(cms == NULL ? NULL : *cms);
104*b077aed3SPierre Pronchery 
105*b077aed3SPierre Pronchery     ci = (CMS_ContentInfo *)SMIME_read_ASN1_ex(bio, flags, bcont,
106*b077aed3SPierre Pronchery                                                ASN1_ITEM_rptr(CMS_ContentInfo),
107*b077aed3SPierre Pronchery                                                (ASN1_VALUE **)cms,
108*b077aed3SPierre Pronchery                                                ossl_cms_ctx_get0_libctx(ctx),
109*b077aed3SPierre Pronchery                                                ossl_cms_ctx_get0_propq(ctx));
110*b077aed3SPierre Pronchery     if (ci != NULL) {
111*b077aed3SPierre Pronchery         ERR_set_mark();
112*b077aed3SPierre Pronchery         ossl_cms_resolve_libctx(ci);
113*b077aed3SPierre Pronchery         ERR_pop_to_mark();
114*b077aed3SPierre Pronchery     }
115*b077aed3SPierre Pronchery     return ci;
116db522d3aSSimon L. B. Nielsen }
117db522d3aSSimon L. B. Nielsen 
SMIME_read_CMS(BIO * bio,BIO ** bcont)118db522d3aSSimon L. B. Nielsen CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont)
119db522d3aSSimon L. B. Nielsen {
120*b077aed3SPierre Pronchery     return SMIME_read_CMS_ex(bio, 0, bcont, NULL);
121db522d3aSSimon L. B. Nielsen }
122