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