diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/asn1/asn1_locl.h | 6 | ||||
-rw-r--r-- | src/lib/libcrypto/asn1/asn1_types.c | 42 | ||||
-rw-r--r-- | src/lib/libcrypto/asn1/tasn_dec.c | 11 |
3 files changed, 52 insertions, 7 deletions
diff --git a/src/lib/libcrypto/asn1/asn1_locl.h b/src/lib/libcrypto/asn1/asn1_locl.h index e2c57fd8c4..1eb7ee402e 100644 --- a/src/lib/libcrypto/asn1/asn1_locl.h +++ b/src/lib/libcrypto/asn1/asn1_locl.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: asn1_locl.h,v 1.36 2022/09/03 18:45:51 jsing Exp $ */ | 1 | /* $OpenBSD: asn1_locl.h,v 1.37 2022/09/03 18:52:18 jsing 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 2006. | 3 | * project 2006. |
4 | */ | 4 | */ |
@@ -204,6 +204,8 @@ int asn1_get_object_cbs(CBS *cbs, int der_mode, uint8_t *out_class, | |||
204 | int asn1_get_primitive(CBS *cbs, int der_mode, uint32_t *out_tag_number, | 204 | int asn1_get_primitive(CBS *cbs, int der_mode, uint32_t *out_tag_number, |
205 | CBS *out_content); | 205 | CBS *out_content); |
206 | 206 | ||
207 | int asn1_must_be_constructed(int tag); | ||
208 | int asn1_must_be_primitive(int tag); | ||
207 | int asn1_tag2charwidth(int tag); | 209 | int asn1_tag2charwidth(int tag); |
208 | 210 | ||
209 | int asn1_abs_set_unused_bits(ASN1_BIT_STRING *abs, uint8_t unused_bits); | 211 | int asn1_abs_set_unused_bits(ASN1_BIT_STRING *abs, uint8_t unused_bits); |
@@ -211,6 +213,8 @@ int c2i_ASN1_BIT_STRING_cbs(ASN1_BIT_STRING **out_abs, CBS *cbs); | |||
211 | 213 | ||
212 | int c2i_ASN1_ENUMERATED_cbs(ASN1_ENUMERATED **out_aenum, CBS *cbs); | 214 | int c2i_ASN1_ENUMERATED_cbs(ASN1_ENUMERATED **out_aenum, CBS *cbs); |
213 | 215 | ||
216 | int c2i_ASN1_ENUMERATED_cbs(ASN1_ENUMERATED **out_aenum, CBS *cbs); | ||
217 | |||
214 | int asn1_aint_get_uint64(CBS *cbs, uint64_t *out_val); | 218 | int asn1_aint_get_uint64(CBS *cbs, uint64_t *out_val); |
215 | int asn1_aint_set_uint64(uint64_t val, uint8_t **out_data, int *out_len); | 219 | int asn1_aint_set_uint64(uint64_t val, uint8_t **out_data, int *out_len); |
216 | int asn1_aint_get_int64(CBS *cbs, int negative, int64_t *out_val); | 220 | int asn1_aint_get_int64(CBS *cbs, int negative, int64_t *out_val); |
diff --git a/src/lib/libcrypto/asn1/asn1_types.c b/src/lib/libcrypto/asn1/asn1_types.c index c8e6b23f4f..d8b7c1e88e 100644 --- a/src/lib/libcrypto/asn1/asn1_types.c +++ b/src/lib/libcrypto/asn1/asn1_types.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: asn1_types.c,v 1.1 2021/12/14 17:35:21 jsing Exp $ */ | 1 | /* $OpenBSD: asn1_types.c,v 1.2 2022/09/03 18:52:18 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2021 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2021 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -19,10 +19,14 @@ | |||
19 | 19 | ||
20 | #include <openssl/asn1.h> | 20 | #include <openssl/asn1.h> |
21 | 21 | ||
22 | #define ASN1_ENCODING_CONSTRUCTED_ONLY 1 | ||
23 | #define ASN1_ENCODING_PRIMITIVE_ONLY 2 | ||
24 | |||
22 | struct asn1_type { | 25 | struct asn1_type { |
23 | const char *name; | 26 | const char *name; |
24 | uint32_t bit_value; | 27 | uint32_t bit_value; |
25 | int char_width; | 28 | int char_width; |
29 | int encoding; | ||
26 | }; | 30 | }; |
27 | 31 | ||
28 | /* | 32 | /* |
@@ -40,12 +44,14 @@ static const struct asn1_type asn1_types[31] = { | |||
40 | .name = "BOOLEAN", | 44 | .name = "BOOLEAN", |
41 | .bit_value = 0, | 45 | .bit_value = 0, |
42 | .char_width = -1, | 46 | .char_width = -1, |
47 | .encoding = ASN1_ENCODING_PRIMITIVE_ONLY, | ||
43 | }, | 48 | }, |
44 | [2] = { | 49 | [2] = { |
45 | /* Tag 2 (0x02) - Integer */ | 50 | /* Tag 2 (0x02) - Integer */ |
46 | .name = "INTEGER", | 51 | .name = "INTEGER", |
47 | .bit_value = 0, | 52 | .bit_value = 0, |
48 | .char_width = -1, | 53 | .char_width = -1, |
54 | .encoding = ASN1_ENCODING_PRIMITIVE_ONLY, | ||
49 | }, | 55 | }, |
50 | [3] = { | 56 | [3] = { |
51 | /* Tag 3 (0x03) - BitString */ | 57 | /* Tag 3 (0x03) - BitString */ |
@@ -64,12 +70,14 @@ static const struct asn1_type asn1_types[31] = { | |||
64 | .name = "NULL", | 70 | .name = "NULL", |
65 | .bit_value = 0, | 71 | .bit_value = 0, |
66 | .char_width = -1, | 72 | .char_width = -1, |
73 | .encoding = ASN1_ENCODING_PRIMITIVE_ONLY, | ||
67 | }, | 74 | }, |
68 | [6] = { | 75 | [6] = { |
69 | /* Tag 6 (0x06) - Object Identifier */ | 76 | /* Tag 6 (0x06) - Object Identifier */ |
70 | .name = "OBJECT", | 77 | .name = "OBJECT", |
71 | .bit_value = 0, | 78 | .bit_value = 0, |
72 | .char_width = -1, | 79 | .char_width = -1, |
80 | .encoding = ASN1_ENCODING_PRIMITIVE_ONLY, | ||
73 | }, | 81 | }, |
74 | [7] = { | 82 | [7] = { |
75 | /* Tag 7 (0x07) - Object Descriptor */ | 83 | /* Tag 7 (0x07) - Object Descriptor */ |
@@ -88,12 +96,14 @@ static const struct asn1_type asn1_types[31] = { | |||
88 | .name = "REAL", | 96 | .name = "REAL", |
89 | .bit_value = B_ASN1_UNKNOWN, | 97 | .bit_value = B_ASN1_UNKNOWN, |
90 | .char_width = -1, | 98 | .char_width = -1, |
99 | .encoding = ASN1_ENCODING_PRIMITIVE_ONLY, | ||
91 | }, | 100 | }, |
92 | [10] = { | 101 | [10] = { |
93 | /* Tag 10 (0x0a) - Enumerated */ | 102 | /* Tag 10 (0x0a) - Enumerated */ |
94 | .name = "ENUMERATED", | 103 | .name = "ENUMERATED", |
95 | .bit_value = B_ASN1_UNKNOWN, | 104 | .bit_value = B_ASN1_UNKNOWN, |
96 | .char_width = -1, | 105 | .char_width = -1, |
106 | .encoding = ASN1_ENCODING_PRIMITIVE_ONLY, | ||
97 | }, | 107 | }, |
98 | [11] = { | 108 | [11] = { |
99 | /* Tag 11 (0x0b) - Embedded PDV */ | 109 | /* Tag 11 (0x0b) - Embedded PDV */ |
@@ -112,12 +122,14 @@ static const struct asn1_type asn1_types[31] = { | |||
112 | .name = "<ASN1 13 RELATIVE OID>", | 122 | .name = "<ASN1 13 RELATIVE OID>", |
113 | .bit_value = B_ASN1_UNKNOWN, | 123 | .bit_value = B_ASN1_UNKNOWN, |
114 | .char_width = -1, | 124 | .char_width = -1, |
125 | .encoding = ASN1_ENCODING_PRIMITIVE_ONLY, | ||
115 | }, | 126 | }, |
116 | [14] = { | 127 | [14] = { |
117 | /* Tag 14 (0x0e) - Time */ | 128 | /* Tag 14 (0x0e) - Time */ |
118 | .name = "<ASN1 14 TIME>", | 129 | .name = "<ASN1 14 TIME>", |
119 | .bit_value = B_ASN1_UNKNOWN, | 130 | .bit_value = B_ASN1_UNKNOWN, |
120 | .char_width = -1, | 131 | .char_width = -1, |
132 | .encoding = ASN1_ENCODING_PRIMITIVE_ONLY, | ||
121 | }, | 133 | }, |
122 | [15] = { | 134 | [15] = { |
123 | /* Tag 15 (0x0f) - Reserved */ | 135 | /* Tag 15 (0x0f) - Reserved */ |
@@ -130,12 +142,14 @@ static const struct asn1_type asn1_types[31] = { | |||
130 | .name = "SEQUENCE", | 142 | .name = "SEQUENCE", |
131 | .bit_value = B_ASN1_SEQUENCE, | 143 | .bit_value = B_ASN1_SEQUENCE, |
132 | .char_width = -1, | 144 | .char_width = -1, |
145 | .encoding = ASN1_ENCODING_CONSTRUCTED_ONLY, | ||
133 | }, | 146 | }, |
134 | [17] = { | 147 | [17] = { |
135 | /* Tag 17 (0x11) - Set */ | 148 | /* Tag 17 (0x11) - Set */ |
136 | .name = "SET", | 149 | .name = "SET", |
137 | .bit_value = 0, | 150 | .bit_value = 0, |
138 | .char_width = -1, | 151 | .char_width = -1, |
152 | .encoding = ASN1_ENCODING_CONSTRUCTED_ONLY, | ||
139 | }, | 153 | }, |
140 | [18] = { | 154 | [18] = { |
141 | /* Tag 18 (0x12) - NumericString */ | 155 | /* Tag 18 (0x12) - NumericString */ |
@@ -227,6 +241,32 @@ asn1_type_by_tag(int tag) | |||
227 | } | 241 | } |
228 | 242 | ||
229 | int | 243 | int |
244 | asn1_must_be_constructed(int tag) | ||
245 | { | ||
246 | const struct asn1_type *at; | ||
247 | |||
248 | if (tag == V_ASN1_NEG_INTEGER || tag == V_ASN1_NEG_ENUMERATED) | ||
249 | tag &= ~V_ASN1_NEG; | ||
250 | if ((at = asn1_type_by_tag(tag)) != NULL) | ||
251 | return at->encoding == ASN1_ENCODING_CONSTRUCTED_ONLY; | ||
252 | |||
253 | return 0; | ||
254 | } | ||
255 | |||
256 | int | ||
257 | asn1_must_be_primitive(int tag) | ||
258 | { | ||
259 | const struct asn1_type *at; | ||
260 | |||
261 | if (tag == V_ASN1_NEG_INTEGER || tag == V_ASN1_NEG_ENUMERATED) | ||
262 | tag &= ~V_ASN1_NEG; | ||
263 | if ((at = asn1_type_by_tag(tag)) != NULL) | ||
264 | return at->encoding == ASN1_ENCODING_PRIMITIVE_ONLY; | ||
265 | |||
266 | return 0; | ||
267 | } | ||
268 | |||
269 | int | ||
230 | asn1_tag2charwidth(int tag) | 270 | asn1_tag2charwidth(int tag) |
231 | { | 271 | { |
232 | const struct asn1_type *at; | 272 | const struct asn1_type *at; |
diff --git a/src/lib/libcrypto/asn1/tasn_dec.c b/src/lib/libcrypto/asn1/tasn_dec.c index 22d8006d0a..457f526e71 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.79 2022/09/03 18:45:51 jsing Exp $ */ | 1 | /* $OpenBSD: tasn_dec.c,v 1.80 2022/09/03 18:52:18 jsing 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 | */ |
@@ -467,13 +467,14 @@ asn1_d2i_primitive_content(ASN1_VALUE **pval, CBS *cbs, CBS *cbs_object, | |||
467 | CBS_dup(cbs, &cbs_initial); | 467 | CBS_dup(cbs, &cbs_initial); |
468 | CBS_init(&cbs_content, NULL, 0); | 468 | CBS_init(&cbs_content, NULL, 0); |
469 | 469 | ||
470 | /* XXX - check primitive vs constructed based on utype. */ | 470 | if (asn1_must_be_constructed(utype) && !constructed) { |
471 | |||
472 | /* SEQUENCE and SET must be constructed. */ | ||
473 | if ((utype == V_ASN1_SEQUENCE || utype == V_ASN1_SET) && !constructed) { | ||
474 | ASN1error(ASN1_R_TYPE_NOT_CONSTRUCTED); | 471 | ASN1error(ASN1_R_TYPE_NOT_CONSTRUCTED); |
475 | goto err; | 472 | goto err; |
476 | } | 473 | } |
474 | if (asn1_must_be_primitive(utype) && constructed) { | ||
475 | ASN1error(ASN1_R_TYPE_NOT_PRIMITIVE); | ||
476 | goto err; | ||
477 | } | ||
477 | 478 | ||
478 | /* SEQUENCE, SET and "OTHER" are left in encoded form. */ | 479 | /* SEQUENCE, SET and "OTHER" are left in encoded form. */ |
479 | if (utype == V_ASN1_SEQUENCE || utype == V_ASN1_SET || | 480 | if (utype == V_ASN1_SEQUENCE || utype == V_ASN1_SET || |