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