xref: /freebsd/crypto/openssl/crypto/cms/cms_io.c (revision e71b7053)
16f9291ceSJung-uk Kim /*
2*e71b7053SJung-uk Kim  * Copyright 2008-2016 The OpenSSL Project Authors. All Rights Reserved.
3db522d3aSSimon L. B. Nielsen  *
4*e71b7053SJung-uk Kim  * Licensed under the OpenSSL license (the "License").  You may not use
5*e71b7053SJung-uk Kim  * this file except in compliance with the License.  You can obtain a copy
6*e71b7053SJung-uk Kim  * in the file LICENSE in the source distribution or at
7*e71b7053SJung-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>
14*e71b7053SJung-uk Kim #include <openssl/cms.h>
15db522d3aSSimon L. B. Nielsen #include "cms_lcl.h"
16db522d3aSSimon L. B. Nielsen 
171f13597dSJung-uk Kim int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms)
181f13597dSJung-uk Kim {
191f13597dSJung-uk Kim     ASN1_OCTET_STRING **pos;
201f13597dSJung-uk Kim     pos = CMS_get0_content(cms);
21*e71b7053SJung-uk Kim     if (pos == NULL)
221f13597dSJung-uk Kim         return 0;
23*e71b7053SJung-uk Kim     if (*pos == NULL)
241f13597dSJung-uk Kim         *pos = ASN1_OCTET_STRING_new();
25*e71b7053SJung-uk Kim     if (*pos != NULL) {
261f13597dSJung-uk Kim         (*pos)->flags |= ASN1_STRING_FLAG_NDEF;
271f13597dSJung-uk Kim         (*pos)->flags &= ~ASN1_STRING_FLAG_CONT;
281f13597dSJung-uk Kim         *boundary = &(*pos)->data;
291f13597dSJung-uk Kim         return 1;
301f13597dSJung-uk Kim     }
311f13597dSJung-uk Kim     CMSerr(CMS_F_CMS_STREAM, ERR_R_MALLOC_FAILURE);
321f13597dSJung-uk Kim     return 0;
331f13597dSJung-uk Kim }
341f13597dSJung-uk Kim 
35db522d3aSSimon L. B. Nielsen CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms)
36db522d3aSSimon L. B. Nielsen {
37db522d3aSSimon L. B. Nielsen     return ASN1_item_d2i_bio(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms);
38db522d3aSSimon L. B. Nielsen }
39db522d3aSSimon L. B. Nielsen 
40db522d3aSSimon L. B. Nielsen int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms)
41db522d3aSSimon L. B. Nielsen {
42db522d3aSSimon L. B. Nielsen     return ASN1_item_i2d_bio(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms);
43db522d3aSSimon L. B. Nielsen }
44db522d3aSSimon L. B. Nielsen 
45db522d3aSSimon L. B. Nielsen IMPLEMENT_PEM_rw_const(CMS, CMS_ContentInfo, PEM_STRING_CMS, CMS_ContentInfo)
46db522d3aSSimon L. B. Nielsen 
471f13597dSJung-uk Kim BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms)
48db522d3aSSimon L. B. Nielsen {
491f13597dSJung-uk Kim     return BIO_new_NDEF(out, (ASN1_VALUE *)cms,
501f13597dSJung-uk Kim                         ASN1_ITEM_rptr(CMS_ContentInfo));
51db522d3aSSimon L. B. Nielsen }
52db522d3aSSimon L. B. Nielsen 
531f13597dSJung-uk Kim /* CMS wrappers round generalised stream and MIME routines */
54db522d3aSSimon L. B. Nielsen 
551f13597dSJung-uk Kim int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags)
56db522d3aSSimon L. B. Nielsen {
571f13597dSJung-uk Kim     return i2d_ASN1_bio_stream(out, (ASN1_VALUE *)cms, in, flags,
581f13597dSJung-uk Kim                                ASN1_ITEM_rptr(CMS_ContentInfo));
59db522d3aSSimon L. B. Nielsen }
60db522d3aSSimon L. B. Nielsen 
616f9291ceSJung-uk Kim int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in,
626f9291ceSJung-uk Kim                              int flags)
631f13597dSJung-uk Kim {
641f13597dSJung-uk Kim     return PEM_write_bio_ASN1_stream(out, (ASN1_VALUE *)cms, in, flags,
656f9291ceSJung-uk Kim                                      "CMS", ASN1_ITEM_rptr(CMS_ContentInfo));
66db522d3aSSimon L. B. Nielsen }
67db522d3aSSimon L. B. Nielsen 
68db522d3aSSimon L. B. Nielsen int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags)
69db522d3aSSimon L. B. Nielsen {
70db522d3aSSimon L. B. Nielsen     STACK_OF(X509_ALGOR) *mdalgs;
71db522d3aSSimon L. B. Nielsen     int ctype_nid = OBJ_obj2nid(cms->contentType);
72db522d3aSSimon L. B. Nielsen     int econt_nid = OBJ_obj2nid(CMS_get0_eContentType(cms));
73db522d3aSSimon L. B. Nielsen     if (ctype_nid == NID_pkcs7_signed)
74db522d3aSSimon L. B. Nielsen         mdalgs = cms->d.signedData->digestAlgorithms;
75db522d3aSSimon L. B. Nielsen     else
76db522d3aSSimon L. B. Nielsen         mdalgs = NULL;
77db522d3aSSimon L. B. Nielsen 
781f13597dSJung-uk Kim     return SMIME_write_ASN1(bio, (ASN1_VALUE *)cms, data, flags,
79db522d3aSSimon L. B. Nielsen                             ctype_nid, econt_nid, mdalgs,
80db522d3aSSimon L. B. Nielsen                             ASN1_ITEM_rptr(CMS_ContentInfo));
81db522d3aSSimon L. B. Nielsen }
82db522d3aSSimon L. B. Nielsen 
83db522d3aSSimon L. B. Nielsen CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont)
84db522d3aSSimon L. B. Nielsen {
85db522d3aSSimon L. B. Nielsen     return (CMS_ContentInfo *)SMIME_read_ASN1(bio, bcont,
866f9291ceSJung-uk Kim                                               ASN1_ITEM_rptr
876f9291ceSJung-uk Kim                                               (CMS_ContentInfo));
88db522d3aSSimon L. B. Nielsen }
89