xref: /freebsd/crypto/openssl/crypto/pkcs7/pk7_mime.c (revision e0c4386e)
16f9291ceSJung-uk Kim /*
2e0c4386eSCy Schubert  * Copyright 1999-2024 The OpenSSL Project Authors. All Rights Reserved.
3f579bf8eSKris Kennaway  *
4b077aed3SPierre 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
8f579bf8eSKris Kennaway  */
9f579bf8eSKris Kennaway 
10f579bf8eSKris Kennaway #include <stdio.h>
11e71b7053SJung-uk Kim #include "internal/cryptlib.h"
12f579bf8eSKris Kennaway #include <openssl/x509.h>
136a599222SSimon L. B. Nielsen #include <openssl/asn1.h>
14b077aed3SPierre Pronchery #include "pk7_local.h"
15f579bf8eSKris Kennaway 
161f13597dSJung-uk Kim /* PKCS#7 wrappers round generalised stream and MIME routines */
17f579bf8eSKris Kennaway 
i2d_PKCS7_bio_stream(BIO * out,PKCS7 * p7,BIO * in,int flags)181f13597dSJung-uk Kim int i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in, int flags)
19f579bf8eSKris Kennaway {
201f13597dSJung-uk Kim     return i2d_ASN1_bio_stream(out, (ASN1_VALUE *)p7, in, flags,
211f13597dSJung-uk Kim                                ASN1_ITEM_rptr(PKCS7));
22f579bf8eSKris Kennaway }
23f579bf8eSKris Kennaway 
PEM_write_bio_PKCS7_stream(BIO * out,PKCS7 * p7,BIO * in,int flags)241f13597dSJung-uk Kim int PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in, int flags)
25f579bf8eSKris Kennaway {
261f13597dSJung-uk Kim     return PEM_write_bio_ASN1_stream(out, (ASN1_VALUE *)p7, in, flags,
276f9291ceSJung-uk Kim                                      "PKCS7", ASN1_ITEM_rptr(PKCS7));
283b4e3dcbSSimon L. B. Nielsen }
293b4e3dcbSSimon L. B. Nielsen 
SMIME_write_PKCS7(BIO * bio,PKCS7 * p7,BIO * data,int flags)306a599222SSimon L. B. Nielsen int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags)
31f579bf8eSKris Kennaway {
326a599222SSimon L. B. Nielsen     STACK_OF(X509_ALGOR) *mdalgs;
336a599222SSimon L. B. Nielsen     int ctype_nid = OBJ_obj2nid(p7->type);
34b077aed3SPierre Pronchery     const PKCS7_CTX *ctx = ossl_pkcs7_get0_ctx(p7);
35b077aed3SPierre Pronchery 
36e0c4386eSCy Schubert     if (ctype_nid == NID_pkcs7_signed) {
37e0c4386eSCy Schubert         if (p7->d.sign == NULL)
38e0c4386eSCy Schubert             return 0;
396a599222SSimon L. B. Nielsen         mdalgs = p7->d.sign->md_algs;
40e0c4386eSCy Schubert     } else {
416a599222SSimon L. B. Nielsen         mdalgs = NULL;
42e0c4386eSCy Schubert     }
43f579bf8eSKris Kennaway 
441f13597dSJung-uk Kim     flags ^= SMIME_OLDMIME;
451f13597dSJung-uk Kim 
46b077aed3SPierre Pronchery     return SMIME_write_ASN1_ex(bio, (ASN1_VALUE *)p7, data, flags, ctype_nid,
47b077aed3SPierre Pronchery                                NID_undef, mdalgs, ASN1_ITEM_rptr(PKCS7),
48b077aed3SPierre Pronchery                                ossl_pkcs7_ctx_get0_libctx(ctx),
49b077aed3SPierre Pronchery                                ossl_pkcs7_ctx_get0_propq(ctx));
50b077aed3SPierre Pronchery }
51b077aed3SPierre Pronchery 
SMIME_read_PKCS7_ex(BIO * bio,BIO ** bcont,PKCS7 ** p7)52b077aed3SPierre Pronchery PKCS7 *SMIME_read_PKCS7_ex(BIO *bio, BIO **bcont, PKCS7 **p7)
53b077aed3SPierre Pronchery {
54b077aed3SPierre Pronchery     PKCS7 *ret;
55b077aed3SPierre Pronchery     OSSL_LIB_CTX *libctx = NULL;
56b077aed3SPierre Pronchery     const char *propq = NULL;
57b077aed3SPierre Pronchery 
58b077aed3SPierre Pronchery     if (p7 != NULL && *p7 != NULL) {
59b077aed3SPierre Pronchery         libctx = (*p7)->ctx.libctx;
60b077aed3SPierre Pronchery         propq = (*p7)->ctx.propq;
61b077aed3SPierre Pronchery     }
62b077aed3SPierre Pronchery 
63b077aed3SPierre Pronchery     ret = (PKCS7 *)SMIME_read_ASN1_ex(bio, 0, bcont, ASN1_ITEM_rptr(PKCS7),
64b077aed3SPierre Pronchery                                       (ASN1_VALUE **)p7, libctx, propq);
65b077aed3SPierre Pronchery     if (ret != NULL)
66b077aed3SPierre Pronchery         ossl_pkcs7_resolve_libctx(ret);
67b077aed3SPierre Pronchery     return ret;
6850ef0093SJacques Vidrine }
691f13597dSJung-uk Kim 
SMIME_read_PKCS7(BIO * bio,BIO ** bcont)701f13597dSJung-uk Kim PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont)
711f13597dSJung-uk Kim {
72b077aed3SPierre Pronchery     return SMIME_read_PKCS7_ex(bio, bcont, NULL);
731f13597dSJung-uk Kim }
74