cms_io.c revision 183234
1/* crypto/cms/cms_io.c */ 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3 * project. 4 */ 5/* ==================================================================== 6 * Copyright (c) 2008 The OpenSSL Project. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in 17 * the documentation and/or other materials provided with the 18 * distribution. 19 * 20 * 3. All advertising materials mentioning features or use of this 21 * software must display the following acknowledgment: 22 * "This product includes software developed by the OpenSSL Project 23 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 24 * 25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26 * endorse or promote products derived from this software without 27 * prior written permission. For written permission, please contact 28 * licensing@OpenSSL.org. 29 * 30 * 5. Products derived from this software may not be called "OpenSSL" 31 * nor may "OpenSSL" appear in their names without prior written 32 * permission of the OpenSSL Project. 33 * 34 * 6. Redistributions of any form whatsoever must retain the following 35 * acknowledgment: 36 * "This product includes software developed by the OpenSSL Project 37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 38 * 39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50 * OF THE POSSIBILITY OF SUCH DAMAGE. 51 * ==================================================================== 52 */ 53 54#include <openssl/asn1t.h> 55#include <openssl/x509.h> 56#include <openssl/err.h> 57#include <openssl/pem.h> 58#include "cms.h" 59#include "cms_lcl.h" 60 61CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms) 62 { 63 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms); 64 } 65 66int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms) 67 { 68 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms); 69 } 70 71IMPLEMENT_PEM_rw_const(CMS, CMS_ContentInfo, PEM_STRING_CMS, CMS_ContentInfo) 72 73/* Callback for int_smime_write_ASN1 */ 74 75static int cms_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, 76 const ASN1_ITEM *it) 77 { 78 CMS_ContentInfo *cms = (CMS_ContentInfo *)val; 79 BIO *tmpbio, *cmsbio; 80 int r = 0; 81 82 if (!(flags & SMIME_DETACHED)) 83 { 84 SMIME_crlf_copy(data, out, flags); 85 return 1; 86 } 87 88 /* Let CMS code prepend any needed BIOs */ 89 90 cmsbio = CMS_dataInit(cms, out); 91 92 if (!cmsbio) 93 return 0; 94 95 /* Copy data across, passing through filter BIOs for processing */ 96 SMIME_crlf_copy(data, cmsbio, flags); 97 98 /* Finalize structure */ 99 if (CMS_dataFinal(cms, cmsbio) <= 0) 100 goto err; 101 102 r = 1; 103 104 err: 105 106 /* Now remove any digests prepended to the BIO */ 107 108 while (cmsbio != out) 109 { 110 tmpbio = BIO_pop(cmsbio); 111 BIO_free(cmsbio); 112 cmsbio = tmpbio; 113 } 114 115 return 1; 116 117 } 118 119 120int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags) 121 { 122 STACK_OF(X509_ALGOR) *mdalgs; 123 int ctype_nid = OBJ_obj2nid(cms->contentType); 124 int econt_nid = OBJ_obj2nid(CMS_get0_eContentType(cms)); 125 if (ctype_nid == NID_pkcs7_signed) 126 mdalgs = cms->d.signedData->digestAlgorithms; 127 else 128 mdalgs = NULL; 129 130 return int_smime_write_ASN1(bio, (ASN1_VALUE *)cms, data, flags, 131 ctype_nid, econt_nid, mdalgs, 132 cms_output_data, 133 ASN1_ITEM_rptr(CMS_ContentInfo)); 134 } 135 136CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont) 137 { 138 return (CMS_ContentInfo *)SMIME_read_ASN1(bio, bcont, 139 ASN1_ITEM_rptr(CMS_ContentInfo)); 140 } 141