Skip to content

Commit 6af7bf9

Browse files
Add test cases for ASN.1 ENUMERATED tag
Add test cases for writing and parsing ASN.1 ENUMERATED tag values. Signed-off-by: Mykhailo Sopiha <[email protected]>
1 parent 20180ca commit 6af7bf9

File tree

4 files changed

+190
-0
lines changed

4 files changed

+190
-0
lines changed

tests/suites/test_suite_asn1parse.data

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,90 @@ get_integer:"010101":"":MBEDTLS_ERR_ASN1_UNEXPECTED_TAG
286286
INTEGER too large for mpi
287287
get_mpi_too_large:
288288

289+
ENUMERATED 0
290+
get_enum:"0A0100":"0":0
291+
292+
ENUMERATED 0, extra leading 0
293+
get_enum:"0A020000":"0":0
294+
295+
ENUMERATED 1
296+
get_enum:"0A0101":"1":0
297+
298+
ENUMERATED 1, extra leading 0
299+
get_enum:"0A020001":"1":0
300+
301+
ENUMERATED 0x7f
302+
get_enum:"0A017f":"7f":0
303+
304+
ENUMERATED 0x80
305+
get_enum:"0A020080":"80":0
306+
307+
ENUMERATED 0x80, extra leading 0
308+
get_enum:"0A03000080":"80":0
309+
310+
ENUMERATED 0xff
311+
get_enum:"0A0200ff":"ff":0
312+
313+
ENUMERATED 0x7fff
314+
get_enum:"0A027fff":"7fff":0
315+
316+
ENUMERATED 0x12345678
317+
get_enum:"0A0412345678":"12345678":0
318+
319+
ENUMERATED 0x12345678, extra leading 0
320+
get_enum:"0A050012345678":"12345678":0
321+
322+
ENUMERATED 0x7fffffff
323+
get_enum:"0A047fffffff":"7fffffff":0
324+
325+
ENUMERATED 0x7fffffff, extra leading 0
326+
get_enum:"0A05007fffffff":"7fffffff":0
327+
328+
ENUMERATED 0x80000000
329+
get_enum:"0A050080000000":"80000000":0
330+
331+
ENUMERATED 0xffffffff
332+
get_enum:"0A0500ffffffff":"ffffffff":0
333+
334+
ENUMERATED 0x100000000
335+
get_enum:"0A050100000000":"0100000000":0
336+
337+
ENUMERATED -1
338+
get_enum:"0A01ff":"-1":0
339+
340+
ENUMERATED -1, extra leading ff
341+
get_enum:"0A02ffff":"-1":0
342+
343+
ENUMERATED -0x7f
344+
get_enum:"0A0181":"-7f":0
345+
346+
ENUMERATED -0x80
347+
get_enum:"0A0180":"-80":0
348+
349+
ENUMERATED -0x81
350+
get_enum:"0A02ff7f":"-81":0
351+
352+
ENUMERATED -0xff
353+
get_enum:"0A02ff01":"-ff":0
354+
355+
ENUMERATED -0x100
356+
get_enum:"0A02ff00":"-100":0
357+
358+
ENUMERATED -0x7fffffff
359+
get_enum:"0A0480000001":"-7fffffff":0
360+
361+
ENUMERATED -0x80000000
362+
get_enum:"0A0480000000":"-80000000":0
363+
364+
ENUMERATED -0x80000001
365+
get_enum:"0A05ff7fffffff":"-80000001":0
366+
367+
ENUMERATED -0xffffffff
368+
get_enum:"0A05ff00000001":"-ffffffff":0
369+
370+
ENUMERATED -0x100000000
371+
get_enum:"0A05ff00000000":"-100000000":0
372+
289373
BIT STRING: empty
290374
get_bitstring:"0300":0:0:MBEDTLS_ERR_ASN1_OUT_OF_DATA:MBEDTLS_ERR_ASN1_INVALID_DATA
291375

tests/suites/test_suite_asn1parse.function

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,49 @@ exit:
393393
}
394394
/* END_CASE */
395395

396+
/* BEGIN_CASE */
397+
void get_enum( const data_t *input,
398+
const char *expected_hex, int expected_result )
399+
{
400+
unsigned char *p;
401+
long expected_value;
402+
int expected_result_for_enum = expected_result;
403+
int val;
404+
int ret;
405+
406+
errno = 0;
407+
expected_value = strtol( expected_hex, NULL, 16 );
408+
if( expected_result == 0 &&
409+
( errno == ERANGE
410+
#if LONG_MAX > INT_MAX
411+
|| expected_value > INT_MAX || expected_value < INT_MIN
412+
#endif
413+
) )
414+
{
415+
/* The library returns the dubious error code INVALID_LENGTH
416+
* for integers that are out of range. */
417+
expected_result_for_enum = MBEDTLS_ERR_ASN1_INVALID_LENGTH;
418+
}
419+
if( expected_result == 0 && expected_value < 0 )
420+
{
421+
/* The library does not support negative INTEGERs and
422+
* returns the dubious error code INVALID_LENGTH.
423+
* Test that we preserve the historical behavior. If we
424+
* decide to change the behavior, we'll also change this test. */
425+
expected_result_for_enum = MBEDTLS_ERR_ASN1_INVALID_LENGTH;
426+
}
427+
428+
p = input->x;
429+
ret = mbedtls_asn1_get_enum( &p, input->x + input->len, &val );
430+
TEST_EQUAL( ret, expected_result_for_enum );
431+
if( ret == 0 )
432+
{
433+
TEST_EQUAL( val, expected_value );
434+
TEST_ASSERT( p == input->x + input->len );
435+
}
436+
}
437+
/* END_CASE */
438+
396439
/* BEGIN_CASE depends_on:MBEDTLS_BIGNUM_C */
397440
void get_mpi_too_large( )
398441
{

tests/suites/test_suite_asn1write.data

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,48 @@ mbedtls_asn1_write_int:0x12345678:"020412345678"
4949
ASN.1 Write int 2147483647
5050
mbedtls_asn1_write_int:0x7fffffff:"02047fffffff"
5151

52+
ASN.1 Write enum 0
53+
mbedtls_asn1_write_enum:0:"0A0100"
54+
55+
ASN.1 Write enum 1
56+
mbedtls_asn1_write_enum:1:"0A0101"
57+
58+
ASN.1 Write enum 127
59+
mbedtls_asn1_write_enum:0x7f:"0A017f"
60+
61+
ASN.1 Write enum 128
62+
mbedtls_asn1_write_enum:0x80:"0A020080"
63+
64+
ASN.1 Write enum 255
65+
mbedtls_asn1_write_enum:0xff:"0A0200ff"
66+
67+
ASN.1 Write enum 256
68+
mbedtls_asn1_write_enum:0x100:"0A020100"
69+
70+
ASN.1 Write enum 32767
71+
mbedtls_asn1_write_enum:0x7fff:"0A027fff"
72+
73+
ASN.1 Write enum 32768
74+
mbedtls_asn1_write_enum:0x8000:"0A03008000"
75+
76+
ASN.1 Write enum 65535
77+
mbedtls_asn1_write_enum:0xffff:"0A0300ffff"
78+
79+
ASN.1 Write enum 65536
80+
mbedtls_asn1_write_enum:0x10000:"0A03010000"
81+
82+
ASN.1 Write enum 8388607
83+
mbedtls_asn1_write_enum:0x7fffff:"0A037fffff"
84+
85+
ASN.1 Write enum 8388608
86+
mbedtls_asn1_write_enum:0x800000:"0A0400800000"
87+
88+
ASN.1 Write enum 0x12345678
89+
mbedtls_asn1_write_enum:0x12345678:"0A0412345678"
90+
91+
ASN.1 Write enum 2147483647
92+
mbedtls_asn1_write_enum:0x7fffffff:"0A047fffffff"
93+
5294
#ASN.1 Write mpi 0
5395
#mbedtls_asn1_write_mpi:"00":"020100"
5496

tests/suites/test_suite_asn1write.function

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,27 @@ exit:
117117
}
118118
/* END_CASE */
119119

120+
121+
/* BEGIN_CASE */
122+
void mbedtls_asn1_write_enum( int val, data_t *expected )
123+
{
124+
generic_write_data_t data = { NULL, NULL, NULL, NULL, 0 };
125+
int ret;
126+
127+
for( data.size = 0; data.size < expected->len + 1; data.size++ )
128+
{
129+
if( ! generic_write_start_step( &data ) )
130+
goto exit;
131+
ret = mbedtls_asn1_write_enum( &data.p, data.start, val );
132+
if( ! generic_write_finish_step( &data, expected, ret ) )
133+
goto exit;
134+
}
135+
136+
exit:
137+
mbedtls_free( data.output );
138+
}
139+
/* END_CASE */
140+
120141
/* BEGIN_CASE depends_on:MBEDTLS_BIGNUM_C */
121142
void mbedtls_asn1_write_mpi( data_t *val, data_t *expected )
122143
{

0 commit comments

Comments
 (0)