OLD | NEW |
1 /* pk7_asn.c */ | 1 /* pk7_asn.c */ |
2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 * project 2000. | 3 * project 2000. |
4 */ | 4 */ |
5 /* ==================================================================== | 5 /* ==================================================================== |
6 * Copyright (c) 2000 The OpenSSL Project. All rights reserved. | 6 * Copyright (c) 2000 The OpenSSL Project. All rights reserved. |
7 * | 7 * |
8 * Redistribution and use in source and binary forms, with or without | 8 * Redistribution and use in source and binary forms, with or without |
9 * modification, are permitted provided that the following conditions | 9 * modification, are permitted provided that the following conditions |
10 * are met: | 10 * are met: |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 | 70 |
71 ASN1_ADB(PKCS7) = { | 71 ASN1_ADB(PKCS7) = { |
72 ADB_ENTRY(NID_pkcs7_data, ASN1_NDEF_EXP_OPT(PKCS7, d.data, ASN1_OCTET_ST
RING_NDEF, 0)), | 72 ADB_ENTRY(NID_pkcs7_data, ASN1_NDEF_EXP_OPT(PKCS7, d.data, ASN1_OCTET_ST
RING_NDEF, 0)), |
73 ADB_ENTRY(NID_pkcs7_signed, ASN1_NDEF_EXP_OPT(PKCS7, d.sign, PKCS7_SIGNE
D, 0)), | 73 ADB_ENTRY(NID_pkcs7_signed, ASN1_NDEF_EXP_OPT(PKCS7, d.sign, PKCS7_SIGNE
D, 0)), |
74 ADB_ENTRY(NID_pkcs7_enveloped, ASN1_NDEF_EXP_OPT(PKCS7, d.enveloped, PKC
S7_ENVELOPE, 0)), | 74 ADB_ENTRY(NID_pkcs7_enveloped, ASN1_NDEF_EXP_OPT(PKCS7, d.enveloped, PKC
S7_ENVELOPE, 0)), |
75 ADB_ENTRY(NID_pkcs7_signedAndEnveloped, ASN1_NDEF_EXP_OPT(PKCS7, d.signe
d_and_enveloped, PKCS7_SIGN_ENVELOPE, 0)), | 75 ADB_ENTRY(NID_pkcs7_signedAndEnveloped, ASN1_NDEF_EXP_OPT(PKCS7, d.signe
d_and_enveloped, PKCS7_SIGN_ENVELOPE, 0)), |
76 ADB_ENTRY(NID_pkcs7_digest, ASN1_NDEF_EXP_OPT(PKCS7, d.digest, PKCS7_DIG
EST, 0)), | 76 ADB_ENTRY(NID_pkcs7_digest, ASN1_NDEF_EXP_OPT(PKCS7, d.digest, PKCS7_DIG
EST, 0)), |
77 ADB_ENTRY(NID_pkcs7_encrypted, ASN1_NDEF_EXP_OPT(PKCS7, d.encrypted, PKC
S7_ENCRYPT, 0)) | 77 ADB_ENTRY(NID_pkcs7_encrypted, ASN1_NDEF_EXP_OPT(PKCS7, d.encrypted, PKC
S7_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) |
87 IMPLEMENT_ASN1_DUP_FUNCTION(PKCS7) | 116 IMPLEMENT_ASN1_DUP_FUNCTION(PKCS7) |
88 | 117 |
89 ASN1_NDEF_SEQUENCE(PKCS7_SIGNED) = { | 118 ASN1_NDEF_SEQUENCE(PKCS7_SIGNED) = { |
90 ASN1_SIMPLE(PKCS7_SIGNED, version, ASN1_INTEGER), | 119 ASN1_SIMPLE(PKCS7_SIGNED, version, ASN1_INTEGER), |
91 ASN1_SET_OF(PKCS7_SIGNED, md_algs, X509_ALGOR), | 120 ASN1_SET_OF(PKCS7_SIGNED, md_algs, X509_ALGOR), |
92 ASN1_SIMPLE(PKCS7_SIGNED, contents, PKCS7), | 121 ASN1_SIMPLE(PKCS7_SIGNED, contents, PKCS7), |
93 ASN1_IMP_SEQUENCE_OF_OPT(PKCS7_SIGNED, cert, X509, 0), | 122 ASN1_IMP_SEQUENCE_OF_OPT(PKCS7_SIGNED, cert, X509, 0), |
94 ASN1_IMP_SET_OF_OPT(PKCS7_SIGNED, crl, X509_CRL, 1), | 123 ASN1_IMP_SET_OF_OPT(PKCS7_SIGNED, crl, X509_CRL, 1), |
95 ASN1_SET_OF(PKCS7_SIGNED, signer_info, PKCS7_SIGNER_INFO) | 124 ASN1_SET_OF(PKCS7_SIGNED, signer_info, PKCS7_SIGNER_INFO) |
96 } ASN1_NDEF_SEQUENCE_END(PKCS7_SIGNED) | 125 } ASN1_NDEF_SEQUENCE_END(PKCS7_SIGNED) |
97 | 126 |
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; |
105 EVP_PKEY_free(si->pkey); | 135 EVP_PKEY_free(si->pkey); |
106 } | 136 } |
107 return 1; | 137 return 1; |
108 } | 138 } |
109 | 139 |
110 ASN1_SEQUENCE_cb(PKCS7_SIGNER_INFO, si_cb) = { | 140 ASN1_SEQUENCE_cb(PKCS7_SIGNER_INFO, si_cb) = { |
111 ASN1_SIMPLE(PKCS7_SIGNER_INFO, version, ASN1_INTEGER), | 141 ASN1_SIMPLE(PKCS7_SIGNER_INFO, version, ASN1_INTEGER), |
(...skipping 21 matching lines...) Expand all Loading... |
133 | 163 |
134 ASN1_NDEF_SEQUENCE(PKCS7_ENVELOPE) = { | 164 ASN1_NDEF_SEQUENCE(PKCS7_ENVELOPE) = { |
135 ASN1_SIMPLE(PKCS7_ENVELOPE, version, ASN1_INTEGER), | 165 ASN1_SIMPLE(PKCS7_ENVELOPE, version, ASN1_INTEGER), |
136 ASN1_SET_OF(PKCS7_ENVELOPE, recipientinfo, PKCS7_RECIP_INFO), | 166 ASN1_SET_OF(PKCS7_ENVELOPE, recipientinfo, PKCS7_RECIP_INFO), |
137 ASN1_SIMPLE(PKCS7_ENVELOPE, enc_data, PKCS7_ENC_CONTENT) | 167 ASN1_SIMPLE(PKCS7_ENVELOPE, enc_data, PKCS7_ENC_CONTENT) |
138 } ASN1_NDEF_SEQUENCE_END(PKCS7_ENVELOPE) | 168 } ASN1_NDEF_SEQUENCE_END(PKCS7_ENVELOPE) |
139 | 169 |
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; |
147 X509_free(ri->cert); | 178 X509_free(ri->cert); |
148 } | 179 } |
149 return 1; | 180 return 1; |
150 } | 181 } |
151 | 182 |
152 ASN1_SEQUENCE_cb(PKCS7_RECIP_INFO, ri_cb) = { | 183 ASN1_SEQUENCE_cb(PKCS7_RECIP_INFO, ri_cb) = { |
153 ASN1_SIMPLE(PKCS7_RECIP_INFO, version, ASN1_INTEGER), | 184 ASN1_SIMPLE(PKCS7_RECIP_INFO, version, ASN1_INTEGER), |
154 ASN1_SIMPLE(PKCS7_RECIP_INFO, issuer_and_serial, PKCS7_ISSUER_AND_SERIAL
), | 185 ASN1_SIMPLE(PKCS7_RECIP_INFO, issuer_and_serial, PKCS7_ISSUER_AND_SERIAL
), |
155 ASN1_SIMPLE(PKCS7_RECIP_INFO, key_enc_algor, X509_ALGOR), | 186 ASN1_SIMPLE(PKCS7_RECIP_INFO, key_enc_algor, X509_ALGOR), |
156 ASN1_SIMPLE(PKCS7_RECIP_INFO, enc_key, ASN1_OCTET_STRING) | 187 ASN1_SIMPLE(PKCS7_RECIP_INFO, enc_key, ASN1_OCTET_STRING) |
157 } ASN1_SEQUENCE_END_cb(PKCS7_RECIP_INFO, PKCS7_RECIP_INFO) | 188 } ASN1_SEQUENCE_END_cb(PKCS7_RECIP_INFO, PKCS7_RECIP_INFO) |
158 | 189 |
159 IMPLEMENT_ASN1_FUNCTIONS(PKCS7_RECIP_INFO) | 190 IMPLEMENT_ASN1_FUNCTIONS(PKCS7_RECIP_INFO) |
160 | 191 |
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) |
168 | 199 |
169 ASN1_NDEF_SEQUENCE(PKCS7_SIGN_ENVELOPE) = { | 200 ASN1_NDEF_SEQUENCE(PKCS7_SIGN_ENVELOPE) = { |
170 ASN1_SIMPLE(PKCS7_SIGN_ENVELOPE, version, ASN1_INTEGER), | 201 ASN1_SIMPLE(PKCS7_SIGN_ENVELOPE, version, ASN1_INTEGER), |
171 ASN1_SET_OF(PKCS7_SIGN_ENVELOPE, recipientinfo, PKCS7_RECIP_INFO), | 202 ASN1_SET_OF(PKCS7_SIGN_ENVELOPE, recipientinfo, PKCS7_RECIP_INFO), |
172 ASN1_SET_OF(PKCS7_SIGN_ENVELOPE, md_algs, X509_ALGOR), | 203 ASN1_SET_OF(PKCS7_SIGN_ENVELOPE, md_algs, X509_ALGOR), |
173 ASN1_SIMPLE(PKCS7_SIGN_ENVELOPE, enc_data, PKCS7_ENC_CONTENT), | 204 ASN1_SIMPLE(PKCS7_SIGN_ENVELOPE, enc_data, PKCS7_ENC_CONTENT), |
174 ASN1_IMP_SET_OF_OPT(PKCS7_SIGN_ENVELOPE, cert, X509, 0), | 205 ASN1_IMP_SET_OF_OPT(PKCS7_SIGN_ENVELOPE, cert, X509, 0), |
(...skipping 30 matching lines...) Expand all Loading... |
205 ASN1_ITEM_TEMPLATE_END(PKCS7_ATTR_SIGN) | 236 ASN1_ITEM_TEMPLATE_END(PKCS7_ATTR_SIGN) |
206 | 237 |
207 /* When verifying attributes we need to use the received order. So | 238 /* When verifying attributes we need to use the received order. So |
208 * we use SEQUENCE OF and tag it to SET OF | 239 * we use SEQUENCE OF and tag it to SET OF |
209 */ | 240 */ |
210 | 241 |
211 ASN1_ITEM_TEMPLATE(PKCS7_ATTR_VERIFY) = | 242 ASN1_ITEM_TEMPLATE(PKCS7_ATTR_VERIFY) = |
212 ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_IMPTAG | ASN1_TF
LG_UNIVERSAL, | 243 ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_IMPTAG | ASN1_TF
LG_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) |
OLD | NEW |