blob: 1669ca86d51435db1fd24b1f3f4bdf7ce47390fd [file] [log] [blame]
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/asn1write.h"
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +02003
4#define GUARD_LEN 4
5#define GUARD_VAL 0x2a
Gilles Peskine3a032c32019-03-01 18:13:36 +01006
7typedef struct
8{
9 unsigned char *output;
10 unsigned char *start;
11 unsigned char *end;
12 unsigned char *p;
13 size_t size;
14} generic_write_data_t;
15
16int generic_write_start_step( generic_write_data_t *data )
17{
18 test_set_step( data->size );
19 ASSERT_ALLOC( data->output, data->size == 0 ? 1 : data->size );
20 data->end = data->output + data->size;
21 data->p = data->end;
22 data->start = data->end - data->size;
23 return( 1 );
24exit:
25 return( 0 );
26}
27
28int generic_write_finish_step( generic_write_data_t *data,
29 const data_t *expected, int ret )
30{
31 int ok = 0;
32
33 if( data->size < expected->len )
34 {
35 TEST_EQUAL( ret, MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
36 }
37 else
38 {
39 TEST_EQUAL( ret, data->end - data->p );
40 TEST_ASSERT( data->p >= data->start );
41 TEST_ASSERT( data->p <= data->end );
42 ASSERT_COMPARE( data->p, (size_t)( data->end - data->p ),
43 expected->x, expected->len );
44 }
45 ok = 1;
46
47exit:
48 mbedtls_free( data->output );
49 data->output = NULL;
50 return( ok );
51}
52
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +020053/* END_HEADER */
54
55/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020056 * depends_on:MBEDTLS_ASN1_WRITE_C
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +020057 * END_DEPENDENCIES
58 */
59
60/* BEGIN_CASE */
Gilles Peskine3a032c32019-03-01 18:13:36 +010061void mbedtls_asn1_write_bool( int val, data_t *expected )
62{
63 generic_write_data_t data = { NULL, NULL, NULL, NULL, 0 };
64 int ret;
65
66 for( data.size = 0; data.size < expected->len + 1; data.size++ )
67 {
68 if( ! generic_write_start_step( &data ) )
69 goto exit;
70 ret = mbedtls_asn1_write_bool( &data.p, data.start, val );
71 if( ! generic_write_finish_step( &data, expected, ret ) )
72 goto exit;
73 }
74
75exit:
76 mbedtls_free( data.output );
77}
78/* END_CASE */
79
80/* BEGIN_CASE */
81void mbedtls_asn1_write_int( int val, data_t *expected )
82{
83 generic_write_data_t data = { NULL, NULL, NULL, NULL, 0 };
84 int ret;
85
86 for( data.size = 0; data.size < expected->len + 1; data.size++ )
87 {
88 if( ! generic_write_start_step( &data ) )
89 goto exit;
90 ret = mbedtls_asn1_write_int( &data.p, data.start, val );
91 if( ! generic_write_finish_step( &data, expected, ret ) )
92 goto exit;
93 }
94
95exit:
96 mbedtls_free( data.output );
97}
98/* END_CASE */
99
100/* BEGIN_CASE depends_on:MBEDTLS_BIGNUM_C */
101void mbedtls_asn1_write_mpi( data_t *val, data_t *expected )
102{
103 generic_write_data_t data = { NULL, NULL, NULL, NULL, 0 };
104 mbedtls_mpi mpi;
105 int ret;
106
107 mbedtls_mpi_init( &mpi );
108 TEST_ASSERT( mbedtls_mpi_read_binary( &mpi, val->x, val->len ) == 0 );
109
110 for( data.size = 0; data.size < expected->len + 1; data.size++ )
111 {
112 if( ! generic_write_start_step( &data ) )
113 goto exit;
114 ret = mbedtls_asn1_write_mpi( &data.p, data.start, &mpi );
115 if( ! generic_write_finish_step( &data, expected, ret ) )
116 goto exit;
Gilles Peskine3f37dca2019-03-01 19:30:20 +0100117 if( expected->len > 10 && data.size == 8 )
118 data.size = expected->len - 2;
Gilles Peskine3a032c32019-03-01 18:13:36 +0100119 }
120
121exit:
122 mbedtls_mpi_free( &mpi );
123 mbedtls_free( data.output );
124}
125/* END_CASE */
126
127/* BEGIN_CASE */
Gilles Peskine3f37dca2019-03-01 19:30:20 +0100128void mbedtls_asn1_write_string( int tag, data_t *content, data_t *expected )
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +0200129{
Gilles Peskine3f37dca2019-03-01 19:30:20 +0100130 generic_write_data_t data = { NULL, NULL, NULL, NULL, 0 };
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +0200131 int ret;
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +0200132
Gilles Peskine3f37dca2019-03-01 19:30:20 +0100133 for( data.size = 0; data.size < expected->len + 1; data.size++ )
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +0200134 {
Gilles Peskine3f37dca2019-03-01 19:30:20 +0100135 if( ! generic_write_start_step( &data ) )
136 goto exit;
137 switch( tag )
138 {
139 case MBEDTLS_ASN1_OCTET_STRING:
140 ret = mbedtls_asn1_write_octet_string(
141 &data.p, data.start, content->x, content->len );
142 break;
143 case MBEDTLS_ASN1_UTF8_STRING:
144 ret = mbedtls_asn1_write_utf8_string(
145 &data.p, data.start,
146 (const char *) content->x, content->len );
147 break;
148 case MBEDTLS_ASN1_PRINTABLE_STRING:
149 ret = mbedtls_asn1_write_printable_string(
150 &data.p, data.start,
151 (const char *) content->x, content->len );
152 break;
153 case MBEDTLS_ASN1_IA5_STRING:
154 ret = mbedtls_asn1_write_ia5_string(
155 &data.p, data.start,
156 (const char *) content->x, content->len );
157 break;
158 default:
159 ret = mbedtls_asn1_write_tagged_string(
160 &data.p, data.start, tag,
161 (const char *) content->x, content->len );
162 }
163 if( ! generic_write_finish_step( &data, expected, ret ) )
164 goto exit;
165 if( expected->len > 10 && data.size == 8 )
166 data.size = expected->len - 2;
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +0200167 }
168
Gilles Peskine3f37dca2019-03-01 19:30:20 +0100169exit:
170 mbedtls_free( data.output );
Manuel Pégourié-Gonnardc22bb492014-05-29 17:16:45 +0200171}
172/* END_CASE */
Paul Bakkere325db92016-07-14 10:27:36 +0100173
Hanno Becker0fbbc642018-10-16 13:48:23 +0100174/* BEGIN_CASE depends_on:MBEDTLS_ASN1PARSE_C */
Azim Khan5fcca462018-06-29 11:05:32 +0100175void mbedtls_asn1_write_len( int len, data_t * asn1, int buf_len,
Azim Khand30ca132017-06-09 04:32:58 +0100176 int result )
Paul Bakkere325db92016-07-14 10:27:36 +0100177{
178 int ret;
179 unsigned char buf[150];
Paul Bakkere325db92016-07-14 10:27:36 +0100180 unsigned char *p;
Azim Khan90791702017-05-30 00:57:11 +0100181 size_t i;
182 size_t read_len;
Paul Bakkere325db92016-07-14 10:27:36 +0100183
184 memset( buf, GUARD_VAL, sizeof( buf ) );
Paul Bakkere325db92016-07-14 10:27:36 +0100185
Paul Bakker58bfb832016-07-14 11:02:31 +0100186 p = buf + GUARD_LEN + buf_len;
Paul Bakkere325db92016-07-14 10:27:36 +0100187
188 ret = mbedtls_asn1_write_len( &p, buf + GUARD_LEN, (size_t) len );
189
190 TEST_ASSERT( ret == result );
191
192 /* Check for buffer overwrite on both sides */
193 for( i = 0; i < GUARD_LEN; i++ )
194 {
195 TEST_ASSERT( buf[i] == GUARD_VAL );
Paul Bakker58bfb832016-07-14 11:02:31 +0100196 TEST_ASSERT( buf[GUARD_LEN + buf_len + i] == GUARD_VAL );
Paul Bakkere325db92016-07-14 10:27:36 +0100197 }
198
199 if( result >= 0 )
200 {
Azim Khand30ca132017-06-09 04:32:58 +0100201 TEST_ASSERT( p + asn1->len == buf + GUARD_LEN + buf_len );
Paul Bakkere325db92016-07-14 10:27:36 +0100202
Azim Khand30ca132017-06-09 04:32:58 +0100203 TEST_ASSERT( memcmp( p, asn1->x, asn1->len ) == 0 );
Paul Bakker5e8b77c2016-07-14 11:14:54 +0100204
205 /* Read back with mbedtls_asn1_get_len() to check */
206 ret = mbedtls_asn1_get_len( &p, buf + GUARD_LEN + buf_len, &read_len );
207
208 if( len == 0 )
209 {
210 TEST_ASSERT( ret == 0 );
211 }
212 else
213 {
214 /* Return will be MBEDTLS_ERR_ASN1_OUT_OF_DATA because the rest of
215 * the buffer is missing
216 */
217 TEST_ASSERT( ret == MBEDTLS_ERR_ASN1_OUT_OF_DATA );
218 }
219 TEST_ASSERT( read_len == (size_t) len );
220 TEST_ASSERT( p == buf + GUARD_LEN + buf_len );
Paul Bakkere325db92016-07-14 10:27:36 +0100221 }
222}
223/* END_CASE */
Andres Amaya Garcia5d261632018-09-26 10:51:16 +0100224
225/* BEGIN_CASE */
226void test_asn1_write_bitstrings( data_t *bitstring, int bits,
Gilles Peskine3f37dca2019-03-01 19:30:20 +0100227 data_t *expected, int is_named )
Andres Amaya Garcia5d261632018-09-26 10:51:16 +0100228{
Gilles Peskine3f37dca2019-03-01 19:30:20 +0100229 generic_write_data_t data = { NULL, NULL, NULL, NULL, 0 };
Andres Amaya Garcia5d261632018-09-26 10:51:16 +0100230 int ret;
Gilles Peskine3f37dca2019-03-01 19:30:20 +0100231 int ( *func )( unsigned char **p, unsigned char *start,
232 const unsigned char *buf, size_t bits ) =
233 ( is_named ? mbedtls_asn1_write_named_bitstring :
234 mbedtls_asn1_write_bitstring );
Andres Amaya Garcia5d261632018-09-26 10:51:16 +0100235
Gilles Peskine3f37dca2019-03-01 19:30:20 +0100236 for( data.size = 0; data.size < expected->len + 1; data.size++ )
Andres Amaya Garcia5d261632018-09-26 10:51:16 +0100237 {
Gilles Peskine3f37dca2019-03-01 19:30:20 +0100238 if( ! generic_write_start_step( &data ) )
239 goto exit;
240 ret = ( *func )( &data.p, data.start, bitstring->x, bits );
241 if( ! generic_write_finish_step( &data, expected, ret ) )
242 goto exit;
Andres Amaya Garcia5d261632018-09-26 10:51:16 +0100243 }
244
Gilles Peskine3f37dca2019-03-01 19:30:20 +0100245exit:
246 mbedtls_free( data.output );
Andres Amaya Garcia5d261632018-09-26 10:51:16 +0100247}
248/* END_CASE */