@@ -314,59 +314,56 @@ void mbedtls_asn1_sequence_free( mbedtls_asn1_sequence *seq )
314
314
}
315
315
}
316
316
317
- /*
318
- * Parses and splits an ASN.1 "SEQUENCE OF <tag>"
319
- */
320
- int mbedtls_asn1_get_sequence_of ( unsigned char * * p ,
321
- const unsigned char * end ,
322
- mbedtls_asn1_sequence * cur ,
323
- int tag )
317
+ typedef struct
324
318
{
325
- int ret ;
326
- size_t len ;
327
- mbedtls_asn1_buf * buf ;
328
-
329
- /* Get main sequence tag */
330
- if ( ( ret = mbedtls_asn1_get_tag ( p , end , & len ,
331
- MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
332
- return ( ret );
333
-
334
- if ( * p + len != end )
335
- return ( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
319
+ int tag ;
320
+ mbedtls_asn1_sequence * cur ;
321
+ } asn1_get_sequence_of_cb_ctx_t ;
322
+
323
+ static int asn1_get_sequence_of_cb ( void * ctx ,
324
+ int tag ,
325
+ unsigned char * start ,
326
+ size_t len )
327
+ {
328
+ asn1_get_sequence_of_cb_ctx_t * cb_ctx =
329
+ (asn1_get_sequence_of_cb_ctx_t * ) ctx ;
330
+ mbedtls_asn1_sequence * cur =
331
+ cb_ctx -> cur ;
336
332
337
- while ( * p < end )
333
+ if ( cur -> buf . p != NULL )
338
334
{
339
- buf = & ( cur -> buf );
340
- buf -> tag = * * p ;
335
+ cur -> next =
336
+ mbedtls_calloc ( 1 , sizeof ( mbedtls_asn1_sequence ) ) ;
341
337
342
- if ( ( ret = mbedtls_asn1_get_tag ( p , end , & buf -> len , tag ) ) != 0 )
343
- return ( ret );
344
-
345
- buf -> p = * p ;
346
- * p += buf -> len ;
347
-
348
- /* Allocate and assign next pointer */
349
- if ( * p < end )
350
- {
351
- cur -> next = (mbedtls_asn1_sequence * )mbedtls_calloc ( 1 ,
352
- sizeof ( mbedtls_asn1_sequence ) );
353
-
354
- if ( cur -> next == NULL )
355
- return ( MBEDTLS_ERR_ASN1_ALLOC_FAILED );
338
+ if ( cur -> next == NULL )
339
+ return ( MBEDTLS_ERR_ASN1_ALLOC_FAILED );
356
340
357
- cur = cur -> next ;
358
- }
341
+ cur = cur -> next ;
359
342
}
360
343
361
- /* Set final sequence entry's next pointer to NULL */
362
- cur -> next = NULL ;
363
-
364
- if ( * p != end )
365
- return ( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
344
+ cur -> buf .p = start ;
345
+ cur -> buf .len = len ;
346
+ cur -> buf .tag = tag ;
366
347
348
+ cb_ctx -> cur = cur ;
367
349
return ( 0 );
368
350
}
369
351
352
+ /*
353
+ * Parses and splits an ASN.1 "SEQUENCE OF <tag>"
354
+ */
355
+ int mbedtls_asn1_get_sequence_of ( unsigned char * * p ,
356
+ const unsigned char * end ,
357
+ mbedtls_asn1_sequence * cur ,
358
+ int tag )
359
+ {
360
+ asn1_get_sequence_of_cb_ctx_t cb_ctx = { tag , cur };
361
+ memset ( cur , 0 , sizeof ( mbedtls_asn1_sequence ) );
362
+ return ( mbedtls_asn1_traverse_sequence_of (
363
+ p , end , 0xFF , tag , 0 , 0 ,
364
+ asn1_get_sequence_of_cb , & cb_ctx ) );
365
+ }
366
+
370
367
int mbedtls_asn1_get_alg ( unsigned char * * p ,
371
368
const unsigned char * end ,
372
369
mbedtls_asn1_buf * alg , mbedtls_asn1_buf * params )
0 commit comments