blob: e33fdf71da65e2733fd9c7e3ed2607e2bf91f2dc [file] [log] [blame]
Paul Bakkerefc30292011-11-10 14:43:23 +00001/*
2 * Generic ASN.1 parsing
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Dave Rodgman16799db2023-11-02 19:47:20 +00005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Paul Bakkerefc30292011-11-10 14:43:23 +00006 */
7
Gilles Peskinedb09ef62020-06-03 01:43:33 +02008#include "common.h"
Paul Bakkerefc30292011-11-10 14:43:23 +00009
Valerio Setti688f7952024-01-16 09:18:40 +010010#if defined(MBEDTLS_ASN1_PARSE_C) || defined(MBEDTLS_X509_CREATE_C) || \
11 defined(MBEDTLS_PSA_UTIL_HAVE_ECDSA)
Paul Bakkerefc30292011-11-10 14:43:23 +000012
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000013#include "mbedtls/asn1.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050014#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000015#include "mbedtls/error.h"
Paul Bakkerefc30292011-11-10 14:43:23 +000016
Rich Evans00ab4702015-02-06 13:43:58 +000017#include <string.h>
18
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020019#if defined(MBEDTLS_BIGNUM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000020#include "mbedtls/bignum.h"
Paul Bakkerefc30292011-11-10 14:43:23 +000021#endif
22
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000023#include "mbedtls/platform.h"
Paul Bakker6e339b52013-07-03 13:37:05 +020024
Paul Bakkerefc30292011-11-10 14:43:23 +000025/*
26 * ASN.1 DER decoding routines
27 */
Gilles Peskine449bd832023-01-11 14:50:10 +010028int mbedtls_asn1_get_len(unsigned char **p,
29 const unsigned char *end,
30 size_t *len)
Paul Bakkerefc30292011-11-10 14:43:23 +000031{
Gilles Peskine449bd832023-01-11 14:50:10 +010032 if ((end - *p) < 1) {
33 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
34 }
Paul Bakkerefc30292011-11-10 14:43:23 +000035
Gilles Peskine449bd832023-01-11 14:50:10 +010036 if ((**p & 0x80) == 0) {
Paul Bakkerefc30292011-11-10 14:43:23 +000037 *len = *(*p)++;
Gilles Peskine449bd832023-01-11 14:50:10 +010038 } else {
Dave Rodgmanef6795d2023-09-12 14:42:46 +010039 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)++;
Paul Bakkerefc30292011-11-10 14:43:23 +000051 }
52 }
53
Gilles Peskine449bd832023-01-11 14:50:10 +010054 if (*len > (size_t) (end - *p)) {
55 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
56 }
Paul Bakkerefc30292011-11-10 14:43:23 +000057
Gilles Peskine449bd832023-01-11 14:50:10 +010058 return 0;
Paul Bakkerefc30292011-11-10 14:43:23 +000059}
60
Gilles Peskine449bd832023-01-11 14:50:10 +010061int mbedtls_asn1_get_tag(unsigned char **p,
62 const unsigned char *end,
63 size_t *len, int tag)
Paul Bakkerefc30292011-11-10 14:43:23 +000064{
Gilles Peskine449bd832023-01-11 14:50:10 +010065 if ((end - *p) < 1) {
66 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
67 }
Paul Bakkerefc30292011-11-10 14:43:23 +000068
Gilles Peskine449bd832023-01-11 14:50:10 +010069 if (**p != tag) {
70 return MBEDTLS_ERR_ASN1_UNEXPECTED_TAG;
71 }
Paul Bakkerefc30292011-11-10 14:43:23 +000072
73 (*p)++;
74
Gilles Peskine449bd832023-01-11 14:50:10 +010075 return mbedtls_asn1_get_len(p, end, len);
Paul Bakkerefc30292011-11-10 14:43:23 +000076}
Valerio Setti688f7952024-01-16 09:18:40 +010077#endif /* MBEDTLS_ASN1_PARSE_C || MBEDTLS_X509_CREATE_C || MBEDTLS_PSA_UTIL_HAVE_ECDSA */
Paul Bakkerefc30292011-11-10 14:43:23 +000078
Agathiyan Bragadeeshfca08612023-09-04 15:45:37 +010079#if defined(MBEDTLS_ASN1_PARSE_C)
Gilles Peskine449bd832023-01-11 14:50:10 +010080int mbedtls_asn1_get_bool(unsigned char **p,
81 const unsigned char *end,
82 int *val)
Paul Bakkerefc30292011-11-10 14:43:23 +000083{
Janos Follath24eed8d2019-11-22 13:21:35 +000084 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerefc30292011-11-10 14:43:23 +000085 size_t len;
86
Gilles Peskine449bd832023-01-11 14:50:10 +010087 if ((ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_BOOLEAN)) != 0) {
88 return ret;
89 }
Paul Bakkerefc30292011-11-10 14:43:23 +000090
Gilles Peskine449bd832023-01-11 14:50:10 +010091 if (len != 1) {
92 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
93 }
Paul Bakkerefc30292011-11-10 14:43:23 +000094
Gilles Peskine449bd832023-01-11 14:50:10 +010095 *val = (**p != 0) ? 1 : 0;
Paul Bakkerefc30292011-11-10 14:43:23 +000096 (*p)++;
97
Gilles Peskine449bd832023-01-11 14:50:10 +010098 return 0;
Paul Bakkerefc30292011-11-10 14:43:23 +000099}
100
Gilles Peskine449bd832023-01-11 14:50:10 +0100101static int asn1_get_tagged_int(unsigned char **p,
102 const unsigned char *end,
103 int tag, int *val)
Paul Bakkerefc30292011-11-10 14:43:23 +0000104{
Janos Follath24eed8d2019-11-22 13:21:35 +0000105 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerefc30292011-11-10 14:43:23 +0000106 size_t len;
107
Gilles Peskine449bd832023-01-11 14:50:10 +0100108 if ((ret = mbedtls_asn1_get_tag(p, end, &len, tag)) != 0) {
109 return ret;
110 }
Paul Bakkerefc30292011-11-10 14:43:23 +0000111
Mykhailo Sopiha20180ca2019-10-29 15:58:10 +0200112 /*
113 * len==0 is malformed (0 must be represented as 020100 for INTEGER,
114 * or 0A0100 for ENUMERATED tags
115 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100116 if (len == 0) {
117 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
118 }
Gilles Peskine9fd97942019-10-10 19:27:53 +0200119 /* This is a cryptography library. Reject negative integers. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100120 if ((**p & 0x80) != 0) {
121 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
122 }
Gilles Peskinef7d6acd2019-03-01 18:06:08 +0100123
Gilles Peskine9fd97942019-10-10 19:27:53 +0200124 /* Skip leading zeros. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100125 while (len > 0 && **p == 0) {
126 ++(*p);
Gilles Peskinef7d6acd2019-03-01 18:06:08 +0100127 --len;
128 }
Gilles Peskine9fd97942019-10-10 19:27:53 +0200129
130 /* Reject integers that don't fit in an int. This code assumes that
131 * the int type has no padding bit. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100132 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 }
Paul Bakkerefc30292011-11-10 14:43:23 +0000138
139 *val = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100140 while (len-- > 0) {
141 *val = (*val << 8) | **p;
Paul Bakkerefc30292011-11-10 14:43:23 +0000142 (*p)++;
143 }
144
Gilles Peskine449bd832023-01-11 14:50:10 +0100145 return 0;
Paul Bakkerefc30292011-11-10 14:43:23 +0000146}
147
Gilles Peskine449bd832023-01-11 14:50:10 +0100148int 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,
Mykhailo Sopiha20180ca2019-10-29 15:58:10 +0200156 const unsigned char *end,
Gilles Peskine449bd832023-01-11 14:50:10 +0100157 int *val)
Mykhailo Sopiha20180ca2019-10-29 15:58:10 +0200158{
Gilles Peskine449bd832023-01-11 14:50:10 +0100159 return asn1_get_tagged_int(p, end, MBEDTLS_ASN1_ENUMERATED, val);
Mykhailo Sopiha20180ca2019-10-29 15:58:10 +0200160}
161
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200162#if defined(MBEDTLS_BIGNUM_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100163int mbedtls_asn1_get_mpi(unsigned char **p,
164 const unsigned char *end,
165 mbedtls_mpi *X)
Paul Bakkerefc30292011-11-10 14:43:23 +0000166{
Janos Follath24eed8d2019-11-22 13:21:35 +0000167 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerefc30292011-11-10 14:43:23 +0000168 size_t len;
169
Gilles Peskine449bd832023-01-11 14:50:10 +0100170 if ((ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_INTEGER)) != 0) {
171 return ret;
172 }
Paul Bakkerefc30292011-11-10 14:43:23 +0000173
Gilles Peskine449bd832023-01-11 14:50:10 +0100174 ret = mbedtls_mpi_read_binary(X, *p, len);
Paul Bakkerefc30292011-11-10 14:43:23 +0000175
176 *p += len;
177
Gilles Peskine449bd832023-01-11 14:50:10 +0100178 return ret;
Paul Bakkerefc30292011-11-10 14:43:23 +0000179}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200180#endif /* MBEDTLS_BIGNUM_C */
Paul Bakkerefc30292011-11-10 14:43:23 +0000181
Gilles Peskine449bd832023-01-11 14:50:10 +0100182int mbedtls_asn1_get_bitstring(unsigned char **p, const unsigned char *end,
183 mbedtls_asn1_bitstring *bs)
Paul Bakkerefc30292011-11-10 14:43:23 +0000184{
Janos Follath24eed8d2019-11-22 13:21:35 +0000185 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerefc30292011-11-10 14:43:23 +0000186
187 /* Certificate type is a single byte bitstring */
Gilles Peskine449bd832023-01-11 14:50:10 +0100188 if ((ret = mbedtls_asn1_get_tag(p, end, &bs->len, MBEDTLS_ASN1_BIT_STRING)) != 0) {
189 return ret;
190 }
Paul Bakkerefc30292011-11-10 14:43:23 +0000191
192 /* Check length, subtract one for actual bit string length */
Gilles Peskine449bd832023-01-11 14:50:10 +0100193 if (bs->len < 1) {
194 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
195 }
Paul Bakkerefc30292011-11-10 14:43:23 +0000196 bs->len -= 1;
197
198 /* Get number of unused bits, ensure unused bits <= 7 */
199 bs->unused_bits = **p;
Gilles Peskine449bd832023-01-11 14:50:10 +0100200 if (bs->unused_bits > 7) {
201 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
202 }
Paul Bakkerefc30292011-11-10 14:43:23 +0000203 (*p)++;
204
205 /* Get actual bitstring */
206 bs->p = *p;
207 *p += bs->len;
208
Gilles Peskine449bd832023-01-11 14:50:10 +0100209 if (*p != end) {
210 return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
211 }
Paul Bakkerefc30292011-11-10 14:43:23 +0000212
Gilles Peskine449bd832023-01-11 14:50:10 +0100213 return 0;
Paul Bakkerefc30292011-11-10 14:43:23 +0000214}
215
Manuel Pégourié-Gonnarda2d4e642013-07-11 13:59:02 +0200216/*
Hanno Becker199b7092019-09-11 14:21:26 +0100217 * 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,
Hanno Becker34aada22020-02-03 10:39:55 +0000223 unsigned char tag_must_mask, unsigned char tag_must_val,
224 unsigned char tag_may_mask, unsigned char tag_may_val,
Gilles Peskine449bd832023-01-11 14:50:10 +0100225 int (*cb)(void *ctx, int tag,
226 unsigned char *start, size_t len),
227 void *ctx)
Hanno Becker199b7092019-09-11 14:21:26 +0100228{
229 int ret;
230 size_t len;
231
232 /* Get main sequence tag */
Gilles Peskine449bd832023-01-11 14:50:10 +0100233 if ((ret = mbedtls_asn1_get_tag(p, end, &len,
234 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
235 return ret;
Hanno Becker199b7092019-09-11 14:21:26 +0100236 }
237
Gilles Peskine449bd832023-01-11 14:50:10 +0100238 if (*p + len != end) {
239 return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
240 }
Hanno Becker199b7092019-09-11 14:21:26 +0100241
Gilles Peskine449bd832023-01-11 14:50:10 +0100242 while (*p < end) {
Hanno Becker199b7092019-09-11 14:21:26 +0100243 unsigned char const tag = *(*p)++;
244
Gilles Peskine449bd832023-01-11 14:50:10 +0100245 if ((tag & tag_must_mask) != tag_must_val) {
246 return MBEDTLS_ERR_ASN1_UNEXPECTED_TAG;
247 }
Hanno Becker199b7092019-09-11 14:21:26 +0100248
Gilles Peskine449bd832023-01-11 14:50:10 +0100249 if ((ret = mbedtls_asn1_get_len(p, end, &len)) != 0) {
250 return ret;
251 }
Hanno Becker199b7092019-09-11 14:21:26 +0100252
Gilles Peskine449bd832023-01-11 14:50:10 +0100253 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 }
Hanno Becker199b7092019-09-11 14:21:26 +0100259 }
260 }
261
262 *p += len;
263 }
264
Gilles Peskine449bd832023-01-11 14:50:10 +0100265 return 0;
Hanno Becker199b7092019-09-11 14:21:26 +0100266}
267
268/*
Manuel Pégourié-Gonnarda2d4e642013-07-11 13:59:02 +0200269 * Get a bit string without unused bits
270 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100271int mbedtls_asn1_get_bitstring_null(unsigned char **p, const unsigned char *end,
272 size_t *len)
Manuel Pégourié-Gonnarda2d4e642013-07-11 13:59:02 +0200273{
Janos Follath24eed8d2019-11-22 13:21:35 +0000274 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnarda2d4e642013-07-11 13:59:02 +0200275
Gilles Peskine449bd832023-01-11 14:50:10 +0100276 if ((ret = mbedtls_asn1_get_tag(p, end, len, MBEDTLS_ASN1_BIT_STRING)) != 0) {
277 return ret;
278 }
Manuel Pégourié-Gonnarda2d4e642013-07-11 13:59:02 +0200279
Gilles Peskine449bd832023-01-11 14:50:10 +0100280 if (*len == 0) {
281 return MBEDTLS_ERR_ASN1_INVALID_DATA;
282 }
283 --(*len);
Gilles Peskinee40d1202019-03-01 18:08:35 +0100284
Gilles Peskine449bd832023-01-11 14:50:10 +0100285 if (**p != 0) {
286 return MBEDTLS_ERR_ASN1_INVALID_DATA;
287 }
288 ++(*p);
Manuel Pégourié-Gonnarda2d4e642013-07-11 13:59:02 +0200289
Gilles Peskine449bd832023-01-11 14:50:10 +0100290 return 0;
Manuel Pégourié-Gonnarda2d4e642013-07-11 13:59:02 +0200291}
292
Gilles Peskine449bd832023-01-11 14:50:10 +0100293void mbedtls_asn1_sequence_free(mbedtls_asn1_sequence *seq)
Hanno Becker12ae27d2019-09-11 14:20:09 +0100294{
Gilles Peskine449bd832023-01-11 14:50:10 +0100295 while (seq != NULL) {
Hanno Becker12ae27d2019-09-11 14:20:09 +0100296 mbedtls_asn1_sequence *next = seq->next;
Gilles Peskine449bd832023-01-11 14:50:10 +0100297 mbedtls_free(seq);
Hanno Becker12ae27d2019-09-11 14:20:09 +0100298 seq = next;
299 }
300}
Paul Bakkerefc30292011-11-10 14:43:23 +0000301
Gilles Peskine449bd832023-01-11 14:50:10 +0100302typedef struct {
Hanno Becker1505f632019-09-11 14:25:26 +0100303 int tag;
304 mbedtls_asn1_sequence *cur;
305} asn1_get_sequence_of_cb_ctx_t;
306
Gilles Peskine449bd832023-01-11 14:50:10 +0100307static int asn1_get_sequence_of_cb(void *ctx,
308 int tag,
309 unsigned char *start,
310 size_t len)
Hanno Becker1505f632019-09-11 14:25:26 +0100311{
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
Gilles Peskine449bd832023-01-11 14:50:10 +0100317 if (cur->buf.p != NULL) {
Hanno Becker1505f632019-09-11 14:25:26 +0100318 cur->next =
Gilles Peskine449bd832023-01-11 14:50:10 +0100319 mbedtls_calloc(1, sizeof(mbedtls_asn1_sequence));
Hanno Becker1505f632019-09-11 14:25:26 +0100320
Gilles Peskine449bd832023-01-11 14:50:10 +0100321 if (cur->next == NULL) {
322 return MBEDTLS_ERR_ASN1_ALLOC_FAILED;
323 }
Hanno Becker1505f632019-09-11 14:25:26 +0100324
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;
Gilles Peskine449bd832023-01-11 14:50:10 +0100333 return 0;
Hanno Becker1505f632019-09-11 14:25:26 +0100334}
335
Paul Bakkerefc30292011-11-10 14:43:23 +0000336/*
337 * Parses and splits an ASN.1 "SEQUENCE OF <tag>"
338 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100339int mbedtls_asn1_get_sequence_of(unsigned char **p,
340 const unsigned char *end,
341 mbedtls_asn1_sequence *cur,
342 int tag)
Paul Bakkerefc30292011-11-10 14:43:23 +0000343{
Hanno Becker1505f632019-09-11 14:25:26 +0100344 asn1_get_sequence_of_cb_ctx_t cb_ctx = { tag, cur };
Gilles Peskine449bd832023-01-11 14:50:10 +0100345 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);
Paul Bakkerefc30292011-11-10 14:43:23 +0000349}
350
Gilles Peskine449bd832023-01-11 14:50:10 +0100351int mbedtls_asn1_get_alg(unsigned char **p,
352 const unsigned char *end,
353 mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params)
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200354{
Janos Follath24eed8d2019-11-22 13:21:35 +0000355 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200356 size_t len;
357
Gilles Peskine449bd832023-01-11 14:50:10 +0100358 if ((ret = mbedtls_asn1_get_tag(p, end, &len,
359 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
360 return ret;
361 }
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200362
Gilles Peskine449bd832023-01-11 14:50:10 +0100363 if ((end - *p) < 1) {
364 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
365 }
Manuel Pégourié-Gonnardba77bbf2013-08-15 13:38:13 +0200366
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200367 alg->tag = **p;
Manuel Pégourié-Gonnardba77bbf2013-08-15 13:38:13 +0200368 end = *p + len;
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200369
Gilles Peskine449bd832023-01-11 14:50:10 +0100370 if ((ret = mbedtls_asn1_get_tag(p, end, &alg->len, MBEDTLS_ASN1_OID)) != 0) {
371 return ret;
372 }
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200373
374 alg->p = *p;
375 *p += alg->len;
376
Gilles Peskine449bd832023-01-11 14:50:10 +0100377 if (*p == end) {
378 mbedtls_platform_zeroize(params, sizeof(mbedtls_asn1_buf));
379 return 0;
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200380 }
381
382 params->tag = **p;
383 (*p)++;
384
Gilles Peskine449bd832023-01-11 14:50:10 +0100385 if ((ret = mbedtls_asn1_get_len(p, end, &params->len)) != 0) {
386 return ret;
387 }
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200388
389 params->p = *p;
390 *p += params->len;
391
Gilles Peskine449bd832023-01-11 14:50:10 +0100392 if (*p != end) {
393 return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
394 }
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200395
Gilles Peskine449bd832023-01-11 14:50:10 +0100396 return 0;
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200397}
398
Gilles Peskine449bd832023-01-11 14:50:10 +0100399int mbedtls_asn1_get_alg_null(unsigned char **p,
400 const unsigned char *end,
401 mbedtls_asn1_buf *alg)
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200402{
Janos Follath24eed8d2019-11-22 13:21:35 +0000403 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200404 mbedtls_asn1_buf params;
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200405
Gilles Peskine449bd832023-01-11 14:50:10 +0100406 memset(&params, 0, sizeof(mbedtls_asn1_buf));
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200407
Gilles Peskine449bd832023-01-11 14:50:10 +0100408 if ((ret = mbedtls_asn1_get_alg(p, end, alg, &params)) != 0) {
409 return ret;
410 }
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200411
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 if ((params.tag != MBEDTLS_ASN1_NULL && params.tag != 0) || params.len != 0) {
413 return MBEDTLS_ERR_ASN1_INVALID_DATA;
414 }
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200415
Gilles Peskine449bd832023-01-11 14:50:10 +0100416 return 0;
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200417}
418
Glenn Strauss82ba2742022-11-04 04:01:23 -0400419#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100420void mbedtls_asn1_free_named_data(mbedtls_asn1_named_data *cur)
Paul Bakkere5eae762013-08-26 12:05:14 +0200421{
Gilles Peskine449bd832023-01-11 14:50:10 +0100422 if (cur == NULL) {
Paul Bakkere5eae762013-08-26 12:05:14 +0200423 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100424 }
Paul Bakkere5eae762013-08-26 12:05:14 +0200425
Gilles Peskine449bd832023-01-11 14:50:10 +0100426 mbedtls_free(cur->oid.p);
427 mbedtls_free(cur->val.p);
Paul Bakkere5eae762013-08-26 12:05:14 +0200428
Gilles Peskine449bd832023-01-11 14:50:10 +0100429 mbedtls_platform_zeroize(cur, sizeof(mbedtls_asn1_named_data));
Paul Bakkere5eae762013-08-26 12:05:14 +0200430}
Glenn Strauss82ba2742022-11-04 04:01:23 -0400431#endif /* MBEDTLS_DEPRECATED_REMOVED */
Paul Bakkere5eae762013-08-26 12:05:14 +0200432
Gilles Peskine449bd832023-01-11 14:50:10 +0100433void mbedtls_asn1_free_named_data_list(mbedtls_asn1_named_data **head)
Paul Bakkerc547cc92013-09-09 12:01:23 +0200434{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200435 mbedtls_asn1_named_data *cur;
Paul Bakkerc547cc92013-09-09 12:01:23 +0200436
Gilles Peskine449bd832023-01-11 14:50:10 +0100437 while ((cur = *head) != NULL) {
Paul Bakkerc547cc92013-09-09 12:01:23 +0200438 *head = cur->next;
Gilles Peskine449bd832023-01-11 14:50:10 +0100439 mbedtls_free(cur->oid.p);
440 mbedtls_free(cur->val.p);
441 mbedtls_free(cur);
Paul Bakkerc547cc92013-09-09 12:01:23 +0200442 }
443}
444
Gilles Peskine449bd832023-01-11 14:50:10 +0100445void mbedtls_asn1_free_named_data_list_shallow(mbedtls_asn1_named_data *name)
Glenn Straussa4b40412022-06-26 19:32:09 -0400446{
Gilles Peskine449bd832023-01-11 14:50:10 +0100447 for (mbedtls_asn1_named_data *next; name != NULL; name = next) {
Glenn Straussa4b40412022-06-26 19:32:09 -0400448 next = name->next;
Gilles Peskine449bd832023-01-11 14:50:10 +0100449 mbedtls_free(name);
Glenn Straussa4b40412022-06-26 19:32:09 -0400450 }
451}
452
Gilles Peskine449bd832023-01-11 14:50:10 +0100453const mbedtls_asn1_named_data *mbedtls_asn1_find_named_data(const mbedtls_asn1_named_data *list,
454 const char *oid, size_t len)
Paul Bakkere5eae762013-08-26 12:05:14 +0200455{
Gilles Peskine449bd832023-01-11 14:50:10 +0100456 while (list != NULL) {
457 if (list->oid.len == len &&
458 memcmp(list->oid.p, oid, len) == 0) {
Paul Bakkere5eae762013-08-26 12:05:14 +0200459 break;
460 }
461
462 list = list->next;
463 }
464
Gilles Peskine449bd832023-01-11 14:50:10 +0100465 return list;
Paul Bakkere5eae762013-08-26 12:05:14 +0200466}
467
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200468#endif /* MBEDTLS_ASN1_PARSE_C */