blob: 4bc17710c0cca7b0f02ec8da97c5e042cfc4ac54 [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
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
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.
Paul Bakkerefc30292011-11-10 14:43:23 +000018 */
19
Gilles Peskinedb09ef62020-06-03 01:43:33 +020020#include "common.h"
Paul Bakkerefc30292011-11-10 14:43:23 +000021
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020022#if defined(MBEDTLS_ASN1_PARSE_C)
Paul Bakkerefc30292011-11-10 14:43:23 +000023
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000024#include "mbedtls/asn1.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050025#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000026#include "mbedtls/error.h"
Paul Bakkerefc30292011-11-10 14:43:23 +000027
Rich Evans00ab4702015-02-06 13:43:58 +000028#include <string.h>
29
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020030#if defined(MBEDTLS_BIGNUM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000031#include "mbedtls/bignum.h"
Paul Bakkerefc30292011-11-10 14:43:23 +000032#endif
33
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000034#include "mbedtls/platform.h"
Paul Bakker6e339b52013-07-03 13:37:05 +020035
Paul Bakkerefc30292011-11-10 14:43:23 +000036/*
37 * ASN.1 DER decoding routines
38 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039int mbedtls_asn1_get_len( unsigned char **p,
Paul Bakkerefc30292011-11-10 14:43:23 +000040 const unsigned char *end,
41 size_t *len )
42{
43 if( ( end - *p ) < 1 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
Paul Bakkerefc30292011-11-10 14:43:23 +000045
46 if( ( **p & 0x80 ) == 0 )
47 *len = *(*p)++;
48 else
49 {
50 switch( **p & 0x7F )
51 {
52 case 1:
53 if( ( end - *p ) < 2 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
Paul Bakkerefc30292011-11-10 14:43:23 +000055
56 *len = (*p)[1];
57 (*p) += 2;
58 break;
59
60 case 2:
61 if( ( end - *p ) < 3 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020062 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
Paul Bakkerefc30292011-11-10 14:43:23 +000063
Manuel Pégourié-Gonnard6fdc4ca2015-02-13 17:15:18 +000064 *len = ( (size_t)(*p)[1] << 8 ) | (*p)[2];
Paul Bakkerefc30292011-11-10 14:43:23 +000065 (*p) += 3;
66 break;
67
68 case 3:
69 if( ( end - *p ) < 4 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020070 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
Paul Bakkerefc30292011-11-10 14:43:23 +000071
Manuel Pégourié-Gonnard6fdc4ca2015-02-13 17:15:18 +000072 *len = ( (size_t)(*p)[1] << 16 ) |
73 ( (size_t)(*p)[2] << 8 ) | (*p)[3];
Paul Bakkerefc30292011-11-10 14:43:23 +000074 (*p) += 4;
75 break;
76
77 case 4:
78 if( ( end - *p ) < 5 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020079 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
Paul Bakkerefc30292011-11-10 14:43:23 +000080
Manuel Pégourié-Gonnard6fdc4ca2015-02-13 17:15:18 +000081 *len = ( (size_t)(*p)[1] << 24 ) | ( (size_t)(*p)[2] << 16 ) |
82 ( (size_t)(*p)[3] << 8 ) | (*p)[4];
Paul Bakkerefc30292011-11-10 14:43:23 +000083 (*p) += 5;
84 break;
85
86 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020087 return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
Paul Bakkerefc30292011-11-10 14:43:23 +000088 }
89 }
90
91 if( *len > (size_t) ( end - *p ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020092 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
Paul Bakkerefc30292011-11-10 14:43:23 +000093
94 return( 0 );
95}
96
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020097int mbedtls_asn1_get_tag( unsigned char **p,
Paul Bakkerefc30292011-11-10 14:43:23 +000098 const unsigned char *end,
99 size_t *len, int tag )
100{
101 if( ( end - *p ) < 1 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200102 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
Paul Bakkerefc30292011-11-10 14:43:23 +0000103
104 if( **p != tag )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200105 return( MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
Paul Bakkerefc30292011-11-10 14:43:23 +0000106
107 (*p)++;
108
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200109 return( mbedtls_asn1_get_len( p, end, len ) );
Paul Bakkerefc30292011-11-10 14:43:23 +0000110}
111
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200112int mbedtls_asn1_get_bool( unsigned char **p,
Paul Bakkerefc30292011-11-10 14:43:23 +0000113 const unsigned char *end,
114 int *val )
115{
Janos Follath24eed8d2019-11-22 13:21:35 +0000116 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerefc30292011-11-10 14:43:23 +0000117 size_t len;
118
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200119 if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_BOOLEAN ) ) != 0 )
Paul Bakkerefc30292011-11-10 14:43:23 +0000120 return( ret );
121
122 if( len != 1 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200123 return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
Paul Bakkerefc30292011-11-10 14:43:23 +0000124
125 *val = ( **p != 0 ) ? 1 : 0;
126 (*p)++;
127
128 return( 0 );
129}
130
Mykhailo Sopiha20180ca2019-10-29 15:58:10 +0200131static int asn1_get_tagged_int( unsigned char **p,
132 const unsigned char *end,
133 int tag, int *val )
Paul Bakkerefc30292011-11-10 14:43:23 +0000134{
Janos Follath24eed8d2019-11-22 13:21:35 +0000135 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerefc30292011-11-10 14:43:23 +0000136 size_t len;
137
Mykhailo Sopiha20180ca2019-10-29 15:58:10 +0200138 if( ( ret = mbedtls_asn1_get_tag( p, end, &len, tag ) ) != 0 )
Paul Bakkerefc30292011-11-10 14:43:23 +0000139 return( ret );
140
Mykhailo Sopiha20180ca2019-10-29 15:58:10 +0200141 /*
142 * len==0 is malformed (0 must be represented as 020100 for INTEGER,
143 * or 0A0100 for ENUMERATED tags
144 */
Gilles Peskine9fd97942019-10-10 19:27:53 +0200145 if( len == 0 )
146 return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
147 /* This is a cryptography library. Reject negative integers. */
148 if( ( **p & 0x80 ) != 0 )
Gilles Peskinef7d6acd2019-03-01 18:06:08 +0100149 return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
150
Gilles Peskine9fd97942019-10-10 19:27:53 +0200151 /* Skip leading zeros. */
Gilles Peskinef7d6acd2019-03-01 18:06:08 +0100152 while( len > 0 && **p == 0 )
153 {
154 ++( *p );
155 --len;
156 }
Gilles Peskine9fd97942019-10-10 19:27:53 +0200157
158 /* Reject integers that don't fit in an int. This code assumes that
159 * the int type has no padding bit. */
Gilles Peskinef7d6acd2019-03-01 18:06:08 +0100160 if( len > sizeof( int ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200161 return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
Gilles Peskine37570e82019-10-10 19:29:27 +0200162 if( len == sizeof( int ) && ( **p & 0x80 ) != 0 )
163 return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
Paul Bakkerefc30292011-11-10 14:43:23 +0000164
165 *val = 0;
Paul Bakkerefc30292011-11-10 14:43:23 +0000166 while( len-- > 0 )
167 {
168 *val = ( *val << 8 ) | **p;
169 (*p)++;
170 }
171
172 return( 0 );
173}
174
Mykhailo Sopiha20180ca2019-10-29 15:58:10 +0200175int mbedtls_asn1_get_int( unsigned char **p,
176 const unsigned char *end,
177 int *val )
178{
179 return( asn1_get_tagged_int( p, end, MBEDTLS_ASN1_INTEGER, val) );
180}
181
182int mbedtls_asn1_get_enum( unsigned char **p,
183 const unsigned char *end,
184 int *val )
185{
186 return( asn1_get_tagged_int( p, end, MBEDTLS_ASN1_ENUMERATED, val) );
187}
188
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200189#if defined(MBEDTLS_BIGNUM_C)
190int mbedtls_asn1_get_mpi( unsigned char **p,
Paul Bakkerefc30292011-11-10 14:43:23 +0000191 const unsigned char *end,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200192 mbedtls_mpi *X )
Paul Bakkerefc30292011-11-10 14:43:23 +0000193{
Janos Follath24eed8d2019-11-22 13:21:35 +0000194 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerefc30292011-11-10 14:43:23 +0000195 size_t len;
196
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200197 if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 )
Paul Bakkerefc30292011-11-10 14:43:23 +0000198 return( ret );
199
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200200 ret = mbedtls_mpi_read_binary( X, *p, len );
Paul Bakkerefc30292011-11-10 14:43:23 +0000201
202 *p += len;
203
204 return( ret );
205}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200206#endif /* MBEDTLS_BIGNUM_C */
Paul Bakkerefc30292011-11-10 14:43:23 +0000207
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200208int mbedtls_asn1_get_bitstring( unsigned char **p, const unsigned char *end,
209 mbedtls_asn1_bitstring *bs)
Paul Bakkerefc30292011-11-10 14:43:23 +0000210{
Janos Follath24eed8d2019-11-22 13:21:35 +0000211 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerefc30292011-11-10 14:43:23 +0000212
213 /* Certificate type is a single byte bitstring */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200214 if( ( ret = mbedtls_asn1_get_tag( p, end, &bs->len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 )
Paul Bakkerefc30292011-11-10 14:43:23 +0000215 return( ret );
216
217 /* Check length, subtract one for actual bit string length */
Paul Bakker66d5d072014-06-17 16:39:18 +0200218 if( bs->len < 1 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200219 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
Paul Bakkerefc30292011-11-10 14:43:23 +0000220 bs->len -= 1;
221
222 /* Get number of unused bits, ensure unused bits <= 7 */
223 bs->unused_bits = **p;
224 if( bs->unused_bits > 7 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200225 return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
Paul Bakkerefc30292011-11-10 14:43:23 +0000226 (*p)++;
227
228 /* Get actual bitstring */
229 bs->p = *p;
230 *p += bs->len;
231
232 if( *p != end )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200233 return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
Paul Bakkerefc30292011-11-10 14:43:23 +0000234
Paul Bakkerd8bb8262014-06-17 14:06:49 +0200235 return( 0 );
Paul Bakkerefc30292011-11-10 14:43:23 +0000236}
237
Manuel Pégourié-Gonnarda2d4e642013-07-11 13:59:02 +0200238/*
Hanno Becker199b7092019-09-11 14:21:26 +0100239 * Traverse an ASN.1 "SEQUENCE OF <tag>"
240 * and call a callback for each entry found.
241 */
242int mbedtls_asn1_traverse_sequence_of(
243 unsigned char **p,
244 const unsigned char *end,
Hanno Becker34aada22020-02-03 10:39:55 +0000245 unsigned char tag_must_mask, unsigned char tag_must_val,
246 unsigned char tag_may_mask, unsigned char tag_may_val,
Hanno Becker199b7092019-09-11 14:21:26 +0100247 int (*cb)( void *ctx, int tag,
248 unsigned char *start, size_t len ),
249 void *ctx )
250{
251 int ret;
252 size_t len;
253
254 /* Get main sequence tag */
255 if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
256 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
257 {
258 return( ret );
259 }
260
261 if( *p + len != end )
262 return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
263
264 while( *p < end )
265 {
266 unsigned char const tag = *(*p)++;
267
268 if( ( tag & tag_must_mask ) != tag_must_val )
269 return( MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
270
271 if( ( ret = mbedtls_asn1_get_len( p, end, &len ) ) != 0 )
272 return( ret );
273
274 if( ( tag & tag_may_mask ) == tag_may_val )
275 {
276 if( cb != NULL )
277 {
278 ret = cb( ctx, tag, *p, len );
279 if( ret != 0 )
280 return( ret );
281 }
282 }
283
284 *p += len;
285 }
286
287 return( 0 );
288}
289
290/*
Manuel Pégourié-Gonnarda2d4e642013-07-11 13:59:02 +0200291 * Get a bit string without unused bits
292 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200293int mbedtls_asn1_get_bitstring_null( unsigned char **p, const unsigned char *end,
Manuel Pégourié-Gonnarda2d4e642013-07-11 13:59:02 +0200294 size_t *len )
295{
Janos Follath24eed8d2019-11-22 13:21:35 +0000296 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnarda2d4e642013-07-11 13:59:02 +0200297
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200298 if( ( ret = mbedtls_asn1_get_tag( p, end, len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 )
Manuel Pégourié-Gonnarda2d4e642013-07-11 13:59:02 +0200299 return( ret );
300
Gilles Peskinee40d1202019-03-01 18:08:35 +0100301 if( *len == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200302 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
Gilles Peskinee40d1202019-03-01 18:08:35 +0100303 --( *len );
304
305 if( **p != 0 )
306 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
307 ++( *p );
Manuel Pégourié-Gonnarda2d4e642013-07-11 13:59:02 +0200308
309 return( 0 );
310}
311
Hanno Becker12ae27d2019-09-11 14:20:09 +0100312void mbedtls_asn1_sequence_free( mbedtls_asn1_sequence *seq )
313{
314 while( seq != NULL )
315 {
316 mbedtls_asn1_sequence *next = seq->next;
Hanno Becker12ae27d2019-09-11 14:20:09 +0100317 mbedtls_free( seq );
318 seq = next;
319 }
320}
Paul Bakkerefc30292011-11-10 14:43:23 +0000321
Hanno Becker1505f632019-09-11 14:25:26 +0100322typedef struct
323{
324 int tag;
325 mbedtls_asn1_sequence *cur;
326} asn1_get_sequence_of_cb_ctx_t;
327
328static int asn1_get_sequence_of_cb( void *ctx,
329 int tag,
330 unsigned char *start,
331 size_t len )
332{
333 asn1_get_sequence_of_cb_ctx_t *cb_ctx =
334 (asn1_get_sequence_of_cb_ctx_t *) ctx;
335 mbedtls_asn1_sequence *cur =
336 cb_ctx->cur;
337
338 if( cur->buf.p != NULL )
339 {
340 cur->next =
341 mbedtls_calloc( 1, sizeof( mbedtls_asn1_sequence ) );
342
343 if( cur->next == NULL )
344 return( MBEDTLS_ERR_ASN1_ALLOC_FAILED );
345
346 cur = cur->next;
347 }
348
349 cur->buf.p = start;
350 cur->buf.len = len;
351 cur->buf.tag = tag;
352
353 cb_ctx->cur = cur;
354 return( 0 );
355}
356
Paul Bakkerefc30292011-11-10 14:43:23 +0000357/*
358 * Parses and splits an ASN.1 "SEQUENCE OF <tag>"
359 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200360int mbedtls_asn1_get_sequence_of( unsigned char **p,
Paul Bakkerefc30292011-11-10 14:43:23 +0000361 const unsigned char *end,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200362 mbedtls_asn1_sequence *cur,
Paul Bakkerefc30292011-11-10 14:43:23 +0000363 int tag)
364{
Hanno Becker1505f632019-09-11 14:25:26 +0100365 asn1_get_sequence_of_cb_ctx_t cb_ctx = { tag, cur };
366 memset( cur, 0, sizeof( mbedtls_asn1_sequence ) );
367 return( mbedtls_asn1_traverse_sequence_of(
368 p, end, 0xFF, tag, 0, 0,
369 asn1_get_sequence_of_cb, &cb_ctx ) );
Paul Bakkerefc30292011-11-10 14:43:23 +0000370}
371
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200372int mbedtls_asn1_get_alg( unsigned char **p,
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200373 const unsigned char *end,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200374 mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params )
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200375{
Janos Follath24eed8d2019-11-22 13:21:35 +0000376 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200377 size_t len;
378
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200379 if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
380 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200381 return( ret );
382
Manuel Pégourié-Gonnardba77bbf2013-08-15 13:38:13 +0200383 if( ( end - *p ) < 1 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200384 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
Manuel Pégourié-Gonnardba77bbf2013-08-15 13:38:13 +0200385
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200386 alg->tag = **p;
Manuel Pégourié-Gonnardba77bbf2013-08-15 13:38:13 +0200387 end = *p + len;
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200388
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389 if( ( ret = mbedtls_asn1_get_tag( p, end, &alg->len, MBEDTLS_ASN1_OID ) ) != 0 )
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200390 return( ret );
391
392 alg->p = *p;
393 *p += alg->len;
394
395 if( *p == end )
396 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500397 mbedtls_platform_zeroize( params, sizeof(mbedtls_asn1_buf) );
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200398 return( 0 );
399 }
400
401 params->tag = **p;
402 (*p)++;
403
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200404 if( ( ret = mbedtls_asn1_get_len( p, end, &params->len ) ) != 0 )
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200405 return( ret );
406
407 params->p = *p;
408 *p += params->len;
409
410 if( *p != end )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200411 return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200412
413 return( 0 );
414}
415
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200416int mbedtls_asn1_get_alg_null( unsigned char **p,
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200417 const unsigned char *end,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200418 mbedtls_asn1_buf *alg )
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200419{
Janos Follath24eed8d2019-11-22 13:21:35 +0000420 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200421 mbedtls_asn1_buf params;
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200422
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200423 memset( &params, 0, sizeof(mbedtls_asn1_buf) );
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200424
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200425 if( ( ret = mbedtls_asn1_get_alg( p, end, alg, &params ) ) != 0 )
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200426 return( ret );
427
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200428 if( ( params.tag != MBEDTLS_ASN1_NULL && params.tag != 0 ) || params.len != 0 )
429 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
Paul Bakkerf8d018a2013-06-29 12:16:17 +0200430
431 return( 0 );
432}
433
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200434void mbedtls_asn1_free_named_data( mbedtls_asn1_named_data *cur )
Paul Bakkere5eae762013-08-26 12:05:14 +0200435{
436 if( cur == NULL )
437 return;
438
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200439 mbedtls_free( cur->oid.p );
440 mbedtls_free( cur->val.p );
Paul Bakkere5eae762013-08-26 12:05:14 +0200441
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500442 mbedtls_platform_zeroize( cur, sizeof( mbedtls_asn1_named_data ) );
Paul Bakkere5eae762013-08-26 12:05:14 +0200443}
444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445void mbedtls_asn1_free_named_data_list( mbedtls_asn1_named_data **head )
Paul Bakkerc547cc92013-09-09 12:01:23 +0200446{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200447 mbedtls_asn1_named_data *cur;
Paul Bakkerc547cc92013-09-09 12:01:23 +0200448
449 while( ( cur = *head ) != NULL )
450 {
451 *head = cur->next;
Glenn Strauss7db31242022-07-01 13:22:45 -0400452 mbedtls_free( cur->oid.p );
453 mbedtls_free( cur->val.p );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200454 mbedtls_free( cur );
Paul Bakkerc547cc92013-09-09 12:01:23 +0200455 }
456}
457
Glenn Straussa4b40412022-06-26 19:32:09 -0400458void mbedtls_asn1_free_named_data_list_shallow( mbedtls_asn1_named_data *name )
459{
460 for( mbedtls_asn1_named_data *next; name != NULL; name = next )
461 {
462 next = name->next;
Glenn Straussa4b40412022-06-26 19:32:09 -0400463 mbedtls_free( name );
464 }
465}
466
Mateusz Starzyk59961cf2021-01-26 13:57:43 +0100467const mbedtls_asn1_named_data *mbedtls_asn1_find_named_data( const mbedtls_asn1_named_data *list,
Paul Bakkere5eae762013-08-26 12:05:14 +0200468 const char *oid, size_t len )
469{
470 while( list != NULL )
471 {
472 if( list->oid.len == len &&
473 memcmp( list->oid.p, oid, len ) == 0 )
474 {
475 break;
476 }
477
478 list = list->next;
479 }
480
481 return( list );
482}
483
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200484#endif /* MBEDTLS_ASN1_PARSE_C */