blob: d257ef43830d7a86586a458149bc2ee43b19365a [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
5 * SPDX-License-Identifier: Apache-2.0
Jens Wiklander817466c2018-05-22 13:49:31 +02006 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Jens Wiklander817466c2018-05-22 13:49:31 +020018 */
19
Jerome Forissier79013242021-07-28 10:24:04 +020020#include "common.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020021
22#if defined(MBEDTLS_ASN1_PARSE_C)
23
24#include "mbedtls/asn1.h"
Jens Wiklander3d3b0592019-03-20 15:30:29 +010025#include "mbedtls/platform_util.h"
Jerome Forissier11fa71b2020-04-20 17:17:56 +020026#include "mbedtls/error.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020027
28#include <string.h>
29
30#if defined(MBEDTLS_BIGNUM_C)
31#include "mbedtls/bignum.h"
32#endif
33
Jens Wiklander817466c2018-05-22 13:49:31 +020034#include "mbedtls/platform.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020035
Jens Wiklander817466c2018-05-22 13:49:31 +020036/*
37 * ASN.1 DER decoding routines
38 */
Jens Wiklander32b31802023-10-06 16:59:46 +020039int mbedtls_asn1_get_len(unsigned char **p,
40 const unsigned char *end,
41 size_t *len)
Jens Wiklander817466c2018-05-22 13:49:31 +020042{
Jens Wiklander32b31802023-10-06 16:59:46 +020043 if ((end - *p) < 1) {
44 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
45 }
Jens Wiklander817466c2018-05-22 13:49:31 +020046
Jens Wiklander32b31802023-10-06 16:59:46 +020047 if ((**p & 0x80) == 0) {
Jens Wiklander817466c2018-05-22 13:49:31 +020048 *len = *(*p)++;
Jens Wiklander32b31802023-10-06 16:59:46 +020049 } else {
50 switch (**p & 0x7F) {
51 case 1:
52 if ((end - *p) < 2) {
53 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
54 }
Jens Wiklander817466c2018-05-22 13:49:31 +020055
Jens Wiklander32b31802023-10-06 16:59:46 +020056 *len = (*p)[1];
57 (*p) += 2;
58 break;
Jens Wiklander817466c2018-05-22 13:49:31 +020059
Jens Wiklander32b31802023-10-06 16:59:46 +020060 case 2:
61 if ((end - *p) < 3) {
62 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
63 }
Jens Wiklander817466c2018-05-22 13:49:31 +020064
Jens Wiklander32b31802023-10-06 16:59:46 +020065 *len = ((size_t) (*p)[1] << 8) | (*p)[2];
66 (*p) += 3;
67 break;
Jens Wiklander817466c2018-05-22 13:49:31 +020068
Jens Wiklander32b31802023-10-06 16:59:46 +020069 case 3:
70 if ((end - *p) < 4) {
71 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
72 }
Jens Wiklander817466c2018-05-22 13:49:31 +020073
Jens Wiklander32b31802023-10-06 16:59:46 +020074 *len = ((size_t) (*p)[1] << 16) |
75 ((size_t) (*p)[2] << 8) | (*p)[3];
76 (*p) += 4;
77 break;
Jens Wiklander817466c2018-05-22 13:49:31 +020078
Jens Wiklander32b31802023-10-06 16:59:46 +020079 case 4:
80 if ((end - *p) < 5) {
81 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
82 }
Jens Wiklander817466c2018-05-22 13:49:31 +020083
Jens Wiklander32b31802023-10-06 16:59:46 +020084 *len = ((size_t) (*p)[1] << 24) | ((size_t) (*p)[2] << 16) |
85 ((size_t) (*p)[3] << 8) | (*p)[4];
86 (*p) += 5;
87 break;
Jens Wiklander817466c2018-05-22 13:49:31 +020088
Jens Wiklander32b31802023-10-06 16:59:46 +020089 default:
90 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
Jens Wiklander817466c2018-05-22 13:49:31 +020091 }
92 }
93
Jens Wiklander32b31802023-10-06 16:59:46 +020094 if (*len > (size_t) (end - *p)) {
95 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
96 }
Jens Wiklander817466c2018-05-22 13:49:31 +020097
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 +0200101int mbedtls_asn1_get_tag(unsigned char **p,
102 const unsigned char *end,
103 size_t *len, int tag)
Jens Wiklander817466c2018-05-22 13:49:31 +0200104{
Jens Wiklander32b31802023-10-06 16:59:46 +0200105 if ((end - *p) < 1) {
106 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
107 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200108
Jens Wiklander32b31802023-10-06 16:59:46 +0200109 if (**p != tag) {
110 return MBEDTLS_ERR_ASN1_UNEXPECTED_TAG;
111 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200112
113 (*p)++;
114
Jens Wiklander32b31802023-10-06 16:59:46 +0200115 return mbedtls_asn1_get_len(p, end, len);
Jens Wiklander817466c2018-05-22 13:49:31 +0200116}
117
Jens Wiklander32b31802023-10-06 16:59:46 +0200118int mbedtls_asn1_get_bool(unsigned char **p,
119 const unsigned char *end,
120 int *val)
Jens Wiklander817466c2018-05-22 13:49:31 +0200121{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200122 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200123 size_t len;
124
Jens Wiklander32b31802023-10-06 16:59:46 +0200125 if ((ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_BOOLEAN)) != 0) {
126 return ret;
127 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200128
Jens Wiklander32b31802023-10-06 16:59:46 +0200129 if (len != 1) {
130 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
131 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200132
Jens Wiklander32b31802023-10-06 16:59:46 +0200133 *val = (**p != 0) ? 1 : 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200134 (*p)++;
135
Jens Wiklander32b31802023-10-06 16:59:46 +0200136 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200137}
138
Jens Wiklander32b31802023-10-06 16:59:46 +0200139static int asn1_get_tagged_int(unsigned char **p,
140 const unsigned char *end,
141 int tag, int *val)
Jens Wiklander817466c2018-05-22 13:49:31 +0200142{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200143 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200144 size_t len;
145
Jens Wiklander32b31802023-10-06 16:59:46 +0200146 if ((ret = mbedtls_asn1_get_tag(p, end, &len, tag)) != 0) {
147 return ret;
148 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200149
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200150 /*
151 * len==0 is malformed (0 must be represented as 020100 for INTEGER,
152 * or 0A0100 for ENUMERATED tags
153 */
Jens Wiklander32b31802023-10-06 16:59:46 +0200154 if (len == 0) {
155 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
156 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200157 /* This is a cryptography library. Reject negative integers. */
Jens Wiklander32b31802023-10-06 16:59:46 +0200158 if ((**p & 0x80) != 0) {
159 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
160 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200161
162 /* Skip leading zeros. */
Jens Wiklander32b31802023-10-06 16:59:46 +0200163 while (len > 0 && **p == 0) {
164 ++(*p);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200165 --len;
166 }
167
168 /* Reject integers that don't fit in an int. This code assumes that
169 * the int type has no padding bit. */
Jens Wiklander32b31802023-10-06 16:59:46 +0200170 if (len > sizeof(int)) {
171 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
172 }
173 if (len == sizeof(int) && (**p & 0x80) != 0) {
174 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
175 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200176
177 *val = 0;
Jens Wiklander32b31802023-10-06 16:59:46 +0200178 while (len-- > 0) {
179 *val = (*val << 8) | **p;
Jens Wiklander817466c2018-05-22 13:49:31 +0200180 (*p)++;
181 }
182
Jens Wiklander32b31802023-10-06 16:59:46 +0200183 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200184}
185
Jens Wiklander32b31802023-10-06 16:59:46 +0200186int mbedtls_asn1_get_int(unsigned char **p,
187 const unsigned char *end,
188 int *val)
189{
190 return asn1_get_tagged_int(p, end, MBEDTLS_ASN1_INTEGER, val);
191}
192
193int mbedtls_asn1_get_enum(unsigned char **p,
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200194 const unsigned char *end,
Jens Wiklander32b31802023-10-06 16:59:46 +0200195 int *val)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200196{
Jens Wiklander32b31802023-10-06 16:59:46 +0200197 return asn1_get_tagged_int(p, end, MBEDTLS_ASN1_ENUMERATED, val);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200198}
199
Jens Wiklander817466c2018-05-22 13:49:31 +0200200#if defined(MBEDTLS_BIGNUM_C)
Jens Wiklander32b31802023-10-06 16:59:46 +0200201int mbedtls_asn1_get_mpi(unsigned char **p,
202 const unsigned char *end,
203 mbedtls_mpi *X)
Jens Wiklander817466c2018-05-22 13:49:31 +0200204{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200205 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200206 size_t len;
207
Jens Wiklander32b31802023-10-06 16:59:46 +0200208 if ((ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_INTEGER)) != 0) {
209 return ret;
210 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200211
Jens Wiklander32b31802023-10-06 16:59:46 +0200212 ret = mbedtls_mpi_read_binary(X, *p, len);
Jens Wiklander817466c2018-05-22 13:49:31 +0200213
214 *p += len;
215
Jens Wiklander32b31802023-10-06 16:59:46 +0200216 return ret;
Jens Wiklander817466c2018-05-22 13:49:31 +0200217}
218#endif /* MBEDTLS_BIGNUM_C */
219
Jens Wiklander32b31802023-10-06 16:59:46 +0200220int mbedtls_asn1_get_bitstring(unsigned char **p, const unsigned char *end,
221 mbedtls_asn1_bitstring *bs)
Jens Wiklander817466c2018-05-22 13:49:31 +0200222{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200223 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200224
225 /* Certificate type is a single byte bitstring */
Jens Wiklander32b31802023-10-06 16:59:46 +0200226 if ((ret = mbedtls_asn1_get_tag(p, end, &bs->len, MBEDTLS_ASN1_BIT_STRING)) != 0) {
227 return ret;
228 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200229
230 /* Check length, subtract one for actual bit string length */
Jens Wiklander32b31802023-10-06 16:59:46 +0200231 if (bs->len < 1) {
232 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
233 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200234 bs->len -= 1;
235
236 /* Get number of unused bits, ensure unused bits <= 7 */
237 bs->unused_bits = **p;
Jens Wiklander32b31802023-10-06 16:59:46 +0200238 if (bs->unused_bits > 7) {
239 return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
240 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200241 (*p)++;
242
243 /* Get actual bitstring */
244 bs->p = *p;
245 *p += bs->len;
246
Jens Wiklander32b31802023-10-06 16:59:46 +0200247 if (*p != end) {
248 return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
249 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200250
Jens Wiklander32b31802023-10-06 16:59:46 +0200251 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200252}
253
254/*
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200255 * Traverse an ASN.1 "SEQUENCE OF <tag>"
256 * and call a callback for each entry found.
257 */
258int mbedtls_asn1_traverse_sequence_of(
259 unsigned char **p,
260 const unsigned char *end,
261 unsigned char tag_must_mask, unsigned char tag_must_val,
262 unsigned char tag_may_mask, unsigned char tag_may_val,
Jens Wiklander32b31802023-10-06 16:59:46 +0200263 int (*cb)(void *ctx, int tag,
264 unsigned char *start, size_t len),
265 void *ctx)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200266{
267 int ret;
268 size_t len;
269
270 /* Get main sequence tag */
Jens Wiklander32b31802023-10-06 16:59:46 +0200271 if ((ret = mbedtls_asn1_get_tag(p, end, &len,
272 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
273 return ret;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200274 }
275
Jens Wiklander32b31802023-10-06 16:59:46 +0200276 if (*p + len != end) {
277 return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
278 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200279
Jens Wiklander32b31802023-10-06 16:59:46 +0200280 while (*p < end) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200281 unsigned char const tag = *(*p)++;
282
Jens Wiklander32b31802023-10-06 16:59:46 +0200283 if ((tag & tag_must_mask) != tag_must_val) {
284 return MBEDTLS_ERR_ASN1_UNEXPECTED_TAG;
285 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200286
Jens Wiklander32b31802023-10-06 16:59:46 +0200287 if ((ret = mbedtls_asn1_get_len(p, end, &len)) != 0) {
288 return ret;
289 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200290
Jens Wiklander32b31802023-10-06 16:59:46 +0200291 if ((tag & tag_may_mask) == tag_may_val) {
292 if (cb != NULL) {
293 ret = cb(ctx, tag, *p, len);
294 if (ret != 0) {
295 return ret;
296 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200297 }
298 }
299
300 *p += len;
301 }
302
Jens Wiklander32b31802023-10-06 16:59:46 +0200303 return 0;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200304}
305
306/*
Jens Wiklander817466c2018-05-22 13:49:31 +0200307 * Get a bit string without unused bits
308 */
Jens Wiklander32b31802023-10-06 16:59:46 +0200309int mbedtls_asn1_get_bitstring_null(unsigned char **p, const unsigned char *end,
310 size_t *len)
Jens Wiklander817466c2018-05-22 13:49:31 +0200311{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200312 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200313
Jens Wiklander32b31802023-10-06 16:59:46 +0200314 if ((ret = mbedtls_asn1_get_tag(p, end, len, MBEDTLS_ASN1_BIT_STRING)) != 0) {
315 return ret;
316 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200317
Jens Wiklander32b31802023-10-06 16:59:46 +0200318 if (*len == 0) {
319 return MBEDTLS_ERR_ASN1_INVALID_DATA;
320 }
321 --(*len);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200322
Jens Wiklander32b31802023-10-06 16:59:46 +0200323 if (**p != 0) {
324 return MBEDTLS_ERR_ASN1_INVALID_DATA;
325 }
326 ++(*p);
Jens Wiklander817466c2018-05-22 13:49:31 +0200327
Jens Wiklander32b31802023-10-06 16:59:46 +0200328 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200329}
330
Jens Wiklander32b31802023-10-06 16:59:46 +0200331void mbedtls_asn1_sequence_free(mbedtls_asn1_sequence *seq)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200332{
Jens Wiklander32b31802023-10-06 16:59:46 +0200333 while (seq != NULL) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200334 mbedtls_asn1_sequence *next = seq->next;
Jens Wiklander32b31802023-10-06 16:59:46 +0200335 mbedtls_free(seq);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200336 seq = next;
337 }
338}
Jens Wiklander817466c2018-05-22 13:49:31 +0200339
Jens Wiklander32b31802023-10-06 16:59:46 +0200340typedef struct {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200341 int tag;
342 mbedtls_asn1_sequence *cur;
343} asn1_get_sequence_of_cb_ctx_t;
344
Jens Wiklander32b31802023-10-06 16:59:46 +0200345static int asn1_get_sequence_of_cb(void *ctx,
346 int tag,
347 unsigned char *start,
348 size_t len)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200349{
350 asn1_get_sequence_of_cb_ctx_t *cb_ctx =
351 (asn1_get_sequence_of_cb_ctx_t *) ctx;
352 mbedtls_asn1_sequence *cur =
353 cb_ctx->cur;
354
Jens Wiklander32b31802023-10-06 16:59:46 +0200355 if (cur->buf.p != NULL) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200356 cur->next =
Jens Wiklander32b31802023-10-06 16:59:46 +0200357 mbedtls_calloc(1, sizeof(mbedtls_asn1_sequence));
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200358
Jens Wiklander32b31802023-10-06 16:59:46 +0200359 if (cur->next == NULL) {
360 return MBEDTLS_ERR_ASN1_ALLOC_FAILED;
361 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200362
363 cur = cur->next;
364 }
365
366 cur->buf.p = start;
367 cur->buf.len = len;
368 cur->buf.tag = tag;
369
370 cb_ctx->cur = cur;
Jens Wiklander32b31802023-10-06 16:59:46 +0200371 return 0;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200372}
Jens Wiklander817466c2018-05-22 13:49:31 +0200373
374/*
375 * Parses and splits an ASN.1 "SEQUENCE OF <tag>"
376 */
Jens Wiklander32b31802023-10-06 16:59:46 +0200377int mbedtls_asn1_get_sequence_of(unsigned char **p,
378 const unsigned char *end,
379 mbedtls_asn1_sequence *cur,
380 int tag)
Jens Wiklander817466c2018-05-22 13:49:31 +0200381{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200382 asn1_get_sequence_of_cb_ctx_t cb_ctx = { tag, cur };
Jens Wiklander32b31802023-10-06 16:59:46 +0200383 memset(cur, 0, sizeof(mbedtls_asn1_sequence));
384 return mbedtls_asn1_traverse_sequence_of(
385 p, end, 0xFF, tag, 0, 0,
386 asn1_get_sequence_of_cb, &cb_ctx);
Jens Wiklander817466c2018-05-22 13:49:31 +0200387}
388
Jens Wiklander32b31802023-10-06 16:59:46 +0200389int mbedtls_asn1_get_alg(unsigned char **p,
390 const unsigned char *end,
391 mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params)
Jens Wiklander817466c2018-05-22 13:49:31 +0200392{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200393 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200394 size_t len;
395
Jens Wiklander32b31802023-10-06 16:59:46 +0200396 if ((ret = mbedtls_asn1_get_tag(p, end, &len,
397 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
398 return ret;
399 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200400
Jens Wiklander32b31802023-10-06 16:59:46 +0200401 if ((end - *p) < 1) {
402 return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
403 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200404
405 alg->tag = **p;
406 end = *p + len;
407
Jens Wiklander32b31802023-10-06 16:59:46 +0200408 if ((ret = mbedtls_asn1_get_tag(p, end, &alg->len, MBEDTLS_ASN1_OID)) != 0) {
409 return ret;
410 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200411
412 alg->p = *p;
413 *p += alg->len;
414
Jens Wiklander32b31802023-10-06 16:59:46 +0200415 if (*p == end) {
416 mbedtls_platform_zeroize(params, sizeof(mbedtls_asn1_buf));
417 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200418 }
419
420 params->tag = **p;
421 (*p)++;
422
Jens Wiklander32b31802023-10-06 16:59:46 +0200423 if ((ret = mbedtls_asn1_get_len(p, end, &params->len)) != 0) {
424 return ret;
425 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200426
427 params->p = *p;
428 *p += params->len;
429
Jens Wiklander32b31802023-10-06 16:59:46 +0200430 if (*p != end) {
431 return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
432 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200433
Jens Wiklander32b31802023-10-06 16:59:46 +0200434 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200435}
436
Jens Wiklander32b31802023-10-06 16:59:46 +0200437int mbedtls_asn1_get_alg_null(unsigned char **p,
438 const unsigned char *end,
439 mbedtls_asn1_buf *alg)
Jens Wiklander817466c2018-05-22 13:49:31 +0200440{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200441 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200442 mbedtls_asn1_buf params;
443
Jens Wiklander32b31802023-10-06 16:59:46 +0200444 memset(&params, 0, sizeof(mbedtls_asn1_buf));
Jens Wiklander817466c2018-05-22 13:49:31 +0200445
Jens Wiklander32b31802023-10-06 16:59:46 +0200446 if ((ret = mbedtls_asn1_get_alg(p, end, alg, &params)) != 0) {
447 return ret;
448 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200449
Jens Wiklander32b31802023-10-06 16:59:46 +0200450 if ((params.tag != MBEDTLS_ASN1_NULL && params.tag != 0) || params.len != 0) {
451 return MBEDTLS_ERR_ASN1_INVALID_DATA;
452 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200453
Jens Wiklander32b31802023-10-06 16:59:46 +0200454 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200455}
456
Jens Wiklander32b31802023-10-06 16:59:46 +0200457#if !defined(MBEDTLS_DEPRECATED_REMOVED)
458void mbedtls_asn1_free_named_data(mbedtls_asn1_named_data *cur)
Jens Wiklander817466c2018-05-22 13:49:31 +0200459{
Jens Wiklander32b31802023-10-06 16:59:46 +0200460 if (cur == NULL) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200461 return;
Jens Wiklander32b31802023-10-06 16:59:46 +0200462 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200463
Jens Wiklander32b31802023-10-06 16:59:46 +0200464 mbedtls_free(cur->oid.p);
465 mbedtls_free(cur->val.p);
Jens Wiklander817466c2018-05-22 13:49:31 +0200466
Jens Wiklander32b31802023-10-06 16:59:46 +0200467 mbedtls_platform_zeroize(cur, sizeof(mbedtls_asn1_named_data));
Jens Wiklander817466c2018-05-22 13:49:31 +0200468}
Jens Wiklander32b31802023-10-06 16:59:46 +0200469#endif /* MBEDTLS_DEPRECATED_REMOVED */
Jens Wiklander817466c2018-05-22 13:49:31 +0200470
Jens Wiklander32b31802023-10-06 16:59:46 +0200471void mbedtls_asn1_free_named_data_list(mbedtls_asn1_named_data **head)
Jens Wiklander817466c2018-05-22 13:49:31 +0200472{
473 mbedtls_asn1_named_data *cur;
474
Jens Wiklander32b31802023-10-06 16:59:46 +0200475 while ((cur = *head) != NULL) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200476 *head = cur->next;
Jens Wiklander32b31802023-10-06 16:59:46 +0200477 mbedtls_free(cur->oid.p);
478 mbedtls_free(cur->val.p);
479 mbedtls_free(cur);
Jens Wiklander817466c2018-05-22 13:49:31 +0200480 }
481}
482
Jens Wiklander32b31802023-10-06 16:59:46 +0200483void mbedtls_asn1_free_named_data_list_shallow(mbedtls_asn1_named_data *name)
Jens Wiklander817466c2018-05-22 13:49:31 +0200484{
Jens Wiklander32b31802023-10-06 16:59:46 +0200485 for (mbedtls_asn1_named_data *next; name != NULL; name = next) {
486 next = name->next;
487 mbedtls_free(name);
488 }
489}
490
491const mbedtls_asn1_named_data *mbedtls_asn1_find_named_data(const mbedtls_asn1_named_data *list,
492 const char *oid, size_t len)
493{
494 while (list != NULL) {
495 if (list->oid.len == len &&
496 memcmp(list->oid.p, oid, len) == 0) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200497 break;
498 }
499
500 list = list->next;
501 }
502
Jens Wiklander32b31802023-10-06 16:59:46 +0200503 return list;
Jens Wiklander817466c2018-05-22 13:49:31 +0200504}
505
506#endif /* MBEDTLS_ASN1_PARSE_C */