blob: e33fdf71da65e2733fd9c7e3ed2607e2bf91f2dc [file] [log] [blame]
Jens Wiklander817466c2018-05-22 13:49:31 +02001/*
2 * Generic ASN.1 parsing
3 *
Jerome Forissier79013242021-07-28 10:24:04 +02004 * Copyright The Mbed TLS Contributors
Tom Van Eyckc1633172024-04-09 18:44:13 +02005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Jens Wiklander817466c2018-05-22 13:49:31 +02006 */
7
Jerome Forissier79013242021-07-28 10:24:04 +02008#include "common.h"
Jens Wiklander817466c2018-05-22 13:49:31 +02009
Tom Van Eyckc1633172024-04-09 18:44:13 +020010#if defined(MBEDTLS_ASN1_PARSE_C) || defined(MBEDTLS_X509_CREATE_C) || \
11 defined(MBEDTLS_PSA_UTIL_HAVE_ECDSA)
Jens Wiklander817466c2018-05-22 13:49:31 +020012
13#include "mbedtls/asn1.h"
Jens Wiklander3d3b0592019-03-20 15:30:29 +010014#include "mbedtls/platform_util.h"
Jerome Forissier11fa71b2020-04-20 17:17:56 +020015#include "mbedtls/error.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020016
17#include <string.h>
18
19#if defined(MBEDTLS_BIGNUM_C)
20#include "mbedtls/bignum.h"
21#endif
22
Jens Wiklander817466c2018-05-22 13:49:31 +020023#include "mbedtls/platform.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020024
Jens Wiklander817466c2018-05-22 13:49:31 +020025/*
26 * ASN.1 DER decoding routines
27 */
Jens Wiklander32b31802023-10-06 16:59:46 +020028int mbedtls_asn1_get_len(unsigned char **p,
29 const unsigned char *end,
30 size_t *len)
Jens Wiklander817466c2018-05-22 13:49:31 +020031{
Jens Wiklander32b31802023-10-06 16:59:46 +020032 if ((end - *p) < 1) {
33 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
34 }
Jens Wiklander817466c2018-05-22 13:49:31 +020035
Jens Wiklander32b31802023-10-06 16:59:46 +020036 if ((**p & 0x80) == 0) {
Jens Wiklander817466c2018-05-22 13:49:31 +020037 *len = *(*p)++;
Jens Wiklander32b31802023-10-06 16:59:46 +020038 } else {
Tom Van Eyckc1633172024-04-09 18:44:13 +020039 int n = (**p) & 0x7F;
40 if (n == 0 || n > 4) {
41 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
42 }
43 if ((end - *p) <= n) {
44 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
45 }
46 *len = 0;
47 (*p)++;
48 while (n--) {
49 *len = (*len << 8) | **p;
50 (*p)++;
Jens Wiklander817466c2018-05-22 13:49:31 +020051 }
52 }
53
Jens Wiklander32b31802023-10-06 16:59:46 +020054 if (*len > (size_t) (end - *p)) {
55 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
56 }
Jens Wiklander817466c2018-05-22 13:49:31 +020057
Jens Wiklander32b31802023-10-06 16:59:46 +020058 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +020059}
60
Jens Wiklander32b31802023-10-06 16:59:46 +020061int mbedtls_asn1_get_tag(unsigned char **p,
62 const unsigned char *end,
63 size_t *len, int tag)
Jens Wiklander817466c2018-05-22 13:49:31 +020064{
Jens Wiklander32b31802023-10-06 16:59:46 +020065 if ((end - *p) < 1) {
66 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
67 }
Jens Wiklander817466c2018-05-22 13:49:31 +020068
Jens Wiklander32b31802023-10-06 16:59:46 +020069 if (**p != tag) {
70 return MBEDTLS_ERR_ASN1_UNEXPECTED_TAG;
71 }
Jens Wiklander817466c2018-05-22 13:49:31 +020072
73 (*p)++;
74
Jens Wiklander32b31802023-10-06 16:59:46 +020075 return mbedtls_asn1_get_len(p, end, len);
Jens Wiklander817466c2018-05-22 13:49:31 +020076}
Tom Van Eyckc1633172024-04-09 18:44:13 +020077#endif /* MBEDTLS_ASN1_PARSE_C || MBEDTLS_X509_CREATE_C || MBEDTLS_PSA_UTIL_HAVE_ECDSA */
Jens Wiklander817466c2018-05-22 13:49:31 +020078
Tom Van Eyckc1633172024-04-09 18:44:13 +020079#if defined(MBEDTLS_ASN1_PARSE_C)
Jens Wiklander32b31802023-10-06 16:59:46 +020080int mbedtls_asn1_get_bool(unsigned char **p,
81 const unsigned char *end,
82 int *val)
Jens Wiklander817466c2018-05-22 13:49:31 +020083{
Jerome Forissier11fa71b2020-04-20 17:17:56 +020084 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +020085 size_t len;
86
Jens Wiklander32b31802023-10-06 16:59:46 +020087 if ((ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_BOOLEAN)) != 0) {
88 return ret;
89 }
Jens Wiklander817466c2018-05-22 13:49:31 +020090
Jens Wiklander32b31802023-10-06 16:59:46 +020091 if (len != 1) {
92 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
93 }
Jens Wiklander817466c2018-05-22 13:49:31 +020094
Jens Wiklander32b31802023-10-06 16:59:46 +020095 *val = (**p != 0) ? 1 : 0;
Jens Wiklander817466c2018-05-22 13:49:31 +020096 (*p)++;
97
Jens Wiklander32b31802023-10-06 16:59:46 +020098 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +020099}
100
Jens Wiklander32b31802023-10-06 16:59:46 +0200101static int asn1_get_tagged_int(unsigned char **p,
102 const unsigned char *end,
103 int tag, int *val)
Jens Wiklander817466c2018-05-22 13:49:31 +0200104{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200105 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200106 size_t len;
107
Jens Wiklander32b31802023-10-06 16:59:46 +0200108 if ((ret = mbedtls_asn1_get_tag(p, end, &len, tag)) != 0) {
109 return ret;
110 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200111
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200112 /*
113 * len==0 is malformed (0 must be represented as 020100 for INTEGER,
114 * or 0A0100 for ENUMERATED tags
115 */
Jens Wiklander32b31802023-10-06 16:59:46 +0200116 if (len == 0) {
117 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
118 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200119 /* This is a cryptography library. Reject negative integers. */
Jens Wiklander32b31802023-10-06 16:59:46 +0200120 if ((**p & 0x80) != 0) {
121 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
122 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200123
124 /* Skip leading zeros. */
Jens Wiklander32b31802023-10-06 16:59:46 +0200125 while (len > 0 && **p == 0) {
126 ++(*p);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200127 --len;
128 }
129
130 /* Reject integers that don't fit in an int. This code assumes that
131 * the int type has no padding bit. */
Jens Wiklander32b31802023-10-06 16:59:46 +0200132 if (len > sizeof(int)) {
133 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
134 }
135 if (len == sizeof(int) && (**p & 0x80) != 0) {
136 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
137 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200138
139 *val = 0;
Jens Wiklander32b31802023-10-06 16:59:46 +0200140 while (len-- > 0) {
141 *val = (*val << 8) | **p;
Jens Wiklander817466c2018-05-22 13:49:31 +0200142 (*p)++;
143 }
144
Jens Wiklander32b31802023-10-06 16:59:46 +0200145 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200146}
147
Jens Wiklander32b31802023-10-06 16:59:46 +0200148int mbedtls_asn1_get_int(unsigned char **p,
149 const unsigned char *end,
150 int *val)
151{
152 return asn1_get_tagged_int(p, end, MBEDTLS_ASN1_INTEGER, val);
153}
154
155int mbedtls_asn1_get_enum(unsigned char **p,
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200156 const unsigned char *end,
Jens Wiklander32b31802023-10-06 16:59:46 +0200157 int *val)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200158{
Jens Wiklander32b31802023-10-06 16:59:46 +0200159 return asn1_get_tagged_int(p, end, MBEDTLS_ASN1_ENUMERATED, val);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200160}
161
Jens Wiklander817466c2018-05-22 13:49:31 +0200162#if defined(MBEDTLS_BIGNUM_C)
Jens Wiklander32b31802023-10-06 16:59:46 +0200163int mbedtls_asn1_get_mpi(unsigned char **p,
164 const unsigned char *end,
165 mbedtls_mpi *X)
Jens Wiklander817466c2018-05-22 13:49:31 +0200166{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200167 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200168 size_t len;
169
Jens Wiklander32b31802023-10-06 16:59:46 +0200170 if ((ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_INTEGER)) != 0) {
171 return ret;
172 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200173
Jens Wiklander32b31802023-10-06 16:59:46 +0200174 ret = mbedtls_mpi_read_binary(X, *p, len);
Jens Wiklander817466c2018-05-22 13:49:31 +0200175
176 *p += len;
177
Jens Wiklander32b31802023-10-06 16:59:46 +0200178 return ret;
Jens Wiklander817466c2018-05-22 13:49:31 +0200179}
180#endif /* MBEDTLS_BIGNUM_C */
181
Jens Wiklander32b31802023-10-06 16:59:46 +0200182int mbedtls_asn1_get_bitstring(unsigned char **p, const unsigned char *end,
183 mbedtls_asn1_bitstring *bs)
Jens Wiklander817466c2018-05-22 13:49:31 +0200184{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200185 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200186
187 /* Certificate type is a single byte bitstring */
Jens Wiklander32b31802023-10-06 16:59:46 +0200188 if ((ret = mbedtls_asn1_get_tag(p, end, &bs->len, MBEDTLS_ASN1_BIT_STRING)) != 0) {
189 return ret;
190 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200191
192 /* Check length, subtract one for actual bit string length */
Jens Wiklander32b31802023-10-06 16:59:46 +0200193 if (bs->len < 1) {
194 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
195 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200196 bs->len -= 1;
197
198 /* Get number of unused bits, ensure unused bits <= 7 */
199 bs->unused_bits = **p;
Jens Wiklander32b31802023-10-06 16:59:46 +0200200 if (bs->unused_bits > 7) {
201 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
202 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200203 (*p)++;
204
205 /* Get actual bitstring */
206 bs->p = *p;
207 *p += bs->len;
208
Jens Wiklander32b31802023-10-06 16:59:46 +0200209 if (*p != end) {
210 return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
211 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200212
Jens Wiklander32b31802023-10-06 16:59:46 +0200213 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200214}
215
216/*
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200217 * Traverse an ASN.1 "SEQUENCE OF <tag>"
218 * and call a callback for each entry found.
219 */
220int mbedtls_asn1_traverse_sequence_of(
221 unsigned char **p,
222 const unsigned char *end,
223 unsigned char tag_must_mask, unsigned char tag_must_val,
224 unsigned char tag_may_mask, unsigned char tag_may_val,
Jens Wiklander32b31802023-10-06 16:59:46 +0200225 int (*cb)(void *ctx, int tag,
226 unsigned char *start, size_t len),
227 void *ctx)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200228{
229 int ret;
230 size_t len;
231
232 /* Get main sequence tag */
Jens Wiklander32b31802023-10-06 16:59:46 +0200233 if ((ret = mbedtls_asn1_get_tag(p, end, &len,
234 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
235 return ret;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200236 }
237
Jens Wiklander32b31802023-10-06 16:59:46 +0200238 if (*p + len != end) {
239 return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
240 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200241
Jens Wiklander32b31802023-10-06 16:59:46 +0200242 while (*p < end) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200243 unsigned char const tag = *(*p)++;
244
Jens Wiklander32b31802023-10-06 16:59:46 +0200245 if ((tag & tag_must_mask) != tag_must_val) {
246 return MBEDTLS_ERR_ASN1_UNEXPECTED_TAG;
247 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200248
Jens Wiklander32b31802023-10-06 16:59:46 +0200249 if ((ret = mbedtls_asn1_get_len(p, end, &len)) != 0) {
250 return ret;
251 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200252
Jens Wiklander32b31802023-10-06 16:59:46 +0200253 if ((tag & tag_may_mask) == tag_may_val) {
254 if (cb != NULL) {
255 ret = cb(ctx, tag, *p, len);
256 if (ret != 0) {
257 return ret;
258 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200259 }
260 }
261
262 *p += len;
263 }
264
Jens Wiklander32b31802023-10-06 16:59:46 +0200265 return 0;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200266}
267
268/*
Jens Wiklander817466c2018-05-22 13:49:31 +0200269 * Get a bit string without unused bits
270 */
Jens Wiklander32b31802023-10-06 16:59:46 +0200271int mbedtls_asn1_get_bitstring_null(unsigned char **p, const unsigned char *end,
272 size_t *len)
Jens Wiklander817466c2018-05-22 13:49:31 +0200273{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200274 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200275
Jens Wiklander32b31802023-10-06 16:59:46 +0200276 if ((ret = mbedtls_asn1_get_tag(p, end, len, MBEDTLS_ASN1_BIT_STRING)) != 0) {
277 return ret;
278 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200279
Jens Wiklander32b31802023-10-06 16:59:46 +0200280 if (*len == 0) {
281 return MBEDTLS_ERR_ASN1_INVALID_DATA;
282 }
283 --(*len);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200284
Jens Wiklander32b31802023-10-06 16:59:46 +0200285 if (**p != 0) {
286 return MBEDTLS_ERR_ASN1_INVALID_DATA;
287 }
288 ++(*p);
Jens Wiklander817466c2018-05-22 13:49:31 +0200289
Jens Wiklander32b31802023-10-06 16:59:46 +0200290 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200291}
292
Jens Wiklander32b31802023-10-06 16:59:46 +0200293void mbedtls_asn1_sequence_free(mbedtls_asn1_sequence *seq)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200294{
Jens Wiklander32b31802023-10-06 16:59:46 +0200295 while (seq != NULL) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200296 mbedtls_asn1_sequence *next = seq->next;
Jens Wiklander32b31802023-10-06 16:59:46 +0200297 mbedtls_free(seq);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200298 seq = next;
299 }
300}
Jens Wiklander817466c2018-05-22 13:49:31 +0200301
Jens Wiklander32b31802023-10-06 16:59:46 +0200302typedef struct {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200303 int tag;
304 mbedtls_asn1_sequence *cur;
305} asn1_get_sequence_of_cb_ctx_t;
306
Jens Wiklander32b31802023-10-06 16:59:46 +0200307static int asn1_get_sequence_of_cb(void *ctx,
308 int tag,
309 unsigned char *start,
310 size_t len)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200311{
312 asn1_get_sequence_of_cb_ctx_t *cb_ctx =
313 (asn1_get_sequence_of_cb_ctx_t *) ctx;
314 mbedtls_asn1_sequence *cur =
315 cb_ctx->cur;
316
Jens Wiklander32b31802023-10-06 16:59:46 +0200317 if (cur->buf.p != NULL) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200318 cur->next =
Jens Wiklander32b31802023-10-06 16:59:46 +0200319 mbedtls_calloc(1, sizeof(mbedtls_asn1_sequence));
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200320
Jens Wiklander32b31802023-10-06 16:59:46 +0200321 if (cur->next == NULL) {
322 return MBEDTLS_ERR_ASN1_ALLOC_FAILED;
323 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200324
325 cur = cur->next;
326 }
327
328 cur->buf.p = start;
329 cur->buf.len = len;
330 cur->buf.tag = tag;
331
332 cb_ctx->cur = cur;
Jens Wiklander32b31802023-10-06 16:59:46 +0200333 return 0;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200334}
Jens Wiklander817466c2018-05-22 13:49:31 +0200335
336/*
337 * Parses and splits an ASN.1 "SEQUENCE OF <tag>"
338 */
Jens Wiklander32b31802023-10-06 16:59:46 +0200339int mbedtls_asn1_get_sequence_of(unsigned char **p,
340 const unsigned char *end,
341 mbedtls_asn1_sequence *cur,
342 int tag)
Jens Wiklander817466c2018-05-22 13:49:31 +0200343{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200344 asn1_get_sequence_of_cb_ctx_t cb_ctx = { tag, cur };
Jens Wiklander32b31802023-10-06 16:59:46 +0200345 memset(cur, 0, sizeof(mbedtls_asn1_sequence));
346 return mbedtls_asn1_traverse_sequence_of(
347 p, end, 0xFF, tag, 0, 0,
348 asn1_get_sequence_of_cb, &cb_ctx);
Jens Wiklander817466c2018-05-22 13:49:31 +0200349}
350
Jens Wiklander32b31802023-10-06 16:59:46 +0200351int mbedtls_asn1_get_alg(unsigned char **p,
352 const unsigned char *end,
353 mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params)
Jens Wiklander817466c2018-05-22 13:49:31 +0200354{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200355 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200356 size_t len;
357
Jens Wiklander32b31802023-10-06 16:59:46 +0200358 if ((ret = mbedtls_asn1_get_tag(p, end, &len,
359 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
360 return ret;
361 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200362
Jens Wiklander32b31802023-10-06 16:59:46 +0200363 if ((end - *p) < 1) {
364 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
365 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200366
367 alg->tag = **p;
368 end = *p + len;
369
Jens Wiklander32b31802023-10-06 16:59:46 +0200370 if ((ret = mbedtls_asn1_get_tag(p, end, &alg->len, MBEDTLS_ASN1_OID)) != 0) {
371 return ret;
372 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200373
374 alg->p = *p;
375 *p += alg->len;
376
Jens Wiklander32b31802023-10-06 16:59:46 +0200377 if (*p == end) {
378 mbedtls_platform_zeroize(params, sizeof(mbedtls_asn1_buf));
379 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200380 }
381
382 params->tag = **p;
383 (*p)++;
384
Jens Wiklander32b31802023-10-06 16:59:46 +0200385 if ((ret = mbedtls_asn1_get_len(p, end, &params->len)) != 0) {
386 return ret;
387 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200388
389 params->p = *p;
390 *p += params->len;
391
Jens Wiklander32b31802023-10-06 16:59:46 +0200392 if (*p != end) {
393 return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
394 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200395
Jens Wiklander32b31802023-10-06 16:59:46 +0200396 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200397}
398
Jens Wiklander32b31802023-10-06 16:59:46 +0200399int mbedtls_asn1_get_alg_null(unsigned char **p,
400 const unsigned char *end,
401 mbedtls_asn1_buf *alg)
Jens Wiklander817466c2018-05-22 13:49:31 +0200402{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200403 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200404 mbedtls_asn1_buf params;
405
Jens Wiklander32b31802023-10-06 16:59:46 +0200406 memset(&params, 0, sizeof(mbedtls_asn1_buf));
Jens Wiklander817466c2018-05-22 13:49:31 +0200407
Jens Wiklander32b31802023-10-06 16:59:46 +0200408 if ((ret = mbedtls_asn1_get_alg(p, end, alg, &params)) != 0) {
409 return ret;
410 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200411
Jens Wiklander32b31802023-10-06 16:59:46 +0200412 if ((params.tag != MBEDTLS_ASN1_NULL && params.tag != 0) || params.len != 0) {
413 return MBEDTLS_ERR_ASN1_INVALID_DATA;
414 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200415
Jens Wiklander32b31802023-10-06 16:59:46 +0200416 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200417}
418
Jens Wiklander32b31802023-10-06 16:59:46 +0200419#if !defined(MBEDTLS_DEPRECATED_REMOVED)
420void mbedtls_asn1_free_named_data(mbedtls_asn1_named_data *cur)
Jens Wiklander817466c2018-05-22 13:49:31 +0200421{
Jens Wiklander32b31802023-10-06 16:59:46 +0200422 if (cur == NULL) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200423 return;
Jens Wiklander32b31802023-10-06 16:59:46 +0200424 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200425
Jens Wiklander32b31802023-10-06 16:59:46 +0200426 mbedtls_free(cur->oid.p);
427 mbedtls_free(cur->val.p);
Jens Wiklander817466c2018-05-22 13:49:31 +0200428
Jens Wiklander32b31802023-10-06 16:59:46 +0200429 mbedtls_platform_zeroize(cur, sizeof(mbedtls_asn1_named_data));
Jens Wiklander817466c2018-05-22 13:49:31 +0200430}
Jens Wiklander32b31802023-10-06 16:59:46 +0200431#endif /* MBEDTLS_DEPRECATED_REMOVED */
Jens Wiklander817466c2018-05-22 13:49:31 +0200432
Jens Wiklander32b31802023-10-06 16:59:46 +0200433void mbedtls_asn1_free_named_data_list(mbedtls_asn1_named_data **head)
Jens Wiklander817466c2018-05-22 13:49:31 +0200434{
435 mbedtls_asn1_named_data *cur;
436
Jens Wiklander32b31802023-10-06 16:59:46 +0200437 while ((cur = *head) != NULL) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200438 *head = cur->next;
Jens Wiklander32b31802023-10-06 16:59:46 +0200439 mbedtls_free(cur->oid.p);
440 mbedtls_free(cur->val.p);
441 mbedtls_free(cur);
Jens Wiklander817466c2018-05-22 13:49:31 +0200442 }
443}
444
Jens Wiklander32b31802023-10-06 16:59:46 +0200445void mbedtls_asn1_free_named_data_list_shallow(mbedtls_asn1_named_data *name)
Jens Wiklander817466c2018-05-22 13:49:31 +0200446{
Jens Wiklander32b31802023-10-06 16:59:46 +0200447 for (mbedtls_asn1_named_data *next; name != NULL; name = next) {
448 next = name->next;
449 mbedtls_free(name);
450 }
451}
452
453const mbedtls_asn1_named_data *mbedtls_asn1_find_named_data(const mbedtls_asn1_named_data *list,
454 const char *oid, size_t len)
455{
456 while (list != NULL) {
457 if (list->oid.len == len &&
458 memcmp(list->oid.p, oid, len) == 0) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200459 break;
460 }
461
462 list = list->next;
463 }
464
Jens Wiklander32b31802023-10-06 16:59:46 +0200465 return list;
Jens Wiklander817466c2018-05-22 13:49:31 +0200466}
467
468#endif /* MBEDTLS_ASN1_PARSE_C */