blob: 58cedc13c47d04b8febdf3f939fae396a9119508 [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/ecdsa.h"
Paul Bakker33b43f12013-08-20 11:48:36 +02003/* END_HEADER */
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +01004
Paul Bakker33b43f12013-08-20 11:48:36 +02005/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006 * depends_on:MBEDTLS_ECDSA_C
Paul Bakker33b43f12013-08-20 11:48:36 +02007 * END_DEPENDENCIES
8 */
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +01009
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050010/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
11void ecdsa_invalid_param( )
12{
13 mbedtls_ecdsa_context ctx;
14 mbedtls_ecp_keypair key;
15 mbedtls_ecp_group grp;
16 mbedtls_ecp_group_id valid_group = MBEDTLS_ECP_DP_SECP192R1;
17 mbedtls_ecp_point P;
18 mbedtls_md_type_t valid_md = MBEDTLS_MD_SHA256;
19 mbedtls_mpi m;
20 size_t slen;
21 unsigned char buf[42] = { 0 };
22
23 TEST_INVALID_PARAM( mbedtls_ecdsa_init( NULL ) );
24 TEST_VALID_PARAM( mbedtls_ecdsa_free( NULL ) );
25
26#if defined(MBEDTLS_ECP_RESTARTABLE)
27 TEST_INVALID_PARAM( mbedtls_ecdsa_restart_init( NULL ) );
28 TEST_VALID_PARAM( mbedtls_ecdsa_restart_free( NULL ) );
29#endif /* MBEDTLS_ECP_RESTARTABLE */
30
31 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
32 mbedtls_ecdsa_sign( NULL, &m, &m, &m,
33 buf, sizeof( buf ),
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020034 mbedtls_test_rnd_std_rand,
35 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050036 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
37 mbedtls_ecdsa_sign( &grp, NULL, &m, &m,
38 buf, sizeof( buf ),
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020039 mbedtls_test_rnd_std_rand,
40 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050041 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
42 mbedtls_ecdsa_sign( &grp, &m, NULL, &m,
43 buf, sizeof( buf ),
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020044 mbedtls_test_rnd_std_rand,
45 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050046 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
47 mbedtls_ecdsa_sign( &grp, &m, &m, NULL,
48 buf, sizeof( buf ),
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020049 mbedtls_test_rnd_std_rand,
50 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050051 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
52 mbedtls_ecdsa_sign( &grp, &m, &m, &m,
53 NULL, sizeof( buf ),
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020054 mbedtls_test_rnd_std_rand,
55 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050056 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
57 mbedtls_ecdsa_sign( &grp, &m, &m, &m,
58 buf, sizeof( buf ),
59 NULL, NULL ) );
60
61#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
62 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Janos Follath651eac82019-01-04 15:51:24 +000063 mbedtls_ecdsa_sign_det_ext( NULL, &m, &m, &m,
64 buf, sizeof( buf ),
65 valid_md,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020066 mbedtls_test_rnd_std_rand,
67 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050068 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Janos Follath651eac82019-01-04 15:51:24 +000069 mbedtls_ecdsa_sign_det_ext( &grp, NULL, &m, &m,
70 buf, sizeof( buf ),
71 valid_md,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020072 mbedtls_test_rnd_std_rand,
73 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050074 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Janos Follath651eac82019-01-04 15:51:24 +000075 mbedtls_ecdsa_sign_det_ext( &grp, &m, NULL, &m,
76 buf, sizeof( buf ),
77 valid_md,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020078 mbedtls_test_rnd_std_rand,
79 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050080 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Janos Follath651eac82019-01-04 15:51:24 +000081 mbedtls_ecdsa_sign_det_ext( &grp, &m, &m, NULL,
82 buf, sizeof( buf ),
83 valid_md,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020084 mbedtls_test_rnd_std_rand,
85 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050086 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Janos Follath651eac82019-01-04 15:51:24 +000087 mbedtls_ecdsa_sign_det_ext( &grp, &m, &m, &m,
88 NULL, sizeof( buf ),
89 valid_md,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020090 mbedtls_test_rnd_std_rand,
91 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050092#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
93
94 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
95 mbedtls_ecdsa_verify( NULL,
96 buf, sizeof( buf ),
97 &P, &m, &m ) );
98 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
99 mbedtls_ecdsa_verify( &grp,
100 NULL, sizeof( buf ),
101 &P, &m, &m ) );
102 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
103 mbedtls_ecdsa_verify( &grp,
104 buf, sizeof( buf ),
105 NULL, &m, &m ) );
106 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
107 mbedtls_ecdsa_verify( &grp,
108 buf, sizeof( buf ),
109 &P, NULL, &m ) );
110 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
111 mbedtls_ecdsa_verify( &grp,
112 buf, sizeof( buf ),
113 &P, &m, NULL ) );
114
115 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200116 mbedtls_ecdsa_write_signature( NULL, valid_md, buf, sizeof( buf ),
117 buf, &slen, mbedtls_test_rnd_std_rand,
118 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500119
120 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200121 mbedtls_ecdsa_write_signature( &ctx, valid_md, NULL, sizeof( buf ),
122 buf, &slen, mbedtls_test_rnd_std_rand,
123 NULL ) );
124
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500125 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200126 mbedtls_ecdsa_write_signature( &ctx, valid_md, buf, sizeof( buf ),
127 NULL, &slen, mbedtls_test_rnd_std_rand,
128 NULL ) );
129
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500130 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200131 mbedtls_ecdsa_write_signature( &ctx, valid_md, buf, sizeof( buf ),
132 buf, NULL, mbedtls_test_rnd_std_rand,
133 NULL ) );
134
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500135 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200136 mbedtls_ecdsa_write_signature_restartable( NULL, valid_md, buf,
137 sizeof( buf ), buf, &slen,
138 mbedtls_test_rnd_std_rand,
139 NULL, NULL ) );
140
141 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
142 mbedtls_ecdsa_write_signature_restartable( &ctx, valid_md, NULL,
143 sizeof( buf ), buf, &slen,
144 mbedtls_test_rnd_std_rand,
145 NULL, NULL ) );
146
147 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
148 mbedtls_ecdsa_write_signature_restartable( &ctx, valid_md, buf,
149 sizeof( buf ), NULL, &slen,
150 mbedtls_test_rnd_std_rand,
151 NULL, NULL ) );
152
153 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
154 mbedtls_ecdsa_write_signature_restartable( &ctx, valid_md, buf,
155 sizeof( buf ), buf, NULL,
156 mbedtls_test_rnd_std_rand,
157 NULL, NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500158
159 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
160 mbedtls_ecdsa_read_signature( NULL,
161 buf, sizeof( buf ),
162 buf, sizeof( buf ) ) );
163 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
164 mbedtls_ecdsa_read_signature( &ctx,
165 NULL, sizeof( buf ),
166 buf, sizeof( buf ) ) );
167 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
168 mbedtls_ecdsa_read_signature( &ctx,
169 buf, sizeof( buf ),
170 NULL, sizeof( buf ) ) );
171
172 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
173 mbedtls_ecdsa_read_signature_restartable( NULL,
174 buf, sizeof( buf ),
175 buf, sizeof( buf ),
176 NULL ) );
177 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
178 mbedtls_ecdsa_read_signature_restartable( &ctx,
179 NULL, sizeof( buf ),
180 buf, sizeof( buf ),
181 NULL ) );
182 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
183 mbedtls_ecdsa_read_signature_restartable( &ctx,
184 buf, sizeof( buf ),
185 NULL, sizeof( buf ),
186 NULL ) );
187
188 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
189 mbedtls_ecdsa_genkey( NULL, valid_group,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200190 mbedtls_test_rnd_std_rand,
191 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500192 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
193 mbedtls_ecdsa_genkey( &ctx, valid_group,
194 NULL, NULL ) );
195
196
197 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
198 mbedtls_ecdsa_from_keypair( NULL, &key ) );
199 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
200 mbedtls_ecdsa_from_keypair( &ctx, NULL ) );
201
202exit:
203 return;
204}
205/* END_CASE */
206
Paul Bakker33b43f12013-08-20 11:48:36 +0200207/* BEGIN_CASE */
TRodziewicz40de3c92021-04-07 19:16:18 +0200208void ecdsa_prim_zero( int id )
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100209{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200210 mbedtls_ecp_group grp;
211 mbedtls_ecp_point Q;
212 mbedtls_mpi d, r, s;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200213 mbedtls_test_rnd_pseudo_info rnd_info;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500214 unsigned char buf[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100215
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200216 mbedtls_ecp_group_init( &grp );
217 mbedtls_ecp_point_init( &Q );
218 mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
Ronald Cron351f0ee2020-06-10 12:12:18 +0200219 memset( &rnd_info, 0x00, sizeof( mbedtls_test_rnd_pseudo_info ) );
Manuel Pégourié-Gonnard450a1632013-01-27 09:08:18 +0100220 memset( buf, 0, sizeof( buf ) );
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100221
TRodziewicz40de3c92021-04-07 19:16:18 +0200222 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
223 TEST_ASSERT( mbedtls_ecp_gen_keypair( &grp, &d, &Q,
224 &mbedtls_test_rnd_pseudo_rand,
225 &rnd_info ) == 0 );
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100226
TRodziewicz40de3c92021-04-07 19:16:18 +0200227 TEST_ASSERT( mbedtls_ecdsa_sign( &grp, &r, &s, &d, buf, sizeof( buf ),
228 &mbedtls_test_rnd_pseudo_rand,
229 &rnd_info ) == 0 );
230 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, buf, sizeof( buf ), &Q, &r, &s ) == 0 );
TRodziewicz5feb6702021-04-06 19:55:17 +0200231
TRodziewicz40de3c92021-04-07 19:16:18 +0200232exit:
233 mbedtls_ecp_group_free( &grp );
234 mbedtls_ecp_point_free( &Q );
235 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
236}
237/* END_CASE */
238
239/* BEGIN_CASE */
240void ecdsa_prim_random( int id )
241{
242 mbedtls_ecp_group grp;
243 mbedtls_ecp_point Q;
244 mbedtls_mpi d, r, s;
245 mbedtls_test_rnd_pseudo_info rnd_info;
246 unsigned char buf[MBEDTLS_MD_MAX_SIZE];
247
248 mbedtls_ecp_group_init( &grp );
249 mbedtls_ecp_point_init( &Q );
250 mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
251 memset( &rnd_info, 0x00, sizeof( mbedtls_test_rnd_pseudo_info ) );
252 memset( buf, 0, sizeof( buf ) );
253
254 /* prepare material for signature */
255 TEST_ASSERT( mbedtls_test_rnd_pseudo_rand( &rnd_info,
256 buf, sizeof( buf ) ) == 0 );
257 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
258 TEST_ASSERT( mbedtls_ecp_gen_keypair( &grp, &d, &Q,
259 &mbedtls_test_rnd_pseudo_rand,
260 &rnd_info ) == 0 );
261
262 TEST_ASSERT( mbedtls_ecdsa_sign( &grp, &r, &s, &d, buf, sizeof( buf ),
263 &mbedtls_test_rnd_pseudo_rand,
264 &rnd_info ) == 0 );
265 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, buf, sizeof( buf ), &Q, &r, &s ) == 0 );
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100266
Paul Bakkerbd51b262014-07-10 15:26:12 +0200267exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200268 mbedtls_ecp_group_free( &grp );
269 mbedtls_ecp_point_free( &Q );
270 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100271}
Paul Bakker33b43f12013-08-20 11:48:36 +0200272/* END_CASE */
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100273
Paul Bakker33b43f12013-08-20 11:48:36 +0200274/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100275void ecdsa_prim_test_vectors( int id, char * d_str, char * xQ_str,
Azim Khan5fcca462018-06-29 11:05:32 +0100276 char * yQ_str, data_t * rnd_buf,
277 data_t * hash, char * r_str, char * s_str,
Azim Khanf1aaec92017-05-30 14:23:15 +0100278 int result )
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100279{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200280 mbedtls_ecp_group grp;
281 mbedtls_ecp_point Q;
282 mbedtls_mpi d, r, s, r_check, s_check;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200283 mbedtls_test_rnd_buf_info rnd_info;
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100284
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200285 mbedtls_ecp_group_init( &grp );
286 mbedtls_ecp_point_init( &Q );
287 mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
288 mbedtls_mpi_init( &r_check ); mbedtls_mpi_init( &s_check );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100289
Manuel Pégourié-Gonnarde3a062b2015-05-11 18:46:47 +0200290 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200291 TEST_ASSERT( mbedtls_ecp_point_read_string( &Q, 16, xQ_str, yQ_str ) == 0 );
292 TEST_ASSERT( mbedtls_mpi_read_string( &d, 16, d_str ) == 0 );
293 TEST_ASSERT( mbedtls_mpi_read_string( &r_check, 16, r_str ) == 0 );
294 TEST_ASSERT( mbedtls_mpi_read_string( &s_check, 16, s_str ) == 0 );
Azim Khand30ca132017-06-09 04:32:58 +0100295 rnd_info.buf = rnd_buf->x;
296 rnd_info.length = rnd_buf->len;
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100297
Azim Khand30ca132017-06-09 04:32:58 +0100298 /* Fix rnd_buf->x by shifting it left if necessary */
Manuel Pégourié-Gonnardfae079e2014-01-06 11:00:07 +0100299 if( grp.nbits % 8 != 0 )
300 {
301 unsigned char shift = 8 - ( grp.nbits % 8 );
302 size_t i;
303
304 for( i = 0; i < rnd_info.length - 1; i++ )
Azim Khand30ca132017-06-09 04:32:58 +0100305 rnd_buf->x[i] = rnd_buf->x[i] << shift | rnd_buf->x[i+1] >> ( 8 - shift );
Manuel Pégourié-Gonnardfae079e2014-01-06 11:00:07 +0100306
Azim Khand30ca132017-06-09 04:32:58 +0100307 rnd_buf->x[rnd_info.length-1] <<= shift;
Manuel Pégourié-Gonnardfae079e2014-01-06 11:00:07 +0100308 }
309
Azim Khand30ca132017-06-09 04:32:58 +0100310 TEST_ASSERT( mbedtls_ecdsa_sign( &grp, &r, &s, &d, hash->x, hash->len,
Ronald Cron351f0ee2020-06-10 12:12:18 +0200311 mbedtls_test_rnd_buffer_rand, &rnd_info ) == result );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100312
Darryl Greenf5bcbed2017-11-17 17:09:31 +0000313 if ( result == 0)
314 {
315 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &r, &r_check ) == 0 );
316 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &s, &s_check ) == 0 );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100317
Azim Khand30ca132017-06-09 04:32:58 +0100318 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q, &r_check, &s_check ) == 0 );
Manuel Pégourié-Gonnardd0a66cc2018-06-13 09:53:21 +0200319
320 TEST_ASSERT( mbedtls_mpi_sub_int( &r, &r, 1 ) == 0 );
321 TEST_ASSERT( mbedtls_mpi_add_int( &s, &s, 1 ) == 0 );
322
Manuel Pégourié-Gonnard125af942018-09-11 11:08:12 +0200323 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, hash->x, hash->len,
Manuel Pégourié-Gonnardd0a66cc2018-06-13 09:53:21 +0200324 &Q, &r, &s_check ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Manuel Pégourié-Gonnard125af942018-09-11 11:08:12 +0200325 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, hash->x, hash->len,
Manuel Pégourié-Gonnardd0a66cc2018-06-13 09:53:21 +0200326 &Q, &r_check, &s ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Manuel Pégourié-Gonnard125af942018-09-11 11:08:12 +0200327 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, hash->x, hash->len,
Manuel Pégourié-Gonnardd0a66cc2018-06-13 09:53:21 +0200328 &grp.G, &r_check, &s_check ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Darryl Greenf5bcbed2017-11-17 17:09:31 +0000329 }
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100330
Paul Bakkerbd51b262014-07-10 15:26:12 +0200331exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200332 mbedtls_ecp_group_free( &grp );
333 mbedtls_ecp_point_free( &Q );
334 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
335 mbedtls_mpi_free( &r_check ); mbedtls_mpi_free( &s_check );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100336}
Paul Bakker33b43f12013-08-20 11:48:36 +0200337/* END_CASE */
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200338
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200339/* BEGIN_CASE depends_on:MBEDTLS_ECDSA_DETERMINISTIC */
Azim Khanf1aaec92017-05-30 14:23:15 +0100340void ecdsa_det_test_vectors( int id, char * d_str, int md_alg, char * msg,
341 char * r_str, char * s_str )
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100342{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200343 mbedtls_ecp_group grp;
344 mbedtls_mpi d, r, s, r_check, s_check;
345 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100346 size_t hlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200347 const mbedtls_md_info_t *md_info;
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200349 mbedtls_ecp_group_init( &grp );
350 mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
351 mbedtls_mpi_init( &r_check ); mbedtls_mpi_init( &s_check );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100352 memset( hash, 0, sizeof( hash ) );
353
Manuel Pégourié-Gonnarde3a062b2015-05-11 18:46:47 +0200354 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200355 TEST_ASSERT( mbedtls_mpi_read_string( &d, 16, d_str ) == 0 );
356 TEST_ASSERT( mbedtls_mpi_read_string( &r_check, 16, r_str ) == 0 );
357 TEST_ASSERT( mbedtls_mpi_read_string( &s_check, 16, s_str ) == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100358
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200359 md_info = mbedtls_md_info_from_type( md_alg );
Paul Bakker94b916c2014-04-17 16:07:20 +0200360 TEST_ASSERT( md_info != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200361 hlen = mbedtls_md_get_size( md_info );
Hanno Becker198611d2018-10-17 13:58:19 +0100362 TEST_ASSERT( mbedtls_md( md_info, (const unsigned char *) msg,
363 strlen( msg ), hash ) == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100364
Janos Follath651eac82019-01-04 15:51:24 +0000365 TEST_ASSERT(
366 mbedtls_ecdsa_sign_det_ext( &grp, &r, &s, &d, hash, hlen,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200367 md_alg, mbedtls_test_rnd_std_rand,
368 NULL )
Janos Follath651eac82019-01-04 15:51:24 +0000369 == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100370
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200371 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &r, &r_check ) == 0 );
372 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &s, &s_check ) == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100373
Paul Bakkerbd51b262014-07-10 15:26:12 +0200374exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375 mbedtls_ecp_group_free( &grp );
376 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
377 mbedtls_mpi_free( &r_check ); mbedtls_mpi_free( &s_check );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100378}
379/* END_CASE */
380
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200381/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
TRodziewicz40de3c92021-04-07 19:16:18 +0200382void ecdsa_write_read_zero( int id )
383{
384 mbedtls_ecdsa_context ctx;
385 mbedtls_test_rnd_pseudo_info rnd_info;
386 unsigned char hash[32];
387 unsigned char sig[200];
388 size_t sig_len, i;
389
390 mbedtls_ecdsa_init( &ctx );
391 memset( &rnd_info, 0x00, sizeof( mbedtls_test_rnd_pseudo_info ) );
392 memset( hash, 0, sizeof( hash ) );
393 memset( sig, 0x2a, sizeof( sig ) );
TRodziewicz40de3c92021-04-07 19:16:18 +0200394
395 /* generate signing key */
396 TEST_ASSERT( mbedtls_ecdsa_genkey( &ctx, id,
397 &mbedtls_test_rnd_pseudo_rand,
398 &rnd_info ) == 0 );
399
400 /* generate and write signature, then read and verify it */
401 TEST_ASSERT( mbedtls_ecdsa_write_signature( &ctx, MBEDTLS_MD_SHA256,
402 hash, sizeof( hash ),
403 sig, &sig_len, &mbedtls_test_rnd_pseudo_rand,
404 &rnd_info ) == 0 );
405 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
406 sig, sig_len ) == 0 );
407
408 /* check we didn't write past the announced length */
409 for( i = sig_len; i < sizeof( sig ); i++ )
410 TEST_ASSERT( sig[i] == 0x2a );
411
412 /* try verification with invalid length */
413 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
414 sig, sig_len - 1 ) != 0 );
415 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
416 sig, sig_len + 1 ) != 0 );
417
418 /* try invalid sequence tag */
419 sig[0]++;
420 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
421 sig, sig_len ) != 0 );
422 sig[0]--;
423
424 /* try modifying r */
425 sig[10]++;
426 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
427 sig, sig_len ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
428 sig[10]--;
429
430 /* try modifying s */
431 sig[sig_len - 1]++;
432 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
433 sig, sig_len ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
434 sig[sig_len - 1]--;
435
436exit:
437 mbedtls_ecdsa_free( &ctx );
438}
439/* END_CASE */
440
441/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200442void ecdsa_write_read_random( int id )
443{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200444 mbedtls_ecdsa_context ctx;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200445 mbedtls_test_rnd_pseudo_info rnd_info;
Manuel Pégourié-Gonnarddfdcac92015-03-31 11:41:42 +0200446 unsigned char hash[32];
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200447 unsigned char sig[200];
448 size_t sig_len, i;
449
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200450 mbedtls_ecdsa_init( &ctx );
Ronald Cron351f0ee2020-06-10 12:12:18 +0200451 memset( &rnd_info, 0x00, sizeof( mbedtls_test_rnd_pseudo_info ) );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200452 memset( hash, 0, sizeof( hash ) );
TRodziewicz40de3c92021-04-07 19:16:18 +0200453 memset( sig, 0x2a, sizeof( sig ) );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200454
TRodziewicz40de3c92021-04-07 19:16:18 +0200455 /* prepare material for signature */
456 TEST_ASSERT( mbedtls_test_rnd_pseudo_rand( &rnd_info,
457 hash, sizeof( hash ) ) == 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200458
TRodziewicz40de3c92021-04-07 19:16:18 +0200459 /* generate signing key */
460 TEST_ASSERT( mbedtls_ecdsa_genkey( &ctx, id,
461 &mbedtls_test_rnd_pseudo_rand,
462 &rnd_info ) == 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200463
TRodziewicz40de3c92021-04-07 19:16:18 +0200464 /* generate and write signature, then read and verify it */
465 TEST_ASSERT( mbedtls_ecdsa_write_signature( &ctx, MBEDTLS_MD_SHA256,
466 hash, sizeof( hash ),
467 sig, &sig_len, &mbedtls_test_rnd_pseudo_rand,
468 &rnd_info ) == 0 );
469 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
470 sig, sig_len ) == 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200471
TRodziewicz40de3c92021-04-07 19:16:18 +0200472 /* check we didn't write past the announced length */
473 for( i = sig_len; i < sizeof( sig ); i++ )
474 TEST_ASSERT( sig[i] == 0x2a );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200475
TRodziewicz40de3c92021-04-07 19:16:18 +0200476 /* try verification with invalid length */
477 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
478 sig, sig_len - 1 ) != 0 );
479 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
480 sig, sig_len + 1 ) != 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200481
TRodziewicz40de3c92021-04-07 19:16:18 +0200482 /* try invalid sequence tag */
483 sig[0]++;
484 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
485 sig, sig_len ) != 0 );
486 sig[0]--;
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200487
TRodziewicz40de3c92021-04-07 19:16:18 +0200488 /* try modifying r */
489 sig[10]++;
490 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
491 sig, sig_len ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
492 sig[10]--;
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200493
TRodziewicz40de3c92021-04-07 19:16:18 +0200494 /* try modifying s */
495 sig[sig_len - 1]++;
496 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
497 sig, sig_len ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
498 sig[sig_len - 1]--;
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200499
Paul Bakkerbd51b262014-07-10 15:26:12 +0200500exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200501 mbedtls_ecdsa_free( &ctx );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200502}
503/* END_CASE */
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100504
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200505/* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE */
Ronald Cron9ed40732020-06-25 09:03:34 +0200506void ecdsa_read_restart( int id, data_t *pk, data_t *hash, data_t *sig,
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200507 int max_ops, int min_restart, int max_restart )
508{
509 mbedtls_ecdsa_context ctx;
510 mbedtls_ecdsa_restart_ctx rs_ctx;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200511 int ret, cnt_restart;
512
513 mbedtls_ecdsa_init( &ctx );
514 mbedtls_ecdsa_restart_init( &rs_ctx );
515
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200516 TEST_ASSERT( mbedtls_ecp_group_load( &ctx.grp, id ) == 0 );
Ronald Cron9ed40732020-06-25 09:03:34 +0200517 TEST_ASSERT( mbedtls_ecp_point_read_binary( &ctx.grp, &ctx.Q,
518 pk->x, pk->len ) == 0 );
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200519
520 mbedtls_ecp_set_max_ops( max_ops );
521
522 cnt_restart = 0;
523 do {
524 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +0200525 hash->x, hash->len, sig->x, sig->len, &rs_ctx );
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200526 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart );
527
528 TEST_ASSERT( ret == 0 );
529 TEST_ASSERT( cnt_restart >= min_restart );
530 TEST_ASSERT( cnt_restart <= max_restart );
531
532 /* try modifying r */
Ronald Cron9ed40732020-06-25 09:03:34 +0200533
534 TEST_ASSERT( sig->len > 10 );
535 sig->x[10]++;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200536 do {
537 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +0200538 hash->x, hash->len, sig->x, sig->len, &rs_ctx );
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200539 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
540 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Ronald Cron9ed40732020-06-25 09:03:34 +0200541 sig->x[10]--;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200542
543 /* try modifying s */
Ronald Cron9ed40732020-06-25 09:03:34 +0200544 sig->x[sig->len - 1]++;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200545 do {
546 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +0200547 hash->x, hash->len, sig->x, sig->len, &rs_ctx );
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200548 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
549 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Ronald Cron9ed40732020-06-25 09:03:34 +0200550 sig->x[sig->len - 1]--;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200551
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200552 /* Do we leak memory when aborting an operation?
553 * This test only makes sense when we actually restart */
554 if( min_restart > 0 )
555 {
556 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +0200557 hash->x, hash->len, sig->x, sig->len, &rs_ctx );
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200558 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
559 }
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200560
561exit:
562 mbedtls_ecdsa_free( &ctx );
563 mbedtls_ecdsa_restart_free( &rs_ctx );
564}
565/* END_CASE */
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200566
567/* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE:MBEDTLS_ECDSA_DETERMINISTIC */
568void ecdsa_write_restart( int id, char *d_str, int md_alg,
Ronald Cron9ed40732020-06-25 09:03:34 +0200569 char *msg, data_t *sig_check,
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200570 int max_ops, int min_restart, int max_restart )
571{
572 int ret, cnt_restart;
573 mbedtls_ecdsa_restart_ctx rs_ctx;
574 mbedtls_ecdsa_context ctx;
575 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
576 unsigned char sig[MBEDTLS_ECDSA_MAX_LEN];
Ronald Cron9ed40732020-06-25 09:03:34 +0200577 size_t hlen, slen;
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200578 const mbedtls_md_info_t *md_info;
579
580 mbedtls_ecdsa_restart_init( &rs_ctx );
581 mbedtls_ecdsa_init( &ctx );
582 memset( hash, 0, sizeof( hash ) );
583 memset( sig, 0, sizeof( sig ) );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200584
585 TEST_ASSERT( mbedtls_ecp_group_load( &ctx.grp, id ) == 0 );
586 TEST_ASSERT( mbedtls_mpi_read_string( &ctx.d, 16, d_str ) == 0 );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200587
588 md_info = mbedtls_md_info_from_type( md_alg );
589 TEST_ASSERT( md_info != NULL );
590
591 hlen = mbedtls_md_get_size( md_info );
Gilles Peskine84984ae2020-01-21 16:52:08 +0100592 TEST_ASSERT( mbedtls_md( md_info,
593 (const unsigned char *) msg, strlen( msg ),
594 hash ) == 0 );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200595
596 mbedtls_ecp_set_max_ops( max_ops );
597
598 slen = sizeof( sig );
599 cnt_restart = 0;
600 do {
601 ret = mbedtls_ecdsa_write_signature_restartable( &ctx,
TRodziewicz0bc39382021-04-30 14:18:06 +0200602 md_alg, hash, hlen, sig, &slen, mbedtls_test_rnd_std_rand, NULL,
TRodziewicz8223cce2021-04-30 13:32:15 +0200603 &rs_ctx );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200604 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart );
605
606 TEST_ASSERT( ret == 0 );
Ronald Cron9ed40732020-06-25 09:03:34 +0200607 TEST_ASSERT( slen == sig_check->len );
608 TEST_ASSERT( memcmp( sig, sig_check->x, slen ) == 0 );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200609
610 TEST_ASSERT( cnt_restart >= min_restart );
611 TEST_ASSERT( cnt_restart <= max_restart );
612
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200613 /* Do we leak memory when aborting an operation?
614 * This test only makes sense when we actually restart */
615 if( min_restart > 0 )
616 {
617 ret = mbedtls_ecdsa_write_signature_restartable( &ctx,
TRodziewicz0bc39382021-04-30 14:18:06 +0200618 md_alg, hash, hlen, sig, &slen, mbedtls_test_rnd_std_rand, NULL,
TRodziewicz8223cce2021-04-30 13:32:15 +0200619 &rs_ctx );
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200620 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
621 }
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200622
623exit:
624 mbedtls_ecdsa_restart_free( &rs_ctx );
625 mbedtls_ecdsa_free( &ctx );
626}
627/* END_CASE */