diff options
Diffstat (limited to 'src/lib/libcrypto/pkcs7/pk7_asn1.c')
-rw-r--r-- | src/lib/libcrypto/pkcs7/pk7_asn1.c | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/src/lib/libcrypto/pkcs7/pk7_asn1.c b/src/lib/libcrypto/pkcs7/pk7_asn1.c index 1f70d31386..b7ec2883cb 100644 --- a/src/lib/libcrypto/pkcs7/pk7_asn1.c +++ b/src/lib/libcrypto/pkcs7/pk7_asn1.c | |||
@@ -77,10 +77,39 @@ ASN1_ADB(PKCS7) = { | |||
77 | ADB_ENTRY(NID_pkcs7_encrypted, ASN1_NDEF_EXP_OPT(PKCS7, d.encrypted, PKCS7_ENCRYPT, 0)) | 77 | ADB_ENTRY(NID_pkcs7_encrypted, ASN1_NDEF_EXP_OPT(PKCS7, d.encrypted, PKCS7_ENCRYPT, 0)) |
78 | } ASN1_ADB_END(PKCS7, 0, type, 0, &p7default_tt, NULL); | 78 | } ASN1_ADB_END(PKCS7, 0, type, 0, &p7default_tt, NULL); |
79 | 79 | ||
80 | ASN1_NDEF_SEQUENCE(PKCS7) = { | 80 | /* PKCS#7 streaming support */ |
81 | static int pk7_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | ||
82 | void *exarg) | ||
83 | { | ||
84 | ASN1_STREAM_ARG *sarg = exarg; | ||
85 | PKCS7 **pp7 = (PKCS7 **)pval; | ||
86 | |||
87 | switch(operation) | ||
88 | { | ||
89 | |||
90 | case ASN1_OP_STREAM_PRE: | ||
91 | if (PKCS7_stream(&sarg->boundary, *pp7) <= 0) | ||
92 | return 0; | ||
93 | case ASN1_OP_DETACHED_PRE: | ||
94 | sarg->ndef_bio = PKCS7_dataInit(*pp7, sarg->out); | ||
95 | if (!sarg->ndef_bio) | ||
96 | return 0; | ||
97 | break; | ||
98 | |||
99 | case ASN1_OP_STREAM_POST: | ||
100 | case ASN1_OP_DETACHED_POST: | ||
101 | if (PKCS7_dataFinal(*pp7, sarg->ndef_bio) <= 0) | ||
102 | return 0; | ||
103 | break; | ||
104 | |||
105 | } | ||
106 | return 1; | ||
107 | } | ||
108 | |||
109 | ASN1_NDEF_SEQUENCE_cb(PKCS7, pk7_cb) = { | ||
81 | ASN1_SIMPLE(PKCS7, type, ASN1_OBJECT), | 110 | ASN1_SIMPLE(PKCS7, type, ASN1_OBJECT), |
82 | ASN1_ADB_OBJECT(PKCS7) | 111 | ASN1_ADB_OBJECT(PKCS7) |
83 | }ASN1_NDEF_SEQUENCE_END(PKCS7) | 112 | }ASN1_NDEF_SEQUENCE_END_cb(PKCS7, PKCS7) |
84 | 113 | ||
85 | IMPLEMENT_ASN1_FUNCTIONS(PKCS7) | 114 | IMPLEMENT_ASN1_FUNCTIONS(PKCS7) |
86 | IMPLEMENT_ASN1_NDEF_FUNCTION(PKCS7) | 115 | IMPLEMENT_ASN1_NDEF_FUNCTION(PKCS7) |
@@ -98,7 +127,8 @@ ASN1_NDEF_SEQUENCE(PKCS7_SIGNED) = { | |||
98 | IMPLEMENT_ASN1_FUNCTIONS(PKCS7_SIGNED) | 127 | IMPLEMENT_ASN1_FUNCTIONS(PKCS7_SIGNED) |
99 | 128 | ||
100 | /* Minor tweak to operation: free up EVP_PKEY */ | 129 | /* Minor tweak to operation: free up EVP_PKEY */ |
101 | static int si_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it) | 130 | static int si_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, |
131 | void *exarg) | ||
102 | { | 132 | { |
103 | if(operation == ASN1_OP_FREE_POST) { | 133 | if(operation == ASN1_OP_FREE_POST) { |
104 | PKCS7_SIGNER_INFO *si = (PKCS7_SIGNER_INFO *)*pval; | 134 | PKCS7_SIGNER_INFO *si = (PKCS7_SIGNER_INFO *)*pval; |
@@ -140,7 +170,8 @@ ASN1_NDEF_SEQUENCE(PKCS7_ENVELOPE) = { | |||
140 | IMPLEMENT_ASN1_FUNCTIONS(PKCS7_ENVELOPE) | 170 | IMPLEMENT_ASN1_FUNCTIONS(PKCS7_ENVELOPE) |
141 | 171 | ||
142 | /* Minor tweak to operation: free up X509 */ | 172 | /* Minor tweak to operation: free up X509 */ |
143 | static int ri_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it) | 173 | static int ri_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, |
174 | void *exarg) | ||
144 | { | 175 | { |
145 | if(operation == ASN1_OP_FREE_POST) { | 176 | if(operation == ASN1_OP_FREE_POST) { |
146 | PKCS7_RECIP_INFO *ri = (PKCS7_RECIP_INFO *)*pval; | 177 | PKCS7_RECIP_INFO *ri = (PKCS7_RECIP_INFO *)*pval; |
@@ -161,7 +192,7 @@ IMPLEMENT_ASN1_FUNCTIONS(PKCS7_RECIP_INFO) | |||
161 | ASN1_NDEF_SEQUENCE(PKCS7_ENC_CONTENT) = { | 192 | ASN1_NDEF_SEQUENCE(PKCS7_ENC_CONTENT) = { |
162 | ASN1_SIMPLE(PKCS7_ENC_CONTENT, content_type, ASN1_OBJECT), | 193 | ASN1_SIMPLE(PKCS7_ENC_CONTENT, content_type, ASN1_OBJECT), |
163 | ASN1_SIMPLE(PKCS7_ENC_CONTENT, algorithm, X509_ALGOR), | 194 | ASN1_SIMPLE(PKCS7_ENC_CONTENT, algorithm, X509_ALGOR), |
164 | ASN1_IMP_OPT(PKCS7_ENC_CONTENT, enc_data, ASN1_OCTET_STRING, 0) | 195 | ASN1_IMP_OPT(PKCS7_ENC_CONTENT, enc_data, ASN1_OCTET_STRING_NDEF, 0) |
165 | } ASN1_NDEF_SEQUENCE_END(PKCS7_ENC_CONTENT) | 196 | } ASN1_NDEF_SEQUENCE_END(PKCS7_ENC_CONTENT) |
166 | 197 | ||
167 | IMPLEMENT_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT) | 198 | IMPLEMENT_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT) |
@@ -212,3 +243,5 @@ ASN1_ITEM_TEMPLATE(PKCS7_ATTR_VERIFY) = | |||
212 | ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_IMPTAG | ASN1_TFLG_UNIVERSAL, | 243 | ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_IMPTAG | ASN1_TFLG_UNIVERSAL, |
213 | V_ASN1_SET, PKCS7_ATTRIBUTES, X509_ATTRIBUTE) | 244 | V_ASN1_SET, PKCS7_ATTRIBUTES, X509_ATTRIBUTE) |
214 | ASN1_ITEM_TEMPLATE_END(PKCS7_ATTR_VERIFY) | 245 | ASN1_ITEM_TEMPLATE_END(PKCS7_ATTR_VERIFY) |
246 | |||
247 | IMPLEMENT_ASN1_PRINT_FUNCTION(PKCS7) | ||