diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/asn1/asn_mime.c | 597 | ||||
| -rw-r--r-- | src/lib/libcrypto/asn1/asn_moid.c | 33 | ||||
| -rw-r--r-- | src/lib/libcrypto/asn1/asn_pack.c | 28 | ||||
| -rw-r--r-- | src/lib/libcrypto/asn1/bio_asn1.c | 152 | ||||
| -rw-r--r-- | src/lib/libcrypto/asn1/bio_ndef.c | 24 | ||||
| -rw-r--r-- | src/lib/libcrypto/asn1/charmap.h | 17 |
6 files changed, 471 insertions, 380 deletions
diff --git a/src/lib/libcrypto/asn1/asn_mime.c b/src/lib/libcrypto/asn1/asn_mime.c index 6cde8fd44e..890557578d 100644 --- a/src/lib/libcrypto/asn1/asn_mime.c +++ b/src/lib/libcrypto/asn1/asn_mime.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -71,24 +71,24 @@ | |||
| 71 | */ | 71 | */ |
| 72 | 72 | ||
| 73 | typedef struct { | 73 | typedef struct { |
| 74 | char *param_name; /* Param name e.g. "micalg" */ | 74 | char *param_name; /* Param name e.g. "micalg" */ |
| 75 | char *param_value; /* Param value e.g. "sha1" */ | 75 | char *param_value; /* Param value e.g. "sha1" */ |
| 76 | } MIME_PARAM; | 76 | } MIME_PARAM; |
| 77 | 77 | ||
| 78 | DECLARE_STACK_OF(MIME_PARAM) | 78 | DECLARE_STACK_OF(MIME_PARAM) |
| 79 | IMPLEMENT_STACK_OF(MIME_PARAM) | 79 | IMPLEMENT_STACK_OF(MIME_PARAM) |
| 80 | 80 | ||
| 81 | typedef struct { | 81 | typedef struct { |
| 82 | char *name; /* Name of line e.g. "content-type" */ | 82 | char *name; /* Name of line e.g. "content-type" */ |
| 83 | char *value; /* Value of line e.g. "text/plain" */ | 83 | char *value; /* Value of line e.g. "text/plain" */ |
| 84 | STACK_OF(MIME_PARAM) *params; /* Zero or more parameters */ | 84 | STACK_OF(MIME_PARAM) *params; /* Zero or more parameters */ |
| 85 | } MIME_HEADER; | 85 | } MIME_HEADER; |
| 86 | 86 | ||
| 87 | DECLARE_STACK_OF(MIME_HEADER) | 87 | DECLARE_STACK_OF(MIME_HEADER) |
| 88 | IMPLEMENT_STACK_OF(MIME_HEADER) | 88 | IMPLEMENT_STACK_OF(MIME_HEADER) |
| 89 | 89 | ||
| 90 | static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, | 90 | static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, |
| 91 | const ASN1_ITEM *it); | 91 | const ASN1_ITEM *it); |
| 92 | static char * strip_ends(char *name); | 92 | static char * strip_ends(char *name); |
| 93 | static char * strip_start(char *name); | 93 | static char * strip_start(char *name); |
| 94 | static char * strip_end(char *name); | 94 | static char * strip_end(char *name); |
| @@ -96,9 +96,9 @@ static MIME_HEADER *mime_hdr_new(char *name, char *value); | |||
| 96 | 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); |
| 97 | static STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio); | 97 | static STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio); |
| 98 | static int mime_hdr_cmp(const MIME_HEADER * const *a, | 98 | static int mime_hdr_cmp(const MIME_HEADER * const *a, |
| 99 | const MIME_HEADER * const *b); | 99 | const MIME_HEADER * const *b); |
| 100 | static int mime_param_cmp(const MIME_PARAM * const *a, | 100 | static int mime_param_cmp(const MIME_PARAM * const *a, |
| 101 | const MIME_PARAM * const *b); | 101 | const MIME_PARAM * const *b); |
| 102 | static void mime_param_free(MIME_PARAM *param); | 102 | static void mime_param_free(MIME_PARAM *param); |
| 103 | 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); |
| 104 | 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); |
| @@ -112,15 +112,17 @@ static void mime_hdr_free(MIME_HEADER *hdr); | |||
| 112 | 112 | ||
| 113 | /* Output an ASN1 structure in BER format streaming if necessary */ | 113 | /* Output an ASN1 structure in BER format streaming if necessary */ |
| 114 | 114 | ||
| 115 | int i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, | 115 | int |
| 116 | const ASN1_ITEM *it) | 116 | i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, |
| 117 | const ASN1_ITEM *it) | ||
| 117 | { | 118 | { |
| 118 | /* If streaming create stream BIO and copy all content through it */ | 119 | /* If streaming create stream BIO and copy all content through it */ |
| 119 | if (flags & SMIME_STREAM) { | 120 | if (flags & SMIME_STREAM) { |
| 120 | BIO *bio, *tbio; | 121 | BIO *bio, *tbio; |
| 121 | bio = BIO_new_NDEF(out, val, it); | 122 | bio = BIO_new_NDEF(out, val, it); |
| 122 | if (!bio) { | 123 | if (!bio) { |
| 123 | ASN1err(ASN1_F_I2D_ASN1_BIO_STREAM,ERR_R_MALLOC_FAILURE); | 124 | ASN1err(ASN1_F_I2D_ASN1_BIO_STREAM, |
| 125 | ERR_R_MALLOC_FAILURE); | ||
| 124 | return 0; | 126 | return 0; |
| 125 | } | 127 | } |
| 126 | SMIME_crlf_copy(in, bio, flags); | 128 | SMIME_crlf_copy(in, bio, flags); |
| @@ -142,14 +144,16 @@ int i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, | |||
| 142 | 144 | ||
| 143 | /* Base 64 read and write of ASN1 structure */ | 145 | /* Base 64 read and write of ASN1 structure */ |
| 144 | 146 | ||
| 145 | static int B64_write_ASN1(BIO *out, ASN1_VALUE *val, BIO *in, int flags, | 147 | static int |
| 146 | const ASN1_ITEM *it) | 148 | B64_write_ASN1(BIO *out, ASN1_VALUE *val, BIO *in, int flags, |
| 149 | const ASN1_ITEM *it) | ||
| 147 | { | 150 | { |
| 148 | BIO *b64; | 151 | BIO *b64; |
| 149 | int r; | 152 | int r; |
| 153 | |||
| 150 | b64 = BIO_new(BIO_f_base64()); | 154 | b64 = BIO_new(BIO_f_base64()); |
| 151 | if(!b64) { | 155 | if (!b64) { |
| 152 | ASN1err(ASN1_F_B64_WRITE_ASN1,ERR_R_MALLOC_FAILURE); | 156 | ASN1err(ASN1_F_B64_WRITE_ASN1, ERR_R_MALLOC_FAILURE); |
| 153 | return 0; | 157 | return 0; |
| 154 | } | 158 | } |
| 155 | /* prepend the b64 BIO so all data is base64 encoded. | 159 | /* prepend the b64 BIO so all data is base64 encoded. |
| @@ -164,29 +168,31 @@ static int B64_write_ASN1(BIO *out, ASN1_VALUE *val, BIO *in, int flags, | |||
| 164 | 168 | ||
| 165 | /* Streaming ASN1 PEM write */ | 169 | /* Streaming ASN1 PEM write */ |
| 166 | 170 | ||
| 167 | int PEM_write_bio_ASN1_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, | 171 | int |
| 168 | const char *hdr, | 172 | PEM_write_bio_ASN1_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, |
| 169 | const ASN1_ITEM *it) | 173 | const char *hdr, const ASN1_ITEM *it) |
| 170 | { | 174 | { |
| 171 | int r; | 175 | int r; |
| 176 | |||
| 172 | BIO_printf(out, "-----BEGIN %s-----\n", hdr); | 177 | BIO_printf(out, "-----BEGIN %s-----\n", hdr); |
| 173 | r = B64_write_ASN1(out, val, in, flags, it); | 178 | r = B64_write_ASN1(out, val, in, flags, it); |
| 174 | BIO_printf(out, "-----END %s-----\n", hdr); | 179 | BIO_printf(out, "-----END %s-----\n", hdr); |
| 175 | return r; | 180 | return r; |
| 176 | } | 181 | } |
| 177 | 182 | ||
| 178 | static ASN1_VALUE *b64_read_asn1(BIO *bio, const ASN1_ITEM *it) | 183 | static ASN1_VALUE * |
| 184 | b64_read_asn1(BIO *bio, const ASN1_ITEM *it) | ||
| 179 | { | 185 | { |
| 180 | BIO *b64; | 186 | BIO *b64; |
| 181 | ASN1_VALUE *val; | 187 | ASN1_VALUE *val; |
| 182 | if(!(b64 = BIO_new(BIO_f_base64()))) { | 188 | if (!(b64 = BIO_new(BIO_f_base64()))) { |
| 183 | ASN1err(ASN1_F_B64_READ_ASN1,ERR_R_MALLOC_FAILURE); | 189 | ASN1err(ASN1_F_B64_READ_ASN1, ERR_R_MALLOC_FAILURE); |
| 184 | return 0; | 190 | return 0; |
| 185 | } | 191 | } |
| 186 | bio = BIO_push(b64, bio); | 192 | bio = BIO_push(b64, bio); |
| 187 | val = ASN1_item_d2i_bio(it, bio, NULL); | 193 | val = ASN1_item_d2i_bio(it, bio, NULL); |
| 188 | if(!val) | 194 | if (!val) |
| 189 | ASN1err(ASN1_F_B64_READ_ASN1,ASN1_R_DECODE_ERROR); | 195 | ASN1err(ASN1_F_B64_READ_ASN1, ASN1_R_DECODE_ERROR); |
| 190 | (void)BIO_flush(bio); | 196 | (void)BIO_flush(bio); |
| 191 | bio = BIO_pop(bio); | 197 | bio = BIO_pop(bio); |
| 192 | BIO_free(b64); | 198 | BIO_free(b64); |
| @@ -195,10 +201,12 @@ static ASN1_VALUE *b64_read_asn1(BIO *bio, const ASN1_ITEM *it) | |||
| 195 | 201 | ||
| 196 | /* Generate the MIME "micalg" parameter from RFC3851, RFC4490 */ | 202 | /* Generate the MIME "micalg" parameter from RFC3851, RFC4490 */ |
| 197 | 203 | ||
| 198 | static int asn1_write_micalg(BIO *out, STACK_OF(X509_ALGOR) *mdalgs) | 204 | static int |
| 205 | asn1_write_micalg(BIO *out, STACK_OF(X509_ALGOR) *mdalgs) | ||
| 199 | { | 206 | { |
| 200 | const EVP_MD *md; | 207 | const EVP_MD *md; |
| 201 | int i, have_unknown = 0, write_comma, ret = 0, md_nid; | 208 | int i, have_unknown = 0, write_comma, ret = 0, md_nid; |
| 209 | |||
| 202 | have_unknown = 0; | 210 | have_unknown = 0; |
| 203 | write_comma = 0; | 211 | write_comma = 0; |
| 204 | for (i = 0; i < sk_X509_ALGOR_num(mdalgs); i++) { | 212 | for (i = 0; i < sk_X509_ALGOR_num(mdalgs); i++) { |
| @@ -219,33 +227,33 @@ static int asn1_write_micalg(BIO *out, STACK_OF(X509_ALGOR) *mdalgs) | |||
| 219 | if (rv != -2) | 227 | if (rv != -2) |
| 220 | goto err; | 228 | goto err; |
| 221 | } | 229 | } |
| 222 | switch(md_nid) { | 230 | switch (md_nid) { |
| 223 | case NID_sha1: | 231 | case NID_sha1: |
| 224 | BIO_puts(out, "sha1"); | 232 | BIO_puts(out, "sha1"); |
| 225 | break; | 233 | break; |
| 226 | 234 | ||
| 227 | case NID_md5: | 235 | case NID_md5: |
| 228 | BIO_puts(out, "md5"); | 236 | BIO_puts(out, "md5"); |
| 229 | break; | 237 | break; |
| 230 | 238 | ||
| 231 | case NID_sha256: | 239 | case NID_sha256: |
| 232 | BIO_puts(out, "sha-256"); | 240 | BIO_puts(out, "sha-256"); |
| 233 | break; | 241 | break; |
| 234 | 242 | ||
| 235 | case NID_sha384: | 243 | case NID_sha384: |
| 236 | BIO_puts(out, "sha-384"); | 244 | BIO_puts(out, "sha-384"); |
| 237 | break; | 245 | break; |
| 238 | 246 | ||
| 239 | case NID_sha512: | 247 | case NID_sha512: |
| 240 | BIO_puts(out, "sha-512"); | 248 | BIO_puts(out, "sha-512"); |
| 241 | break; | 249 | break; |
| 242 | 250 | ||
| 243 | case NID_id_GostR3411_94: | 251 | case NID_id_GostR3411_94: |
| 244 | BIO_puts(out, "gostr3411-94"); | 252 | BIO_puts(out, "gostr3411-94"); |
| 245 | goto err; | 253 | goto err; |
| 246 | break; | 254 | break; |
| 247 | 255 | ||
| 248 | default: | 256 | default: |
| 249 | if (have_unknown) | 257 | if (have_unknown) |
| 250 | write_comma = 0; | 258 | write_comma = 0; |
| 251 | else { | 259 | else { |
| @@ -258,23 +266,23 @@ static int asn1_write_micalg(BIO *out, STACK_OF(X509_ALGOR) *mdalgs) | |||
| 258 | } | 266 | } |
| 259 | 267 | ||
| 260 | ret = 1; | 268 | ret = 1; |
| 261 | err: | ||
| 262 | 269 | ||
| 270 | err: | ||
| 263 | return ret; | 271 | return ret; |
| 264 | |||
| 265 | } | 272 | } |
| 266 | 273 | ||
| 267 | /* SMIME sender */ | 274 | /* SMIME sender */ |
| 268 | 275 | ||
| 269 | int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, | 276 | int |
| 270 | int ctype_nid, int econt_nid, | 277 | SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, |
| 271 | STACK_OF(X509_ALGOR) *mdalgs, | 278 | int ctype_nid, int econt_nid, STACK_OF(X509_ALGOR) *mdalgs, |
| 272 | const ASN1_ITEM *it) | 279 | const ASN1_ITEM *it) |
| 273 | { | 280 | { |
| 274 | char bound[33], c; | 281 | char bound[33], c; |
| 275 | int i; | 282 | int i; |
| 276 | const char *mime_prefix, *mime_eol, *cname = "smime.p7m"; | 283 | const char *mime_prefix, *mime_eol, *cname = "smime.p7m"; |
| 277 | const char *msg_type=NULL; | 284 | const char *msg_type = NULL; |
| 285 | |||
| 278 | if (flags & SMIME_OLDMIME) | 286 | if (flags & SMIME_OLDMIME) |
| 279 | mime_prefix = "application/x-pkcs7-"; | 287 | mime_prefix = "application/x-pkcs7-"; |
| 280 | else | 288 | else |
| @@ -284,16 +292,18 @@ int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, | |||
| 284 | mime_eol = "\r\n"; | 292 | mime_eol = "\r\n"; |
| 285 | else | 293 | else |
| 286 | mime_eol = "\n"; | 294 | mime_eol = "\n"; |
| 287 | if((flags & SMIME_DETACHED) && data) { | 295 | if ((flags & SMIME_DETACHED) && data) { |
| 288 | /* We want multipart/signed */ | 296 | /* We want multipart/signed */ |
| 289 | /* Generate a random boundary */ | 297 | /* Generate a random boundary */ |
| 290 | RAND_pseudo_bytes((unsigned char *)bound, 32); | 298 | RAND_pseudo_bytes((unsigned char *)bound, 32); |
| 291 | for(i = 0; i < 32; i++) { | 299 | for (i = 0; i < 32; i++) { |
| 292 | c = bound[i] & 0xf; | 300 | c = bound[i] & 0xf; |
| 293 | if(c < 10) c += '0'; | 301 | if (c < 10) |
| 294 | else c += 'A' - 10; | 302 | c += '0'; |
| 303 | else | ||
| 304 | c += 'A' - 10; | ||
| 295 | bound[i] = c; | 305 | bound[i] = c; |
| 296 | } | 306 | } |
| 297 | bound[32] = 0; | 307 | bound[32] = 0; |
| 298 | BIO_printf(bio, "MIME-Version: 1.0%s", mime_eol); | 308 | BIO_printf(bio, "MIME-Version: 1.0%s", mime_eol); |
| 299 | BIO_printf(bio, "Content-Type: multipart/signed;"); | 309 | BIO_printf(bio, "Content-Type: multipart/signed;"); |
| @@ -301,9 +311,9 @@ int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, | |||
| 301 | BIO_puts(bio, " micalg=\""); | 311 | BIO_puts(bio, " micalg=\""); |
| 302 | asn1_write_micalg(bio, mdalgs); | 312 | asn1_write_micalg(bio, mdalgs); |
| 303 | BIO_printf(bio, "\"; boundary=\"----%s\"%s%s", | 313 | BIO_printf(bio, "\"; boundary=\"----%s\"%s%s", |
| 304 | bound, mime_eol, mime_eol); | 314 | bound, mime_eol, mime_eol); |
| 305 | BIO_printf(bio, "This is an S/MIME signed message%s%s", | 315 | BIO_printf(bio, "This is an S/MIME signed message%s%s", |
| 306 | mime_eol, mime_eol); | 316 | mime_eol, mime_eol); |
| 307 | /* Now write out the first part */ | 317 | /* Now write out the first part */ |
| 308 | BIO_printf(bio, "------%s%s", bound, mime_eol); | 318 | BIO_printf(bio, "------%s%s", bound, mime_eol); |
| 309 | if (!asn1_output_data(bio, data, val, flags, it)) | 319 | if (!asn1_output_data(bio, data, val, flags, it)) |
| @@ -312,18 +322,18 @@ int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, | |||
| 312 | 322 | ||
| 313 | /* Headers for signature */ | 323 | /* Headers for signature */ |
| 314 | 324 | ||
| 315 | BIO_printf(bio, "Content-Type: %ssignature;", mime_prefix); | 325 | BIO_printf(bio, "Content-Type: %ssignature;", mime_prefix); |
| 316 | BIO_printf(bio, " name=\"smime.p7s\"%s", mime_eol); | 326 | BIO_printf(bio, " name=\"smime.p7s\"%s", mime_eol); |
| 317 | BIO_printf(bio, "Content-Transfer-Encoding: base64%s", | 327 | BIO_printf(bio, "Content-Transfer-Encoding: base64%s", |
| 318 | mime_eol); | 328 | mime_eol); |
| 319 | BIO_printf(bio, "Content-Disposition: attachment;"); | 329 | BIO_printf(bio, "Content-Disposition: attachment;"); |
| 320 | BIO_printf(bio, " filename=\"smime.p7s\"%s%s", | 330 | BIO_printf(bio, " filename=\"smime.p7s\"%s%s", |
| 321 | mime_eol, mime_eol); | 331 | mime_eol, mime_eol); |
| 322 | B64_write_ASN1(bio, val, NULL, 0, it); | 332 | B64_write_ASN1(bio, val, NULL, 0, it); |
| 323 | BIO_printf(bio,"%s------%s--%s%s", mime_eol, bound, | 333 | BIO_printf(bio, "%s------%s--%s%s", mime_eol, bound, |
| 324 | mime_eol, mime_eol); | 334 | mime_eol, mime_eol); |
| 325 | return 1; | 335 | return 1; |
| 326 | } | 336 | } |
| 327 | 337 | ||
| 328 | /* Determine smime-type header */ | 338 | /* Determine smime-type header */ |
| 329 | 339 | ||
| @@ -349,7 +359,7 @@ int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, | |||
| 349 | BIO_printf(bio, " smime-type=%s;", msg_type); | 359 | BIO_printf(bio, " smime-type=%s;", msg_type); |
| 350 | BIO_printf(bio, " name=\"%s\"%s", cname, mime_eol); | 360 | BIO_printf(bio, " name=\"%s\"%s", cname, mime_eol); |
| 351 | BIO_printf(bio, "Content-Transfer-Encoding: base64%s%s", | 361 | BIO_printf(bio, "Content-Transfer-Encoding: base64%s%s", |
| 352 | mime_eol, mime_eol); | 362 | mime_eol, mime_eol); |
| 353 | if (!B64_write_ASN1(bio, val, data, flags, it)) | 363 | if (!B64_write_ASN1(bio, val, data, flags, it)) |
| 354 | return 0; | 364 | return 0; |
| 355 | BIO_printf(bio, "%s", mime_eol); | 365 | BIO_printf(bio, "%s", mime_eol); |
| @@ -359,8 +369,9 @@ int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, | |||
| 359 | /* Handle output of ASN1 data */ | 369 | /* Handle output of ASN1 data */ |
| 360 | 370 | ||
| 361 | 371 | ||
| 362 | static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, | 372 | static int |
| 363 | const ASN1_ITEM *it) | 373 | asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, |
| 374 | const ASN1_ITEM *it) | ||
| 364 | { | 375 | { |
| 365 | BIO *tmpbio; | 376 | BIO *tmpbio; |
| 366 | const ASN1_AUX *aux = it->funcs; | 377 | const ASN1_AUX *aux = it->funcs; |
| @@ -377,7 +388,7 @@ static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, | |||
| 377 | 388 | ||
| 378 | if (!aux || !aux->asn1_cb) { | 389 | if (!aux || !aux->asn1_cb) { |
| 379 | ASN1err(ASN1_F_ASN1_OUTPUT_DATA, | 390 | ASN1err(ASN1_F_ASN1_OUTPUT_DATA, |
| 380 | ASN1_R_STREAMING_NOT_SUPPORTED); | 391 | ASN1_R_STREAMING_NOT_SUPPORTED); |
| 381 | return 0; | 392 | return 0; |
| 382 | } | 393 | } |
| 383 | 394 | ||
| @@ -406,7 +417,6 @@ static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, | |||
| 406 | } | 417 | } |
| 407 | 418 | ||
| 408 | return rv; | 419 | return rv; |
| 409 | |||
| 410 | } | 420 | } |
| 411 | 421 | ||
| 412 | /* SMIME reader: handle multipart/signed and opaque signing. | 422 | /* SMIME reader: handle multipart/signed and opaque signing. |
| @@ -414,7 +424,8 @@ static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, | |||
| 414 | * pointed to by "bcont". In opaque this is set to NULL | 424 | * pointed to by "bcont". In opaque this is set to NULL |
| 415 | */ | 425 | */ |
| 416 | 426 | ||
| 417 | ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it) | 427 | ASN1_VALUE * |
| 428 | SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it) | ||
| 418 | { | 429 | { |
| 419 | BIO *asnin; | 430 | BIO *asnin; |
| 420 | STACK_OF(MIME_HEADER) *headers = NULL; | 431 | STACK_OF(MIME_HEADER) *headers = NULL; |
| @@ -424,106 +435,114 @@ ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it) | |||
| 424 | ASN1_VALUE *val; | 435 | ASN1_VALUE *val; |
| 425 | int ret; | 436 | int ret; |
| 426 | 437 | ||
| 427 | if(bcont) *bcont = NULL; | 438 | if (bcont) |
| 439 | *bcont = NULL; | ||
| 428 | 440 | ||
| 429 | if (!(headers = mime_parse_hdr(bio))) { | 441 | if (!(headers = mime_parse_hdr(bio))) { |
| 430 | ASN1err(ASN1_F_SMIME_READ_ASN1,ASN1_R_MIME_PARSE_ERROR); | 442 | ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_MIME_PARSE_ERROR); |
| 431 | return NULL; | 443 | return NULL; |
| 432 | } | 444 | } |
| 433 | 445 | ||
| 434 | if(!(hdr = mime_hdr_find(headers, "content-type")) || !hdr->value) { | 446 | if (!(hdr = mime_hdr_find(headers, "content-type")) || !hdr->value) { |
| 435 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | 447 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); |
| 436 | ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_NO_CONTENT_TYPE); | 448 | ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_NO_CONTENT_TYPE); |
| 437 | return NULL; | 449 | return NULL; |
| 438 | } | 450 | } |
| 439 | 451 | ||
| 440 | /* Handle multipart/signed */ | 452 | /* Handle multipart/signed */ |
| 441 | 453 | ||
| 442 | if(!strcmp(hdr->value, "multipart/signed")) { | 454 | if (!strcmp(hdr->value, "multipart/signed")) { |
| 443 | /* Split into two parts */ | 455 | /* Split into two parts */ |
| 444 | prm = mime_param_find(hdr, "boundary"); | 456 | prm = mime_param_find(hdr, "boundary"); |
| 445 | if(!prm || !prm->param_value) { | 457 | if (!prm || !prm->param_value) { |
| 446 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | 458 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); |
| 447 | ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_NO_MULTIPART_BOUNDARY); | 459 | ASN1err(ASN1_F_SMIME_READ_ASN1, |
| 460 | ASN1_R_NO_MULTIPART_BOUNDARY); | ||
| 448 | return NULL; | 461 | return NULL; |
| 449 | } | 462 | } |
| 450 | ret = multi_split(bio, prm->param_value, &parts); | 463 | ret = multi_split(bio, prm->param_value, &parts); |
| 451 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | 464 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); |
| 452 | if(!ret || (sk_BIO_num(parts) != 2) ) { | 465 | if (!ret || (sk_BIO_num(parts) != 2) ) { |
| 453 | ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_NO_MULTIPART_BODY_FAILURE); | 466 | ASN1err(ASN1_F_SMIME_READ_ASN1, |
| 467 | ASN1_R_NO_MULTIPART_BODY_FAILURE); | ||
| 454 | sk_BIO_pop_free(parts, BIO_vfree); | 468 | sk_BIO_pop_free(parts, BIO_vfree); |
| 455 | return NULL; | 469 | return NULL; |
| 456 | } | 470 | } |
| 457 | 471 | ||
| 458 | /* Parse the signature piece */ | 472 | /* Parse the signature piece */ |
| 459 | asnin = sk_BIO_value(parts, 1); | 473 | asnin = sk_BIO_value(parts, 1); |
| 460 | 474 | ||
| 461 | if (!(headers = mime_parse_hdr(asnin))) { | 475 | if (!(headers = mime_parse_hdr(asnin))) { |
| 462 | ASN1err(ASN1_F_SMIME_READ_ASN1,ASN1_R_MIME_SIG_PARSE_ERROR); | 476 | ASN1err(ASN1_F_SMIME_READ_ASN1, |
| 477 | ASN1_R_MIME_SIG_PARSE_ERROR); | ||
| 463 | sk_BIO_pop_free(parts, BIO_vfree); | 478 | sk_BIO_pop_free(parts, BIO_vfree); |
| 464 | return NULL; | 479 | return NULL; |
| 465 | } | 480 | } |
| 466 | 481 | ||
| 467 | /* Get content type */ | 482 | /* Get content type */ |
| 468 | 483 | ||
| 469 | if(!(hdr = mime_hdr_find(headers, "content-type")) || | 484 | if (!(hdr = mime_hdr_find(headers, "content-type")) || |
| 470 | !hdr->value) { | 485 | !hdr->value) { |
| 471 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | 486 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); |
| 472 | ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_NO_SIG_CONTENT_TYPE); | 487 | ASN1err(ASN1_F_SMIME_READ_ASN1, |
| 488 | ASN1_R_NO_SIG_CONTENT_TYPE); | ||
| 473 | return NULL; | 489 | return NULL; |
| 474 | } | 490 | } |
| 475 | 491 | ||
| 476 | if(strcmp(hdr->value, "application/x-pkcs7-signature") && | 492 | if (strcmp(hdr->value, "application/x-pkcs7-signature") && |
| 477 | strcmp(hdr->value, "application/pkcs7-signature")) { | 493 | strcmp(hdr->value, "application/pkcs7-signature")) { |
| 478 | ASN1err(ASN1_F_SMIME_READ_ASN1,ASN1_R_SIG_INVALID_MIME_TYPE); | 494 | ASN1err(ASN1_F_SMIME_READ_ASN1, |
| 495 | ASN1_R_SIG_INVALID_MIME_TYPE); | ||
| 479 | ERR_add_error_data(2, "type: ", hdr->value); | 496 | ERR_add_error_data(2, "type: ", hdr->value); |
| 480 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | 497 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); |
| 481 | sk_BIO_pop_free(parts, BIO_vfree); | 498 | sk_BIO_pop_free(parts, BIO_vfree); |
| 482 | return NULL; | 499 | return NULL; |
| 483 | } | 500 | } |
| 484 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | 501 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); |
| 485 | /* Read in ASN1 */ | 502 | /* Read in ASN1 */ |
| 486 | if(!(val = b64_read_asn1(asnin, it))) { | 503 | if (!(val = b64_read_asn1(asnin, it))) { |
| 487 | ASN1err(ASN1_F_SMIME_READ_ASN1,ASN1_R_ASN1_SIG_PARSE_ERROR); | 504 | ASN1err(ASN1_F_SMIME_READ_ASN1, |
| 505 | ASN1_R_ASN1_SIG_PARSE_ERROR); | ||
| 488 | sk_BIO_pop_free(parts, BIO_vfree); | 506 | sk_BIO_pop_free(parts, BIO_vfree); |
| 489 | return NULL; | 507 | return NULL; |
| 490 | } | 508 | } |
| 491 | 509 | ||
| 492 | if(bcont) { | 510 | if (bcont) { |
| 493 | *bcont = sk_BIO_value(parts, 0); | 511 | *bcont = sk_BIO_value(parts, 0); |
| 494 | BIO_free(asnin); | 512 | BIO_free(asnin); |
| 495 | sk_BIO_free(parts); | 513 | sk_BIO_free(parts); |
| 496 | } else sk_BIO_pop_free(parts, BIO_vfree); | 514 | } else sk_BIO_pop_free(parts, BIO_vfree); |
| 497 | return val; | 515 | return val; |
| 498 | } | 516 | } |
| 499 | 517 | ||
| 500 | /* OK, if not multipart/signed try opaque signature */ | 518 | /* OK, if not multipart/signed try opaque signature */ |
| 501 | 519 | ||
| 502 | if (strcmp (hdr->value, "application/x-pkcs7-mime") && | 520 | if (strcmp (hdr->value, "application/x-pkcs7-mime") && |
| 503 | strcmp (hdr->value, "application/pkcs7-mime")) { | 521 | strcmp (hdr->value, "application/pkcs7-mime")) { |
| 504 | ASN1err(ASN1_F_SMIME_READ_ASN1,ASN1_R_INVALID_MIME_TYPE); | 522 | ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_INVALID_MIME_TYPE); |
| 505 | ERR_add_error_data(2, "type: ", hdr->value); | 523 | ERR_add_error_data(2, "type: ", hdr->value); |
| 506 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | 524 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); |
| 507 | return NULL; | 525 | return NULL; |
| 508 | } | 526 | } |
| 509 | 527 | ||
| 510 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | 528 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); |
| 511 | 529 | ||
| 512 | if(!(val = b64_read_asn1(bio, it))) { | 530 | if (!(val = b64_read_asn1(bio, it))) { |
| 513 | ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_ASN1_PARSE_ERROR); | 531 | ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_ASN1_PARSE_ERROR); |
| 514 | return NULL; | 532 | return NULL; |
| 515 | } | 533 | } |
| 516 | return val; | 534 | return val; |
| 517 | |||
| 518 | } | 535 | } |
| 519 | 536 | ||
| 520 | /* Copy text from one BIO to another making the output CRLF at EOL */ | 537 | /* Copy text from one BIO to another making the output CRLF at EOL */ |
| 521 | int SMIME_crlf_copy(BIO *in, BIO *out, int flags) | 538 | int |
| 539 | SMIME_crlf_copy(BIO *in, BIO *out, int flags) | ||
| 522 | { | 540 | { |
| 523 | BIO *bf; | 541 | BIO *bf; |
| 524 | char eol; | 542 | char eol; |
| 525 | int len; | 543 | int len; |
| 526 | char linebuf[MAX_SMLEN]; | 544 | char linebuf[MAX_SMLEN]; |
| 545 | |||
| 527 | /* Buffer output so we don't write one line at a time. This is | 546 | /* Buffer output so we don't write one line at a time. This is |
| 528 | * useful when streaming as we don't end up with one OCTET STRING | 547 | * useful when streaming as we don't end up with one OCTET STRING |
| 529 | * per line. | 548 | * per line. |
| @@ -532,17 +551,18 @@ int SMIME_crlf_copy(BIO *in, BIO *out, int flags) | |||
| 532 | if (!bf) | 551 | if (!bf) |
| 533 | return 0; | 552 | return 0; |
| 534 | out = BIO_push(bf, out); | 553 | out = BIO_push(bf, out); |
| 535 | if(flags & SMIME_BINARY) { | 554 | if (flags & SMIME_BINARY) { |
| 536 | while((len = BIO_read(in, linebuf, MAX_SMLEN)) > 0) | 555 | while ((len = BIO_read(in, linebuf, MAX_SMLEN)) > 0) |
| 537 | BIO_write(out, linebuf, len); | 556 | BIO_write(out, linebuf, len); |
| 538 | } else { | 557 | } else { |
| 539 | if(flags & SMIME_TEXT) | 558 | if (flags & SMIME_TEXT) |
| 540 | BIO_printf(out, "Content-Type: text/plain\r\n\r\n"); | 559 | BIO_printf(out, "Content-Type: text/plain\r\n\r\n"); |
| 541 | while ((len = BIO_gets(in, linebuf, MAX_SMLEN)) > 0) { | 560 | while ((len = BIO_gets(in, linebuf, MAX_SMLEN)) > 0) { |
| 542 | eol = strip_eol(linebuf, &len); | 561 | eol = strip_eol(linebuf, &len); |
| 543 | if (len) | 562 | if (len) |
| 544 | BIO_write(out, linebuf, len); | 563 | BIO_write(out, linebuf, len); |
| 545 | if(eol) BIO_write(out, "\r\n", 2); | 564 | if (eol) |
| 565 | BIO_write(out, "\r\n", 2); | ||
| 546 | } | 566 | } |
| 547 | } | 567 | } |
| 548 | (void)BIO_flush(out); | 568 | (void)BIO_flush(out); |
| @@ -552,7 +572,8 @@ int SMIME_crlf_copy(BIO *in, BIO *out, int flags) | |||
| 552 | } | 572 | } |
| 553 | 573 | ||
| 554 | /* Strip off headers if they are text/plain */ | 574 | /* Strip off headers if they are text/plain */ |
| 555 | int SMIME_text(BIO *in, BIO *out) | 575 | int |
| 576 | SMIME_text(BIO *in, BIO *out) | ||
| 556 | { | 577 | { |
| 557 | char iobuf[4096]; | 578 | char iobuf[4096]; |
| 558 | int len; | 579 | int len; |
| @@ -560,23 +581,23 @@ int SMIME_text(BIO *in, BIO *out) | |||
| 560 | MIME_HEADER *hdr; | 581 | MIME_HEADER *hdr; |
| 561 | 582 | ||
| 562 | if (!(headers = mime_parse_hdr(in))) { | 583 | if (!(headers = mime_parse_hdr(in))) { |
| 563 | ASN1err(ASN1_F_SMIME_TEXT,ASN1_R_MIME_PARSE_ERROR); | 584 | ASN1err(ASN1_F_SMIME_TEXT, ASN1_R_MIME_PARSE_ERROR); |
| 564 | return 0; | 585 | return 0; |
| 565 | } | 586 | } |
| 566 | if(!(hdr = mime_hdr_find(headers, "content-type")) || !hdr->value) { | 587 | if (!(hdr = mime_hdr_find(headers, "content-type")) || !hdr->value) { |
| 567 | ASN1err(ASN1_F_SMIME_TEXT,ASN1_R_MIME_NO_CONTENT_TYPE); | 588 | ASN1err(ASN1_F_SMIME_TEXT, ASN1_R_MIME_NO_CONTENT_TYPE); |
| 568 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | 589 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); |
| 569 | return 0; | 590 | return 0; |
| 570 | } | 591 | } |
| 571 | if (strcmp (hdr->value, "text/plain")) { | 592 | if (strcmp (hdr->value, "text/plain")) { |
| 572 | ASN1err(ASN1_F_SMIME_TEXT,ASN1_R_INVALID_MIME_TYPE); | 593 | ASN1err(ASN1_F_SMIME_TEXT, ASN1_R_INVALID_MIME_TYPE); |
| 573 | ERR_add_error_data(2, "type: ", hdr->value); | 594 | ERR_add_error_data(2, "type: ", hdr->value); |
| 574 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | 595 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); |
| 575 | return 0; | 596 | return 0; |
| 576 | } | 597 | } |
| 577 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | 598 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); |
| 578 | while ((len = BIO_read(in, iobuf, sizeof(iobuf))) > 0) | 599 | while ((len = BIO_read(in, iobuf, sizeof(iobuf))) > 0) |
| 579 | BIO_write(out, iobuf, len); | 600 | BIO_write(out, iobuf, len); |
| 580 | if (len < 0) | 601 | if (len < 0) |
| 581 | return 0; | 602 | return 0; |
| 582 | return 1; | 603 | return 1; |
| @@ -586,7 +607,8 @@ int SMIME_text(BIO *in, BIO *out) | |||
| 586 | * canonical parts in a STACK of bios | 607 | * canonical parts in a STACK of bios |
| 587 | */ | 608 | */ |
| 588 | 609 | ||
| 589 | static int multi_split(BIO *bio, char *bound, STACK_OF(BIO) **ret) | 610 | static int |
| 611 | multi_split(BIO *bio, char *bound, STACK_OF(BIO) **ret) | ||
| 590 | { | 612 | { |
| 591 | char linebuf[MAX_SMLEN]; | 613 | char linebuf[MAX_SMLEN]; |
| 592 | int len, blen; | 614 | int len, blen; |
| @@ -603,27 +625,28 @@ static int multi_split(BIO *bio, char *bound, STACK_OF(BIO) **ret) | |||
| 603 | *ret = parts; | 625 | *ret = parts; |
| 604 | while ((len = BIO_gets(bio, linebuf, MAX_SMLEN)) > 0) { | 626 | while ((len = BIO_gets(bio, linebuf, MAX_SMLEN)) > 0) { |
| 605 | state = mime_bound_check(linebuf, len, bound, blen); | 627 | state = mime_bound_check(linebuf, len, bound, blen); |
| 606 | if(state == 1) { | 628 | if (state == 1) { |
| 607 | first = 1; | 629 | first = 1; |
| 608 | part++; | 630 | part++; |
| 609 | } else if(state == 2) { | 631 | } else if (state == 2) { |
| 610 | sk_BIO_push(parts, bpart); | 632 | sk_BIO_push(parts, bpart); |
| 611 | return 1; | 633 | return 1; |
| 612 | } else if(part) { | 634 | } else if (part) { |
| 613 | /* Strip CR+LF from linebuf */ | 635 | /* Strip CR+LF from linebuf */ |
| 614 | next_eol = strip_eol(linebuf, &len); | 636 | next_eol = strip_eol(linebuf, &len); |
| 615 | if(first) { | 637 | if (first) { |
| 616 | first = 0; | 638 | first = 0; |
| 617 | if(bpart) sk_BIO_push(parts, bpart); | 639 | if (bpart) |
| 640 | sk_BIO_push(parts, bpart); | ||
| 618 | bpart = BIO_new(BIO_s_mem()); | 641 | bpart = BIO_new(BIO_s_mem()); |
| 619 | BIO_set_mem_eof_return(bpart, 0); | 642 | BIO_set_mem_eof_return(bpart, 0); |
| 620 | } else if (eol) | 643 | } else if (eol) |
| 621 | BIO_write(bpart, "\r\n", 2); | 644 | BIO_write(bpart, "\r\n", 2); |
| 622 | eol = next_eol; | 645 | eol = next_eol; |
| 623 | if (len) | 646 | if (len) |
| 624 | BIO_write(bpart, linebuf, len); | 647 | BIO_write(bpart, linebuf, len); |
| 648 | } | ||
| 625 | } | 649 | } |
| 626 | } | ||
| 627 | return 0; | 650 | return 0; |
| 628 | } | 651 | } |
| 629 | 652 | ||
| @@ -638,7 +661,8 @@ static int multi_split(BIO *bio, char *bound, STACK_OF(BIO) **ret) | |||
| 638 | #define MIME_COMMENT 6 | 661 | #define MIME_COMMENT 6 |
| 639 | 662 | ||
| 640 | 663 | ||
| 641 | static STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio) | 664 | static |
| 665 | STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio) | ||
| 642 | { | 666 | { |
| 643 | char *p, *q, c; | 667 | char *p, *q, c; |
| 644 | char *ntmp; | 668 | char *ntmp; |
| @@ -649,254 +673,294 @@ static STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio) | |||
| 649 | 673 | ||
| 650 | headers = sk_MIME_HEADER_new(mime_hdr_cmp); | 674 | headers = sk_MIME_HEADER_new(mime_hdr_cmp); |
| 651 | while ((len = BIO_gets(bio, linebuf, MAX_SMLEN)) > 0) { | 675 | while ((len = BIO_gets(bio, linebuf, MAX_SMLEN)) > 0) { |
| 652 | /* If whitespace at line start then continuation line */ | 676 | /* If whitespace at line start then continuation line */ |
| 653 | if(mhdr && isspace((unsigned char)linebuf[0])) state = MIME_NAME; | 677 | if (mhdr && isspace((unsigned char)linebuf[0])) |
| 654 | else state = MIME_START; | 678 | state = MIME_NAME; |
| 655 | ntmp = NULL; | 679 | else |
| 656 | /* Go through all characters */ | 680 | state = MIME_START; |
| 657 | for(p = linebuf, q = linebuf; (c = *p) && (c!='\r') && (c!='\n'); p++) { | 681 | ntmp = NULL; |
| 658 | 682 | ||
| 659 | /* State machine to handle MIME headers | 683 | /* Go through all characters */ |
| 660 | * if this looks horrible that's because it *is* | 684 | for (p = linebuf, q = linebuf; |
| 661 | */ | 685 | (c = *p) && (c != '\r') && (c != '\n'); p++) { |
| 662 | 686 | ||
| 663 | switch(state) { | 687 | /* State machine to handle MIME headers |
| 688 | * if this looks horrible that's because it *is* | ||
| 689 | */ | ||
| 690 | |||
| 691 | switch (state) { | ||
| 664 | case MIME_START: | 692 | case MIME_START: |
| 665 | if(c == ':') { | 693 | if (c == ':') { |
| 666 | state = MIME_TYPE; | 694 | state = MIME_TYPE; |
| 667 | *p = 0; | 695 | *p = 0; |
| 668 | ntmp = strip_ends(q); | 696 | ntmp = strip_ends(q); |
| 669 | q = p + 1; | 697 | q = p + 1; |
| 670 | } | 698 | } |
| 671 | break; | 699 | break; |
| 672 | 700 | ||
| 673 | case MIME_TYPE: | 701 | case MIME_TYPE: |
| 674 | if(c == ';') { | 702 | if (c == ';') { |
| 675 | mime_debug("Found End Value\n"); | 703 | mime_debug("Found End Value\n"); |
| 676 | *p = 0; | 704 | *p = 0; |
| 677 | mhdr = mime_hdr_new(ntmp, strip_ends(q)); | 705 | mhdr = mime_hdr_new(ntmp, |
| 678 | sk_MIME_HEADER_push(headers, mhdr); | 706 | strip_ends(q)); |
| 679 | ntmp = NULL; | 707 | sk_MIME_HEADER_push(headers, mhdr); |
| 680 | q = p + 1; | 708 | ntmp = NULL; |
| 681 | state = MIME_NAME; | 709 | q = p + 1; |
| 682 | } else if(c == '(') { | 710 | state = MIME_NAME; |
| 683 | save_state = state; | 711 | } else if (c == '(') { |
| 684 | state = MIME_COMMENT; | 712 | save_state = state; |
| 685 | } | 713 | state = MIME_COMMENT; |
| 686 | break; | 714 | } |
| 715 | break; | ||
| 687 | 716 | ||
| 688 | case MIME_COMMENT: | 717 | case MIME_COMMENT: |
| 689 | if(c == ')') { | 718 | if (c == ')') { |
| 690 | state = save_state; | 719 | state = save_state; |
| 691 | } | 720 | } |
| 692 | break; | 721 | break; |
| 693 | 722 | ||
| 694 | case MIME_NAME: | 723 | case MIME_NAME: |
| 695 | if(c == '=') { | 724 | if (c == '=') { |
| 696 | state = MIME_VALUE; | 725 | state = MIME_VALUE; |
| 697 | *p = 0; | 726 | *p = 0; |
| 698 | ntmp = strip_ends(q); | 727 | ntmp = strip_ends(q); |
| 699 | q = p + 1; | 728 | q = p + 1; |
| 700 | } | 729 | } |
| 701 | break ; | 730 | break; |
| 702 | 731 | ||
| 703 | case MIME_VALUE: | 732 | case MIME_VALUE: |
| 704 | if(c == ';') { | 733 | if (c == ';') { |
| 705 | state = MIME_NAME; | 734 | state = MIME_NAME; |
| 706 | *p = 0; | 735 | *p = 0; |
| 707 | mime_hdr_addparam(mhdr, ntmp, strip_ends(q)); | 736 | mime_hdr_addparam(mhdr, ntmp, |
| 708 | ntmp = NULL; | 737 | strip_ends(q)); |
| 709 | q = p + 1; | 738 | ntmp = NULL; |
| 710 | } else if (c == '"') { | 739 | q = p + 1; |
| 711 | mime_debug("Found Quote\n"); | 740 | } else if (c == '"') { |
| 712 | state = MIME_QUOTE; | 741 | mime_debug("Found Quote\n"); |
| 713 | } else if(c == '(') { | 742 | state = MIME_QUOTE; |
| 714 | save_state = state; | 743 | } else if (c == '(') { |
| 715 | state = MIME_COMMENT; | 744 | save_state = state; |
| 716 | } | 745 | state = MIME_COMMENT; |
| 717 | break; | 746 | } |
| 747 | break; | ||
| 718 | 748 | ||
| 719 | case MIME_QUOTE: | 749 | case MIME_QUOTE: |
| 720 | if(c == '"') { | 750 | if (c == '"') { |
| 721 | mime_debug("Found Match Quote\n"); | 751 | mime_debug("Found Match Quote\n"); |
| 722 | state = MIME_VALUE; | 752 | state = MIME_VALUE; |
| 753 | } | ||
| 754 | break; | ||
| 755 | } | ||
| 723 | } | 756 | } |
| 724 | break; | ||
| 725 | } | ||
| 726 | } | ||
| 727 | 757 | ||
| 728 | if(state == MIME_TYPE) { | 758 | if (state == MIME_TYPE) { |
| 729 | mhdr = mime_hdr_new(ntmp, strip_ends(q)); | 759 | mhdr = mime_hdr_new(ntmp, strip_ends(q)); |
| 730 | sk_MIME_HEADER_push(headers, mhdr); | 760 | sk_MIME_HEADER_push(headers, mhdr); |
| 731 | } else if(state == MIME_VALUE) | 761 | } else if (state == MIME_VALUE) |
| 732 | mime_hdr_addparam(mhdr, ntmp, strip_ends(q)); | 762 | mime_hdr_addparam(mhdr, ntmp, strip_ends(q)); |
| 733 | if(p == linebuf) break; /* Blank line means end of headers */ | ||
| 734 | } | ||
| 735 | 763 | ||
| 736 | return headers; | 764 | if (p == linebuf) |
| 765 | break; /* Blank line means end of headers */ | ||
| 766 | } | ||
| 737 | 767 | ||
| 768 | return headers; | ||
| 738 | } | 769 | } |
| 739 | 770 | ||
| 740 | static char *strip_ends(char *name) | 771 | static char * |
| 772 | strip_ends(char *name) | ||
| 741 | { | 773 | { |
| 742 | return strip_end(strip_start(name)); | 774 | return strip_end(strip_start(name)); |
| 743 | } | 775 | } |
| 744 | 776 | ||
| 745 | /* Strip a parameter of whitespace from start of param */ | 777 | /* Strip a parameter of whitespace from start of param */ |
| 746 | static char *strip_start(char *name) | 778 | static char * |
| 779 | strip_start(char *name) | ||
| 747 | { | 780 | { |
| 748 | char *p, c; | 781 | char *p, c; |
| 782 | |||
| 749 | /* Look for first non white space or quote */ | 783 | /* Look for first non white space or quote */ |
| 750 | for(p = name; (c = *p) ;p++) { | 784 | for (p = name; (c = *p); p++) { |
| 751 | if(c == '"') { | 785 | if (c == '"') { |
| 752 | /* Next char is start of string if non null */ | 786 | /* Next char is start of string if non null */ |
| 753 | if(p[1]) return p + 1; | 787 | if (p[1]) |
| 788 | return p + 1; | ||
| 754 | /* Else null string */ | 789 | /* Else null string */ |
| 755 | return NULL; | 790 | return NULL; |
| 791 | } | ||
| 792 | if (!isspace((unsigned char)c)) | ||
| 793 | return p; | ||
| 756 | } | 794 | } |
| 757 | if(!isspace((unsigned char)c)) return p; | ||
| 758 | } | ||
| 759 | return NULL; | 795 | return NULL; |
| 760 | } | 796 | } |
| 761 | 797 | ||
| 762 | /* As above but strip from end of string : maybe should handle brackets? */ | 798 | /* As above but strip from end of string : maybe should handle brackets? */ |
| 763 | static char *strip_end(char *name) | 799 | static char * |
| 800 | strip_end(char *name) | ||
| 764 | { | 801 | { |
| 765 | char *p, c; | 802 | char *p, c; |
| 766 | if(!name) return NULL; | 803 | |
| 804 | if (!name) | ||
| 805 | return NULL; | ||
| 806 | |||
| 767 | /* Look for first non white space or quote */ | 807 | /* Look for first non white space or quote */ |
| 768 | for(p = name + strlen(name) - 1; p >= name ;p--) { | 808 | for (p = name + strlen(name) - 1; p >= name; p--) { |
| 769 | c = *p; | 809 | c = *p; |
| 770 | if(c == '"') { | 810 | if (c == '"') { |
| 771 | if(p - 1 == name) return NULL; | 811 | if (p - 1 == name) |
| 812 | return NULL; | ||
| 772 | *p = 0; | 813 | *p = 0; |
| 773 | return name; | 814 | return name; |
| 815 | } | ||
| 816 | if (isspace((unsigned char)c)) | ||
| 817 | *p = 0; | ||
| 818 | else | ||
| 819 | return name; | ||
| 774 | } | 820 | } |
| 775 | if(isspace((unsigned char)c)) *p = 0; | ||
| 776 | else return name; | ||
| 777 | } | ||
| 778 | return NULL; | 821 | return NULL; |
| 779 | } | 822 | } |
| 780 | 823 | ||
| 781 | static MIME_HEADER *mime_hdr_new(char *name, char *value) | 824 | static MIME_HEADER * |
| 825 | mime_hdr_new(char *name, char *value) | ||
| 782 | { | 826 | { |
| 783 | MIME_HEADER *mhdr; | 827 | MIME_HEADER *mhdr; |
| 784 | char *tmpname, *tmpval, *p; | 828 | char *tmpname, *tmpval, *p; |
| 785 | int c; | 829 | int c; |
| 786 | if(name) { | 830 | if (name) { |
| 787 | if(!(tmpname = BUF_strdup(name))) return NULL; | 831 | if (!(tmpname = BUF_strdup(name))) |
| 788 | for(p = tmpname ; *p; p++) { | 832 | return NULL; |
| 833 | for (p = tmpname; *p; p++) { | ||
| 789 | c = (unsigned char)*p; | 834 | c = (unsigned char)*p; |
| 790 | if(isupper(c)) { | 835 | if (isupper(c)) { |
| 791 | c = tolower(c); | 836 | c = tolower(c); |
| 792 | *p = c; | 837 | *p = c; |
| 838 | } | ||
| 793 | } | 839 | } |
| 794 | } | 840 | } else |
| 795 | } else tmpname = NULL; | 841 | tmpname = NULL; |
| 796 | if(value) { | 842 | if (value) { |
| 797 | if(!(tmpval = BUF_strdup(value))) return NULL; | 843 | if (!(tmpval = BUF_strdup(value))) |
| 798 | for(p = tmpval ; *p; p++) { | 844 | return NULL; |
| 845 | for (p = tmpval; *p; p++) { | ||
| 799 | c = (unsigned char)*p; | 846 | c = (unsigned char)*p; |
| 800 | if(isupper(c)) { | 847 | if (isupper(c)) { |
| 801 | c = tolower(c); | 848 | c = tolower(c); |
| 802 | *p = c; | 849 | *p = c; |
| 850 | } | ||
| 803 | } | 851 | } |
| 804 | } | 852 | } else tmpval = NULL; |
| 805 | } else tmpval = NULL; | 853 | mhdr = (MIME_HEADER *)malloc(sizeof(MIME_HEADER)); |
| 806 | mhdr = (MIME_HEADER *) malloc(sizeof(MIME_HEADER)); | ||
| 807 | if (!mhdr) { | 854 | if (!mhdr) { |
| 808 | OPENSSL_free(tmpname); | 855 | OPENSSL_free(tmpname); |
| 809 | return NULL; | 856 | return NULL; |
| 810 | } | 857 | } |
| 811 | mhdr->name = tmpname; | 858 | mhdr->name = tmpname; |
| 812 | mhdr->value = tmpval; | 859 | mhdr->value = tmpval; |
| 813 | if (!(mhdr->params = sk_MIME_PARAM_new(mime_param_cmp))) { | 860 | if (!(mhdr->params = sk_MIME_PARAM_new(mime_param_cmp))) { |
| 814 | free(mhdr); | 861 | free(mhdr); |
| 815 | return NULL; | 862 | return NULL; |
| 816 | } | 863 | } |
| 817 | return mhdr; | 864 | return mhdr; |
| 818 | } | 865 | } |
| 819 | 866 | ||
| 820 | static int mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value) | 867 | static int |
| 868 | mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value) | ||
| 821 | { | 869 | { |
| 822 | char *tmpname, *tmpval, *p; | 870 | char *tmpname, *tmpval, *p; |
| 823 | int c; | 871 | int c; |
| 824 | MIME_PARAM *mparam; | 872 | MIME_PARAM *mparam; |
| 825 | if(name) { | 873 | |
| 874 | if (name) { | ||
| 826 | tmpname = BUF_strdup(name); | 875 | tmpname = BUF_strdup(name); |
| 827 | if(!tmpname) return 0; | 876 | if (!tmpname) |
| 828 | for(p = tmpname ; *p; p++) { | 877 | return 0; |
| 878 | for (p = tmpname; *p; p++) { | ||
| 829 | c = (unsigned char)*p; | 879 | c = (unsigned char)*p; |
| 830 | if(isupper(c)) { | 880 | if (isupper(c)) { |
| 831 | c = tolower(c); | 881 | c = tolower(c); |
| 832 | *p = c; | 882 | *p = c; |
| 883 | } | ||
| 833 | } | 884 | } |
| 834 | } | 885 | } else |
| 835 | } else tmpname = NULL; | 886 | tmpname = NULL; |
| 836 | if(value) { | 887 | if (value) { |
| 837 | tmpval = BUF_strdup(value); | 888 | tmpval = BUF_strdup(value); |
| 838 | if(!tmpval) return 0; | 889 | if (!tmpval) |
| 839 | } else tmpval = NULL; | 890 | return 0; |
| 891 | } else | ||
| 892 | tmpval = NULL; | ||
| 840 | /* Parameter values are case sensitive so leave as is */ | 893 | /* Parameter values are case sensitive so leave as is */ |
| 841 | mparam = (MIME_PARAM *) malloc(sizeof(MIME_PARAM)); | 894 | mparam = (MIME_PARAM *) malloc(sizeof(MIME_PARAM)); |
| 842 | if(!mparam) return 0; | 895 | if (!mparam) |
| 896 | return 0; | ||
| 843 | mparam->param_name = tmpname; | 897 | mparam->param_name = tmpname; |
| 844 | mparam->param_value = tmpval; | 898 | mparam->param_value = tmpval; |
| 845 | sk_MIME_PARAM_push(mhdr->params, mparam); | 899 | sk_MIME_PARAM_push(mhdr->params, mparam); |
| 846 | return 1; | 900 | return 1; |
| 847 | } | 901 | } |
| 848 | 902 | ||
| 849 | static int mime_hdr_cmp(const MIME_HEADER * const *a, | 903 | static int |
| 850 | const MIME_HEADER * const *b) | 904 | mime_hdr_cmp(const MIME_HEADER * const *a, const MIME_HEADER * const *b) |
| 851 | { | 905 | { |
| 852 | if (!(*a)->name || !(*b)->name) | 906 | if (!(*a)->name || !(*b)->name) |
| 853 | return !!(*a)->name - !!(*b)->name; | 907 | return !!(*a)->name - !!(*b)->name; |
| 854 | 908 | return (strcmp((*a)->name, (*b)->name)); | |
| 855 | return(strcmp((*a)->name, (*b)->name)); | ||
| 856 | } | 909 | } |
| 857 | 910 | ||
| 858 | static int mime_param_cmp(const MIME_PARAM * const *a, | 911 | static int |
| 859 | const MIME_PARAM * const *b) | 912 | mime_param_cmp(const MIME_PARAM * const *a, const MIME_PARAM * const *b) |
| 860 | { | 913 | { |
| 861 | if (!(*a)->param_name || !(*b)->param_name) | 914 | if (!(*a)->param_name || !(*b)->param_name) |
| 862 | return !!(*a)->param_name - !!(*b)->param_name; | 915 | return !!(*a)->param_name - !!(*b)->param_name; |
| 863 | return(strcmp((*a)->param_name, (*b)->param_name)); | 916 | return (strcmp((*a)->param_name, (*b)->param_name)); |
| 864 | } | 917 | } |
| 865 | 918 | ||
| 866 | /* Find a header with a given name (if possible) */ | 919 | /* Find a header with a given name (if possible) */ |
| 867 | 920 | ||
| 868 | static MIME_HEADER *mime_hdr_find(STACK_OF(MIME_HEADER) *hdrs, char *name) | 921 | static MIME_HEADER * |
| 922 | mime_hdr_find(STACK_OF(MIME_HEADER) *hdrs, char *name) | ||
| 869 | { | 923 | { |
| 870 | MIME_HEADER htmp; | 924 | MIME_HEADER htmp; |
| 871 | int idx; | 925 | int idx; |
| 872 | htmp.name = name; | 926 | htmp.name = name; |
| 873 | idx = sk_MIME_HEADER_find(hdrs, &htmp); | 927 | idx = sk_MIME_HEADER_find(hdrs, &htmp); |
| 874 | if(idx < 0) return NULL; | 928 | if (idx < 0) |
| 929 | return NULL; | ||
| 875 | return sk_MIME_HEADER_value(hdrs, idx); | 930 | return sk_MIME_HEADER_value(hdrs, idx); |
| 876 | } | 931 | } |
| 877 | 932 | ||
| 878 | static MIME_PARAM *mime_param_find(MIME_HEADER *hdr, char *name) | 933 | static MIME_PARAM * |
| 934 | mime_param_find(MIME_HEADER *hdr, char *name) | ||
| 879 | { | 935 | { |
| 880 | MIME_PARAM param; | 936 | MIME_PARAM param; |
| 881 | int idx; | 937 | int idx; |
| 882 | param.param_name = name; | 938 | param.param_name = name; |
| 883 | idx = sk_MIME_PARAM_find(hdr->params, ¶m); | 939 | idx = sk_MIME_PARAM_find(hdr->params, ¶m); |
| 884 | if(idx < 0) return NULL; | 940 | if (idx < 0) |
| 941 | return NULL; | ||
| 885 | return sk_MIME_PARAM_value(hdr->params, idx); | 942 | return sk_MIME_PARAM_value(hdr->params, idx); |
| 886 | } | 943 | } |
| 887 | 944 | ||
| 888 | static void mime_hdr_free(MIME_HEADER *hdr) | 945 | static void |
| 946 | mime_hdr_free(MIME_HEADER *hdr) | ||
| 889 | { | 947 | { |
| 890 | if(hdr->name) free(hdr->name); | 948 | if (hdr->name) |
| 891 | if(hdr->value) free(hdr->value); | 949 | free(hdr->name); |
| 892 | if(hdr->params) sk_MIME_PARAM_pop_free(hdr->params, mime_param_free); | 950 | if (hdr->value) |
| 951 | free(hdr->value); | ||
| 952 | if (hdr->params) | ||
| 953 | sk_MIME_PARAM_pop_free(hdr->params, mime_param_free); | ||
| 893 | free(hdr); | 954 | free(hdr); |
| 894 | } | 955 | } |
| 895 | 956 | ||
| 896 | static void mime_param_free(MIME_PARAM *param) | 957 | static void |
| 958 | mime_param_free(MIME_PARAM *param) | ||
| 897 | { | 959 | { |
| 898 | if(param->param_name) free(param->param_name); | 960 | if (param->param_name) |
| 899 | if(param->param_value) free(param->param_value); | 961 | free(param->param_name); |
| 962 | if (param->param_value) | ||
| 963 | free(param->param_value); | ||
| 900 | free(param); | 964 | free(param); |
| 901 | } | 965 | } |
| 902 | 966 | ||
| @@ -905,21 +969,28 @@ static void mime_param_free(MIME_PARAM *param) | |||
| 905 | * 1 : part boundary | 969 | * 1 : part boundary |
| 906 | * 2 : final boundary | 970 | * 2 : final boundary |
| 907 | */ | 971 | */ |
| 908 | static int mime_bound_check(char *line, int linelen, char *bound, int blen) | 972 | static int |
| 973 | mime_bound_check(char *line, int linelen, char *bound, int blen) | ||
| 909 | { | 974 | { |
| 910 | if(linelen == -1) linelen = strlen(line); | 975 | if (linelen == -1) |
| 911 | if(blen == -1) blen = strlen(bound); | 976 | linelen = strlen(line); |
| 977 | if (blen == -1) | ||
| 978 | blen = strlen(bound); | ||
| 912 | /* Quickly eliminate if line length too short */ | 979 | /* Quickly eliminate if line length too short */ |
| 913 | if(blen + 2 > linelen) return 0; | 980 | if (blen + 2 > linelen) |
| 981 | return 0; | ||
| 914 | /* Check for part boundary */ | 982 | /* Check for part boundary */ |
| 915 | if(!strncmp(line, "--", 2) && !strncmp(line + 2, bound, blen)) { | 983 | if (!strncmp(line, "--", 2) && !strncmp(line + 2, bound, blen)) { |
| 916 | if(!strncmp(line + blen + 2, "--", 2)) return 2; | 984 | if (!strncmp(line + blen + 2, "--", 2)) |
| 917 | else return 1; | 985 | return 2; |
| 918 | } | 986 | else |
| 987 | return 1; | ||
| 988 | } | ||
| 919 | return 0; | 989 | return 0; |
| 920 | } | 990 | } |
| 921 | 991 | ||
| 922 | static int strip_eol(char *linebuf, int *plen) | 992 | static int |
| 993 | strip_eol(char *linebuf, int *plen) | ||
| 923 | { | 994 | { |
| 924 | int len = *plen; | 995 | int len = *plen; |
| 925 | char *p, c; | 996 | char *p, c; |
diff --git a/src/lib/libcrypto/asn1/asn_moid.c b/src/lib/libcrypto/asn1/asn_moid.c index 0c09a8e934..7ddf212e9a 100644 --- a/src/lib/libcrypto/asn1/asn_moid.c +++ b/src/lib/libcrypto/asn1/asn_moid.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -68,20 +68,22 @@ | |||
| 68 | 68 | ||
| 69 | static int do_create(char *value, char *name); | 69 | static int do_create(char *value, char *name); |
| 70 | 70 | ||
| 71 | static int oid_module_init(CONF_IMODULE *md, const CONF *cnf) | 71 | static int |
| 72 | oid_module_init(CONF_IMODULE *md, const CONF *cnf) | ||
| 72 | { | 73 | { |
| 73 | int i; | 74 | int i; |
| 74 | const char *oid_section; | 75 | const char *oid_section; |
| 75 | STACK_OF(CONF_VALUE) *sktmp; | 76 | STACK_OF(CONF_VALUE) *sktmp; |
| 76 | CONF_VALUE *oval; | 77 | CONF_VALUE *oval; |
| 78 | |||
| 77 | oid_section = CONF_imodule_get_value(md); | 79 | oid_section = CONF_imodule_get_value(md); |
| 78 | if(!(sktmp = NCONF_get_section(cnf, oid_section))) { | 80 | if (!(sktmp = NCONF_get_section(cnf, oid_section))) { |
| 79 | ASN1err(ASN1_F_OID_MODULE_INIT, ASN1_R_ERROR_LOADING_SECTION); | 81 | ASN1err(ASN1_F_OID_MODULE_INIT, ASN1_R_ERROR_LOADING_SECTION); |
| 80 | return 0; | 82 | return 0; |
| 81 | } | 83 | } |
| 82 | for(i = 0; i < sk_CONF_VALUE_num(sktmp); i++) { | 84 | for (i = 0; i < sk_CONF_VALUE_num(sktmp); i++) { |
| 83 | oval = sk_CONF_VALUE_value(sktmp, i); | 85 | oval = sk_CONF_VALUE_value(sktmp, i); |
| 84 | if(!do_create(oval->value, oval->name)) { | 86 | if (!do_create(oval->value, oval->name)) { |
| 85 | ASN1err(ASN1_F_OID_MODULE_INIT, ASN1_R_ADDING_OBJECT); | 87 | ASN1err(ASN1_F_OID_MODULE_INIT, ASN1_R_ADDING_OBJECT); |
| 86 | return 0; | 88 | return 0; |
| 87 | } | 89 | } |
| @@ -89,12 +91,14 @@ static int oid_module_init(CONF_IMODULE *md, const CONF *cnf) | |||
| 89 | return 1; | 91 | return 1; |
| 90 | } | 92 | } |
| 91 | 93 | ||
| 92 | static void oid_module_finish(CONF_IMODULE *md) | 94 | static void |
| 95 | oid_module_finish(CONF_IMODULE *md) | ||
| 93 | { | 96 | { |
| 94 | OBJ_cleanup(); | 97 | OBJ_cleanup(); |
| 95 | } | 98 | } |
| 96 | 99 | ||
| 97 | void ASN1_add_oid_module(void) | 100 | void |
| 101 | ASN1_add_oid_module(void) | ||
| 98 | { | 102 | { |
| 99 | CONF_module_add("oid_section", oid_module_init, oid_module_finish); | 103 | CONF_module_add("oid_section", oid_module_init, oid_module_finish); |
| 100 | } | 104 | } |
| @@ -104,12 +108,13 @@ void ASN1_add_oid_module(void) | |||
| 104 | * shortname = some long name, 1.2.3.4 | 108 | * shortname = some long name, 1.2.3.4 |
| 105 | */ | 109 | */ |
| 106 | 110 | ||
| 107 | 111 | static int | |
| 108 | static int do_create(char *value, char *name) | 112 | do_create(char *value, char *name) |
| 109 | { | 113 | { |
| 110 | int nid; | 114 | int nid; |
| 111 | ASN1_OBJECT *oid; | 115 | ASN1_OBJECT *oid; |
| 112 | char *ln, *ostr, *p, *lntmp; | 116 | char *ln, *ostr, *p, *lntmp; |
| 117 | |||
| 113 | p = strrchr(value, ','); | 118 | p = strrchr(value, ','); |
| 114 | if (!p) { | 119 | if (!p) { |
| 115 | ln = name; | 120 | ln = name; |
| @@ -119,7 +124,8 @@ static int do_create(char *value, char *name) | |||
| 119 | ostr = p + 1; | 124 | ostr = p + 1; |
| 120 | if (!*ostr) | 125 | if (!*ostr) |
| 121 | return 0; | 126 | return 0; |
| 122 | while(isspace((unsigned char)*ostr)) ostr++; | 127 | while (isspace((unsigned char)*ostr)) |
| 128 | ostr++; | ||
| 123 | } | 129 | } |
| 124 | 130 | ||
| 125 | nid = OBJ_create(ostr, name, ln); | 131 | nid = OBJ_create(ostr, name, ln); |
| @@ -129,9 +135,10 @@ static int do_create(char *value, char *name) | |||
| 129 | 135 | ||
| 130 | if (p) { | 136 | if (p) { |
| 131 | ln = value; | 137 | ln = value; |
| 132 | while(isspace((unsigned char)*ln)) ln++; | 138 | while (isspace((unsigned char)*ln)) |
| 139 | ln++; | ||
| 133 | p--; | 140 | p--; |
| 134 | while(isspace((unsigned char)*p)) { | 141 | while (isspace((unsigned char)*p)) { |
| 135 | if (p == ln) | 142 | if (p == ln) |
| 136 | return 0; | 143 | return 0; |
| 137 | p--; | 144 | p--; |
| @@ -148,5 +155,3 @@ static int do_create(char *value, char *name) | |||
| 148 | 155 | ||
| 149 | return 1; | 156 | return 1; |
| 150 | } | 157 | } |
| 151 | |||
| 152 | |||
diff --git a/src/lib/libcrypto/asn1/asn_pack.c b/src/lib/libcrypto/asn1/asn_pack.c index 13dc5d4665..9752a68206 100644 --- a/src/lib/libcrypto/asn1/asn_pack.c +++ b/src/lib/libcrypto/asn1/asn_pack.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -62,29 +62,32 @@ | |||
| 62 | 62 | ||
| 63 | /* ASN1_ITEM versions of the above */ | 63 | /* ASN1_ITEM versions of the above */ |
| 64 | 64 | ||
| 65 | ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **oct) | 65 | ASN1_STRING * |
| 66 | ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **oct) | ||
| 66 | { | 67 | { |
| 67 | ASN1_STRING *octmp; | 68 | ASN1_STRING *octmp; |
| 68 | 69 | ||
| 69 | if (!oct || !*oct) { | 70 | if (!oct || !*oct) { |
| 70 | if (!(octmp = ASN1_STRING_new ())) { | 71 | if (!(octmp = ASN1_STRING_new ())) { |
| 71 | ASN1err(ASN1_F_ASN1_ITEM_PACK,ERR_R_MALLOC_FAILURE); | 72 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); |
| 72 | return NULL; | 73 | return NULL; |
| 73 | } | 74 | } |
| 74 | if (oct) *oct = octmp; | 75 | if (oct) |
| 75 | } else octmp = *oct; | 76 | *oct = octmp; |
| 77 | } else | ||
| 78 | octmp = *oct; | ||
| 76 | 79 | ||
| 77 | if(octmp->data) { | 80 | if (octmp->data) { |
| 78 | free(octmp->data); | 81 | free(octmp->data); |
| 79 | octmp->data = NULL; | 82 | octmp->data = NULL; |
| 80 | } | 83 | } |
| 81 | 84 | ||
| 82 | if (!(octmp->length = ASN1_item_i2d(obj, &octmp->data, it))) { | 85 | if (!(octmp->length = ASN1_item_i2d(obj, &octmp->data, it))) { |
| 83 | ASN1err(ASN1_F_ASN1_ITEM_PACK,ASN1_R_ENCODE_ERROR); | 86 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ASN1_R_ENCODE_ERROR); |
| 84 | return NULL; | 87 | return NULL; |
| 85 | } | 88 | } |
| 86 | if (!octmp->data) { | 89 | if (!octmp->data) { |
| 87 | ASN1err(ASN1_F_ASN1_ITEM_PACK,ERR_R_MALLOC_FAILURE); | 90 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); |
| 88 | return NULL; | 91 | return NULL; |
| 89 | } | 92 | } |
| 90 | return octmp; | 93 | return octmp; |
| @@ -92,13 +95,14 @@ ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **oct) | |||
| 92 | 95 | ||
| 93 | /* Extract an ASN1 object from an ASN1_STRING */ | 96 | /* Extract an ASN1 object from an ASN1_STRING */ |
| 94 | 97 | ||
| 95 | void *ASN1_item_unpack(ASN1_STRING *oct, const ASN1_ITEM *it) | 98 | void * |
| 99 | ASN1_item_unpack(ASN1_STRING *oct, const ASN1_ITEM *it) | ||
| 96 | { | 100 | { |
| 97 | const unsigned char *p; | 101 | const unsigned char *p; |
| 98 | void *ret; | 102 | void *ret; |
| 99 | 103 | ||
| 100 | p = oct->data; | 104 | p = oct->data; |
| 101 | if(!(ret = ASN1_item_d2i(NULL, &p, oct->length, it))) | 105 | if (!(ret = ASN1_item_d2i(NULL, &p, oct->length, it))) |
| 102 | ASN1err(ASN1_F_ASN1_ITEM_UNPACK,ASN1_R_DECODE_ERROR); | 106 | ASN1err(ASN1_F_ASN1_ITEM_UNPACK, ASN1_R_DECODE_ERROR); |
| 103 | return ret; | 107 | return ret; |
| 104 | } | 108 | } |
diff --git a/src/lib/libcrypto/asn1/bio_asn1.c b/src/lib/libcrypto/asn1/bio_asn1.c index 8ebac02a00..36b82758ed 100644 --- a/src/lib/libcrypto/asn1/bio_asn1.c +++ b/src/lib/libcrypto/asn1/bio_asn1.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -68,8 +68,7 @@ | |||
| 68 | /* Must be large enough for biggest tag+length */ | 68 | /* Must be large enough for biggest tag+length */ |
| 69 | #define DEFAULT_ASN1_BUF_SIZE 20 | 69 | #define DEFAULT_ASN1_BUF_SIZE 20 |
| 70 | 70 | ||
| 71 | typedef enum | 71 | typedef enum { |
| 72 | { | ||
| 73 | ASN1_STATE_START, | 72 | ASN1_STATE_START, |
| 74 | ASN1_STATE_PRE_COPY, | 73 | ASN1_STATE_PRE_COPY, |
| 75 | ASN1_STATE_HEADER, | 74 | ASN1_STATE_HEADER, |
| @@ -79,14 +78,12 @@ typedef enum | |||
| 79 | ASN1_STATE_DONE | 78 | ASN1_STATE_DONE |
| 80 | } asn1_bio_state_t; | 79 | } asn1_bio_state_t; |
| 81 | 80 | ||
| 82 | typedef struct BIO_ASN1_EX_FUNCS_st | 81 | typedef struct BIO_ASN1_EX_FUNCS_st { |
| 83 | { | ||
| 84 | asn1_ps_func *ex_func; | 82 | asn1_ps_func *ex_func; |
| 85 | asn1_ps_func *ex_free_func; | 83 | asn1_ps_func *ex_free_func; |
| 86 | } BIO_ASN1_EX_FUNCS; | 84 | } BIO_ASN1_EX_FUNCS; |
| 87 | 85 | ||
| 88 | typedef struct BIO_ASN1_BUF_CTX_t | 86 | typedef struct BIO_ASN1_BUF_CTX_t { |
| 89 | { | ||
| 90 | /* Internal state */ | 87 | /* Internal state */ |
| 91 | asn1_bio_state_t state; | 88 | asn1_bio_state_t state; |
| 92 | /* Internal buffer */ | 89 | /* Internal buffer */ |
| @@ -110,7 +107,7 @@ typedef struct BIO_ASN1_BUF_CTX_t | |||
| 110 | } BIO_ASN1_BUF_CTX; | 107 | } BIO_ASN1_BUF_CTX; |
| 111 | 108 | ||
| 112 | 109 | ||
| 113 | static int asn1_bio_write(BIO *h, const char *buf,int num); | 110 | static int asn1_bio_write(BIO *h, const char *buf, int num); |
| 114 | static int asn1_bio_read(BIO *h, char *buf, int size); | 111 | static int asn1_bio_read(BIO *h, char *buf, int size); |
| 115 | static int asn1_bio_puts(BIO *h, const char *str); | 112 | static int asn1_bio_puts(BIO *h, const char *str); |
| 116 | static int asn1_bio_gets(BIO *h, char *str, int size); | 113 | static int asn1_bio_gets(BIO *h, char *str, int size); |
| @@ -121,14 +118,12 @@ static long asn1_bio_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); | |||
| 121 | 118 | ||
| 122 | static int asn1_bio_init(BIO_ASN1_BUF_CTX *ctx, int size); | 119 | static int asn1_bio_init(BIO_ASN1_BUF_CTX *ctx, int size); |
| 123 | static int asn1_bio_flush_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx, | 120 | static int asn1_bio_flush_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx, |
| 124 | asn1_ps_func *cleanup, asn1_bio_state_t next); | 121 | asn1_ps_func *cleanup, asn1_bio_state_t next); |
| 125 | static int asn1_bio_setup_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx, | 122 | static int asn1_bio_setup_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx, |
| 126 | asn1_ps_func *setup, | 123 | asn1_ps_func *setup, asn1_bio_state_t ex_state, |
| 127 | asn1_bio_state_t ex_state, | 124 | asn1_bio_state_t other_state); |
| 128 | asn1_bio_state_t other_state); | ||
| 129 | 125 | ||
| 130 | static BIO_METHOD methods_asn1= | 126 | static BIO_METHOD methods_asn1 = { |
| 131 | { | ||
| 132 | BIO_TYPE_ASN1, | 127 | BIO_TYPE_ASN1, |
| 133 | "asn1", | 128 | "asn1", |
| 134 | asn1_bio_write, | 129 | asn1_bio_write, |
| @@ -141,13 +136,14 @@ static BIO_METHOD methods_asn1= | |||
| 141 | asn1_bio_callback_ctrl, | 136 | asn1_bio_callback_ctrl, |
| 142 | }; | 137 | }; |
| 143 | 138 | ||
| 144 | BIO_METHOD *BIO_f_asn1(void) | 139 | BIO_METHOD * |
| 140 | BIO_f_asn1(void) | ||
| 145 | { | 141 | { |
| 146 | return(&methods_asn1); | 142 | return (&methods_asn1); |
| 147 | } | 143 | } |
| 148 | 144 | ||
| 149 | 145 | static int | |
| 150 | static int asn1_bio_new(BIO *b) | 146 | asn1_bio_new(BIO *b) |
| 151 | { | 147 | { |
| 152 | BIO_ASN1_BUF_CTX *ctx; | 148 | BIO_ASN1_BUF_CTX *ctx; |
| 153 | ctx = malloc(sizeof(BIO_ASN1_BUF_CTX)); | 149 | ctx = malloc(sizeof(BIO_ASN1_BUF_CTX)); |
| @@ -156,14 +152,15 @@ static int asn1_bio_new(BIO *b) | |||
| 156 | if (!asn1_bio_init(ctx, DEFAULT_ASN1_BUF_SIZE)) { | 152 | if (!asn1_bio_init(ctx, DEFAULT_ASN1_BUF_SIZE)) { |
| 157 | free(ctx); | 153 | free(ctx); |
| 158 | return 0; | 154 | return 0; |
| 159 | } | 155 | } |
| 160 | b->init = 1; | 156 | b->init = 1; |
| 161 | b->ptr = (char *)ctx; | 157 | b->ptr = (char *)ctx; |
| 162 | b->flags = 0; | 158 | b->flags = 0; |
| 163 | return 1; | 159 | return 1; |
| 164 | } | 160 | } |
| 165 | 161 | ||
| 166 | static int asn1_bio_init(BIO_ASN1_BUF_CTX *ctx, int size) | 162 | static int |
| 163 | asn1_bio_init(BIO_ASN1_BUF_CTX *ctx, int size) | ||
| 167 | { | 164 | { |
| 168 | ctx->buf = malloc(size); | 165 | ctx->buf = malloc(size); |
| 169 | if (!ctx->buf) | 166 | if (!ctx->buf) |
| @@ -181,9 +178,11 @@ static int asn1_bio_init(BIO_ASN1_BUF_CTX *ctx, int size) | |||
| 181 | return 1; | 178 | return 1; |
| 182 | } | 179 | } |
| 183 | 180 | ||
| 184 | static int asn1_bio_free(BIO *b) | 181 | static int |
| 182 | asn1_bio_free(BIO *b) | ||
| 185 | { | 183 | { |
| 186 | BIO_ASN1_BUF_CTX *ctx; | 184 | BIO_ASN1_BUF_CTX *ctx; |
| 185 | |||
| 187 | ctx = (BIO_ASN1_BUF_CTX *) b->ptr; | 186 | ctx = (BIO_ASN1_BUF_CTX *) b->ptr; |
| 188 | if (ctx == NULL) | 187 | if (ctx == NULL) |
| 189 | return 0; | 188 | return 0; |
| @@ -196,11 +195,13 @@ static int asn1_bio_free(BIO *b) | |||
| 196 | return 1; | 195 | return 1; |
| 197 | } | 196 | } |
| 198 | 197 | ||
| 199 | static int asn1_bio_write(BIO *b, const char *in , int inl) | 198 | static int |
| 199 | asn1_bio_write(BIO *b, const char *in , int inl) | ||
| 200 | { | 200 | { |
| 201 | BIO_ASN1_BUF_CTX *ctx; | 201 | BIO_ASN1_BUF_CTX *ctx; |
| 202 | int wrmax, wrlen, ret; | 202 | int wrmax, wrlen, ret; |
| 203 | unsigned char *p; | 203 | unsigned char *p; |
| 204 | |||
| 204 | if (!in || (inl < 0) || (b->next_bio == NULL)) | 205 | if (!in || (inl < 0) || (b->next_bio == NULL)) |
| 205 | return 0; | 206 | return 0; |
| 206 | ctx = (BIO_ASN1_BUF_CTX *) b->ptr; | 207 | ctx = (BIO_ASN1_BUF_CTX *) b->ptr; |
| @@ -210,42 +211,38 @@ static int asn1_bio_write(BIO *b, const char *in , int inl) | |||
| 210 | wrlen = 0; | 211 | wrlen = 0; |
| 211 | ret = -1; | 212 | ret = -1; |
| 212 | 213 | ||
| 213 | for(;;) { | 214 | for (;;) { |
| 214 | switch (ctx->state) { | 215 | switch (ctx->state) { |
| 215 | 216 | ||
| 216 | /* Setup prefix data, call it */ | 217 | /* Setup prefix data, call it */ |
| 217 | case ASN1_STATE_START: | 218 | case ASN1_STATE_START: |
| 218 | if (!asn1_bio_setup_ex(b, ctx, ctx->prefix, | 219 | if (!asn1_bio_setup_ex(b, ctx, ctx->prefix, |
| 219 | ASN1_STATE_PRE_COPY, ASN1_STATE_HEADER)) | 220 | ASN1_STATE_PRE_COPY, ASN1_STATE_HEADER)) |
| 220 | return 0; | 221 | return 0; |
| 221 | break; | 222 | break; |
| 222 | 223 | ||
| 223 | /* Copy any pre data first */ | 224 | /* Copy any pre data first */ |
| 224 | case ASN1_STATE_PRE_COPY: | 225 | case ASN1_STATE_PRE_COPY: |
| 225 | |||
| 226 | ret = asn1_bio_flush_ex(b, ctx, ctx->prefix_free, | 226 | ret = asn1_bio_flush_ex(b, ctx, ctx->prefix_free, |
| 227 | ASN1_STATE_HEADER); | 227 | ASN1_STATE_HEADER); |
| 228 | |||
| 229 | if (ret <= 0) | 228 | if (ret <= 0) |
| 230 | goto done; | 229 | goto done; |
| 231 | |||
| 232 | break; | 230 | break; |
| 233 | 231 | ||
| 234 | case ASN1_STATE_HEADER: | 232 | case ASN1_STATE_HEADER: |
| 235 | ctx->buflen = | 233 | ctx->buflen = |
| 236 | ASN1_object_size(0, inl, ctx->asn1_tag) - inl; | 234 | ASN1_object_size(0, inl, ctx->asn1_tag) - inl; |
| 237 | OPENSSL_assert(ctx->buflen <= ctx->bufsize); | 235 | OPENSSL_assert(ctx->buflen <= ctx->bufsize); |
| 238 | p = ctx->buf; | 236 | p = ctx->buf; |
| 239 | ASN1_put_object(&p, 0, inl, | 237 | ASN1_put_object(&p, 0, inl, |
| 240 | ctx->asn1_tag, ctx->asn1_class); | 238 | ctx->asn1_tag, ctx->asn1_class); |
| 241 | ctx->copylen = inl; | 239 | ctx->copylen = inl; |
| 242 | ctx->state = ASN1_STATE_HEADER_COPY; | 240 | ctx->state = ASN1_STATE_HEADER_COPY; |
| 243 | |||
| 244 | break; | 241 | break; |
| 245 | 242 | ||
| 246 | case ASN1_STATE_HEADER_COPY: | 243 | case ASN1_STATE_HEADER_COPY: |
| 247 | ret = BIO_write(b->next_bio, | 244 | ret = BIO_write(b->next_bio, |
| 248 | ctx->buf + ctx->bufpos, ctx->buflen); | 245 | ctx->buf + ctx->bufpos, ctx->buflen); |
| 249 | if (ret <= 0) | 246 | if (ret <= 0) |
| 250 | goto done; | 247 | goto done; |
| 251 | 248 | ||
| @@ -256,7 +253,6 @@ static int asn1_bio_write(BIO *b, const char *in , int inl) | |||
| 256 | ctx->bufpos = 0; | 253 | ctx->bufpos = 0; |
| 257 | ctx->state = ASN1_STATE_DATA_COPY; | 254 | ctx->state = ASN1_STATE_DATA_COPY; |
| 258 | } | 255 | } |
| 259 | |||
| 260 | break; | 256 | break; |
| 261 | 257 | ||
| 262 | case ASN1_STATE_DATA_COPY: | 258 | case ASN1_STATE_DATA_COPY: |
| @@ -275,46 +271,44 @@ static int asn1_bio_write(BIO *b, const char *in , int inl) | |||
| 275 | 271 | ||
| 276 | if (ctx->copylen == 0) | 272 | if (ctx->copylen == 0) |
| 277 | ctx->state = ASN1_STATE_HEADER; | 273 | ctx->state = ASN1_STATE_HEADER; |
| 278 | |||
| 279 | if (inl == 0) | 274 | if (inl == 0) |
| 280 | goto done; | 275 | goto done; |
| 281 | |||
| 282 | break; | 276 | break; |
| 283 | 277 | ||
| 284 | default: | 278 | default: |
| 285 | BIO_clear_retry_flags(b); | 279 | BIO_clear_retry_flags(b); |
| 286 | return 0; | 280 | return 0; |
| 287 | |||
| 288 | } | 281 | } |
| 289 | 282 | ||
| 290 | } | 283 | } |
| 291 | 284 | ||
| 292 | done: | 285 | done: |
| 293 | BIO_clear_retry_flags(b); | 286 | BIO_clear_retry_flags(b); |
| 294 | BIO_copy_next_retry(b); | 287 | BIO_copy_next_retry(b); |
| 295 | 288 | ||
| 296 | return (wrlen > 0) ? wrlen : ret; | 289 | return (wrlen > 0) ? wrlen : ret; |
| 297 | |||
| 298 | } | 290 | } |
| 299 | 291 | ||
| 300 | static int asn1_bio_flush_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx, | 292 | static int |
| 301 | asn1_ps_func *cleanup, asn1_bio_state_t next) | 293 | asn1_bio_flush_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx, asn1_ps_func *cleanup, |
| 294 | asn1_bio_state_t next) | ||
| 302 | { | 295 | { |
| 303 | int ret; | 296 | int ret; |
| 297 | |||
| 304 | if (ctx->ex_len <= 0) | 298 | if (ctx->ex_len <= 0) |
| 305 | return 1; | 299 | return 1; |
| 306 | for(;;) { | 300 | for (;;) { |
| 307 | ret = BIO_write(b->next_bio, ctx->ex_buf + ctx->ex_pos, | 301 | ret = BIO_write(b->next_bio, ctx->ex_buf + ctx->ex_pos, |
| 308 | ctx->ex_len); | 302 | ctx->ex_len); |
| 309 | if (ret <= 0) | 303 | if (ret <= 0) |
| 310 | break; | 304 | break; |
| 311 | ctx->ex_len -= ret; | 305 | ctx->ex_len -= ret; |
| 312 | if (ctx->ex_len > 0) | 306 | if (ctx->ex_len > 0) |
| 313 | ctx->ex_pos += ret; | 307 | ctx->ex_pos += ret; |
| 314 | else { | 308 | else { |
| 315 | if(cleanup) | 309 | if (cleanup) |
| 316 | cleanup(b, &ctx->ex_buf, &ctx->ex_len, | 310 | cleanup(b, &ctx->ex_buf, &ctx->ex_len, |
| 317 | &ctx->ex_arg); | 311 | &ctx->ex_arg); |
| 318 | ctx->state = next; | 312 | ctx->state = next; |
| 319 | ctx->ex_pos = 0; | 313 | ctx->ex_pos = 0; |
| 320 | break; | 314 | break; |
| @@ -323,10 +317,9 @@ static int asn1_bio_flush_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx, | |||
| 323 | return ret; | 317 | return ret; |
| 324 | } | 318 | } |
| 325 | 319 | ||
| 326 | static int asn1_bio_setup_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx, | 320 | static int |
| 327 | asn1_ps_func *setup, | 321 | asn1_bio_setup_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx, asn1_ps_func *setup, |
| 328 | asn1_bio_state_t ex_state, | 322 | asn1_bio_state_t ex_state, asn1_bio_state_t other_state) |
| 329 | asn1_bio_state_t other_state) | ||
| 330 | { | 323 | { |
| 331 | if (setup && !setup(b, &ctx->ex_buf, &ctx->ex_len, &ctx->ex_arg)) { | 324 | if (setup && !setup(b, &ctx->ex_buf, &ctx->ex_len, &ctx->ex_arg)) { |
| 332 | BIO_clear_retry_flags(b); | 325 | BIO_clear_retry_flags(b); |
| @@ -339,45 +332,52 @@ static int asn1_bio_setup_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx, | |||
| 339 | return 1; | 332 | return 1; |
| 340 | } | 333 | } |
| 341 | 334 | ||
| 342 | static int asn1_bio_read(BIO *b, char *in , int inl) | 335 | static int |
| 336 | asn1_bio_read(BIO *b, char *in , int inl) | ||
| 343 | { | 337 | { |
| 344 | if (!b->next_bio) | 338 | if (!b->next_bio) |
| 345 | return 0; | 339 | return 0; |
| 346 | return BIO_read(b->next_bio, in , inl); | 340 | return BIO_read(b->next_bio, in , inl); |
| 347 | } | 341 | } |
| 348 | 342 | ||
| 349 | static int asn1_bio_puts(BIO *b, const char *str) | 343 | static int |
| 344 | asn1_bio_puts(BIO *b, const char *str) | ||
| 350 | { | 345 | { |
| 351 | return asn1_bio_write(b, str, strlen(str)); | 346 | return asn1_bio_write(b, str, strlen(str)); |
| 352 | } | 347 | } |
| 353 | 348 | ||
| 354 | static int asn1_bio_gets(BIO *b, char *str, int size) | 349 | static int |
| 350 | asn1_bio_gets(BIO *b, char *str, int size) | ||
| 355 | { | 351 | { |
| 356 | if (!b->next_bio) | 352 | if (!b->next_bio) |
| 357 | return 0; | 353 | return 0; |
| 358 | return BIO_gets(b->next_bio, str , size); | 354 | return BIO_gets(b->next_bio, str , size); |
| 359 | } | 355 | } |
| 360 | 356 | ||
| 361 | static long asn1_bio_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) | 357 | static long |
| 358 | asn1_bio_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) | ||
| 362 | { | 359 | { |
| 363 | if (b->next_bio == NULL) return(0); | 360 | if (b->next_bio == NULL) |
| 364 | return BIO_callback_ctrl(b->next_bio,cmd,fp); | 361 | return (0); |
| 362 | return BIO_callback_ctrl(b->next_bio, cmd, fp); | ||
| 365 | } | 363 | } |
| 366 | 364 | ||
| 367 | static long asn1_bio_ctrl(BIO *b, int cmd, long arg1, void *arg2) | 365 | static long |
| 366 | asn1_bio_ctrl(BIO *b, int cmd, long arg1, void *arg2) | ||
| 368 | { | 367 | { |
| 369 | BIO_ASN1_BUF_CTX *ctx; | 368 | BIO_ASN1_BUF_CTX *ctx; |
| 370 | BIO_ASN1_EX_FUNCS *ex_func; | 369 | BIO_ASN1_EX_FUNCS *ex_func; |
| 371 | long ret = 1; | 370 | long ret = 1; |
| 371 | |||
| 372 | ctx = (BIO_ASN1_BUF_CTX *) b->ptr; | 372 | ctx = (BIO_ASN1_BUF_CTX *) b->ptr; |
| 373 | if (ctx == NULL) | 373 | if (ctx == NULL) |
| 374 | return 0; | 374 | return 0; |
| 375 | switch(cmd) { | 375 | switch (cmd) { |
| 376 | 376 | ||
| 377 | case BIO_C_SET_PREFIX: | 377 | case BIO_C_SET_PREFIX: |
| 378 | ex_func = arg2; | 378 | ex_func = arg2; |
| 379 | ctx->prefix = ex_func->ex_func; | 379 | ctx->prefix = ex_func->ex_func; |
| 380 | ctx->prefix_free = ex_func->ex_free_func; | 380 | ctx->prefix_free = ex_func->ex_free_func; |
| 381 | break; | 381 | break; |
| 382 | 382 | ||
| 383 | case BIO_C_GET_PREFIX: | 383 | case BIO_C_GET_PREFIX: |
| @@ -388,8 +388,8 @@ static long asn1_bio_ctrl(BIO *b, int cmd, long arg1, void *arg2) | |||
| 388 | 388 | ||
| 389 | case BIO_C_SET_SUFFIX: | 389 | case BIO_C_SET_SUFFIX: |
| 390 | ex_func = arg2; | 390 | ex_func = arg2; |
| 391 | ctx->suffix = ex_func->ex_func; | 391 | ctx->suffix = ex_func->ex_func; |
| 392 | ctx->suffix_free = ex_func->ex_free_func; | 392 | ctx->suffix_free = ex_func->ex_free_func; |
| 393 | break; | 393 | break; |
| 394 | 394 | ||
| 395 | case BIO_C_GET_SUFFIX: | 395 | case BIO_C_GET_SUFFIX: |
| @@ -413,13 +413,13 @@ static long asn1_bio_ctrl(BIO *b, int cmd, long arg1, void *arg2) | |||
| 413 | /* Call post function if possible */ | 413 | /* Call post function if possible */ |
| 414 | if (ctx->state == ASN1_STATE_HEADER) { | 414 | if (ctx->state == ASN1_STATE_HEADER) { |
| 415 | if (!asn1_bio_setup_ex(b, ctx, ctx->suffix, | 415 | if (!asn1_bio_setup_ex(b, ctx, ctx->suffix, |
| 416 | ASN1_STATE_POST_COPY, ASN1_STATE_DONE)) | 416 | ASN1_STATE_POST_COPY, ASN1_STATE_DONE)) |
| 417 | return 0; | 417 | return 0; |
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | if (ctx->state == ASN1_STATE_POST_COPY) { | 420 | if (ctx->state == ASN1_STATE_POST_COPY) { |
| 421 | ret = asn1_bio_flush_ex(b, ctx, ctx->suffix_free, | 421 | ret = asn1_bio_flush_ex(b, ctx, ctx->suffix_free, |
| 422 | ASN1_STATE_DONE); | 422 | ASN1_STATE_DONE); |
| 423 | if (ret <= 0) | 423 | if (ret <= 0) |
| 424 | return ret; | 424 | return ret; |
| 425 | } | 425 | } |
| @@ -443,20 +443,24 @@ static long asn1_bio_ctrl(BIO *b, int cmd, long arg1, void *arg2) | |||
| 443 | return ret; | 443 | return ret; |
| 444 | } | 444 | } |
| 445 | 445 | ||
| 446 | static int asn1_bio_set_ex(BIO *b, int cmd, | 446 | static int |
| 447 | asn1_ps_func *ex_func, asn1_ps_func *ex_free_func) | 447 | asn1_bio_set_ex(BIO *b, int cmd, asn1_ps_func *ex_func, asn1_ps_func |
| 448 | *ex_free_func) | ||
| 448 | { | 449 | { |
| 449 | BIO_ASN1_EX_FUNCS extmp; | 450 | BIO_ASN1_EX_FUNCS extmp; |
| 451 | |||
| 450 | extmp.ex_func = ex_func; | 452 | extmp.ex_func = ex_func; |
| 451 | extmp.ex_free_func = ex_free_func; | 453 | extmp.ex_free_func = ex_free_func; |
| 452 | return BIO_ctrl(b, cmd, 0, &extmp); | 454 | return BIO_ctrl(b, cmd, 0, &extmp); |
| 453 | } | 455 | } |
| 454 | 456 | ||
| 455 | static int asn1_bio_get_ex(BIO *b, int cmd, | 457 | static int |
| 456 | asn1_ps_func **ex_func, asn1_ps_func **ex_free_func) | 458 | asn1_bio_get_ex(BIO *b, int cmd, asn1_ps_func **ex_func, |
| 459 | asn1_ps_func **ex_free_func) | ||
| 457 | { | 460 | { |
| 458 | BIO_ASN1_EX_FUNCS extmp; | 461 | BIO_ASN1_EX_FUNCS extmp; |
| 459 | int ret; | 462 | int ret; |
| 463 | |||
| 460 | ret = BIO_ctrl(b, cmd, 0, &extmp); | 464 | ret = BIO_ctrl(b, cmd, 0, &extmp); |
| 461 | if (ret > 0) { | 465 | if (ret > 0) { |
| 462 | *ex_func = extmp.ex_func; | 466 | *ex_func = extmp.ex_func; |
| @@ -465,22 +469,26 @@ static int asn1_bio_get_ex(BIO *b, int cmd, | |||
| 465 | return ret; | 469 | return ret; |
| 466 | } | 470 | } |
| 467 | 471 | ||
| 468 | int BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, asn1_ps_func *prefix_free) | 472 | int |
| 473 | BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, asn1_ps_func *prefix_free) | ||
| 469 | { | 474 | { |
| 470 | return asn1_bio_set_ex(b, BIO_C_SET_PREFIX, prefix, prefix_free); | 475 | return asn1_bio_set_ex(b, BIO_C_SET_PREFIX, prefix, prefix_free); |
| 471 | } | 476 | } |
| 472 | 477 | ||
| 473 | int BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, asn1_ps_func **pprefix_free) | 478 | int |
| 479 | BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, asn1_ps_func **pprefix_free) | ||
| 474 | { | 480 | { |
| 475 | return asn1_bio_get_ex(b, BIO_C_GET_PREFIX, pprefix, pprefix_free); | 481 | return asn1_bio_get_ex(b, BIO_C_GET_PREFIX, pprefix, pprefix_free); |
| 476 | } | 482 | } |
| 477 | 483 | ||
| 478 | int BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, asn1_ps_func *suffix_free) | 484 | int |
| 485 | BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, asn1_ps_func *suffix_free) | ||
| 479 | { | 486 | { |
| 480 | return asn1_bio_set_ex(b, BIO_C_SET_SUFFIX, suffix, suffix_free); | 487 | return asn1_bio_set_ex(b, BIO_C_SET_SUFFIX, suffix, suffix_free); |
| 481 | } | 488 | } |
| 482 | 489 | ||
| 483 | int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, asn1_ps_func **psuffix_free) | 490 | int |
| 491 | BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, asn1_ps_func **psuffix_free) | ||
| 484 | { | 492 | { |
| 485 | return asn1_bio_get_ex(b, BIO_C_GET_SUFFIX, psuffix, psuffix_free); | 493 | return asn1_bio_get_ex(b, BIO_C_GET_SUFFIX, psuffix, psuffix_free); |
| 486 | } | 494 | } |
diff --git a/src/lib/libcrypto/asn1/bio_ndef.c b/src/lib/libcrypto/asn1/bio_ndef.c index 595e6471c2..f00d38e5e4 100644 --- a/src/lib/libcrypto/asn1/bio_ndef.c +++ b/src/lib/libcrypto/asn1/bio_ndef.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -78,8 +78,7 @@ | |||
| 78 | 78 | ||
| 79 | /* BIO support data stored in the ASN1 BIO ex_arg */ | 79 | /* BIO support data stored in the ASN1 BIO ex_arg */ |
| 80 | 80 | ||
| 81 | typedef struct ndef_aux_st | 81 | typedef struct ndef_aux_st { |
| 82 | { | ||
| 83 | /* ASN1 structure this BIO refers to */ | 82 | /* ASN1 structure this BIO refers to */ |
| 84 | ASN1_VALUE *val; | 83 | ASN1_VALUE *val; |
| 85 | const ASN1_ITEM *it; | 84 | const ASN1_ITEM *it; |
| @@ -98,7 +97,8 @@ static int ndef_prefix_free(BIO *b, unsigned char **pbuf, int *plen, void *parg) | |||
| 98 | static int ndef_suffix(BIO *b, unsigned char **pbuf, int *plen, void *parg); | 97 | static int ndef_suffix(BIO *b, unsigned char **pbuf, int *plen, void *parg); |
| 99 | static int ndef_suffix_free(BIO *b, unsigned char **pbuf, int *plen, void *parg); | 98 | static int ndef_suffix_free(BIO *b, unsigned char **pbuf, int *plen, void *parg); |
| 100 | 99 | ||
| 101 | BIO *BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it) | 100 | BIO * |
| 101 | BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it) | ||
| 102 | { | 102 | { |
| 103 | NDEF_SUPPORT *ndef_aux = NULL; | 103 | NDEF_SUPPORT *ndef_aux = NULL; |
| 104 | BIO *asn_bio = NULL; | 104 | BIO *asn_bio = NULL; |
| @@ -143,7 +143,7 @@ BIO *BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it) | |||
| 143 | 143 | ||
| 144 | return sarg.ndef_bio; | 144 | return sarg.ndef_bio; |
| 145 | 145 | ||
| 146 | err: | 146 | err: |
| 147 | if (asn_bio) | 147 | if (asn_bio) |
| 148 | BIO_free(asn_bio); | 148 | BIO_free(asn_bio); |
| 149 | if (ndef_aux) | 149 | if (ndef_aux) |
| @@ -151,7 +151,8 @@ BIO *BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it) | |||
| 151 | return NULL; | 151 | return NULL; |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | static int ndef_prefix(BIO *b, unsigned char **pbuf, int *plen, void *parg) | 154 | static int |
| 155 | ndef_prefix(BIO *b, unsigned char **pbuf, int *plen, void *parg) | ||
| 155 | { | 156 | { |
| 156 | NDEF_SUPPORT *ndef_aux; | 157 | NDEF_SUPPORT *ndef_aux; |
| 157 | unsigned char *p; | 158 | unsigned char *p; |
| @@ -176,7 +177,8 @@ static int ndef_prefix(BIO *b, unsigned char **pbuf, int *plen, void *parg) | |||
| 176 | return 1; | 177 | return 1; |
| 177 | } | 178 | } |
| 178 | 179 | ||
| 179 | static int ndef_prefix_free(BIO *b, unsigned char **pbuf, int *plen, void *parg) | 180 | static int |
| 181 | ndef_prefix_free(BIO *b, unsigned char **pbuf, int *plen, void *parg) | ||
| 180 | { | 182 | { |
| 181 | NDEF_SUPPORT *ndef_aux; | 183 | NDEF_SUPPORT *ndef_aux; |
| 182 | 184 | ||
| @@ -194,7 +196,8 @@ static int ndef_prefix_free(BIO *b, unsigned char **pbuf, int *plen, void *parg) | |||
| 194 | return 1; | 196 | return 1; |
| 195 | } | 197 | } |
| 196 | 198 | ||
| 197 | static int ndef_suffix_free(BIO *b, unsigned char **pbuf, int *plen, void *parg) | 199 | static int |
| 200 | ndef_suffix_free(BIO *b, unsigned char **pbuf, int *plen, void *parg) | ||
| 198 | { | 201 | { |
| 199 | NDEF_SUPPORT **pndef_aux = (NDEF_SUPPORT **)parg; | 202 | NDEF_SUPPORT **pndef_aux = (NDEF_SUPPORT **)parg; |
| 200 | if (!ndef_prefix_free(b, pbuf, plen, parg)) | 203 | if (!ndef_prefix_free(b, pbuf, plen, parg)) |
| @@ -204,7 +207,8 @@ static int ndef_suffix_free(BIO *b, unsigned char **pbuf, int *plen, void *parg) | |||
| 204 | return 1; | 207 | return 1; |
| 205 | } | 208 | } |
| 206 | 209 | ||
| 207 | static int ndef_suffix(BIO *b, unsigned char **pbuf, int *plen, void *parg) | 210 | static int |
| 211 | ndef_suffix(BIO *b, unsigned char **pbuf, int *plen, void *parg) | ||
| 208 | { | 212 | { |
| 209 | NDEF_SUPPORT *ndef_aux; | 213 | NDEF_SUPPORT *ndef_aux; |
| 210 | unsigned char *p; | 214 | unsigned char *p; |
| @@ -224,7 +228,7 @@ static int ndef_suffix(BIO *b, unsigned char **pbuf, int *plen, void *parg) | |||
| 224 | sarg.out = ndef_aux->out; | 228 | sarg.out = ndef_aux->out; |
| 225 | sarg.boundary = ndef_aux->boundary; | 229 | sarg.boundary = ndef_aux->boundary; |
| 226 | if (aux->asn1_cb(ASN1_OP_STREAM_POST, | 230 | if (aux->asn1_cb(ASN1_OP_STREAM_POST, |
| 227 | &ndef_aux->val, ndef_aux->it, &sarg) <= 0) | 231 | &ndef_aux->val, ndef_aux->it, &sarg) <= 0) |
| 228 | return 0; | 232 | return 0; |
| 229 | 233 | ||
| 230 | derlen = ASN1_item_ndef_i2d(ndef_aux->val, NULL, ndef_aux->it); | 234 | derlen = ASN1_item_ndef_i2d(ndef_aux->val, NULL, ndef_aux->it); |
diff --git a/src/lib/libcrypto/asn1/charmap.h b/src/lib/libcrypto/asn1/charmap.h index b55e638725..acab65b77f 100644 --- a/src/lib/libcrypto/asn1/charmap.h +++ b/src/lib/libcrypto/asn1/charmap.h | |||
| @@ -3,13 +3,12 @@ | |||
| 3 | */ | 3 | */ |
| 4 | 4 | ||
| 5 | static const unsigned char char_type[] = { | 5 | static const unsigned char char_type[] = { |
| 6 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | 6 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 7 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | 7 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 8 | 120, 0, 1,40, 0, 0, 0,16,16,16, 0,25,25,16,16,16, | 8 | 120, 0, 1, 40, 0, 0, 0, 16, 16, 16, 0, 25, 25, 16, 16, 16, |
| 9 | 16,16,16,16,16,16,16,16,16,16,16, 9, 9,16, 9,16, | 9 | 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 9, 9, 16, 9, 16, |
| 10 | 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, | 10 | 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, |
| 11 | 16,16,16,16,16,16,16,16,16,16,16, 0, 1, 0, 0, 0, | 11 | 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 1, 0, 0, 0, |
| 12 | 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, | 12 | 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, |
| 13 | 16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0, 2 | 13 | 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 2 |
| 14 | }; | 14 | }; |
| 15 | |||
