diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/asn1/asn1t.h | 37 | ||||
| -rw-r--r-- | src/lib/libcrypto/asn1/tasn_dec.c | 72 | ||||
| -rw-r--r-- | src/lib/libcrypto/asn1/tasn_enc.c | 17 | ||||
| -rw-r--r-- | src/lib/libcrypto/asn1/tasn_fre.c | 9 | ||||
| -rw-r--r-- | src/lib/libcrypto/asn1/tasn_new.c | 13 | ||||
| -rw-r--r-- | src/lib/libssl/src/crypto/asn1/asn1t.h | 37 | ||||
| -rw-r--r-- | src/lib/libssl/src/crypto/asn1/tasn_dec.c | 72 | ||||
| -rw-r--r-- | src/lib/libssl/src/crypto/asn1/tasn_enc.c | 17 | ||||
| -rw-r--r-- | src/lib/libssl/src/crypto/asn1/tasn_fre.c | 9 | ||||
| -rw-r--r-- | src/lib/libssl/src/crypto/asn1/tasn_new.c | 13 |
10 files changed, 14 insertions, 282 deletions
diff --git a/src/lib/libcrypto/asn1/asn1t.h b/src/lib/libcrypto/asn1/asn1t.h index 1d96df8148..3d6874d874 100644 --- a/src/lib/libcrypto/asn1/asn1t.h +++ b/src/lib/libcrypto/asn1/asn1t.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: asn1t.h,v 1.10 2015/02/10 08:05:16 jsing Exp $ */ | 1 | /* $OpenBSD: asn1t.h,v 1.11 2015/02/14 15:23:57 miod Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| @@ -549,10 +549,6 @@ const char *sname; /* Structure name */ | |||
| 549 | * The 'funcs' field is used for application | 549 | * The 'funcs' field is used for application |
| 550 | * specific functions. | 550 | * specific functions. |
| 551 | * | 551 | * |
| 552 | * For COMPAT types the funcs field gives a | ||
| 553 | * set of functions that handle this type, this | ||
| 554 | * supports the old d2i, i2d convention. | ||
| 555 | * | ||
| 556 | * The EXTERN type uses a new style d2i/i2d. | 552 | * The EXTERN type uses a new style d2i/i2d. |
| 557 | * The new style should be used where possible | 553 | * The new style should be used where possible |
| 558 | * because it avoids things like the d2i IMPLICIT | 554 | * because it avoids things like the d2i IMPLICIT |
| @@ -577,8 +573,6 @@ const char *sname; /* Structure name */ | |||
| 577 | 573 | ||
| 578 | #define ASN1_ITYPE_CHOICE 0x2 | 574 | #define ASN1_ITYPE_CHOICE 0x2 |
| 579 | 575 | ||
| 580 | #define ASN1_ITYPE_COMPAT 0x3 | ||
| 581 | |||
| 582 | #define ASN1_ITYPE_EXTERN 0x4 | 576 | #define ASN1_ITYPE_EXTERN 0x4 |
| 583 | 577 | ||
| 584 | #define ASN1_ITYPE_MSTRING 0x5 | 578 | #define ASN1_ITYPE_MSTRING 0x5 |
| @@ -621,13 +615,6 @@ typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, int *puty | |||
| 621 | typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it); | 615 | typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it); |
| 622 | typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, const ASN1_ITEM *it, int indent, const ASN1_PCTX *pctx); | 616 | typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, const ASN1_ITEM *it, int indent, const ASN1_PCTX *pctx); |
| 623 | 617 | ||
| 624 | typedef struct ASN1_COMPAT_FUNCS_st { | ||
| 625 | ASN1_new_func *asn1_new; | ||
| 626 | ASN1_free_func *asn1_free; | ||
| 627 | ASN1_d2i_func *asn1_d2i; | ||
| 628 | ASN1_i2d_func *asn1_i2d; | ||
| 629 | } ASN1_COMPAT_FUNCS; | ||
| 630 | |||
| 631 | typedef struct ASN1_EXTERN_FUNCS_st { | 618 | typedef struct ASN1_EXTERN_FUNCS_st { |
| 632 | void *app_data; | 619 | void *app_data; |
| 633 | ASN1_ex_new_func *asn1_ex_new; | 620 | ASN1_ex_new_func *asn1_ex_new; |
| @@ -733,28 +720,6 @@ typedef struct ASN1_STREAM_ARG_st { | |||
| 733 | ASN1_ITEM_start(itname) \ | 720 | ASN1_ITEM_start(itname) \ |
| 734 | ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ | 721 | ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ |
| 735 | ASN1_ITEM_end(itname) | 722 | ASN1_ITEM_end(itname) |
| 736 | |||
| 737 | /* Macro to implement an ASN1_ITEM in terms of old style funcs */ | ||
| 738 | |||
| 739 | #define IMPLEMENT_COMPAT_ASN1(sname) IMPLEMENT_COMPAT_ASN1_type(sname, V_ASN1_SEQUENCE) | ||
| 740 | |||
| 741 | #define IMPLEMENT_COMPAT_ASN1_type(sname, tag) \ | ||
| 742 | static const ASN1_COMPAT_FUNCS sname##_ff = { \ | ||
| 743 | (ASN1_new_func *)sname##_new, \ | ||
| 744 | (ASN1_free_func *)sname##_free, \ | ||
| 745 | (ASN1_d2i_func *)d2i_##sname, \ | ||
| 746 | (ASN1_i2d_func *)i2d_##sname, \ | ||
| 747 | }; \ | ||
| 748 | ASN1_ITEM_start(sname) \ | ||
| 749 | ASN1_ITYPE_COMPAT, \ | ||
| 750 | tag, \ | ||
| 751 | NULL, \ | ||
| 752 | 0, \ | ||
| 753 | &sname##_ff, \ | ||
| 754 | 0, \ | ||
| 755 | #sname \ | ||
| 756 | ASN1_ITEM_end(sname) | ||
| 757 | |||
| 758 | #define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ | 723 | #define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ |
| 759 | ASN1_ITEM_start(sname) \ | 724 | ASN1_ITEM_start(sname) \ |
| 760 | ASN1_ITYPE_EXTERN, \ | 725 | ASN1_ITYPE_EXTERN, \ |
diff --git a/src/lib/libcrypto/asn1/tasn_dec.c b/src/lib/libcrypto/asn1/tasn_dec.c index f633d03e9c..791a10a9c0 100644 --- a/src/lib/libcrypto/asn1/tasn_dec.c +++ b/src/lib/libcrypto/asn1/tasn_dec.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tasn_dec.c,v 1.24 2014/06/12 15:49:27 deraadt Exp $ */ | 1 | /* $OpenBSD: tasn_dec.c,v 1.25 2015/02/14 15:23:57 miod Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| @@ -155,19 +155,17 @@ ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, | |||
| 155 | const ASN1_ITEM *it, int tag, int aclass, char opt, ASN1_TLC *ctx) | 155 | const ASN1_ITEM *it, int tag, int aclass, char opt, ASN1_TLC *ctx) |
| 156 | { | 156 | { |
| 157 | const ASN1_TEMPLATE *tt, *errtt = NULL; | 157 | const ASN1_TEMPLATE *tt, *errtt = NULL; |
| 158 | const ASN1_COMPAT_FUNCS *cf; | ||
| 159 | const ASN1_EXTERN_FUNCS *ef; | 158 | const ASN1_EXTERN_FUNCS *ef; |
| 160 | const ASN1_AUX *aux = it->funcs; | 159 | const ASN1_AUX *aux = it->funcs; |
| 161 | ASN1_aux_cb *asn1_cb; | 160 | ASN1_aux_cb *asn1_cb; |
| 162 | const unsigned char *p = NULL, *q; | 161 | const unsigned char *p = NULL, *q; |
| 163 | unsigned char *wp = NULL; /* BIG FAT WARNING! BREAKS CONST WHERE USED */ | 162 | unsigned char oclass; |
| 164 | unsigned char imphack = 0, oclass; | ||
| 165 | char seq_eoc, seq_nolen, cst, isopt; | 163 | char seq_eoc, seq_nolen, cst, isopt; |
| 166 | long tmplen; | 164 | long tmplen; |
| 167 | int i; | 165 | int i; |
| 168 | int otag; | 166 | int otag; |
| 169 | int ret = 0; | 167 | int ret = 0; |
| 170 | ASN1_VALUE **pchptr, *ptmpval; | 168 | ASN1_VALUE **pchptr; |
| 171 | 169 | ||
| 172 | if (!pval) | 170 | if (!pval) |
| 173 | return 0; | 171 | return 0; |
| @@ -236,70 +234,6 @@ ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, | |||
| 236 | return ef->asn1_ex_d2i(pval, in, len, | 234 | return ef->asn1_ex_d2i(pval, in, len, |
| 237 | it, tag, aclass, opt, ctx); | 235 | it, tag, aclass, opt, ctx); |
| 238 | 236 | ||
| 239 | case ASN1_ITYPE_COMPAT: | ||
| 240 | /* we must resort to old style evil hackery */ | ||
| 241 | cf = it->funcs; | ||
| 242 | |||
| 243 | /* If OPTIONAL see if it is there */ | ||
| 244 | if (opt) { | ||
| 245 | int exptag; | ||
| 246 | p = *in; | ||
| 247 | if (tag == -1) | ||
| 248 | exptag = it->utype; | ||
| 249 | else | ||
| 250 | exptag = tag; | ||
| 251 | /* Don't care about anything other than presence | ||
| 252 | * of expected tag */ | ||
| 253 | |||
| 254 | ret = asn1_check_tlen(NULL, NULL, NULL, NULL, NULL, | ||
| 255 | &p, len, exptag, aclass, 1, ctx); | ||
| 256 | if (!ret) { | ||
| 257 | ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, | ||
| 258 | ERR_R_NESTED_ASN1_ERROR); | ||
| 259 | goto err; | ||
| 260 | } | ||
| 261 | if (ret == -1) | ||
| 262 | return -1; | ||
| 263 | } | ||
| 264 | |||
| 265 | /* This is the old style evil hack IMPLICIT handling: | ||
| 266 | * since the underlying code is expecting a tag and | ||
| 267 | * class other than the one present we change the | ||
| 268 | * buffer temporarily then change it back afterwards. | ||
| 269 | * This doesn't and never did work for tags > 30. | ||
| 270 | * | ||
| 271 | * Yes this is *horrible* but it is only needed for | ||
| 272 | * old style d2i which will hopefully not be around | ||
| 273 | * for much longer. | ||
| 274 | * FIXME: should copy the buffer then modify it so | ||
| 275 | * the input buffer can be const: we should *always* | ||
| 276 | * copy because the old style d2i might modify the | ||
| 277 | * buffer. | ||
| 278 | */ | ||
| 279 | |||
| 280 | if (tag != -1) { | ||
| 281 | wp = *(unsigned char **)in; | ||
| 282 | imphack = *wp; | ||
| 283 | if (p == NULL) { | ||
| 284 | ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, | ||
| 285 | ERR_R_NESTED_ASN1_ERROR); | ||
| 286 | goto err; | ||
| 287 | } | ||
| 288 | *wp = (unsigned char)((*p & V_ASN1_CONSTRUCTED) | | ||
| 289 | it->utype); | ||
| 290 | } | ||
| 291 | |||
| 292 | ptmpval = cf->asn1_d2i(pval, in, len); | ||
| 293 | |||
| 294 | if (tag != -1) | ||
| 295 | *wp = imphack; | ||
| 296 | |||
| 297 | if (ptmpval) | ||
| 298 | return 1; | ||
| 299 | |||
| 300 | ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ERR_R_NESTED_ASN1_ERROR); | ||
| 301 | goto err; | ||
| 302 | |||
| 303 | case ASN1_ITYPE_CHOICE: | 237 | case ASN1_ITYPE_CHOICE: |
| 304 | if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL)) | 238 | if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL)) |
| 305 | goto auxerr; | 239 | goto auxerr; |
diff --git a/src/lib/libcrypto/asn1/tasn_enc.c b/src/lib/libcrypto/asn1/tasn_enc.c index 67d774a9c1..c59033e54d 100644 --- a/src/lib/libcrypto/asn1/tasn_enc.c +++ b/src/lib/libcrypto/asn1/tasn_enc.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tasn_enc.c,v 1.15 2015/02/14 15:21:49 miod Exp $ */ | 1 | /* $OpenBSD: tasn_enc.c,v 1.16 2015/02/14 15:23:57 miod Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| @@ -131,9 +131,7 @@ ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, | |||
| 131 | int tag, int aclass) | 131 | int tag, int aclass) |
| 132 | { | 132 | { |
| 133 | const ASN1_TEMPLATE *tt = NULL; | 133 | const ASN1_TEMPLATE *tt = NULL; |
| 134 | unsigned char *p = NULL; | ||
| 135 | int i, seqcontlen, seqlen, ndef = 1; | 134 | int i, seqcontlen, seqlen, ndef = 1; |
| 136 | const ASN1_COMPAT_FUNCS *cf; | ||
| 137 | const ASN1_EXTERN_FUNCS *ef; | 135 | const ASN1_EXTERN_FUNCS *ef; |
| 138 | const ASN1_AUX *aux = it->funcs; | 136 | const ASN1_AUX *aux = it->funcs; |
| 139 | ASN1_aux_cb *asn1_cb = 0; | 137 | ASN1_aux_cb *asn1_cb = 0; |
| @@ -178,19 +176,6 @@ ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, | |||
| 178 | ef = it->funcs; | 176 | ef = it->funcs; |
| 179 | return ef->asn1_ex_i2d(pval, out, it, tag, aclass); | 177 | return ef->asn1_ex_i2d(pval, out, it, tag, aclass); |
| 180 | 178 | ||
| 181 | case ASN1_ITYPE_COMPAT: | ||
| 182 | /* old style hackery... */ | ||
| 183 | cf = it->funcs; | ||
| 184 | if (out) | ||
| 185 | p = *out; | ||
| 186 | i = cf->asn1_i2d(*pval, out); | ||
| 187 | /* Fixup for IMPLICIT tag: note this messes up for tags > 30, | ||
| 188 | * but so did the old code. Tags > 30 are very rare anyway. | ||
| 189 | */ | ||
| 190 | if (out && (tag != -1)) | ||
| 191 | *p = aclass | tag | (*p & V_ASN1_CONSTRUCTED); | ||
| 192 | return i; | ||
| 193 | |||
| 194 | case ASN1_ITYPE_NDEF_SEQUENCE: | 179 | case ASN1_ITYPE_NDEF_SEQUENCE: |
| 195 | /* Use indefinite length constructed if requested */ | 180 | /* Use indefinite length constructed if requested */ |
| 196 | if (aclass & ASN1_TFLG_NDEF) | 181 | if (aclass & ASN1_TFLG_NDEF) |
diff --git a/src/lib/libcrypto/asn1/tasn_fre.c b/src/lib/libcrypto/asn1/tasn_fre.c index 36b668a7f9..30d68786b1 100644 --- a/src/lib/libcrypto/asn1/tasn_fre.c +++ b/src/lib/libcrypto/asn1/tasn_fre.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tasn_fre.c,v 1.13 2015/02/14 13:32:46 jsing Exp $ */ | 1 | /* $OpenBSD: tasn_fre.c,v 1.14 2015/02/14 15:23:57 miod Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| @@ -84,7 +84,6 @@ asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it, int combine) | |||
| 84 | { | 84 | { |
| 85 | const ASN1_TEMPLATE *tt = NULL, *seqtt; | 85 | const ASN1_TEMPLATE *tt = NULL, *seqtt; |
| 86 | const ASN1_EXTERN_FUNCS *ef; | 86 | const ASN1_EXTERN_FUNCS *ef; |
| 87 | const ASN1_COMPAT_FUNCS *cf; | ||
| 88 | const ASN1_AUX *aux = it->funcs; | 87 | const ASN1_AUX *aux = it->funcs; |
| 89 | ASN1_aux_cb *asn1_cb = NULL; | 88 | ASN1_aux_cb *asn1_cb = NULL; |
| 90 | int i; | 89 | int i; |
| @@ -128,12 +127,6 @@ asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it, int combine) | |||
| 128 | } | 127 | } |
| 129 | break; | 128 | break; |
| 130 | 129 | ||
| 131 | case ASN1_ITYPE_COMPAT: | ||
| 132 | cf = it->funcs; | ||
| 133 | if (cf && cf->asn1_free) | ||
| 134 | cf->asn1_free(*pval); | ||
| 135 | break; | ||
| 136 | |||
| 137 | case ASN1_ITYPE_EXTERN: | 130 | case ASN1_ITYPE_EXTERN: |
| 138 | ef = it->funcs; | 131 | ef = it->funcs; |
| 139 | if (ef && ef->asn1_ex_free) | 132 | if (ef && ef->asn1_ex_free) |
diff --git a/src/lib/libcrypto/asn1/tasn_new.c b/src/lib/libcrypto/asn1/tasn_new.c index 86b2b3facd..132df07637 100644 --- a/src/lib/libcrypto/asn1/tasn_new.c +++ b/src/lib/libcrypto/asn1/tasn_new.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tasn_new.c,v 1.13 2015/02/14 15:15:27 miod Exp $ */ | 1 | /* $OpenBSD: tasn_new.c,v 1.14 2015/02/14 15:23:57 miod Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| @@ -91,7 +91,6 @@ static int | |||
| 91 | asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, int combine) | 91 | asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, int combine) |
| 92 | { | 92 | { |
| 93 | const ASN1_TEMPLATE *tt = NULL; | 93 | const ASN1_TEMPLATE *tt = NULL; |
| 94 | const ASN1_COMPAT_FUNCS *cf; | ||
| 95 | const ASN1_EXTERN_FUNCS *ef; | 94 | const ASN1_EXTERN_FUNCS *ef; |
| 96 | const ASN1_AUX *aux = it->funcs; | 95 | const ASN1_AUX *aux = it->funcs; |
| 97 | ASN1_aux_cb *asn1_cb = NULL; | 96 | ASN1_aux_cb *asn1_cb = NULL; |
| @@ -118,15 +117,6 @@ asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, int combine) | |||
| 118 | } | 117 | } |
| 119 | break; | 118 | break; |
| 120 | 119 | ||
| 121 | case ASN1_ITYPE_COMPAT: | ||
| 122 | cf = it->funcs; | ||
| 123 | if (cf && cf->asn1_new) { | ||
| 124 | *pval = cf->asn1_new(); | ||
| 125 | if (!*pval) | ||
| 126 | goto memerr; | ||
| 127 | } | ||
| 128 | break; | ||
| 129 | |||
| 130 | case ASN1_ITYPE_PRIMITIVE: | 120 | case ASN1_ITYPE_PRIMITIVE: |
| 131 | if (it->templates) { | 121 | if (it->templates) { |
| 132 | if (!ASN1_template_new(pval, it->templates)) | 122 | if (!ASN1_template_new(pval, it->templates)) |
| @@ -243,7 +233,6 @@ asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) | |||
| 243 | asn1_primitive_clear(pval, it); | 233 | asn1_primitive_clear(pval, it); |
| 244 | break; | 234 | break; |
| 245 | 235 | ||
| 246 | case ASN1_ITYPE_COMPAT: | ||
| 247 | case ASN1_ITYPE_CHOICE: | 236 | case ASN1_ITYPE_CHOICE: |
| 248 | case ASN1_ITYPE_SEQUENCE: | 237 | case ASN1_ITYPE_SEQUENCE: |
| 249 | case ASN1_ITYPE_NDEF_SEQUENCE: | 238 | case ASN1_ITYPE_NDEF_SEQUENCE: |
diff --git a/src/lib/libssl/src/crypto/asn1/asn1t.h b/src/lib/libssl/src/crypto/asn1/asn1t.h index 1d96df8148..3d6874d874 100644 --- a/src/lib/libssl/src/crypto/asn1/asn1t.h +++ b/src/lib/libssl/src/crypto/asn1/asn1t.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: asn1t.h,v 1.10 2015/02/10 08:05:16 jsing Exp $ */ | 1 | /* $OpenBSD: asn1t.h,v 1.11 2015/02/14 15:23:57 miod Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| @@ -549,10 +549,6 @@ const char *sname; /* Structure name */ | |||
| 549 | * The 'funcs' field is used for application | 549 | * The 'funcs' field is used for application |
| 550 | * specific functions. | 550 | * specific functions. |
| 551 | * | 551 | * |
| 552 | * For COMPAT types the funcs field gives a | ||
| 553 | * set of functions that handle this type, this | ||
| 554 | * supports the old d2i, i2d convention. | ||
| 555 | * | ||
| 556 | * The EXTERN type uses a new style d2i/i2d. | 552 | * The EXTERN type uses a new style d2i/i2d. |
| 557 | * The new style should be used where possible | 553 | * The new style should be used where possible |
| 558 | * because it avoids things like the d2i IMPLICIT | 554 | * because it avoids things like the d2i IMPLICIT |
| @@ -577,8 +573,6 @@ const char *sname; /* Structure name */ | |||
| 577 | 573 | ||
| 578 | #define ASN1_ITYPE_CHOICE 0x2 | 574 | #define ASN1_ITYPE_CHOICE 0x2 |
| 579 | 575 | ||
| 580 | #define ASN1_ITYPE_COMPAT 0x3 | ||
| 581 | |||
| 582 | #define ASN1_ITYPE_EXTERN 0x4 | 576 | #define ASN1_ITYPE_EXTERN 0x4 |
| 583 | 577 | ||
| 584 | #define ASN1_ITYPE_MSTRING 0x5 | 578 | #define ASN1_ITYPE_MSTRING 0x5 |
| @@ -621,13 +615,6 @@ typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, int *puty | |||
| 621 | typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it); | 615 | typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it); |
| 622 | typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, const ASN1_ITEM *it, int indent, const ASN1_PCTX *pctx); | 616 | typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, const ASN1_ITEM *it, int indent, const ASN1_PCTX *pctx); |
| 623 | 617 | ||
| 624 | typedef struct ASN1_COMPAT_FUNCS_st { | ||
| 625 | ASN1_new_func *asn1_new; | ||
| 626 | ASN1_free_func *asn1_free; | ||
| 627 | ASN1_d2i_func *asn1_d2i; | ||
| 628 | ASN1_i2d_func *asn1_i2d; | ||
| 629 | } ASN1_COMPAT_FUNCS; | ||
| 630 | |||
| 631 | typedef struct ASN1_EXTERN_FUNCS_st { | 618 | typedef struct ASN1_EXTERN_FUNCS_st { |
| 632 | void *app_data; | 619 | void *app_data; |
| 633 | ASN1_ex_new_func *asn1_ex_new; | 620 | ASN1_ex_new_func *asn1_ex_new; |
| @@ -733,28 +720,6 @@ typedef struct ASN1_STREAM_ARG_st { | |||
| 733 | ASN1_ITEM_start(itname) \ | 720 | ASN1_ITEM_start(itname) \ |
| 734 | ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ | 721 | ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ |
| 735 | ASN1_ITEM_end(itname) | 722 | ASN1_ITEM_end(itname) |
| 736 | |||
| 737 | /* Macro to implement an ASN1_ITEM in terms of old style funcs */ | ||
| 738 | |||
| 739 | #define IMPLEMENT_COMPAT_ASN1(sname) IMPLEMENT_COMPAT_ASN1_type(sname, V_ASN1_SEQUENCE) | ||
| 740 | |||
| 741 | #define IMPLEMENT_COMPAT_ASN1_type(sname, tag) \ | ||
| 742 | static const ASN1_COMPAT_FUNCS sname##_ff = { \ | ||
| 743 | (ASN1_new_func *)sname##_new, \ | ||
| 744 | (ASN1_free_func *)sname##_free, \ | ||
| 745 | (ASN1_d2i_func *)d2i_##sname, \ | ||
| 746 | (ASN1_i2d_func *)i2d_##sname, \ | ||
| 747 | }; \ | ||
| 748 | ASN1_ITEM_start(sname) \ | ||
| 749 | ASN1_ITYPE_COMPAT, \ | ||
| 750 | tag, \ | ||
| 751 | NULL, \ | ||
| 752 | 0, \ | ||
| 753 | &sname##_ff, \ | ||
| 754 | 0, \ | ||
| 755 | #sname \ | ||
| 756 | ASN1_ITEM_end(sname) | ||
| 757 | |||
| 758 | #define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ | 723 | #define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ |
| 759 | ASN1_ITEM_start(sname) \ | 724 | ASN1_ITEM_start(sname) \ |
| 760 | ASN1_ITYPE_EXTERN, \ | 725 | ASN1_ITYPE_EXTERN, \ |
diff --git a/src/lib/libssl/src/crypto/asn1/tasn_dec.c b/src/lib/libssl/src/crypto/asn1/tasn_dec.c index f633d03e9c..791a10a9c0 100644 --- a/src/lib/libssl/src/crypto/asn1/tasn_dec.c +++ b/src/lib/libssl/src/crypto/asn1/tasn_dec.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tasn_dec.c,v 1.24 2014/06/12 15:49:27 deraadt Exp $ */ | 1 | /* $OpenBSD: tasn_dec.c,v 1.25 2015/02/14 15:23:57 miod Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| @@ -155,19 +155,17 @@ ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, | |||
| 155 | const ASN1_ITEM *it, int tag, int aclass, char opt, ASN1_TLC *ctx) | 155 | const ASN1_ITEM *it, int tag, int aclass, char opt, ASN1_TLC *ctx) |
| 156 | { | 156 | { |
| 157 | const ASN1_TEMPLATE *tt, *errtt = NULL; | 157 | const ASN1_TEMPLATE *tt, *errtt = NULL; |
| 158 | const ASN1_COMPAT_FUNCS *cf; | ||
| 159 | const ASN1_EXTERN_FUNCS *ef; | 158 | const ASN1_EXTERN_FUNCS *ef; |
| 160 | const ASN1_AUX *aux = it->funcs; | 159 | const ASN1_AUX *aux = it->funcs; |
| 161 | ASN1_aux_cb *asn1_cb; | 160 | ASN1_aux_cb *asn1_cb; |
| 162 | const unsigned char *p = NULL, *q; | 161 | const unsigned char *p = NULL, *q; |
| 163 | unsigned char *wp = NULL; /* BIG FAT WARNING! BREAKS CONST WHERE USED */ | 162 | unsigned char oclass; |
| 164 | unsigned char imphack = 0, oclass; | ||
| 165 | char seq_eoc, seq_nolen, cst, isopt; | 163 | char seq_eoc, seq_nolen, cst, isopt; |
| 166 | long tmplen; | 164 | long tmplen; |
| 167 | int i; | 165 | int i; |
| 168 | int otag; | 166 | int otag; |
| 169 | int ret = 0; | 167 | int ret = 0; |
| 170 | ASN1_VALUE **pchptr, *ptmpval; | 168 | ASN1_VALUE **pchptr; |
| 171 | 169 | ||
| 172 | if (!pval) | 170 | if (!pval) |
| 173 | return 0; | 171 | return 0; |
| @@ -236,70 +234,6 @@ ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, | |||
| 236 | return ef->asn1_ex_d2i(pval, in, len, | 234 | return ef->asn1_ex_d2i(pval, in, len, |
| 237 | it, tag, aclass, opt, ctx); | 235 | it, tag, aclass, opt, ctx); |
| 238 | 236 | ||
| 239 | case ASN1_ITYPE_COMPAT: | ||
| 240 | /* we must resort to old style evil hackery */ | ||
| 241 | cf = it->funcs; | ||
| 242 | |||
| 243 | /* If OPTIONAL see if it is there */ | ||
| 244 | if (opt) { | ||
| 245 | int exptag; | ||
| 246 | p = *in; | ||
| 247 | if (tag == -1) | ||
| 248 | exptag = it->utype; | ||
| 249 | else | ||
| 250 | exptag = tag; | ||
| 251 | /* Don't care about anything other than presence | ||
| 252 | * of expected tag */ | ||
| 253 | |||
| 254 | ret = asn1_check_tlen(NULL, NULL, NULL, NULL, NULL, | ||
| 255 | &p, len, exptag, aclass, 1, ctx); | ||
| 256 | if (!ret) { | ||
| 257 | ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, | ||
| 258 | ERR_R_NESTED_ASN1_ERROR); | ||
| 259 | goto err; | ||
| 260 | } | ||
| 261 | if (ret == -1) | ||
| 262 | return -1; | ||
| 263 | } | ||
| 264 | |||
| 265 | /* This is the old style evil hack IMPLICIT handling: | ||
| 266 | * since the underlying code is expecting a tag and | ||
| 267 | * class other than the one present we change the | ||
| 268 | * buffer temporarily then change it back afterwards. | ||
| 269 | * This doesn't and never did work for tags > 30. | ||
| 270 | * | ||
| 271 | * Yes this is *horrible* but it is only needed for | ||
| 272 | * old style d2i which will hopefully not be around | ||
| 273 | * for much longer. | ||
| 274 | * FIXME: should copy the buffer then modify it so | ||
| 275 | * the input buffer can be const: we should *always* | ||
| 276 | * copy because the old style d2i might modify the | ||
| 277 | * buffer. | ||
| 278 | */ | ||
| 279 | |||
| 280 | if (tag != -1) { | ||
| 281 | wp = *(unsigned char **)in; | ||
| 282 | imphack = *wp; | ||
| 283 | if (p == NULL) { | ||
| 284 | ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, | ||
| 285 | ERR_R_NESTED_ASN1_ERROR); | ||
| 286 | goto err; | ||
| 287 | } | ||
| 288 | *wp = (unsigned char)((*p & V_ASN1_CONSTRUCTED) | | ||
| 289 | it->utype); | ||
| 290 | } | ||
| 291 | |||
| 292 | ptmpval = cf->asn1_d2i(pval, in, len); | ||
| 293 | |||
| 294 | if (tag != -1) | ||
| 295 | *wp = imphack; | ||
| 296 | |||
| 297 | if (ptmpval) | ||
| 298 | return 1; | ||
| 299 | |||
| 300 | ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ERR_R_NESTED_ASN1_ERROR); | ||
| 301 | goto err; | ||
| 302 | |||
| 303 | case ASN1_ITYPE_CHOICE: | 237 | case ASN1_ITYPE_CHOICE: |
| 304 | if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL)) | 238 | if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL)) |
| 305 | goto auxerr; | 239 | goto auxerr; |
diff --git a/src/lib/libssl/src/crypto/asn1/tasn_enc.c b/src/lib/libssl/src/crypto/asn1/tasn_enc.c index 67d774a9c1..c59033e54d 100644 --- a/src/lib/libssl/src/crypto/asn1/tasn_enc.c +++ b/src/lib/libssl/src/crypto/asn1/tasn_enc.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tasn_enc.c,v 1.15 2015/02/14 15:21:49 miod Exp $ */ | 1 | /* $OpenBSD: tasn_enc.c,v 1.16 2015/02/14 15:23:57 miod Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| @@ -131,9 +131,7 @@ ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, | |||
| 131 | int tag, int aclass) | 131 | int tag, int aclass) |
| 132 | { | 132 | { |
| 133 | const ASN1_TEMPLATE *tt = NULL; | 133 | const ASN1_TEMPLATE *tt = NULL; |
| 134 | unsigned char *p = NULL; | ||
| 135 | int i, seqcontlen, seqlen, ndef = 1; | 134 | int i, seqcontlen, seqlen, ndef = 1; |
| 136 | const ASN1_COMPAT_FUNCS *cf; | ||
| 137 | const ASN1_EXTERN_FUNCS *ef; | 135 | const ASN1_EXTERN_FUNCS *ef; |
| 138 | const ASN1_AUX *aux = it->funcs; | 136 | const ASN1_AUX *aux = it->funcs; |
| 139 | ASN1_aux_cb *asn1_cb = 0; | 137 | ASN1_aux_cb *asn1_cb = 0; |
| @@ -178,19 +176,6 @@ ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, | |||
| 178 | ef = it->funcs; | 176 | ef = it->funcs; |
| 179 | return ef->asn1_ex_i2d(pval, out, it, tag, aclass); | 177 | return ef->asn1_ex_i2d(pval, out, it, tag, aclass); |
| 180 | 178 | ||
| 181 | case ASN1_ITYPE_COMPAT: | ||
| 182 | /* old style hackery... */ | ||
| 183 | cf = it->funcs; | ||
| 184 | if (out) | ||
| 185 | p = *out; | ||
| 186 | i = cf->asn1_i2d(*pval, out); | ||
| 187 | /* Fixup for IMPLICIT tag: note this messes up for tags > 30, | ||
| 188 | * but so did the old code. Tags > 30 are very rare anyway. | ||
| 189 | */ | ||
| 190 | if (out && (tag != -1)) | ||
| 191 | *p = aclass | tag | (*p & V_ASN1_CONSTRUCTED); | ||
| 192 | return i; | ||
| 193 | |||
| 194 | case ASN1_ITYPE_NDEF_SEQUENCE: | 179 | case ASN1_ITYPE_NDEF_SEQUENCE: |
| 195 | /* Use indefinite length constructed if requested */ | 180 | /* Use indefinite length constructed if requested */ |
| 196 | if (aclass & ASN1_TFLG_NDEF) | 181 | if (aclass & ASN1_TFLG_NDEF) |
diff --git a/src/lib/libssl/src/crypto/asn1/tasn_fre.c b/src/lib/libssl/src/crypto/asn1/tasn_fre.c index 36b668a7f9..30d68786b1 100644 --- a/src/lib/libssl/src/crypto/asn1/tasn_fre.c +++ b/src/lib/libssl/src/crypto/asn1/tasn_fre.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tasn_fre.c,v 1.13 2015/02/14 13:32:46 jsing Exp $ */ | 1 | /* $OpenBSD: tasn_fre.c,v 1.14 2015/02/14 15:23:57 miod Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| @@ -84,7 +84,6 @@ asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it, int combine) | |||
| 84 | { | 84 | { |
| 85 | const ASN1_TEMPLATE *tt = NULL, *seqtt; | 85 | const ASN1_TEMPLATE *tt = NULL, *seqtt; |
| 86 | const ASN1_EXTERN_FUNCS *ef; | 86 | const ASN1_EXTERN_FUNCS *ef; |
| 87 | const ASN1_COMPAT_FUNCS *cf; | ||
| 88 | const ASN1_AUX *aux = it->funcs; | 87 | const ASN1_AUX *aux = it->funcs; |
| 89 | ASN1_aux_cb *asn1_cb = NULL; | 88 | ASN1_aux_cb *asn1_cb = NULL; |
| 90 | int i; | 89 | int i; |
| @@ -128,12 +127,6 @@ asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it, int combine) | |||
| 128 | } | 127 | } |
| 129 | break; | 128 | break; |
| 130 | 129 | ||
| 131 | case ASN1_ITYPE_COMPAT: | ||
| 132 | cf = it->funcs; | ||
| 133 | if (cf && cf->asn1_free) | ||
| 134 | cf->asn1_free(*pval); | ||
| 135 | break; | ||
| 136 | |||
| 137 | case ASN1_ITYPE_EXTERN: | 130 | case ASN1_ITYPE_EXTERN: |
| 138 | ef = it->funcs; | 131 | ef = it->funcs; |
| 139 | if (ef && ef->asn1_ex_free) | 132 | if (ef && ef->asn1_ex_free) |
diff --git a/src/lib/libssl/src/crypto/asn1/tasn_new.c b/src/lib/libssl/src/crypto/asn1/tasn_new.c index 86b2b3facd..132df07637 100644 --- a/src/lib/libssl/src/crypto/asn1/tasn_new.c +++ b/src/lib/libssl/src/crypto/asn1/tasn_new.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tasn_new.c,v 1.13 2015/02/14 15:15:27 miod Exp $ */ | 1 | /* $OpenBSD: tasn_new.c,v 1.14 2015/02/14 15:23:57 miod Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| @@ -91,7 +91,6 @@ static int | |||
| 91 | asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, int combine) | 91 | asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, int combine) |
| 92 | { | 92 | { |
| 93 | const ASN1_TEMPLATE *tt = NULL; | 93 | const ASN1_TEMPLATE *tt = NULL; |
| 94 | const ASN1_COMPAT_FUNCS *cf; | ||
| 95 | const ASN1_EXTERN_FUNCS *ef; | 94 | const ASN1_EXTERN_FUNCS *ef; |
| 96 | const ASN1_AUX *aux = it->funcs; | 95 | const ASN1_AUX *aux = it->funcs; |
| 97 | ASN1_aux_cb *asn1_cb = NULL; | 96 | ASN1_aux_cb *asn1_cb = NULL; |
| @@ -118,15 +117,6 @@ asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, int combine) | |||
| 118 | } | 117 | } |
| 119 | break; | 118 | break; |
| 120 | 119 | ||
| 121 | case ASN1_ITYPE_COMPAT: | ||
| 122 | cf = it->funcs; | ||
| 123 | if (cf && cf->asn1_new) { | ||
| 124 | *pval = cf->asn1_new(); | ||
| 125 | if (!*pval) | ||
| 126 | goto memerr; | ||
| 127 | } | ||
| 128 | break; | ||
| 129 | |||
| 130 | case ASN1_ITYPE_PRIMITIVE: | 120 | case ASN1_ITYPE_PRIMITIVE: |
| 131 | if (it->templates) { | 121 | if (it->templates) { |
| 132 | if (!ASN1_template_new(pval, it->templates)) | 122 | if (!ASN1_template_new(pval, it->templates)) |
| @@ -243,7 +233,6 @@ asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) | |||
| 243 | asn1_primitive_clear(pval, it); | 233 | asn1_primitive_clear(pval, it); |
| 244 | break; | 234 | break; |
| 245 | 235 | ||
| 246 | case ASN1_ITYPE_COMPAT: | ||
| 247 | case ASN1_ITYPE_CHOICE: | 236 | case ASN1_ITYPE_CHOICE: |
| 248 | case ASN1_ITYPE_SEQUENCE: | 237 | case ASN1_ITYPE_SEQUENCE: |
| 249 | case ASN1_ITYPE_NDEF_SEQUENCE: | 238 | case ASN1_ITYPE_NDEF_SEQUENCE: |
