• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* BEGIN_HEADER */
2#include "mbedtls/asn1write.h"
3
4#define GUARD_LEN 4
5#define GUARD_VAL 0x2a
6/* END_HEADER */
7
8/* BEGIN_DEPENDENCIES
9 * depends_on:MBEDTLS_ASN1_WRITE_C
10 * END_DEPENDENCIES
11 */
12
13/* BEGIN_CASE */
14void mbedtls_asn1_write_octet_string( data_t * str, data_t * asn1,
15                                      int buf_len, int result )
16{
17    int ret;
18    unsigned char buf[150];
19    size_t i;
20    unsigned char *p;
21
22    memset( buf, GUARD_VAL, sizeof( buf ) );
23
24
25    p = buf + GUARD_LEN + buf_len;
26
27    ret = mbedtls_asn1_write_octet_string( &p, buf + GUARD_LEN, str->x, str->len );
28
29    /* Check for buffer overwrite on both sides */
30    for( i = 0; i < GUARD_LEN; i++ )
31    {
32        TEST_ASSERT( buf[i] == GUARD_VAL );
33        TEST_ASSERT( buf[GUARD_LEN + buf_len + i] == GUARD_VAL );
34    }
35
36    if( result >= 0 )
37    {
38        TEST_ASSERT( (size_t) ret == asn1->len );
39        TEST_ASSERT( p + asn1->len == buf + GUARD_LEN + buf_len );
40
41        TEST_ASSERT( memcmp( p, asn1->x, asn1->len ) == 0 );
42    }
43}
44/* END_CASE */
45
46/* BEGIN_CASE */
47void mbedtls_asn1_write_ia5_string( char * str, data_t * asn1,
48                                    int buf_len, int result )
49{
50    int ret;
51    unsigned char buf[150];
52    size_t str_len;
53    size_t i;
54    unsigned char *p;
55
56    memset( buf, GUARD_VAL, sizeof( buf ) );
57
58    str_len = strlen( str );
59
60    p = buf + GUARD_LEN + buf_len;
61
62    ret = mbedtls_asn1_write_ia5_string( &p, buf + GUARD_LEN, str, str_len );
63
64    /* Check for buffer overwrite on both sides */
65    for( i = 0; i < GUARD_LEN; i++ )
66    {
67        TEST_ASSERT( buf[i] == GUARD_VAL );
68        TEST_ASSERT( buf[GUARD_LEN + buf_len + i] == GUARD_VAL );
69    }
70
71    if( result >= 0 )
72    {
73        TEST_ASSERT( (size_t) ret == asn1->len );
74        TEST_ASSERT( p + asn1->len == buf + GUARD_LEN + buf_len );
75
76        TEST_ASSERT( memcmp( p, asn1->x, asn1->len ) == 0 );
77    }
78}
79/* END_CASE */
80
81/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */
82void mbedtls_asn1_write_len( int len, data_t * asn1, int buf_len,
83                             int result )
84{
85    int ret;
86    unsigned char buf[150];
87    unsigned char *p;
88    size_t i;
89    size_t read_len;
90
91    memset( buf, GUARD_VAL, sizeof( buf ) );
92
93    p = buf + GUARD_LEN + buf_len;
94
95    ret = mbedtls_asn1_write_len( &p, buf + GUARD_LEN, (size_t) len );
96
97    TEST_ASSERT( ret == result );
98
99    /* Check for buffer overwrite on both sides */
100    for( i = 0; i < GUARD_LEN; i++ )
101    {
102        TEST_ASSERT( buf[i] == GUARD_VAL );
103        TEST_ASSERT( buf[GUARD_LEN + buf_len + i] == GUARD_VAL );
104    }
105
106    if( result >= 0 )
107    {
108        TEST_ASSERT( p + asn1->len == buf + GUARD_LEN + buf_len );
109
110        TEST_ASSERT( memcmp( p, asn1->x, asn1->len ) == 0 );
111
112        /* Read back with mbedtls_asn1_get_len() to check */
113        ret = mbedtls_asn1_get_len( &p, buf + GUARD_LEN + buf_len, &read_len );
114
115        if( len == 0 )
116        {
117            TEST_ASSERT( ret == 0 );
118        }
119        else
120        {
121            /* Return will be MBEDTLS_ERR_ASN1_OUT_OF_DATA because the rest of
122             * the buffer is missing
123             */
124            TEST_ASSERT( ret == MBEDTLS_ERR_ASN1_OUT_OF_DATA );
125        }
126        TEST_ASSERT( read_len == (size_t) len );
127        TEST_ASSERT( p == buf + GUARD_LEN + buf_len );
128    }
129}
130/* END_CASE */
131