diff options
Diffstat (limited to 'src/lib/libcrypto/cms/cms_io.c')
-rw-r--r-- | src/lib/libcrypto/cms/cms_io.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/lib/libcrypto/cms/cms_io.c b/src/lib/libcrypto/cms/cms_io.c new file mode 100644 index 0000000000..d18f980a97 --- /dev/null +++ b/src/lib/libcrypto/cms/cms_io.c | |||
@@ -0,0 +1,88 @@ | |||
1 | /* | ||
2 | * Copyright 2008-2016 The OpenSSL Project Authors. All Rights Reserved. | ||
3 | * | ||
4 | * Licensed under the OpenSSL license (the "License"). You may not use | ||
5 | * this file except in compliance with the License. You can obtain a copy | ||
6 | * in the file LICENSE in the source distribution or at | ||
7 | * https://www.openssl.org/source/license.html | ||
8 | */ | ||
9 | |||
10 | #include <openssl/asn1t.h> | ||
11 | #include <openssl/x509.h> | ||
12 | #include <openssl/err.h> | ||
13 | #include <openssl/pem.h> | ||
14 | #include <openssl/cms.h> | ||
15 | #include "cms_lcl.h" | ||
16 | |||
17 | int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms) | ||
18 | { | ||
19 | ASN1_OCTET_STRING **pos; | ||
20 | pos = CMS_get0_content(cms); | ||
21 | if (pos == NULL) | ||
22 | return 0; | ||
23 | if (*pos == NULL) | ||
24 | *pos = ASN1_OCTET_STRING_new(); | ||
25 | if (*pos != NULL) { | ||
26 | (*pos)->flags |= ASN1_STRING_FLAG_NDEF; | ||
27 | (*pos)->flags &= ~ASN1_STRING_FLAG_CONT; | ||
28 | *boundary = &(*pos)->data; | ||
29 | return 1; | ||
30 | } | ||
31 | CMSerr(CMS_F_CMS_STREAM, ERR_R_MALLOC_FAILURE); | ||
32 | return 0; | ||
33 | } | ||
34 | |||
35 | CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms) | ||
36 | { | ||
37 | return ASN1_item_d2i_bio(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms); | ||
38 | } | ||
39 | |||
40 | int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms) | ||
41 | { | ||
42 | return ASN1_item_i2d_bio(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms); | ||
43 | } | ||
44 | |||
45 | IMPLEMENT_PEM_rw_const(CMS, CMS_ContentInfo, PEM_STRING_CMS, CMS_ContentInfo) | ||
46 | |||
47 | BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms) | ||
48 | { | ||
49 | return BIO_new_NDEF(out, (ASN1_VALUE *)cms, | ||
50 | ASN1_ITEM_rptr(CMS_ContentInfo)); | ||
51 | } | ||
52 | |||
53 | /* CMS wrappers round generalised stream and MIME routines */ | ||
54 | |||
55 | int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags) | ||
56 | { | ||
57 | return i2d_ASN1_bio_stream(out, (ASN1_VALUE *)cms, in, flags, | ||
58 | ASN1_ITEM_rptr(CMS_ContentInfo)); | ||
59 | } | ||
60 | |||
61 | int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, | ||
62 | int flags) | ||
63 | { | ||
64 | return PEM_write_bio_ASN1_stream(out, (ASN1_VALUE *)cms, in, flags, | ||
65 | "CMS", ASN1_ITEM_rptr(CMS_ContentInfo)); | ||
66 | } | ||
67 | |||
68 | int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags) | ||
69 | { | ||
70 | STACK_OF(X509_ALGOR) *mdalgs; | ||
71 | int ctype_nid = OBJ_obj2nid(cms->contentType); | ||
72 | int econt_nid = OBJ_obj2nid(CMS_get0_eContentType(cms)); | ||
73 | if (ctype_nid == NID_pkcs7_signed) | ||
74 | mdalgs = cms->d.signedData->digestAlgorithms; | ||
75 | else | ||
76 | mdalgs = NULL; | ||
77 | |||
78 | return SMIME_write_ASN1(bio, (ASN1_VALUE *)cms, data, flags, | ||
79 | ctype_nid, econt_nid, mdalgs, | ||
80 | ASN1_ITEM_rptr(CMS_ContentInfo)); | ||
81 | } | ||
82 | |||
83 | CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont) | ||
84 | { | ||
85 | return (CMS_ContentInfo *)SMIME_read_ASN1(bio, bcont, | ||
86 | ASN1_ITEM_rptr | ||
87 | (CMS_ContentInfo)); | ||
88 | } | ||