Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

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