blob: 08bbe632b000ee69d1962108b4ba305825cf27b5 [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 */
208void ecdsa_prim_random( 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];
TRodziewicz5feb6702021-04-06 19:55:17 +0200215 int test_runs = 2;
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100216
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200217 mbedtls_ecp_group_init( &grp );
218 mbedtls_ecp_point_init( &Q );
219 mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
Ronald Cron351f0ee2020-06-10 12:12:18 +0200220 memset( &rnd_info, 0x00, sizeof( mbedtls_test_rnd_pseudo_info ) );
Manuel Pégourié-Gonnard450a1632013-01-27 09:08:18 +0100221 memset( buf, 0, sizeof( buf ) );
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100222
TRodziewicz5feb6702021-04-06 19:55:17 +0200223 while ( test_runs-- )
224 {
225 /* prepare material for signature */
226 if ( test_runs == 1 )
227 {
228 TEST_ASSERT( mbedtls_test_rnd_pseudo_rand( &rnd_info,
229 buf, sizeof( buf ) )
230 == 0 );
231 } else {
232 TEST_ASSERT( mbedtls_test_rnd_zero_rand( NULL,
233 buf, sizeof( buf ) )
234 == 0 );
235 }
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100236
TRodziewicz5feb6702021-04-06 19:55:17 +0200237 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
238 TEST_ASSERT( mbedtls_ecp_gen_keypair( &grp, &d, &Q,
239 &mbedtls_test_rnd_pseudo_rand,
240 &rnd_info ) == 0 );
241
242 TEST_ASSERT( mbedtls_ecdsa_sign( &grp, &r, &s, &d, buf, sizeof( buf ),
243 &mbedtls_test_rnd_pseudo_rand,
244 &rnd_info ) == 0 );
245 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, buf, sizeof( buf ), &Q, &r, &s )
246 == 0 );
247 }
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100248
Paul Bakkerbd51b262014-07-10 15:26:12 +0200249exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200250 mbedtls_ecp_group_free( &grp );
251 mbedtls_ecp_point_free( &Q );
252 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100253}
Paul Bakker33b43f12013-08-20 11:48:36 +0200254/* END_CASE */
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100255
Paul Bakker33b43f12013-08-20 11:48:36 +0200256/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100257void ecdsa_prim_test_vectors( int id, char * d_str, char * xQ_str,
Azim Khan5fcca462018-06-29 11:05:32 +0100258 char * yQ_str, data_t * rnd_buf,
259 data_t * hash, char * r_str, char * s_str,
Azim Khanf1aaec92017-05-30 14:23:15 +0100260 int result )
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100261{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200262 mbedtls_ecp_group grp;
263 mbedtls_ecp_point Q;
264 mbedtls_mpi d, r, s, r_check, s_check;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200265 mbedtls_test_rnd_buf_info rnd_info;
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100266
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200267 mbedtls_ecp_group_init( &grp );
268 mbedtls_ecp_point_init( &Q );
269 mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
270 mbedtls_mpi_init( &r_check ); mbedtls_mpi_init( &s_check );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100271
Manuel Pégourié-Gonnarde3a062b2015-05-11 18:46:47 +0200272 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200273 TEST_ASSERT( mbedtls_ecp_point_read_string( &Q, 16, xQ_str, yQ_str ) == 0 );
274 TEST_ASSERT( mbedtls_mpi_read_string( &d, 16, d_str ) == 0 );
275 TEST_ASSERT( mbedtls_mpi_read_string( &r_check, 16, r_str ) == 0 );
276 TEST_ASSERT( mbedtls_mpi_read_string( &s_check, 16, s_str ) == 0 );
Azim Khand30ca132017-06-09 04:32:58 +0100277 rnd_info.buf = rnd_buf->x;
278 rnd_info.length = rnd_buf->len;
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100279
Azim Khand30ca132017-06-09 04:32:58 +0100280 /* Fix rnd_buf->x by shifting it left if necessary */
Manuel Pégourié-Gonnardfae079e2014-01-06 11:00:07 +0100281 if( grp.nbits % 8 != 0 )
282 {
283 unsigned char shift = 8 - ( grp.nbits % 8 );
284 size_t i;
285
286 for( i = 0; i < rnd_info.length - 1; i++ )
Azim Khand30ca132017-06-09 04:32:58 +0100287 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 +0100288
Azim Khand30ca132017-06-09 04:32:58 +0100289 rnd_buf->x[rnd_info.length-1] <<= shift;
Manuel Pégourié-Gonnardfae079e2014-01-06 11:00:07 +0100290 }
291
Azim Khand30ca132017-06-09 04:32:58 +0100292 TEST_ASSERT( mbedtls_ecdsa_sign( &grp, &r, &s, &d, hash->x, hash->len,
Ronald Cron351f0ee2020-06-10 12:12:18 +0200293 mbedtls_test_rnd_buffer_rand, &rnd_info ) == result );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100294
Darryl Greenf5bcbed2017-11-17 17:09:31 +0000295 if ( result == 0)
296 {
297 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &r, &r_check ) == 0 );
298 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &s, &s_check ) == 0 );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100299
Azim Khand30ca132017-06-09 04:32:58 +0100300 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 +0200301
302 TEST_ASSERT( mbedtls_mpi_sub_int( &r, &r, 1 ) == 0 );
303 TEST_ASSERT( mbedtls_mpi_add_int( &s, &s, 1 ) == 0 );
304
Manuel Pégourié-Gonnard125af942018-09-11 11:08:12 +0200305 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, hash->x, hash->len,
Manuel Pégourié-Gonnardd0a66cc2018-06-13 09:53:21 +0200306 &Q, &r, &s_check ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Manuel Pégourié-Gonnard125af942018-09-11 11:08:12 +0200307 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, hash->x, hash->len,
Manuel Pégourié-Gonnardd0a66cc2018-06-13 09:53:21 +0200308 &Q, &r_check, &s ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Manuel Pégourié-Gonnard125af942018-09-11 11:08:12 +0200309 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, hash->x, hash->len,
Manuel Pégourié-Gonnardd0a66cc2018-06-13 09:53:21 +0200310 &grp.G, &r_check, &s_check ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Darryl Greenf5bcbed2017-11-17 17:09:31 +0000311 }
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100312
Paul Bakkerbd51b262014-07-10 15:26:12 +0200313exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200314 mbedtls_ecp_group_free( &grp );
315 mbedtls_ecp_point_free( &Q );
316 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
317 mbedtls_mpi_free( &r_check ); mbedtls_mpi_free( &s_check );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100318}
Paul Bakker33b43f12013-08-20 11:48:36 +0200319/* END_CASE */
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200320
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200321/* BEGIN_CASE depends_on:MBEDTLS_ECDSA_DETERMINISTIC */
Azim Khanf1aaec92017-05-30 14:23:15 +0100322void ecdsa_det_test_vectors( int id, char * d_str, int md_alg, char * msg,
323 char * r_str, char * s_str )
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100324{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200325 mbedtls_ecp_group grp;
326 mbedtls_mpi d, r, s, r_check, s_check;
327 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100328 size_t hlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200329 const mbedtls_md_info_t *md_info;
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100330
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200331 mbedtls_ecp_group_init( &grp );
332 mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
333 mbedtls_mpi_init( &r_check ); mbedtls_mpi_init( &s_check );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100334 memset( hash, 0, sizeof( hash ) );
335
Manuel Pégourié-Gonnarde3a062b2015-05-11 18:46:47 +0200336 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200337 TEST_ASSERT( mbedtls_mpi_read_string( &d, 16, d_str ) == 0 );
338 TEST_ASSERT( mbedtls_mpi_read_string( &r_check, 16, r_str ) == 0 );
339 TEST_ASSERT( mbedtls_mpi_read_string( &s_check, 16, s_str ) == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100340
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200341 md_info = mbedtls_md_info_from_type( md_alg );
Paul Bakker94b916c2014-04-17 16:07:20 +0200342 TEST_ASSERT( md_info != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200343 hlen = mbedtls_md_get_size( md_info );
Hanno Becker198611d2018-10-17 13:58:19 +0100344 TEST_ASSERT( mbedtls_md( md_info, (const unsigned char *) msg,
345 strlen( msg ), hash ) == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100346
Janos Follath651eac82019-01-04 15:51:24 +0000347 TEST_ASSERT(
348 mbedtls_ecdsa_sign_det_ext( &grp, &r, &s, &d, hash, hlen,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200349 md_alg, mbedtls_test_rnd_std_rand,
350 NULL )
Janos Follath651eac82019-01-04 15:51:24 +0000351 == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100352
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200353 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &r, &r_check ) == 0 );
354 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &s, &s_check ) == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100355
Paul Bakkerbd51b262014-07-10 15:26:12 +0200356exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200357 mbedtls_ecp_group_free( &grp );
358 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
359 mbedtls_mpi_free( &r_check ); mbedtls_mpi_free( &s_check );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100360}
361/* END_CASE */
362
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200363/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200364void ecdsa_write_read_random( int id )
365{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200366 mbedtls_ecdsa_context ctx;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200367 mbedtls_test_rnd_pseudo_info rnd_info;
Manuel Pégourié-Gonnarddfdcac92015-03-31 11:41:42 +0200368 unsigned char hash[32];
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200369 unsigned char sig[200];
370 size_t sig_len, i;
TRodziewicz5feb6702021-04-06 19:55:17 +0200371 int test_runs = 2;
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200372
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200373 mbedtls_ecdsa_init( &ctx );
Ronald Cron351f0ee2020-06-10 12:12:18 +0200374 memset( &rnd_info, 0x00, sizeof( mbedtls_test_rnd_pseudo_info ) );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200375 memset( hash, 0, sizeof( hash ) );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200376
TRodziewicz5feb6702021-04-06 19:55:17 +0200377 while ( test_runs-- )
378 {
379 memset( sig, 0x2a, sizeof( sig ) );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200380
TRodziewicz5feb6702021-04-06 19:55:17 +0200381 /* prepare material for signature */
382 if ( test_runs == 1 )
383 {
384 TEST_ASSERT( mbedtls_test_rnd_pseudo_rand( &rnd_info,
385 hash, sizeof( hash ) )
386 == 0 );
387 } else {
388 TEST_ASSERT( mbedtls_test_rnd_zero_rand( NULL,
389 hash, sizeof( hash ) )
390 == 0 );
391 }
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200392
TRodziewicz5feb6702021-04-06 19:55:17 +0200393 /* generate signing key */
394 TEST_ASSERT( mbedtls_ecdsa_genkey( &ctx, id,
395 &mbedtls_test_rnd_pseudo_rand,
396 &rnd_info ) == 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200397
TRodziewicz5feb6702021-04-06 19:55:17 +0200398 /* generate and write signature, then read and verify it */
399 TEST_ASSERT( mbedtls_ecdsa_write_signature( &ctx, MBEDTLS_MD_SHA256,
400 hash, sizeof( hash ),
401 sig, &sig_len, &mbedtls_test_rnd_pseudo_rand,
402 &rnd_info ) == 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200403
TRodziewicz5feb6702021-04-06 19:55:17 +0200404 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
405 sig, sig_len ) == 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200406
TRodziewicz5feb6702021-04-06 19:55:17 +0200407 /* check we didn't write past the announced length */
408 for( i = sig_len; i < sizeof( sig ); i++ )
409 TEST_ASSERT( sig[i] == 0x2a );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200410
TRodziewicz5feb6702021-04-06 19:55:17 +0200411 /* try verification with invalid length */
412 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
413 sig, sig_len - 1 ) != 0 );
414 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
415 sig, sig_len + 1 ) != 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200416
TRodziewicz5feb6702021-04-06 19:55:17 +0200417 /* try invalid sequence tag */
418 sig[0]++;
419 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
420 sig, sig_len ) != 0 );
421 sig[0]--;
422
423 /* try modifying r */
424 sig[10]++;
425 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
426 sig, sig_len ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
427 sig[10]--;
428
429 /* try modifying s */
430 sig[sig_len - 1]++;
431 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
432 sig, sig_len ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
433 sig[sig_len - 1]--;
434 }
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200435
Paul Bakkerbd51b262014-07-10 15:26:12 +0200436exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200437 mbedtls_ecdsa_free( &ctx );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200438}
439/* END_CASE */
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100440
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200441/* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE */
Ronald Cron9ed40732020-06-25 09:03:34 +0200442void ecdsa_read_restart( int id, data_t *pk, data_t *hash, data_t *sig,
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200443 int max_ops, int min_restart, int max_restart )
444{
445 mbedtls_ecdsa_context ctx;
446 mbedtls_ecdsa_restart_ctx rs_ctx;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200447 int ret, cnt_restart;
448
449 mbedtls_ecdsa_init( &ctx );
450 mbedtls_ecdsa_restart_init( &rs_ctx );
451
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200452 TEST_ASSERT( mbedtls_ecp_group_load( &ctx.grp, id ) == 0 );
Ronald Cron9ed40732020-06-25 09:03:34 +0200453 TEST_ASSERT( mbedtls_ecp_point_read_binary( &ctx.grp, &ctx.Q,
454 pk->x, pk->len ) == 0 );
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200455
456 mbedtls_ecp_set_max_ops( max_ops );
457
458 cnt_restart = 0;
459 do {
460 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +0200461 hash->x, hash->len, sig->x, sig->len, &rs_ctx );
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200462 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart );
463
464 TEST_ASSERT( ret == 0 );
465 TEST_ASSERT( cnt_restart >= min_restart );
466 TEST_ASSERT( cnt_restart <= max_restart );
467
468 /* try modifying r */
Ronald Cron9ed40732020-06-25 09:03:34 +0200469
470 TEST_ASSERT( sig->len > 10 );
471 sig->x[10]++;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200472 do {
473 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +0200474 hash->x, hash->len, sig->x, sig->len, &rs_ctx );
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200475 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
476 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Ronald Cron9ed40732020-06-25 09:03:34 +0200477 sig->x[10]--;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200478
479 /* try modifying s */
Ronald Cron9ed40732020-06-25 09:03:34 +0200480 sig->x[sig->len - 1]++;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200481 do {
482 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +0200483 hash->x, hash->len, sig->x, sig->len, &rs_ctx );
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200484 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
485 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Ronald Cron9ed40732020-06-25 09:03:34 +0200486 sig->x[sig->len - 1]--;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200487
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200488 /* Do we leak memory when aborting an operation?
489 * This test only makes sense when we actually restart */
490 if( min_restart > 0 )
491 {
492 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +0200493 hash->x, hash->len, sig->x, sig->len, &rs_ctx );
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200494 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
495 }
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200496
497exit:
498 mbedtls_ecdsa_free( &ctx );
499 mbedtls_ecdsa_restart_free( &rs_ctx );
500}
501/* END_CASE */
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200502
503/* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE:MBEDTLS_ECDSA_DETERMINISTIC */
504void ecdsa_write_restart( int id, char *d_str, int md_alg,
Ronald Cron9ed40732020-06-25 09:03:34 +0200505 char *msg, data_t *sig_check,
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200506 int max_ops, int min_restart, int max_restart )
507{
508 int ret, cnt_restart;
509 mbedtls_ecdsa_restart_ctx rs_ctx;
510 mbedtls_ecdsa_context ctx;
511 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
512 unsigned char sig[MBEDTLS_ECDSA_MAX_LEN];
Ronald Cron9ed40732020-06-25 09:03:34 +0200513 size_t hlen, slen;
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200514 const mbedtls_md_info_t *md_info;
515
516 mbedtls_ecdsa_restart_init( &rs_ctx );
517 mbedtls_ecdsa_init( &ctx );
518 memset( hash, 0, sizeof( hash ) );
519 memset( sig, 0, sizeof( sig ) );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200520
521 TEST_ASSERT( mbedtls_ecp_group_load( &ctx.grp, id ) == 0 );
522 TEST_ASSERT( mbedtls_mpi_read_string( &ctx.d, 16, d_str ) == 0 );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200523
524 md_info = mbedtls_md_info_from_type( md_alg );
525 TEST_ASSERT( md_info != NULL );
526
527 hlen = mbedtls_md_get_size( md_info );
Gilles Peskine84984ae2020-01-21 16:52:08 +0100528 TEST_ASSERT( mbedtls_md( md_info,
529 (const unsigned char *) msg, strlen( msg ),
530 hash ) == 0 );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200531
532 mbedtls_ecp_set_max_ops( max_ops );
533
534 slen = sizeof( sig );
535 cnt_restart = 0;
536 do {
537 ret = mbedtls_ecdsa_write_signature_restartable( &ctx,
538 md_alg, hash, hlen, sig, &slen, NULL, NULL, &rs_ctx );
539 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart );
540
541 TEST_ASSERT( ret == 0 );
Ronald Cron9ed40732020-06-25 09:03:34 +0200542 TEST_ASSERT( slen == sig_check->len );
543 TEST_ASSERT( memcmp( sig, sig_check->x, slen ) == 0 );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200544
545 TEST_ASSERT( cnt_restart >= min_restart );
546 TEST_ASSERT( cnt_restart <= max_restart );
547
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200548 /* Do we leak memory when aborting an operation?
549 * This test only makes sense when we actually restart */
550 if( min_restart > 0 )
551 {
552 ret = mbedtls_ecdsa_write_signature_restartable( &ctx,
553 md_alg, hash, hlen, sig, &slen, NULL, NULL, &rs_ctx );
554 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
555 }
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200556
557exit:
558 mbedtls_ecdsa_restart_free( &rs_ctx );
559 mbedtls_ecdsa_free( &ctx );
560}
561/* END_CASE */