blob: 7dfc16217ed4c6546a75aab85020bd08d49d3ddf [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;
117 }
118
119exit:
120 mbedtls_mpi_free( &mpi );
121 mbedtls_free( data.output );
122}
123/* END_CASE */
124
125/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +0100126void mbedtls_asn1_write_octet_string( data_t * str, data_t * asn1,
Azim Khanf1aaec92017-05-30 14:23:15 +0100127 int buf_len, int result )
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +0200128{
129 int ret;
130 unsigned char buf[150];
Azim Khan90791702017-05-30 00:57:11 +0100131 size_t i;
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +0200132 unsigned char *p;
133
134 memset( buf, GUARD_VAL, sizeof( buf ) );
135
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +0200136
137 p = buf + GUARD_LEN + buf_len;
138
Azim Khand30ca132017-06-09 04:32:58 +0100139 ret = mbedtls_asn1_write_octet_string( &p, buf + GUARD_LEN, str->x, str->len );
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +0200140
141 /* Check for buffer overwrite on both sides */
142 for( i = 0; i < GUARD_LEN; i++ )
143 {
144 TEST_ASSERT( buf[i] == GUARD_VAL );
145 TEST_ASSERT( buf[GUARD_LEN + buf_len + i] == GUARD_VAL );
146 }
147
148 if( result >= 0 )
149 {
Azim Khand30ca132017-06-09 04:32:58 +0100150 TEST_ASSERT( (size_t) ret == asn1->len );
151 TEST_ASSERT( p + asn1->len == buf + GUARD_LEN + buf_len );
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +0200152
Azim Khand30ca132017-06-09 04:32:58 +0100153 TEST_ASSERT( memcmp( p, asn1->x, asn1->len ) == 0 );
Manuel Pégourié-Gonnard36178ff2014-05-29 14:26:03 +0200154 }
155}
156/* END_CASE */
Manuel Pégourié-Gonnardc22bb492014-05-29 17:16:45 +0200157
158/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +0100159void mbedtls_asn1_write_ia5_string( char * str, data_t * asn1,
Azim Khand30ca132017-06-09 04:32:58 +0100160 int buf_len, int result )
Manuel Pégourié-Gonnardc22bb492014-05-29 17:16:45 +0200161{
162 int ret;
163 unsigned char buf[150];
Azim Khan90791702017-05-30 00:57:11 +0100164 size_t str_len;
Azim Khan90791702017-05-30 00:57:11 +0100165 size_t i;
Manuel Pégourié-Gonnardc22bb492014-05-29 17:16:45 +0200166 unsigned char *p;
167
168 memset( buf, GUARD_VAL, sizeof( buf ) );
169
170 str_len = strlen( str );
Manuel Pégourié-Gonnardc22bb492014-05-29 17:16:45 +0200171
172 p = buf + GUARD_LEN + buf_len;
173
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200174 ret = mbedtls_asn1_write_ia5_string( &p, buf + GUARD_LEN, str, str_len );
Manuel Pégourié-Gonnardc22bb492014-05-29 17:16:45 +0200175
176 /* Check for buffer overwrite on both sides */
177 for( i = 0; i < GUARD_LEN; i++ )
178 {
179 TEST_ASSERT( buf[i] == GUARD_VAL );
180 TEST_ASSERT( buf[GUARD_LEN + buf_len + i] == GUARD_VAL );
181 }
182
183 if( result >= 0 )
184 {
Azim Khand30ca132017-06-09 04:32:58 +0100185 TEST_ASSERT( (size_t) ret == asn1->len );
186 TEST_ASSERT( p + asn1->len == buf + GUARD_LEN + buf_len );
Manuel Pégourié-Gonnardc22bb492014-05-29 17:16:45 +0200187
Azim Khand30ca132017-06-09 04:32:58 +0100188 TEST_ASSERT( memcmp( p, asn1->x, asn1->len ) == 0 );
Manuel Pégourié-Gonnardc22bb492014-05-29 17:16:45 +0200189 }
190}
191/* END_CASE */
Paul Bakkere325db92016-07-14 10:27:36 +0100192
Hanno Becker0fbbc642018-10-16 13:48:23 +0100193/* BEGIN_CASE depends_on:MBEDTLS_ASN1PARSE_C */
Azim Khan5fcca462018-06-29 11:05:32 +0100194void mbedtls_asn1_write_len( int len, data_t * asn1, int buf_len,
Azim Khand30ca132017-06-09 04:32:58 +0100195 int result )
Paul Bakkere325db92016-07-14 10:27:36 +0100196{
197 int ret;
198 unsigned char buf[150];
Paul Bakkere325db92016-07-14 10:27:36 +0100199 unsigned char *p;
Azim Khan90791702017-05-30 00:57:11 +0100200 size_t i;
201 size_t read_len;
Paul Bakkere325db92016-07-14 10:27:36 +0100202
203 memset( buf, GUARD_VAL, sizeof( buf ) );
Paul Bakkere325db92016-07-14 10:27:36 +0100204
Paul Bakker58bfb832016-07-14 11:02:31 +0100205 p = buf + GUARD_LEN + buf_len;
Paul Bakkere325db92016-07-14 10:27:36 +0100206
207 ret = mbedtls_asn1_write_len( &p, buf + GUARD_LEN, (size_t) len );
208
209 TEST_ASSERT( ret == result );
210
211 /* Check for buffer overwrite on both sides */
212 for( i = 0; i < GUARD_LEN; i++ )
213 {
214 TEST_ASSERT( buf[i] == GUARD_VAL );
Paul Bakker58bfb832016-07-14 11:02:31 +0100215 TEST_ASSERT( buf[GUARD_LEN + buf_len + i] == GUARD_VAL );
Paul Bakkere325db92016-07-14 10:27:36 +0100216 }
217
218 if( result >= 0 )
219 {
Azim Khand30ca132017-06-09 04:32:58 +0100220 TEST_ASSERT( p + asn1->len == buf + GUARD_LEN + buf_len );
Paul Bakkere325db92016-07-14 10:27:36 +0100221
Azim Khand30ca132017-06-09 04:32:58 +0100222 TEST_ASSERT( memcmp( p, asn1->x, asn1->len ) == 0 );
Paul Bakker5e8b77c2016-07-14 11:14:54 +0100223
224 /* Read back with mbedtls_asn1_get_len() to check */
225 ret = mbedtls_asn1_get_len( &p, buf + GUARD_LEN + buf_len, &read_len );
226
227 if( len == 0 )
228 {
229 TEST_ASSERT( ret == 0 );
230 }
231 else
232 {
233 /* Return will be MBEDTLS_ERR_ASN1_OUT_OF_DATA because the rest of
234 * the buffer is missing
235 */
236 TEST_ASSERT( ret == MBEDTLS_ERR_ASN1_OUT_OF_DATA );
237 }
238 TEST_ASSERT( read_len == (size_t) len );
239 TEST_ASSERT( p == buf + GUARD_LEN + buf_len );
Paul Bakkere325db92016-07-14 10:27:36 +0100240 }
241}
242/* END_CASE */
Andres Amaya Garcia5d261632018-09-26 10:51:16 +0100243
244/* BEGIN_CASE */
245void test_asn1_write_bitstrings( data_t *bitstring, int bits,
246 data_t *expected_asn1, int result,
247 int is_named )
248{
249 int ret;
250 size_t i;
251 unsigned char buf[150];
252 unsigned char *p;
253
254 memset( buf, GUARD_VAL, sizeof( buf ) );
255
256 p = buf + GUARD_LEN + expected_asn1->len;
257
258 if ( is_named == 0 )
259 {
260 ret = mbedtls_asn1_write_bitstring( &p,
261 buf,
262 (unsigned char *)bitstring->x,
263 (size_t) bits );
264 }
265 else
266 {
267 ret = mbedtls_asn1_write_named_bitstring( &p,
268 buf,
269 (unsigned char *)bitstring->x,
270 (size_t) bits );
271 }
272 TEST_ASSERT( ret == result );
273
274 /* Check for buffer overwrite on both sides */
275 for( i = 0; i < GUARD_LEN; i++ )
276 {
277 TEST_ASSERT( buf[i] == GUARD_VAL );
278 TEST_ASSERT( buf[GUARD_LEN + expected_asn1->len + i] == GUARD_VAL );
279 }
280
281 if ( result >= 0 )
282 {
283 TEST_ASSERT( memcmp( p, expected_asn1->x, expected_asn1->len ) == 0 );
284 }
285}
286/* END_CASE */