xref: /openbsd-src/lib/libcrypto/pkcs7/pk7_mime.c (revision 5fd44ab703ab05845f5818cf1f0c04c2b623b883)
1*5fd44ab7Stb /* $OpenBSD: pk7_mime.c,v 1.20 2024/01/25 13:44:08 tb Exp $ */
2e6841c1dSdjm /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
34fcf65c5Sdjm  * project.
4ba5406e9Sbeck  */
5ba5406e9Sbeck /* ====================================================================
66d388760Sdjm  * Copyright (c) 1999-2005 The OpenSSL Project.  All rights reserved.
7ba5406e9Sbeck  *
8ba5406e9Sbeck  * Redistribution and use in source and binary forms, with or without
9ba5406e9Sbeck  * modification, are permitted provided that the following conditions
10ba5406e9Sbeck  * are met:
11ba5406e9Sbeck  *
12ba5406e9Sbeck  * 1. Redistributions of source code must retain the above copyright
13ba5406e9Sbeck  *    notice, this list of conditions and the following disclaimer.
14ba5406e9Sbeck  *
15ba5406e9Sbeck  * 2. Redistributions in binary form must reproduce the above copyright
16ba5406e9Sbeck  *    notice, this list of conditions and the following disclaimer in
17ba5406e9Sbeck  *    the documentation and/or other materials provided with the
18ba5406e9Sbeck  *    distribution.
19ba5406e9Sbeck  *
20ba5406e9Sbeck  * 3. All advertising materials mentioning features or use of this
21ba5406e9Sbeck  *    software must display the following acknowledgment:
22ba5406e9Sbeck  *    "This product includes software developed by the OpenSSL Project
23ba5406e9Sbeck  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24ba5406e9Sbeck  *
25ba5406e9Sbeck  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26ba5406e9Sbeck  *    endorse or promote products derived from this software without
27ba5406e9Sbeck  *    prior written permission. For written permission, please contact
28ba5406e9Sbeck  *    licensing@OpenSSL.org.
29ba5406e9Sbeck  *
30ba5406e9Sbeck  * 5. Products derived from this software may not be called "OpenSSL"
31ba5406e9Sbeck  *    nor may "OpenSSL" appear in their names without prior written
32ba5406e9Sbeck  *    permission of the OpenSSL Project.
33ba5406e9Sbeck  *
34ba5406e9Sbeck  * 6. Redistributions of any form whatsoever must retain the following
35ba5406e9Sbeck  *    acknowledgment:
36ba5406e9Sbeck  *    "This product includes software developed by the OpenSSL Project
37ba5406e9Sbeck  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38ba5406e9Sbeck  *
39ba5406e9Sbeck  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40ba5406e9Sbeck  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41ba5406e9Sbeck  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42ba5406e9Sbeck  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43ba5406e9Sbeck  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44ba5406e9Sbeck  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45ba5406e9Sbeck  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46ba5406e9Sbeck  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47ba5406e9Sbeck  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48ba5406e9Sbeck  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49ba5406e9Sbeck  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50ba5406e9Sbeck  * OF THE POSSIBILITY OF SUCH DAMAGE.
51ba5406e9Sbeck  * ====================================================================
52ba5406e9Sbeck  *
53ba5406e9Sbeck  */
54ba5406e9Sbeck 
55ba5406e9Sbeck #include <ctype.h>
56b6ab114eSjsing #include <stdio.h>
57b6ab114eSjsing 
58b6ab114eSjsing #include <openssl/asn1.h>
59ba5406e9Sbeck #include <openssl/x509.h>
60ba5406e9Sbeck 
612b5e1227Stb #include "asn1_local.h"
622b5e1227Stb 
630a5d6edeSdjm /* PKCS#7 wrappers round generalised stream and MIME routines */
64841512abStb BIO *
BIO_new_PKCS7(BIO * out,PKCS7 * p7)65841512abStb BIO_new_PKCS7(BIO *out, PKCS7 *p7)
66841512abStb {
67841512abStb 	return BIO_new_NDEF(out, (ASN1_VALUE *)p7, &PKCS7_it);
68841512abStb }
69841512abStb LCRYPTO_ALIAS(BIO_new_PKCS7);
70ba5406e9Sbeck 
71cace2641Sjsing int
i2d_PKCS7_bio_stream(BIO * out,PKCS7 * p7,BIO * in,int flags)72cace2641Sjsing i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in, int flags)
73ba5406e9Sbeck {
74b061a02fStb 	return i2d_ASN1_bio_stream(out, (ASN1_VALUE *)p7, in, flags, &PKCS7_it);
75ba5406e9Sbeck }
76cedac418Stb LCRYPTO_ALIAS(i2d_PKCS7_bio_stream);
77ba5406e9Sbeck 
78cace2641Sjsing int
PEM_write_bio_PKCS7_stream(BIO * out,PKCS7 * p7,BIO * in,int flags)79cace2641Sjsing PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in, int flags)
80ba5406e9Sbeck {
810a5d6edeSdjm 	return PEM_write_bio_ASN1_stream(out, (ASN1_VALUE *) p7, in, flags,
82cd8ba489Sjsing 	    "PKCS7", &PKCS7_it);
83ba5406e9Sbeck }
84cedac418Stb LCRYPTO_ALIAS(PEM_write_bio_PKCS7_stream);
85ba5406e9Sbeck 
86cace2641Sjsing int
SMIME_write_PKCS7(BIO * bio,PKCS7 * p7,BIO * data,int flags)87cace2641Sjsing SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags)
88ba5406e9Sbeck {
89158e7cafStb 	STACK_OF(X509_ALGOR) *mdalgs = NULL;
90158e7cafStb 	int ctype_nid;
91158e7cafStb 
92*5fd44ab7Stb 	if ((ctype_nid = OBJ_obj2nid(p7->type)) == NID_pkcs7_signed) {
93*5fd44ab7Stb 		if (p7->d.sign == NULL)
94*5fd44ab7Stb 			return 0;
950a5d6edeSdjm 		mdalgs = p7->d.sign->md_algs;
96*5fd44ab7Stb 	}
976d388760Sdjm 
980a5d6edeSdjm 	flags ^= SMIME_OLDMIME;
990a5d6edeSdjm 
1000a5d6edeSdjm 	return SMIME_write_ASN1(bio, (ASN1_VALUE *)p7, data, flags,
101cd8ba489Sjsing 	    ctype_nid, NID_undef, mdalgs, &PKCS7_it);
102ba5406e9Sbeck }
103cedac418Stb LCRYPTO_ALIAS(SMIME_write_PKCS7);
104ba5406e9Sbeck 
105cace2641Sjsing PKCS7 *
SMIME_read_PKCS7(BIO * bio,BIO ** bcont)106cace2641Sjsing SMIME_read_PKCS7(BIO *bio, BIO **bcont)
107ba5406e9Sbeck {
108cd8ba489Sjsing 	return (PKCS7 *)SMIME_read_ASN1(bio, bcont, &PKCS7_it);
109cdc51833Smarkus }
110cedac418Stb LCRYPTO_ALIAS(SMIME_read_PKCS7);
111