Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: openssl/crypto/asn1/asn_mime.c

Issue 9254031: Upgrade chrome's OpenSSL to same version Android ships with. (Closed) Base URL: http://src.chromium.org/svn/trunk/deps/third_party/openssl/
Patch Set: '' Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « openssl/crypto/asn1/asn1t.h ('k') | openssl/crypto/asn1/asn_pack.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* asn_mime.c */ 1 /* asn_mime.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. 3 * project.
4 */ 4 */
5 /* ==================================================================== 5 /* ====================================================================
6 * Copyright (c) 1999-2008 The OpenSSL Project. All rights reserved. 6 * Copyright (c) 1999-2008 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 * 52 *
53 */ 53 */
54 54
55 #include <stdio.h> 55 #include <stdio.h>
56 #include <ctype.h> 56 #include <ctype.h>
57 #include "cryptlib.h" 57 #include "cryptlib.h"
58 #include <openssl/rand.h> 58 #include <openssl/rand.h>
59 #include <openssl/x509.h> 59 #include <openssl/x509.h>
60 #include <openssl/asn1.h> 60 #include <openssl/asn1.h>
61 #include <openssl/asn1t.h> 61 #include <openssl/asn1t.h>
62 #include "asn1_locl.h"
62 63
63 /* Generalised MIME like utilities for streaming ASN1. Although many 64 /* Generalised MIME like utilities for streaming ASN1. Although many
64 * have a PKCS7/CMS like flavour others are more general purpose. 65 * have a PKCS7/CMS like flavour others are more general purpose.
65 */ 66 */
66 67
67 /* MIME format structures 68 /* MIME format structures
68 * Note that all are translated to lower case apart from 69 * Note that all are translated to lower case apart from
69 * parameter values. Quotes are stripped off 70 * parameter values. Quotes are stripped off
70 */ 71 */
71 72
72 typedef struct { 73 typedef struct {
73 char *param_name; /* Param name e.g. "micalg" */ 74 char *param_name; /* Param name e.g. "micalg" */
74 char *param_value; /* Param value e.g. "sha1" */ 75 char *param_value; /* Param value e.g. "sha1" */
75 } MIME_PARAM; 76 } MIME_PARAM;
76 77
77 DECLARE_STACK_OF(MIME_PARAM) 78 DECLARE_STACK_OF(MIME_PARAM)
78 IMPLEMENT_STACK_OF(MIME_PARAM) 79 IMPLEMENT_STACK_OF(MIME_PARAM)
79 80
80 typedef struct { 81 typedef struct {
81 char *name; /* Name of line e.g. "content-type" */ 82 char *name; /* Name of line e.g. "content-type" */
82 char *value; /* Value of line e.g. "text/plain" */ 83 char *value; /* Value of line e.g. "text/plain" */
83 STACK_OF(MIME_PARAM) *params; /* Zero or more parameters */ 84 STACK_OF(MIME_PARAM) *params; /* Zero or more parameters */
84 } MIME_HEADER; 85 } MIME_HEADER;
85 86
86 DECLARE_STACK_OF(MIME_HEADER) 87 DECLARE_STACK_OF(MIME_HEADER)
87 IMPLEMENT_STACK_OF(MIME_HEADER) 88 IMPLEMENT_STACK_OF(MIME_HEADER)
88 89
90 static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags,
91 const ASN1_ITEM *it);
89 static char * strip_ends(char *name); 92 static char * strip_ends(char *name);
90 static char * strip_start(char *name); 93 static char * strip_start(char *name);
91 static char * strip_end(char *name); 94 static char * strip_end(char *name);
92 static MIME_HEADER *mime_hdr_new(char *name, char *value); 95 static MIME_HEADER *mime_hdr_new(char *name, char *value);
93 static int mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value); 96 static int mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value);
94 static STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio); 97 static STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio);
95 static int mime_hdr_cmp(const MIME_HEADER * const *a, 98 static int mime_hdr_cmp(const MIME_HEADER * const *a,
96 const MIME_HEADER * const *b); 99 const MIME_HEADER * const *b);
97 static int mime_param_cmp(const MIME_PARAM * const *a, 100 static int mime_param_cmp(const MIME_PARAM * const *a,
98 const MIME_PARAM * const *b); 101 const MIME_PARAM * const *b);
99 static void mime_param_free(MIME_PARAM *param); 102 static void mime_param_free(MIME_PARAM *param);
100 static int mime_bound_check(char *line, int linelen, char *bound, int blen); 103 static int mime_bound_check(char *line, int linelen, char *bound, int blen);
101 static int multi_split(BIO *bio, char *bound, STACK_OF(BIO) **ret); 104 static int multi_split(BIO *bio, char *bound, STACK_OF(BIO) **ret);
102 static int strip_eol(char *linebuf, int *plen); 105 static int strip_eol(char *linebuf, int *plen);
103 static MIME_HEADER *mime_hdr_find(STACK_OF(MIME_HEADER) *hdrs, char *name); 106 static MIME_HEADER *mime_hdr_find(STACK_OF(MIME_HEADER) *hdrs, char *name);
104 static MIME_PARAM *mime_param_find(MIME_HEADER *hdr, char *name); 107 static MIME_PARAM *mime_param_find(MIME_HEADER *hdr, char *name);
105 static void mime_hdr_free(MIME_HEADER *hdr); 108 static void mime_hdr_free(MIME_HEADER *hdr);
106 109
107 #define MAX_SMLEN 1024 110 #define MAX_SMLEN 1024
108 #define mime_debug(x) /* x */ 111 #define mime_debug(x) /* x */
109 112
113 /* Output an ASN1 structure in BER format streaming if necessary */
114
115 int i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags,
116 const ASN1_ITEM *it)
117 {
118 /* If streaming create stream BIO and copy all content through it */
119 if (flags & SMIME_STREAM)
120 {
121 BIO *bio, *tbio;
122 bio = BIO_new_NDEF(out, val, it);
123 if (!bio)
124 {
125 ASN1err(ASN1_F_I2D_ASN1_BIO_STREAM,ERR_R_MALLOC_FAILURE) ;
126 return 0;
127 }
128 SMIME_crlf_copy(in, bio, flags);
129 (void)BIO_flush(bio);
130 /* Free up successive BIOs until we hit the old output BIO */
131 do
132 {
133 tbio = BIO_pop(bio);
134 BIO_free(bio);
135 bio = tbio;
136 } while (bio != out);
137 }
138 /* else just write out ASN1 structure which will have all content
139 * stored internally
140 */
141 else
142 ASN1_item_i2d_bio(it, out, val);
143 return 1;
144 }
145
110 /* Base 64 read and write of ASN1 structure */ 146 /* Base 64 read and write of ASN1 structure */
111 147
112 static int B64_write_ASN1(BIO *out, ASN1_VALUE *val, BIO *in, int flags, 148 static int B64_write_ASN1(BIO *out, ASN1_VALUE *val, BIO *in, int flags,
113 const ASN1_ITEM *it) 149 const ASN1_ITEM *it)
114 { 150 {
115 BIO *b64; 151 BIO *b64;
116 int r; 152 int r;
117 b64 = BIO_new(BIO_f_base64()); 153 b64 = BIO_new(BIO_f_base64());
118 if(!b64) 154 if(!b64)
119 { 155 {
120 ASN1err(ASN1_F_B64_WRITE_ASN1,ERR_R_MALLOC_FAILURE); 156 ASN1err(ASN1_F_B64_WRITE_ASN1,ERR_R_MALLOC_FAILURE);
121 return 0; 157 return 0;
122 } 158 }
123 /* prepend the b64 BIO so all data is base64 encoded. 159 /* prepend the b64 BIO so all data is base64 encoded.
124 */ 160 */
125 out = BIO_push(b64, out); 161 out = BIO_push(b64, out);
126 » r = ASN1_item_i2d_bio(it, out, val); 162 » r = i2d_ASN1_bio_stream(out, val, in, flags, it);
127 (void)BIO_flush(out); 163 (void)BIO_flush(out);
128 BIO_pop(out); 164 BIO_pop(out);
129 BIO_free(b64); 165 BIO_free(b64);
130 return r; 166 return r;
131 } 167 }
132 168
169 /* Streaming ASN1 PEM write */
170
171 int PEM_write_bio_ASN1_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags,
172 const char *hdr,
173 const ASN1_ITEM *it)
174 {
175 int r;
176 BIO_printf(out, "-----BEGIN %s-----\n", hdr);
177 r = B64_write_ASN1(out, val, in, flags, it);
178 BIO_printf(out, "-----END %s-----\n", hdr);
179 return r;
180 }
181
133 static ASN1_VALUE *b64_read_asn1(BIO *bio, const ASN1_ITEM *it) 182 static ASN1_VALUE *b64_read_asn1(BIO *bio, const ASN1_ITEM *it)
134 { 183 {
135 BIO *b64; 184 BIO *b64;
136 ASN1_VALUE *val; 185 ASN1_VALUE *val;
137 if(!(b64 = BIO_new(BIO_f_base64()))) { 186 if(!(b64 = BIO_new(BIO_f_base64()))) {
138 ASN1err(ASN1_F_B64_READ_ASN1,ERR_R_MALLOC_FAILURE); 187 ASN1err(ASN1_F_B64_READ_ASN1,ERR_R_MALLOC_FAILURE);
139 return 0; 188 return 0;
140 } 189 }
141 bio = BIO_push(b64, bio); 190 bio = BIO_push(b64, bio);
142 val = ASN1_item_d2i_bio(it, bio, NULL); 191 val = ASN1_item_d2i_bio(it, bio, NULL);
143 if(!val) 192 if(!val)
144 ASN1err(ASN1_F_B64_READ_ASN1,ASN1_R_DECODE_ERROR); 193 ASN1err(ASN1_F_B64_READ_ASN1,ASN1_R_DECODE_ERROR);
145 (void)BIO_flush(bio); 194 (void)BIO_flush(bio);
146 bio = BIO_pop(bio); 195 bio = BIO_pop(bio);
147 BIO_free(b64); 196 BIO_free(b64);
148 return val; 197 return val;
149 } 198 }
150 199
151 /* Generate the MIME "micalg" parameter from RFC3851, RFC4490 */ 200 /* Generate the MIME "micalg" parameter from RFC3851, RFC4490 */
152 201
153 static int asn1_write_micalg(BIO *out, STACK_OF(X509_ALGOR) *mdalgs) 202 static int asn1_write_micalg(BIO *out, STACK_OF(X509_ALGOR) *mdalgs)
154 { 203 {
155 » int i, have_unknown = 0, write_comma, md_nid; 204 » const EVP_MD *md;
205 » int i, have_unknown = 0, write_comma, ret = 0, md_nid;
156 have_unknown = 0; 206 have_unknown = 0;
157 write_comma = 0; 207 write_comma = 0;
158 for (i = 0; i < sk_X509_ALGOR_num(mdalgs); i++) 208 for (i = 0; i < sk_X509_ALGOR_num(mdalgs); i++)
159 { 209 {
160 if (write_comma) 210 if (write_comma)
161 BIO_write(out, ",", 1); 211 BIO_write(out, ",", 1);
162 write_comma = 1; 212 write_comma = 1;
163 md_nid = OBJ_obj2nid(sk_X509_ALGOR_value(mdalgs, i)->algorithm); 213 md_nid = OBJ_obj2nid(sk_X509_ALGOR_value(mdalgs, i)->algorithm);
214 md = EVP_get_digestbynid(md_nid);
215 if (md && md->md_ctrl)
216 {
217 int rv;
218 char *micstr;
219 rv = md->md_ctrl(NULL, EVP_MD_CTRL_MICALG, 0, &micstr);
220 if (rv > 0)
221 {
222 BIO_puts(out, micstr);
223 OPENSSL_free(micstr);
224 continue;
225 }
226 if (rv != -2)
227 goto err;
228 }
164 switch(md_nid) 229 switch(md_nid)
165 { 230 {
166 case NID_sha1: 231 case NID_sha1:
167 BIO_puts(out, "sha1"); 232 BIO_puts(out, "sha1");
168 break; 233 break;
169 234
170 case NID_md5: 235 case NID_md5:
171 BIO_puts(out, "md5"); 236 BIO_puts(out, "md5");
172 break; 237 break;
173 238
174 case NID_sha256: 239 case NID_sha256:
175 BIO_puts(out, "sha-256"); 240 BIO_puts(out, "sha-256");
176 break; 241 break;
177 242
178 case NID_sha384: 243 case NID_sha384:
179 BIO_puts(out, "sha-384"); 244 BIO_puts(out, "sha-384");
180 break; 245 break;
181 246
182 case NID_sha512: 247 case NID_sha512:
183 BIO_puts(out, "sha-512"); 248 BIO_puts(out, "sha-512");
184 break; 249 break;
185 250
251 case NID_id_GostR3411_94:
252 BIO_puts(out, "gostr3411-94");
253 goto err;
254 break;
255
186 default: 256 default:
187 if (have_unknown) 257 if (have_unknown)
188 write_comma = 0; 258 write_comma = 0;
189 else 259 else
190 { 260 {
191 BIO_puts(out, "unknown"); 261 BIO_puts(out, "unknown");
192 have_unknown = 1; 262 have_unknown = 1;
193 } 263 }
194 break; 264 break;
195 265
196 } 266 }
197 } 267 }
198 268
199 » return 1; 269 » ret = 1;
270 » err:
271
272 » return ret;
200 273
201 } 274 }
202 275
203 /* SMIME sender */ 276 /* SMIME sender */
204 277
205 int int_smime_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, 278 int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags,
206 int ctype_nid, int econt_nid, 279 int ctype_nid, int econt_nid,
207 STACK_OF(X509_ALGOR) *mdalgs, 280 STACK_OF(X509_ALGOR) *mdalgs,
208 asn1_output_data_fn *data_fn,
209 const ASN1_ITEM *it) 281 const ASN1_ITEM *it)
210 { 282 {
211 char bound[33], c; 283 char bound[33], c;
212 int i; 284 int i;
213 const char *mime_prefix, *mime_eol, *cname = "smime.p7m"; 285 const char *mime_prefix, *mime_eol, *cname = "smime.p7m";
214 const char *msg_type=NULL; 286 const char *msg_type=NULL;
215 if (flags & SMIME_OLDMIME) 287 if (flags & SMIME_OLDMIME)
216 mime_prefix = "application/x-pkcs7-"; 288 mime_prefix = "application/x-pkcs7-";
217 else 289 else
218 mime_prefix = "application/pkcs7-"; 290 mime_prefix = "application/pkcs7-";
(...skipping 17 matching lines...) Expand all
236 BIO_printf(bio, "Content-Type: multipart/signed;"); 308 BIO_printf(bio, "Content-Type: multipart/signed;");
237 BIO_printf(bio, " protocol=\"%ssignature\";", mime_prefix); 309 BIO_printf(bio, " protocol=\"%ssignature\";", mime_prefix);
238 BIO_puts(bio, " micalg=\""); 310 BIO_puts(bio, " micalg=\"");
239 asn1_write_micalg(bio, mdalgs); 311 asn1_write_micalg(bio, mdalgs);
240 BIO_printf(bio, "\"; boundary=\"----%s\"%s%s", 312 BIO_printf(bio, "\"; boundary=\"----%s\"%s%s",
241 bound, mime_eol, mime_eol); 313 bound, mime_eol, mime_eol);
242 BIO_printf(bio, "This is an S/MIME signed message%s%s", 314 BIO_printf(bio, "This is an S/MIME signed message%s%s",
243 mime_eol, mime_eol); 315 mime_eol, mime_eol);
244 /* Now write out the first part */ 316 /* Now write out the first part */
245 BIO_printf(bio, "------%s%s", bound, mime_eol); 317 BIO_printf(bio, "------%s%s", bound, mime_eol);
246 » » if (!data_fn(bio, data, val, flags, it)) 318 » » if (!asn1_output_data(bio, data, val, flags, it))
247 return 0; 319 return 0;
248 BIO_printf(bio, "%s------%s%s", mime_eol, bound, mime_eol); 320 BIO_printf(bio, "%s------%s%s", mime_eol, bound, mime_eol);
249 321
250 /* Headers for signature */ 322 /* Headers for signature */
251 323
252 BIO_printf(bio, "Content-Type: %ssignature;", mime_prefix); 324 BIO_printf(bio, "Content-Type: %ssignature;", mime_prefix);
253 BIO_printf(bio, " name=\"smime.p7s\"%s", mime_eol); 325 BIO_printf(bio, " name=\"smime.p7s\"%s", mime_eol);
254 BIO_printf(bio, "Content-Transfer-Encoding: base64%s", 326 BIO_printf(bio, "Content-Transfer-Encoding: base64%s",
255 mime_eol); 327 mime_eol);
256 BIO_printf(bio, "Content-Disposition: attachment;"); 328 BIO_printf(bio, "Content-Disposition: attachment;");
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 BIO_printf(bio, " smime-type=%s;", msg_type); 361 BIO_printf(bio, " smime-type=%s;", msg_type);
290 BIO_printf(bio, " name=\"%s\"%s", cname, mime_eol); 362 BIO_printf(bio, " name=\"%s\"%s", cname, mime_eol);
291 BIO_printf(bio, "Content-Transfer-Encoding: base64%s%s", 363 BIO_printf(bio, "Content-Transfer-Encoding: base64%s%s",
292 mime_eol, mime_eol); 364 mime_eol, mime_eol);
293 if (!B64_write_ASN1(bio, val, data, flags, it)) 365 if (!B64_write_ASN1(bio, val, data, flags, it))
294 return 0; 366 return 0;
295 BIO_printf(bio, "%s", mime_eol); 367 BIO_printf(bio, "%s", mime_eol);
296 return 1; 368 return 1;
297 } 369 }
298 370
299 #if 0
300
301 /* Handle output of ASN1 data */ 371 /* Handle output of ASN1 data */
302 372
303 373
304 static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, 374 static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags,
305 const ASN1_ITEM *it) 375 const ASN1_ITEM *it)
306 { 376 {
307 BIO *tmpbio; 377 BIO *tmpbio;
308 const ASN1_AUX *aux = it->funcs; 378 const ASN1_AUX *aux = it->funcs;
309 ASN1_STREAM_ARG sarg; 379 ASN1_STREAM_ARG sarg;
310 380
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 { 413 {
344 tmpbio = BIO_pop(sarg.ndef_bio); 414 tmpbio = BIO_pop(sarg.ndef_bio);
345 BIO_free(sarg.ndef_bio); 415 BIO_free(sarg.ndef_bio);
346 sarg.ndef_bio = tmpbio; 416 sarg.ndef_bio = tmpbio;
347 } 417 }
348 418
349 return 1; 419 return 1;
350 420
351 } 421 }
352 422
353 #endif
354
355 /* SMIME reader: handle multipart/signed and opaque signing. 423 /* SMIME reader: handle multipart/signed and opaque signing.
356 * in multipart case the content is placed in a memory BIO 424 * in multipart case the content is placed in a memory BIO
357 * pointed to by "bcont". In opaque this is set to NULL 425 * pointed to by "bcont". In opaque this is set to NULL
358 */ 426 */
359 427
360 ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it) 428 ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it)
361 { 429 {
362 BIO *asnin; 430 BIO *asnin;
363 STACK_OF(MIME_HEADER) *headers = NULL; 431 STACK_OF(MIME_HEADER) *headers = NULL;
364 STACK_OF(BIO) *parts = NULL; 432 STACK_OF(BIO) *parts = NULL;
(...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after
865 { 933 {
866 c = *p; 934 c = *p;
867 if (c == '\n') 935 if (c == '\n')
868 is_eol = 1; 936 is_eol = 1;
869 else if (c != '\r') 937 else if (c != '\r')
870 break; 938 break;
871 } 939 }
872 *plen = len; 940 *plen = len;
873 return is_eol; 941 return is_eol;
874 } 942 }
OLDNEW
« no previous file with comments | « openssl/crypto/asn1/asn1t.h ('k') | openssl/crypto/asn1/asn_pack.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698