Dependents:   blinky_max32630fthr

Committer:
switches
Date:
Fri Dec 16 16:27:57 2016 +0000
Revision:
3:1198227e6421
Parent:
0:5c4d7b2438d3
Changed ADC scale for MAX32625 platforms to 1.2V full scale to match MAX32630 platforms

Who changed what in which revision?

UserRevisionLine numberNew contents of line
switches 0:5c4d7b2438d3 1 /*
switches 0:5c4d7b2438d3 2 * Generic ASN.1 parsing
switches 0:5c4d7b2438d3 3 *
switches 0:5c4d7b2438d3 4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
switches 0:5c4d7b2438d3 5 * SPDX-License-Identifier: Apache-2.0
switches 0:5c4d7b2438d3 6 *
switches 0:5c4d7b2438d3 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
switches 0:5c4d7b2438d3 8 * not use this file except in compliance with the License.
switches 0:5c4d7b2438d3 9 * You may obtain a copy of the License at
switches 0:5c4d7b2438d3 10 *
switches 0:5c4d7b2438d3 11 * http://www.apache.org/licenses/LICENSE-2.0
switches 0:5c4d7b2438d3 12 *
switches 0:5c4d7b2438d3 13 * Unless required by applicable law or agreed to in writing, software
switches 0:5c4d7b2438d3 14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
switches 0:5c4d7b2438d3 15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
switches 0:5c4d7b2438d3 16 * See the License for the specific language governing permissions and
switches 0:5c4d7b2438d3 17 * limitations under the License.
switches 0:5c4d7b2438d3 18 *
switches 0:5c4d7b2438d3 19 * This file is part of mbed TLS (https://tls.mbed.org)
switches 0:5c4d7b2438d3 20 */
switches 0:5c4d7b2438d3 21
switches 0:5c4d7b2438d3 22 #if !defined(MBEDTLS_CONFIG_FILE)
switches 0:5c4d7b2438d3 23 #include "mbedtls/config.h"
switches 0:5c4d7b2438d3 24 #else
switches 0:5c4d7b2438d3 25 #include MBEDTLS_CONFIG_FILE
switches 0:5c4d7b2438d3 26 #endif
switches 0:5c4d7b2438d3 27
switches 0:5c4d7b2438d3 28 #if defined(MBEDTLS_ASN1_PARSE_C)
switches 0:5c4d7b2438d3 29
switches 0:5c4d7b2438d3 30 #include "mbedtls/asn1.h"
switches 0:5c4d7b2438d3 31
switches 0:5c4d7b2438d3 32 #include <string.h>
switches 0:5c4d7b2438d3 33
switches 0:5c4d7b2438d3 34 #if defined(MBEDTLS_BIGNUM_C)
switches 0:5c4d7b2438d3 35 #include "mbedtls/bignum.h"
switches 0:5c4d7b2438d3 36 #endif
switches 0:5c4d7b2438d3 37
switches 0:5c4d7b2438d3 38 #if defined(MBEDTLS_PLATFORM_C)
switches 0:5c4d7b2438d3 39 #include "mbedtls/platform.h"
switches 0:5c4d7b2438d3 40 #else
switches 0:5c4d7b2438d3 41 #include <stdlib.h>
switches 0:5c4d7b2438d3 42 #define mbedtls_calloc calloc
switches 0:5c4d7b2438d3 43 #define mbedtls_free free
switches 0:5c4d7b2438d3 44 #endif
switches 0:5c4d7b2438d3 45
switches 0:5c4d7b2438d3 46 /* Implementation that should never be optimized out by the compiler */
switches 0:5c4d7b2438d3 47 static void mbedtls_zeroize( void *v, size_t n ) {
switches 0:5c4d7b2438d3 48 volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;
switches 0:5c4d7b2438d3 49 }
switches 0:5c4d7b2438d3 50
switches 0:5c4d7b2438d3 51 /*
switches 0:5c4d7b2438d3 52 * ASN.1 DER decoding routines
switches 0:5c4d7b2438d3 53 */
switches 0:5c4d7b2438d3 54 int mbedtls_asn1_get_len( unsigned char **p,
switches 0:5c4d7b2438d3 55 const unsigned char *end,
switches 0:5c4d7b2438d3 56 size_t *len )
switches 0:5c4d7b2438d3 57 {
switches 0:5c4d7b2438d3 58 if( ( end - *p ) < 1 )
switches 0:5c4d7b2438d3 59 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
switches 0:5c4d7b2438d3 60
switches 0:5c4d7b2438d3 61 if( ( **p & 0x80 ) == 0 )
switches 0:5c4d7b2438d3 62 *len = *(*p)++;
switches 0:5c4d7b2438d3 63 else
switches 0:5c4d7b2438d3 64 {
switches 0:5c4d7b2438d3 65 switch( **p & 0x7F )
switches 0:5c4d7b2438d3 66 {
switches 0:5c4d7b2438d3 67 case 1:
switches 0:5c4d7b2438d3 68 if( ( end - *p ) < 2 )
switches 0:5c4d7b2438d3 69 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
switches 0:5c4d7b2438d3 70
switches 0:5c4d7b2438d3 71 *len = (*p)[1];
switches 0:5c4d7b2438d3 72 (*p) += 2;
switches 0:5c4d7b2438d3 73 break;
switches 0:5c4d7b2438d3 74
switches 0:5c4d7b2438d3 75 case 2:
switches 0:5c4d7b2438d3 76 if( ( end - *p ) < 3 )
switches 0:5c4d7b2438d3 77 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
switches 0:5c4d7b2438d3 78
switches 0:5c4d7b2438d3 79 *len = ( (size_t)(*p)[1] << 8 ) | (*p)[2];
switches 0:5c4d7b2438d3 80 (*p) += 3;
switches 0:5c4d7b2438d3 81 break;
switches 0:5c4d7b2438d3 82
switches 0:5c4d7b2438d3 83 case 3:
switches 0:5c4d7b2438d3 84 if( ( end - *p ) < 4 )
switches 0:5c4d7b2438d3 85 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
switches 0:5c4d7b2438d3 86
switches 0:5c4d7b2438d3 87 *len = ( (size_t)(*p)[1] << 16 ) |
switches 0:5c4d7b2438d3 88 ( (size_t)(*p)[2] << 8 ) | (*p)[3];
switches 0:5c4d7b2438d3 89 (*p) += 4;
switches 0:5c4d7b2438d3 90 break;
switches 0:5c4d7b2438d3 91
switches 0:5c4d7b2438d3 92 case 4:
switches 0:5c4d7b2438d3 93 if( ( end - *p ) < 5 )
switches 0:5c4d7b2438d3 94 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
switches 0:5c4d7b2438d3 95
switches 0:5c4d7b2438d3 96 *len = ( (size_t)(*p)[1] << 24 ) | ( (size_t)(*p)[2] << 16 ) |
switches 0:5c4d7b2438d3 97 ( (size_t)(*p)[3] << 8 ) | (*p)[4];
switches 0:5c4d7b2438d3 98 (*p) += 5;
switches 0:5c4d7b2438d3 99 break;
switches 0:5c4d7b2438d3 100
switches 0:5c4d7b2438d3 101 default:
switches 0:5c4d7b2438d3 102 return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
switches 0:5c4d7b2438d3 103 }
switches 0:5c4d7b2438d3 104 }
switches 0:5c4d7b2438d3 105
switches 0:5c4d7b2438d3 106 if( *len > (size_t) ( end - *p ) )
switches 0:5c4d7b2438d3 107 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
switches 0:5c4d7b2438d3 108
switches 0:5c4d7b2438d3 109 return( 0 );
switches 0:5c4d7b2438d3 110 }
switches 0:5c4d7b2438d3 111
switches 0:5c4d7b2438d3 112 int mbedtls_asn1_get_tag( unsigned char **p,
switches 0:5c4d7b2438d3 113 const unsigned char *end,
switches 0:5c4d7b2438d3 114 size_t *len, int tag )
switches 0:5c4d7b2438d3 115 {
switches 0:5c4d7b2438d3 116 if( ( end - *p ) < 1 )
switches 0:5c4d7b2438d3 117 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
switches 0:5c4d7b2438d3 118
switches 0:5c4d7b2438d3 119 if( **p != tag )
switches 0:5c4d7b2438d3 120 return( MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
switches 0:5c4d7b2438d3 121
switches 0:5c4d7b2438d3 122 (*p)++;
switches 0:5c4d7b2438d3 123
switches 0:5c4d7b2438d3 124 return( mbedtls_asn1_get_len( p, end, len ) );
switches 0:5c4d7b2438d3 125 }
switches 0:5c4d7b2438d3 126
switches 0:5c4d7b2438d3 127 int mbedtls_asn1_get_bool( unsigned char **p,
switches 0:5c4d7b2438d3 128 const unsigned char *end,
switches 0:5c4d7b2438d3 129 int *val )
switches 0:5c4d7b2438d3 130 {
switches 0:5c4d7b2438d3 131 int ret;
switches 0:5c4d7b2438d3 132 size_t len;
switches 0:5c4d7b2438d3 133
switches 0:5c4d7b2438d3 134 if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_BOOLEAN ) ) != 0 )
switches 0:5c4d7b2438d3 135 return( ret );
switches 0:5c4d7b2438d3 136
switches 0:5c4d7b2438d3 137 if( len != 1 )
switches 0:5c4d7b2438d3 138 return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
switches 0:5c4d7b2438d3 139
switches 0:5c4d7b2438d3 140 *val = ( **p != 0 ) ? 1 : 0;
switches 0:5c4d7b2438d3 141 (*p)++;
switches 0:5c4d7b2438d3 142
switches 0:5c4d7b2438d3 143 return( 0 );
switches 0:5c4d7b2438d3 144 }
switches 0:5c4d7b2438d3 145
switches 0:5c4d7b2438d3 146 int mbedtls_asn1_get_int( unsigned char **p,
switches 0:5c4d7b2438d3 147 const unsigned char *end,
switches 0:5c4d7b2438d3 148 int *val )
switches 0:5c4d7b2438d3 149 {
switches 0:5c4d7b2438d3 150 int ret;
switches 0:5c4d7b2438d3 151 size_t len;
switches 0:5c4d7b2438d3 152
switches 0:5c4d7b2438d3 153 if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 )
switches 0:5c4d7b2438d3 154 return( ret );
switches 0:5c4d7b2438d3 155
switches 0:5c4d7b2438d3 156 if( len == 0 || len > sizeof( int ) || ( **p & 0x80 ) != 0 )
switches 0:5c4d7b2438d3 157 return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
switches 0:5c4d7b2438d3 158
switches 0:5c4d7b2438d3 159 *val = 0;
switches 0:5c4d7b2438d3 160
switches 0:5c4d7b2438d3 161 while( len-- > 0 )
switches 0:5c4d7b2438d3 162 {
switches 0:5c4d7b2438d3 163 *val = ( *val << 8 ) | **p;
switches 0:5c4d7b2438d3 164 (*p)++;
switches 0:5c4d7b2438d3 165 }
switches 0:5c4d7b2438d3 166
switches 0:5c4d7b2438d3 167 return( 0 );
switches 0:5c4d7b2438d3 168 }
switches 0:5c4d7b2438d3 169
switches 0:5c4d7b2438d3 170 #if defined(MBEDTLS_BIGNUM_C)
switches 0:5c4d7b2438d3 171 int mbedtls_asn1_get_mpi( unsigned char **p,
switches 0:5c4d7b2438d3 172 const unsigned char *end,
switches 0:5c4d7b2438d3 173 mbedtls_mpi *X )
switches 0:5c4d7b2438d3 174 {
switches 0:5c4d7b2438d3 175 int ret;
switches 0:5c4d7b2438d3 176 size_t len;
switches 0:5c4d7b2438d3 177
switches 0:5c4d7b2438d3 178 if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 )
switches 0:5c4d7b2438d3 179 return( ret );
switches 0:5c4d7b2438d3 180
switches 0:5c4d7b2438d3 181 ret = mbedtls_mpi_read_binary( X, *p, len );
switches 0:5c4d7b2438d3 182
switches 0:5c4d7b2438d3 183 *p += len;
switches 0:5c4d7b2438d3 184
switches 0:5c4d7b2438d3 185 return( ret );
switches 0:5c4d7b2438d3 186 }
switches 0:5c4d7b2438d3 187 #endif /* MBEDTLS_BIGNUM_C */
switches 0:5c4d7b2438d3 188
switches 0:5c4d7b2438d3 189 int mbedtls_asn1_get_bitstring( unsigned char **p, const unsigned char *end,
switches 0:5c4d7b2438d3 190 mbedtls_asn1_bitstring *bs)
switches 0:5c4d7b2438d3 191 {
switches 0:5c4d7b2438d3 192 int ret;
switches 0:5c4d7b2438d3 193
switches 0:5c4d7b2438d3 194 /* Certificate type is a single byte bitstring */
switches 0:5c4d7b2438d3 195 if( ( ret = mbedtls_asn1_get_tag( p, end, &bs->len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 )
switches 0:5c4d7b2438d3 196 return( ret );
switches 0:5c4d7b2438d3 197
switches 0:5c4d7b2438d3 198 /* Check length, subtract one for actual bit string length */
switches 0:5c4d7b2438d3 199 if( bs->len < 1 )
switches 0:5c4d7b2438d3 200 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
switches 0:5c4d7b2438d3 201 bs->len -= 1;
switches 0:5c4d7b2438d3 202
switches 0:5c4d7b2438d3 203 /* Get number of unused bits, ensure unused bits <= 7 */
switches 0:5c4d7b2438d3 204 bs->unused_bits = **p;
switches 0:5c4d7b2438d3 205 if( bs->unused_bits > 7 )
switches 0:5c4d7b2438d3 206 return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
switches 0:5c4d7b2438d3 207 (*p)++;
switches 0:5c4d7b2438d3 208
switches 0:5c4d7b2438d3 209 /* Get actual bitstring */
switches 0:5c4d7b2438d3 210 bs->p = *p;
switches 0:5c4d7b2438d3 211 *p += bs->len;
switches 0:5c4d7b2438d3 212
switches 0:5c4d7b2438d3 213 if( *p != end )
switches 0:5c4d7b2438d3 214 return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
switches 0:5c4d7b2438d3 215
switches 0:5c4d7b2438d3 216 return( 0 );
switches 0:5c4d7b2438d3 217 }
switches 0:5c4d7b2438d3 218
switches 0:5c4d7b2438d3 219 /*
switches 0:5c4d7b2438d3 220 * Get a bit string without unused bits
switches 0:5c4d7b2438d3 221 */
switches 0:5c4d7b2438d3 222 int mbedtls_asn1_get_bitstring_null( unsigned char **p, const unsigned char *end,
switches 0:5c4d7b2438d3 223 size_t *len )
switches 0:5c4d7b2438d3 224 {
switches 0:5c4d7b2438d3 225 int ret;
switches 0:5c4d7b2438d3 226
switches 0:5c4d7b2438d3 227 if( ( ret = mbedtls_asn1_get_tag( p, end, len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 )
switches 0:5c4d7b2438d3 228 return( ret );
switches 0:5c4d7b2438d3 229
switches 0:5c4d7b2438d3 230 if( (*len)-- < 2 || *(*p)++ != 0 )
switches 0:5c4d7b2438d3 231 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
switches 0:5c4d7b2438d3 232
switches 0:5c4d7b2438d3 233 return( 0 );
switches 0:5c4d7b2438d3 234 }
switches 0:5c4d7b2438d3 235
switches 0:5c4d7b2438d3 236
switches 0:5c4d7b2438d3 237
switches 0:5c4d7b2438d3 238 /*
switches 0:5c4d7b2438d3 239 * Parses and splits an ASN.1 "SEQUENCE OF <tag>"
switches 0:5c4d7b2438d3 240 */
switches 0:5c4d7b2438d3 241 int mbedtls_asn1_get_sequence_of( unsigned char **p,
switches 0:5c4d7b2438d3 242 const unsigned char *end,
switches 0:5c4d7b2438d3 243 mbedtls_asn1_sequence *cur,
switches 0:5c4d7b2438d3 244 int tag)
switches 0:5c4d7b2438d3 245 {
switches 0:5c4d7b2438d3 246 int ret;
switches 0:5c4d7b2438d3 247 size_t len;
switches 0:5c4d7b2438d3 248 mbedtls_asn1_buf *buf;
switches 0:5c4d7b2438d3 249
switches 0:5c4d7b2438d3 250 /* Get main sequence tag */
switches 0:5c4d7b2438d3 251 if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
switches 0:5c4d7b2438d3 252 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
switches 0:5c4d7b2438d3 253 return( ret );
switches 0:5c4d7b2438d3 254
switches 0:5c4d7b2438d3 255 if( *p + len != end )
switches 0:5c4d7b2438d3 256 return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
switches 0:5c4d7b2438d3 257
switches 0:5c4d7b2438d3 258 while( *p < end )
switches 0:5c4d7b2438d3 259 {
switches 0:5c4d7b2438d3 260 buf = &(cur->buf);
switches 0:5c4d7b2438d3 261 buf->tag = **p;
switches 0:5c4d7b2438d3 262
switches 0:5c4d7b2438d3 263 if( ( ret = mbedtls_asn1_get_tag( p, end, &buf->len, tag ) ) != 0 )
switches 0:5c4d7b2438d3 264 return( ret );
switches 0:5c4d7b2438d3 265
switches 0:5c4d7b2438d3 266 buf->p = *p;
switches 0:5c4d7b2438d3 267 *p += buf->len;
switches 0:5c4d7b2438d3 268
switches 0:5c4d7b2438d3 269 /* Allocate and assign next pointer */
switches 0:5c4d7b2438d3 270 if( *p < end )
switches 0:5c4d7b2438d3 271 {
switches 0:5c4d7b2438d3 272 cur->next = (mbedtls_asn1_sequence*)mbedtls_calloc( 1,
switches 0:5c4d7b2438d3 273 sizeof( mbedtls_asn1_sequence ) );
switches 0:5c4d7b2438d3 274
switches 0:5c4d7b2438d3 275 if( cur->next == NULL )
switches 0:5c4d7b2438d3 276 return( MBEDTLS_ERR_ASN1_ALLOC_FAILED );
switches 0:5c4d7b2438d3 277
switches 0:5c4d7b2438d3 278 cur = cur->next;
switches 0:5c4d7b2438d3 279 }
switches 0:5c4d7b2438d3 280 }
switches 0:5c4d7b2438d3 281
switches 0:5c4d7b2438d3 282 /* Set final sequence entry's next pointer to NULL */
switches 0:5c4d7b2438d3 283 cur->next = NULL;
switches 0:5c4d7b2438d3 284
switches 0:5c4d7b2438d3 285 if( *p != end )
switches 0:5c4d7b2438d3 286 return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
switches 0:5c4d7b2438d3 287
switches 0:5c4d7b2438d3 288 return( 0 );
switches 0:5c4d7b2438d3 289 }
switches 0:5c4d7b2438d3 290
switches 0:5c4d7b2438d3 291 int mbedtls_asn1_get_alg( unsigned char **p,
switches 0:5c4d7b2438d3 292 const unsigned char *end,
switches 0:5c4d7b2438d3 293 mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params )
switches 0:5c4d7b2438d3 294 {
switches 0:5c4d7b2438d3 295 int ret;
switches 0:5c4d7b2438d3 296 size_t len;
switches 0:5c4d7b2438d3 297
switches 0:5c4d7b2438d3 298 if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
switches 0:5c4d7b2438d3 299 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
switches 0:5c4d7b2438d3 300 return( ret );
switches 0:5c4d7b2438d3 301
switches 0:5c4d7b2438d3 302 if( ( end - *p ) < 1 )
switches 0:5c4d7b2438d3 303 return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
switches 0:5c4d7b2438d3 304
switches 0:5c4d7b2438d3 305 alg->tag = **p;
switches 0:5c4d7b2438d3 306 end = *p + len;
switches 0:5c4d7b2438d3 307
switches 0:5c4d7b2438d3 308 if( ( ret = mbedtls_asn1_get_tag( p, end, &alg->len, MBEDTLS_ASN1_OID ) ) != 0 )
switches 0:5c4d7b2438d3 309 return( ret );
switches 0:5c4d7b2438d3 310
switches 0:5c4d7b2438d3 311 alg->p = *p;
switches 0:5c4d7b2438d3 312 *p += alg->len;
switches 0:5c4d7b2438d3 313
switches 0:5c4d7b2438d3 314 if( *p == end )
switches 0:5c4d7b2438d3 315 {
switches 0:5c4d7b2438d3 316 mbedtls_zeroize( params, sizeof(mbedtls_asn1_buf) );
switches 0:5c4d7b2438d3 317 return( 0 );
switches 0:5c4d7b2438d3 318 }
switches 0:5c4d7b2438d3 319
switches 0:5c4d7b2438d3 320 params->tag = **p;
switches 0:5c4d7b2438d3 321 (*p)++;
switches 0:5c4d7b2438d3 322
switches 0:5c4d7b2438d3 323 if( ( ret = mbedtls_asn1_get_len( p, end, &params->len ) ) != 0 )
switches 0:5c4d7b2438d3 324 return( ret );
switches 0:5c4d7b2438d3 325
switches 0:5c4d7b2438d3 326 params->p = *p;
switches 0:5c4d7b2438d3 327 *p += params->len;
switches 0:5c4d7b2438d3 328
switches 0:5c4d7b2438d3 329 if( *p != end )
switches 0:5c4d7b2438d3 330 return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
switches 0:5c4d7b2438d3 331
switches 0:5c4d7b2438d3 332 return( 0 );
switches 0:5c4d7b2438d3 333 }
switches 0:5c4d7b2438d3 334
switches 0:5c4d7b2438d3 335 int mbedtls_asn1_get_alg_null( unsigned char **p,
switches 0:5c4d7b2438d3 336 const unsigned char *end,
switches 0:5c4d7b2438d3 337 mbedtls_asn1_buf *alg )
switches 0:5c4d7b2438d3 338 {
switches 0:5c4d7b2438d3 339 int ret;
switches 0:5c4d7b2438d3 340 mbedtls_asn1_buf params;
switches 0:5c4d7b2438d3 341
switches 0:5c4d7b2438d3 342 memset( &params, 0, sizeof(mbedtls_asn1_buf) );
switches 0:5c4d7b2438d3 343
switches 0:5c4d7b2438d3 344 if( ( ret = mbedtls_asn1_get_alg( p, end, alg, &params ) ) != 0 )
switches 0:5c4d7b2438d3 345 return( ret );
switches 0:5c4d7b2438d3 346
switches 0:5c4d7b2438d3 347 if( ( params.tag != MBEDTLS_ASN1_NULL && params.tag != 0 ) || params.len != 0 )
switches 0:5c4d7b2438d3 348 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
switches 0:5c4d7b2438d3 349
switches 0:5c4d7b2438d3 350 return( 0 );
switches 0:5c4d7b2438d3 351 }
switches 0:5c4d7b2438d3 352
switches 0:5c4d7b2438d3 353 void mbedtls_asn1_free_named_data( mbedtls_asn1_named_data *cur )
switches 0:5c4d7b2438d3 354 {
switches 0:5c4d7b2438d3 355 if( cur == NULL )
switches 0:5c4d7b2438d3 356 return;
switches 0:5c4d7b2438d3 357
switches 0:5c4d7b2438d3 358 mbedtls_free( cur->oid.p );
switches 0:5c4d7b2438d3 359 mbedtls_free( cur->val.p );
switches 0:5c4d7b2438d3 360
switches 0:5c4d7b2438d3 361 mbedtls_zeroize( cur, sizeof( mbedtls_asn1_named_data ) );
switches 0:5c4d7b2438d3 362 }
switches 0:5c4d7b2438d3 363
switches 0:5c4d7b2438d3 364 void mbedtls_asn1_free_named_data_list( mbedtls_asn1_named_data **head )
switches 0:5c4d7b2438d3 365 {
switches 0:5c4d7b2438d3 366 mbedtls_asn1_named_data *cur;
switches 0:5c4d7b2438d3 367
switches 0:5c4d7b2438d3 368 while( ( cur = *head ) != NULL )
switches 0:5c4d7b2438d3 369 {
switches 0:5c4d7b2438d3 370 *head = cur->next;
switches 0:5c4d7b2438d3 371 mbedtls_asn1_free_named_data( cur );
switches 0:5c4d7b2438d3 372 mbedtls_free( cur );
switches 0:5c4d7b2438d3 373 }
switches 0:5c4d7b2438d3 374 }
switches 0:5c4d7b2438d3 375
switches 0:5c4d7b2438d3 376 mbedtls_asn1_named_data *mbedtls_asn1_find_named_data( mbedtls_asn1_named_data *list,
switches 0:5c4d7b2438d3 377 const char *oid, size_t len )
switches 0:5c4d7b2438d3 378 {
switches 0:5c4d7b2438d3 379 while( list != NULL )
switches 0:5c4d7b2438d3 380 {
switches 0:5c4d7b2438d3 381 if( list->oid.len == len &&
switches 0:5c4d7b2438d3 382 memcmp( list->oid.p, oid, len ) == 0 )
switches 0:5c4d7b2438d3 383 {
switches 0:5c4d7b2438d3 384 break;
switches 0:5c4d7b2438d3 385 }
switches 0:5c4d7b2438d3 386
switches 0:5c4d7b2438d3 387 list = list->next;
switches 0:5c4d7b2438d3 388 }
switches 0:5c4d7b2438d3 389
switches 0:5c4d7b2438d3 390 return( list );
switches 0:5c4d7b2438d3 391 }
switches 0:5c4d7b2438d3 392
switches 0:5c4d7b2438d3 393 #endif /* MBEDTLS_ASN1_PARSE_C */