blob: 1ca7c39712e7ecd659ec4d24bd558e8405b08db8 [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
Gabor Mezei1b5800d2022-09-28 15:45:59 +020023 mbedtls_ecdsa_init( &ctx );
24 mbedtls_ecp_keypair_init( &key );
25 mbedtls_ecp_group_init( &grp );
26 mbedtls_ecp_point_init( &P );
27 mbedtls_mpi_init( &m );
28
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050029 TEST_INVALID_PARAM( mbedtls_ecdsa_init( NULL ) );
30 TEST_VALID_PARAM( mbedtls_ecdsa_free( NULL ) );
31
32#if defined(MBEDTLS_ECP_RESTARTABLE)
33 TEST_INVALID_PARAM( mbedtls_ecdsa_restart_init( NULL ) );
34 TEST_VALID_PARAM( mbedtls_ecdsa_restart_free( NULL ) );
35#endif /* MBEDTLS_ECP_RESTARTABLE */
36
37 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
38 mbedtls_ecdsa_sign( NULL, &m, &m, &m,
39 buf, sizeof( buf ),
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020040 mbedtls_test_rnd_std_rand,
41 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050042 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
43 mbedtls_ecdsa_sign( &grp, NULL, &m, &m,
44 buf, sizeof( buf ),
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020045 mbedtls_test_rnd_std_rand,
46 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050047 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
48 mbedtls_ecdsa_sign( &grp, &m, NULL, &m,
49 buf, sizeof( buf ),
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020050 mbedtls_test_rnd_std_rand,
51 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050052 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
53 mbedtls_ecdsa_sign( &grp, &m, &m, NULL,
54 buf, sizeof( buf ),
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020055 mbedtls_test_rnd_std_rand,
56 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050057 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
58 mbedtls_ecdsa_sign( &grp, &m, &m, &m,
59 NULL, sizeof( buf ),
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020060 mbedtls_test_rnd_std_rand,
61 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050062 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
63 mbedtls_ecdsa_sign( &grp, &m, &m, &m,
64 buf, sizeof( buf ),
65 NULL, NULL ) );
66
67#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
68 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Janos Follath651eac82019-01-04 15:51:24 +000069 mbedtls_ecdsa_sign_det_ext( NULL, &m, &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, NULL, &m, &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, NULL, &m,
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, NULL,
88 buf, 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 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Janos Follath651eac82019-01-04 15:51:24 +000093 mbedtls_ecdsa_sign_det_ext( &grp, &m, &m, &m,
94 NULL, sizeof( buf ),
95 valid_md,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020096 mbedtls_test_rnd_std_rand,
97 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050098#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
99
100 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
101 mbedtls_ecdsa_verify( NULL,
102 buf, sizeof( buf ),
103 &P, &m, &m ) );
104 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
105 mbedtls_ecdsa_verify( &grp,
106 NULL, sizeof( buf ),
107 &P, &m, &m ) );
108 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
109 mbedtls_ecdsa_verify( &grp,
110 buf, sizeof( buf ),
111 NULL, &m, &m ) );
112 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
113 mbedtls_ecdsa_verify( &grp,
114 buf, sizeof( buf ),
115 &P, NULL, &m ) );
116 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
117 mbedtls_ecdsa_verify( &grp,
118 buf, sizeof( buf ),
119 &P, &m, NULL ) );
120
121 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200122 mbedtls_ecdsa_write_signature( NULL, valid_md, buf, sizeof( buf ),
123 buf, &slen, mbedtls_test_rnd_std_rand,
124 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500125
126 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200127 mbedtls_ecdsa_write_signature( &ctx, valid_md, NULL, sizeof( buf ),
128 buf, &slen, mbedtls_test_rnd_std_rand,
129 NULL ) );
130
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500131 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200132 mbedtls_ecdsa_write_signature( &ctx, valid_md, buf, sizeof( buf ),
133 NULL, &slen, mbedtls_test_rnd_std_rand,
134 NULL ) );
135
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500136 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200137 mbedtls_ecdsa_write_signature( &ctx, valid_md, buf, sizeof( buf ),
138 buf, NULL, mbedtls_test_rnd_std_rand,
139 NULL ) );
140
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500141 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200142 mbedtls_ecdsa_write_signature_restartable( NULL, valid_md, buf,
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, NULL,
149 sizeof( buf ), buf, &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 ), NULL, &slen,
156 mbedtls_test_rnd_std_rand,
157 NULL, NULL ) );
158
159 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
160 mbedtls_ecdsa_write_signature_restartable( &ctx, valid_md, buf,
161 sizeof( buf ), buf, NULL,
162 mbedtls_test_rnd_std_rand,
163 NULL, NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500164
165 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
166 mbedtls_ecdsa_read_signature( NULL,
167 buf, sizeof( buf ),
168 buf, sizeof( buf ) ) );
169 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
170 mbedtls_ecdsa_read_signature( &ctx,
171 NULL, sizeof( buf ),
172 buf, sizeof( buf ) ) );
173 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
174 mbedtls_ecdsa_read_signature( &ctx,
175 buf, sizeof( buf ),
176 NULL, sizeof( buf ) ) );
177
178 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
179 mbedtls_ecdsa_read_signature_restartable( NULL,
180 buf, sizeof( buf ),
181 buf, sizeof( buf ),
182 NULL ) );
183 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
184 mbedtls_ecdsa_read_signature_restartable( &ctx,
185 NULL, sizeof( buf ),
186 buf, sizeof( buf ),
187 NULL ) );
188 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
189 mbedtls_ecdsa_read_signature_restartable( &ctx,
190 buf, sizeof( buf ),
191 NULL, sizeof( buf ),
192 NULL ) );
193
194 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
195 mbedtls_ecdsa_genkey( NULL, valid_group,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200196 mbedtls_test_rnd_std_rand,
197 NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500198 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
199 mbedtls_ecdsa_genkey( &ctx, valid_group,
200 NULL, NULL ) );
201
202
203 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
204 mbedtls_ecdsa_from_keypair( NULL, &key ) );
205 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
206 mbedtls_ecdsa_from_keypair( &ctx, NULL ) );
207
208exit:
Gabor Mezei1b5800d2022-09-28 15:45:59 +0200209 mbedtls_ecdsa_free( &ctx );
210 mbedtls_ecp_keypair_free( &key );
211 mbedtls_ecp_group_free( &grp );
212 mbedtls_ecp_point_free( &P );
213 mbedtls_mpi_free( &m );
214
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500215 return;
216}
217/* END_CASE */
218
Paul Bakker33b43f12013-08-20 11:48:36 +0200219/* BEGIN_CASE */
TRodziewicz40de3c92021-04-07 19:16:18 +0200220void ecdsa_prim_zero( int id )
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100221{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200222 mbedtls_ecp_group grp;
223 mbedtls_ecp_point Q;
224 mbedtls_mpi d, r, s;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200225 mbedtls_test_rnd_pseudo_info rnd_info;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500226 unsigned char buf[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100227
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200228 mbedtls_ecp_group_init( &grp );
229 mbedtls_ecp_point_init( &Q );
230 mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
Ronald Cron351f0ee2020-06-10 12:12:18 +0200231 memset( &rnd_info, 0x00, sizeof( mbedtls_test_rnd_pseudo_info ) );
Manuel Pégourié-Gonnard450a1632013-01-27 09:08:18 +0100232 memset( buf, 0, sizeof( buf ) );
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100233
TRodziewicz40de3c92021-04-07 19:16:18 +0200234 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
235 TEST_ASSERT( mbedtls_ecp_gen_keypair( &grp, &d, &Q,
236 &mbedtls_test_rnd_pseudo_rand,
237 &rnd_info ) == 0 );
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100238
TRodziewicz40de3c92021-04-07 19:16:18 +0200239 TEST_ASSERT( mbedtls_ecdsa_sign( &grp, &r, &s, &d, buf, sizeof( buf ),
240 &mbedtls_test_rnd_pseudo_rand,
241 &rnd_info ) == 0 );
242 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, buf, sizeof( buf ), &Q, &r, &s ) == 0 );
TRodziewicz5feb6702021-04-06 19:55:17 +0200243
TRodziewicz40de3c92021-04-07 19:16:18 +0200244exit:
245 mbedtls_ecp_group_free( &grp );
246 mbedtls_ecp_point_free( &Q );
247 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
248}
249/* END_CASE */
250
251/* BEGIN_CASE */
252void ecdsa_prim_random( int id )
253{
254 mbedtls_ecp_group grp;
255 mbedtls_ecp_point Q;
256 mbedtls_mpi d, r, s;
257 mbedtls_test_rnd_pseudo_info rnd_info;
258 unsigned char buf[MBEDTLS_MD_MAX_SIZE];
259
260 mbedtls_ecp_group_init( &grp );
261 mbedtls_ecp_point_init( &Q );
262 mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
263 memset( &rnd_info, 0x00, sizeof( mbedtls_test_rnd_pseudo_info ) );
264 memset( buf, 0, sizeof( buf ) );
265
266 /* prepare material for signature */
267 TEST_ASSERT( mbedtls_test_rnd_pseudo_rand( &rnd_info,
268 buf, sizeof( buf ) ) == 0 );
269 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
270 TEST_ASSERT( mbedtls_ecp_gen_keypair( &grp, &d, &Q,
271 &mbedtls_test_rnd_pseudo_rand,
272 &rnd_info ) == 0 );
273
274 TEST_ASSERT( mbedtls_ecdsa_sign( &grp, &r, &s, &d, buf, sizeof( buf ),
275 &mbedtls_test_rnd_pseudo_rand,
276 &rnd_info ) == 0 );
277 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, buf, sizeof( buf ), &Q, &r, &s ) == 0 );
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100278
Paul Bakkerbd51b262014-07-10 15:26:12 +0200279exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200280 mbedtls_ecp_group_free( &grp );
281 mbedtls_ecp_point_free( &Q );
282 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100283}
Paul Bakker33b43f12013-08-20 11:48:36 +0200284/* END_CASE */
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100285
Paul Bakker33b43f12013-08-20 11:48:36 +0200286/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100287void ecdsa_prim_test_vectors( int id, char * d_str, char * xQ_str,
Azim Khan5fcca462018-06-29 11:05:32 +0100288 char * yQ_str, data_t * rnd_buf,
289 data_t * hash, char * r_str, char * s_str,
Azim Khanf1aaec92017-05-30 14:23:15 +0100290 int result )
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100291{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200292 mbedtls_ecp_group grp;
293 mbedtls_ecp_point Q;
Manuel Pégourié-Gonnard5aeb61c2022-04-21 09:25:23 +0200294 mbedtls_mpi d, r, s, r_check, s_check, zero;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200295 mbedtls_test_rnd_buf_info rnd_info;
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100296
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200297 mbedtls_ecp_group_init( &grp );
298 mbedtls_ecp_point_init( &Q );
299 mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
300 mbedtls_mpi_init( &r_check ); mbedtls_mpi_init( &s_check );
Manuel Pégourié-Gonnard5aeb61c2022-04-21 09:25:23 +0200301 mbedtls_mpi_init( &zero );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100302
Manuel Pégourié-Gonnarde3a062b2015-05-11 18:46:47 +0200303 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200304 TEST_ASSERT( mbedtls_ecp_point_read_string( &Q, 16, xQ_str, yQ_str ) == 0 );
Werner Lewis24b60782022-07-07 15:08:17 +0100305 TEST_ASSERT( mbedtls_test_read_mpi( &d, d_str ) == 0 );
306 TEST_ASSERT( mbedtls_test_read_mpi( &r_check, r_str ) == 0 );
307 TEST_ASSERT( mbedtls_test_read_mpi( &s_check, s_str ) == 0 );
Gilles Peskinebef30192021-03-24 00:48:57 +0100308 rnd_info.fallback_f_rng = mbedtls_test_rnd_std_rand;
309 rnd_info.fallback_p_rng = NULL;
Azim Khand30ca132017-06-09 04:32:58 +0100310 rnd_info.buf = rnd_buf->x;
311 rnd_info.length = rnd_buf->len;
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100312
Azim Khand30ca132017-06-09 04:32:58 +0100313 /* Fix rnd_buf->x by shifting it left if necessary */
Manuel Pégourié-Gonnardfae079e2014-01-06 11:00:07 +0100314 if( grp.nbits % 8 != 0 )
315 {
316 unsigned char shift = 8 - ( grp.nbits % 8 );
317 size_t i;
318
319 for( i = 0; i < rnd_info.length - 1; i++ )
Azim Khand30ca132017-06-09 04:32:58 +0100320 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 +0100321
Azim Khand30ca132017-06-09 04:32:58 +0100322 rnd_buf->x[rnd_info.length-1] <<= shift;
Manuel Pégourié-Gonnardfae079e2014-01-06 11:00:07 +0100323 }
324
Azim Khand30ca132017-06-09 04:32:58 +0100325 TEST_ASSERT( mbedtls_ecdsa_sign( &grp, &r, &s, &d, hash->x, hash->len,
Ronald Cron351f0ee2020-06-10 12:12:18 +0200326 mbedtls_test_rnd_buffer_rand, &rnd_info ) == result );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100327
Darryl Greenf5bcbed2017-11-17 17:09:31 +0000328 if ( result == 0)
329 {
Manuel Pégourié-Gonnard5aeb61c2022-04-21 09:25:23 +0200330 /* Check we generated the expected values */
Manuel Pégourié-Gonnardbcaba032022-04-20 10:34:22 +0200331 TEST_EQUAL( mbedtls_mpi_cmp_mpi( &r, &r_check ), 0 );
332 TEST_EQUAL( mbedtls_mpi_cmp_mpi( &s, &s_check ), 0 );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100333
Manuel Pégourié-Gonnardbcaba032022-04-20 10:34:22 +0200334 /* Valid signature */
335 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len,
336 &Q, &r_check, &s_check ), 0 );
Manuel Pégourié-Gonnardd0a66cc2018-06-13 09:53:21 +0200337
Manuel Pégourié-Gonnardbcaba032022-04-20 10:34:22 +0200338 /* Invalid signature: wrong public key (G instead of Q) */
339 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len,
340 &grp.G, &r_check, &s_check ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
Manuel Pégourié-Gonnardd0a66cc2018-06-13 09:53:21 +0200341
Manuel Pégourié-Gonnardbcaba032022-04-20 10:34:22 +0200342 /* Invalid signatures: r or s or both one off */
Manuel Pégourié-Gonnard5aeb61c2022-04-21 09:25:23 +0200343 TEST_EQUAL( mbedtls_mpi_sub_int( &r, &r_check, 1 ), 0 );
344 TEST_EQUAL( mbedtls_mpi_add_int( &s, &s_check, 1 ), 0 );
Manuel Pégourié-Gonnardbcaba032022-04-20 10:34:22 +0200345
346 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
347 &r, &s_check ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
348 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
349 &r_check, &s ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
350 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
351 &r, &s ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
352
353 /* Invalid signatures: r, s or both (CVE-2022-21449) are zero */
Manuel Pégourié-Gonnard5aeb61c2022-04-21 09:25:23 +0200354 TEST_EQUAL( mbedtls_mpi_lset( &zero, 0 ), 0 );
Manuel Pégourié-Gonnardbcaba032022-04-20 10:34:22 +0200355
356 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
Manuel Pégourié-Gonnard5aeb61c2022-04-21 09:25:23 +0200357 &zero, &s_check ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
Manuel Pégourié-Gonnardbcaba032022-04-20 10:34:22 +0200358 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
Manuel Pégourié-Gonnard5aeb61c2022-04-21 09:25:23 +0200359 &r_check, &zero ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
Manuel Pégourié-Gonnardbcaba032022-04-20 10:34:22 +0200360 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
Manuel Pégourié-Gonnard5aeb61c2022-04-21 09:25:23 +0200361 &zero, &zero ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
Manuel Pégourié-Gonnardbcaba032022-04-20 10:34:22 +0200362
363 /* Invalid signatures: r, s or both are == N */
Manuel Pégourié-Gonnard5aeb61c2022-04-21 09:25:23 +0200364 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
365 &grp.N, &s_check ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
366 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
367 &r_check, &grp.N ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
368 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
369 &grp.N, &grp.N ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
370
371 /* Invalid signatures: r, s or both are negative */
372 TEST_EQUAL( mbedtls_mpi_sub_mpi( &r, &r_check, &grp.N ), 0 );
373 TEST_EQUAL( mbedtls_mpi_sub_mpi( &s, &s_check, &grp.N ), 0 );
Manuel Pégourié-Gonnardbcaba032022-04-20 10:34:22 +0200374
375 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
376 &r, &s_check ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
377 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
378 &r_check, &s ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
379 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
380 &r, &s ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
381
382 /* Invalid signatures: r or s or both are > N */
Manuel Pégourié-Gonnard5aeb61c2022-04-21 09:25:23 +0200383 TEST_EQUAL( mbedtls_mpi_add_mpi( &r, &r_check, &grp.N ), 0 );
384 TEST_EQUAL( mbedtls_mpi_add_mpi( &s, &s_check, &grp.N ), 0 );
Manuel Pégourié-Gonnardbcaba032022-04-20 10:34:22 +0200385
386 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
387 &r, &s_check ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
388 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
389 &r_check, &s ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
390 TEST_EQUAL( mbedtls_ecdsa_verify( &grp, hash->x, hash->len, &Q,
391 &r, &s ), MBEDTLS_ERR_ECP_VERIFY_FAILED );
Darryl Greenf5bcbed2017-11-17 17:09:31 +0000392 }
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100393
Paul Bakkerbd51b262014-07-10 15:26:12 +0200394exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200395 mbedtls_ecp_group_free( &grp );
396 mbedtls_ecp_point_free( &Q );
397 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
398 mbedtls_mpi_free( &r_check ); mbedtls_mpi_free( &s_check );
Manuel Pégourié-Gonnard5aeb61c2022-04-21 09:25:23 +0200399 mbedtls_mpi_free( &zero );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100400}
Paul Bakker33b43f12013-08-20 11:48:36 +0200401/* END_CASE */
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200402
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200403/* BEGIN_CASE depends_on:MBEDTLS_ECDSA_DETERMINISTIC */
Azim Khanf1aaec92017-05-30 14:23:15 +0100404void ecdsa_det_test_vectors( int id, char * d_str, int md_alg, char * msg,
405 char * r_str, char * s_str )
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100406{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200407 mbedtls_ecp_group grp;
408 mbedtls_mpi d, r, s, r_check, s_check;
409 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100410 size_t hlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200411 const mbedtls_md_info_t *md_info;
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200413 mbedtls_ecp_group_init( &grp );
414 mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
415 mbedtls_mpi_init( &r_check ); mbedtls_mpi_init( &s_check );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100416 memset( hash, 0, sizeof( hash ) );
417
Manuel Pégourié-Gonnarde3a062b2015-05-11 18:46:47 +0200418 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
Werner Lewis24b60782022-07-07 15:08:17 +0100419 TEST_ASSERT( mbedtls_test_read_mpi( &d, d_str ) == 0 );
420 TEST_ASSERT( mbedtls_test_read_mpi( &r_check, r_str ) == 0 );
421 TEST_ASSERT( mbedtls_test_read_mpi( &s_check, s_str ) == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100422
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200423 md_info = mbedtls_md_info_from_type( md_alg );
Paul Bakker94b916c2014-04-17 16:07:20 +0200424 TEST_ASSERT( md_info != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200425 hlen = mbedtls_md_get_size( md_info );
Hanno Becker198611d2018-10-17 13:58:19 +0100426 TEST_ASSERT( mbedtls_md( md_info, (const unsigned char *) msg,
427 strlen( msg ), hash ) == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100428
Janos Follath651eac82019-01-04 15:51:24 +0000429 TEST_ASSERT(
430 mbedtls_ecdsa_sign_det_ext( &grp, &r, &s, &d, hash, hlen,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200431 md_alg, mbedtls_test_rnd_std_rand,
432 NULL )
Janos Follath651eac82019-01-04 15:51:24 +0000433 == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100434
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200435 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &r, &r_check ) == 0 );
436 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &s, &s_check ) == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100437
Paul Bakkerbd51b262014-07-10 15:26:12 +0200438exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200439 mbedtls_ecp_group_free( &grp );
440 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
441 mbedtls_mpi_free( &r_check ); mbedtls_mpi_free( &s_check );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100442}
443/* END_CASE */
444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
TRodziewicz40de3c92021-04-07 19:16:18 +0200446void ecdsa_write_read_zero( int id )
447{
448 mbedtls_ecdsa_context ctx;
449 mbedtls_test_rnd_pseudo_info rnd_info;
450 unsigned char hash[32];
451 unsigned char sig[200];
452 size_t sig_len, i;
453
454 mbedtls_ecdsa_init( &ctx );
455 memset( &rnd_info, 0x00, sizeof( mbedtls_test_rnd_pseudo_info ) );
456 memset( hash, 0, sizeof( hash ) );
457 memset( sig, 0x2a, sizeof( sig ) );
TRodziewicz40de3c92021-04-07 19:16:18 +0200458
459 /* generate signing key */
460 TEST_ASSERT( mbedtls_ecdsa_genkey( &ctx, id,
461 &mbedtls_test_rnd_pseudo_rand,
462 &rnd_info ) == 0 );
463
464 /* 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 );
471
472 /* check we didn't write past the announced length */
473 for( i = sig_len; i < sizeof( sig ); i++ )
474 TEST_ASSERT( sig[i] == 0x2a );
475
476 /* 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 );
481
482 /* 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]--;
487
488 /* 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]--;
493
494 /* 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]--;
499
500exit:
501 mbedtls_ecdsa_free( &ctx );
502}
503/* END_CASE */
504
505/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200506void ecdsa_write_read_random( int id )
507{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200508 mbedtls_ecdsa_context ctx;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200509 mbedtls_test_rnd_pseudo_info rnd_info;
Manuel Pégourié-Gonnarddfdcac92015-03-31 11:41:42 +0200510 unsigned char hash[32];
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200511 unsigned char sig[200];
512 size_t sig_len, i;
513
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200514 mbedtls_ecdsa_init( &ctx );
Ronald Cron351f0ee2020-06-10 12:12:18 +0200515 memset( &rnd_info, 0x00, sizeof( mbedtls_test_rnd_pseudo_info ) );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200516 memset( hash, 0, sizeof( hash ) );
TRodziewicz40de3c92021-04-07 19:16:18 +0200517 memset( sig, 0x2a, sizeof( sig ) );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200518
TRodziewicz40de3c92021-04-07 19:16:18 +0200519 /* prepare material for signature */
520 TEST_ASSERT( mbedtls_test_rnd_pseudo_rand( &rnd_info,
521 hash, sizeof( hash ) ) == 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200522
TRodziewicz40de3c92021-04-07 19:16:18 +0200523 /* generate signing key */
524 TEST_ASSERT( mbedtls_ecdsa_genkey( &ctx, id,
525 &mbedtls_test_rnd_pseudo_rand,
526 &rnd_info ) == 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200527
TRodziewicz40de3c92021-04-07 19:16:18 +0200528 /* generate and write signature, then read and verify it */
529 TEST_ASSERT( mbedtls_ecdsa_write_signature( &ctx, MBEDTLS_MD_SHA256,
530 hash, sizeof( hash ),
531 sig, &sig_len, &mbedtls_test_rnd_pseudo_rand,
532 &rnd_info ) == 0 );
533 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
534 sig, sig_len ) == 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200535
TRodziewicz40de3c92021-04-07 19:16:18 +0200536 /* check we didn't write past the announced length */
537 for( i = sig_len; i < sizeof( sig ); i++ )
538 TEST_ASSERT( sig[i] == 0x2a );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200539
TRodziewicz40de3c92021-04-07 19:16:18 +0200540 /* try verification with invalid length */
541 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
542 sig, sig_len - 1 ) != 0 );
543 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
544 sig, sig_len + 1 ) != 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200545
TRodziewicz40de3c92021-04-07 19:16:18 +0200546 /* try invalid sequence tag */
547 sig[0]++;
548 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
549 sig, sig_len ) != 0 );
550 sig[0]--;
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200551
TRodziewicz40de3c92021-04-07 19:16:18 +0200552 /* try modifying r */
553 sig[10]++;
554 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
555 sig, sig_len ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
556 sig[10]--;
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200557
TRodziewicz40de3c92021-04-07 19:16:18 +0200558 /* try modifying s */
559 sig[sig_len - 1]++;
560 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
561 sig, sig_len ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
562 sig[sig_len - 1]--;
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200563
Paul Bakkerbd51b262014-07-10 15:26:12 +0200564exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200565 mbedtls_ecdsa_free( &ctx );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200566}
567/* END_CASE */
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100568
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200569/* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE */
Ronald Cron9ed40732020-06-25 09:03:34 +0200570void ecdsa_read_restart( int id, data_t *pk, data_t *hash, data_t *sig,
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200571 int max_ops, int min_restart, int max_restart )
572{
573 mbedtls_ecdsa_context ctx;
574 mbedtls_ecdsa_restart_ctx rs_ctx;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200575 int ret, cnt_restart;
576
577 mbedtls_ecdsa_init( &ctx );
578 mbedtls_ecdsa_restart_init( &rs_ctx );
579
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200580 TEST_ASSERT( mbedtls_ecp_group_load( &ctx.grp, id ) == 0 );
Ronald Cron9ed40732020-06-25 09:03:34 +0200581 TEST_ASSERT( mbedtls_ecp_point_read_binary( &ctx.grp, &ctx.Q,
582 pk->x, pk->len ) == 0 );
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200583
584 mbedtls_ecp_set_max_ops( max_ops );
585
586 cnt_restart = 0;
587 do {
588 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +0200589 hash->x, hash->len, sig->x, sig->len, &rs_ctx );
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200590 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart );
591
592 TEST_ASSERT( ret == 0 );
593 TEST_ASSERT( cnt_restart >= min_restart );
594 TEST_ASSERT( cnt_restart <= max_restart );
595
596 /* try modifying r */
Ronald Cron9ed40732020-06-25 09:03:34 +0200597
598 TEST_ASSERT( sig->len > 10 );
599 sig->x[10]++;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200600 do {
601 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +0200602 hash->x, hash->len, sig->x, sig->len, &rs_ctx );
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200603 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
604 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Ronald Cron9ed40732020-06-25 09:03:34 +0200605 sig->x[10]--;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200606
607 /* try modifying s */
Ronald Cron9ed40732020-06-25 09:03:34 +0200608 sig->x[sig->len - 1]++;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200609 do {
610 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +0200611 hash->x, hash->len, sig->x, sig->len, &rs_ctx );
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200612 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
613 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Ronald Cron9ed40732020-06-25 09:03:34 +0200614 sig->x[sig->len - 1]--;
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200615
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200616 /* Do we leak memory when aborting an operation?
617 * This test only makes sense when we actually restart */
618 if( min_restart > 0 )
619 {
620 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
Ronald Cron9ed40732020-06-25 09:03:34 +0200621 hash->x, hash->len, sig->x, sig->len, &rs_ctx );
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200622 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
623 }
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200624
625exit:
626 mbedtls_ecdsa_free( &ctx );
627 mbedtls_ecdsa_restart_free( &rs_ctx );
628}
629/* END_CASE */
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200630
631/* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE:MBEDTLS_ECDSA_DETERMINISTIC */
632void ecdsa_write_restart( int id, char *d_str, int md_alg,
Ronald Cron9ed40732020-06-25 09:03:34 +0200633 char *msg, data_t *sig_check,
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200634 int max_ops, int min_restart, int max_restart )
635{
636 int ret, cnt_restart;
637 mbedtls_ecdsa_restart_ctx rs_ctx;
638 mbedtls_ecdsa_context ctx;
639 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
640 unsigned char sig[MBEDTLS_ECDSA_MAX_LEN];
Ronald Cron9ed40732020-06-25 09:03:34 +0200641 size_t hlen, slen;
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200642 const mbedtls_md_info_t *md_info;
643
644 mbedtls_ecdsa_restart_init( &rs_ctx );
645 mbedtls_ecdsa_init( &ctx );
646 memset( hash, 0, sizeof( hash ) );
647 memset( sig, 0, sizeof( sig ) );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200648
649 TEST_ASSERT( mbedtls_ecp_group_load( &ctx.grp, id ) == 0 );
Werner Lewis24b60782022-07-07 15:08:17 +0100650 TEST_ASSERT( mbedtls_test_read_mpi( &ctx.d, d_str ) == 0 );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200651
652 md_info = mbedtls_md_info_from_type( md_alg );
653 TEST_ASSERT( md_info != NULL );
654
655 hlen = mbedtls_md_get_size( md_info );
Gilles Peskine84984ae2020-01-21 16:52:08 +0100656 TEST_ASSERT( mbedtls_md( md_info,
657 (const unsigned char *) msg, strlen( msg ),
658 hash ) == 0 );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200659
660 mbedtls_ecp_set_max_ops( max_ops );
661
662 slen = sizeof( sig );
663 cnt_restart = 0;
664 do {
665 ret = mbedtls_ecdsa_write_signature_restartable( &ctx,
666 md_alg, hash, hlen, sig, &slen, NULL, NULL, &rs_ctx );
667 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart );
668
669 TEST_ASSERT( ret == 0 );
Ronald Cron9ed40732020-06-25 09:03:34 +0200670 TEST_ASSERT( slen == sig_check->len );
671 TEST_ASSERT( memcmp( sig, sig_check->x, slen ) == 0 );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200672
673 TEST_ASSERT( cnt_restart >= min_restart );
674 TEST_ASSERT( cnt_restart <= max_restart );
675
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200676 /* Do we leak memory when aborting an operation?
677 * This test only makes sense when we actually restart */
678 if( min_restart > 0 )
679 {
680 ret = mbedtls_ecdsa_write_signature_restartable( &ctx,
681 md_alg, hash, hlen, sig, &slen, NULL, NULL, &rs_ctx );
682 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
683 }
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200684
685exit:
686 mbedtls_ecdsa_restart_free( &rs_ctx );
687 mbedtls_ecdsa_free( &ctx );
688}
689/* END_CASE */
Dave Rodgman535dcce2022-08-10 11:32:07 +0100690
691/* BEGIN_CASE */
Dave Rodgman53cac342022-08-19 11:26:32 +0100692void ecdsa_verify( int grp_id, char * x, char * y, char * r, char * s, data_t * content, int expected )
Dave Rodgman535dcce2022-08-10 11:32:07 +0100693{
Dave Rodgman535dcce2022-08-10 11:32:07 +0100694 mbedtls_ecdsa_context ctx;
695 mbedtls_mpi sig_r, sig_s;
Dave Rodgman535dcce2022-08-10 11:32:07 +0100696
697 mbedtls_ecdsa_init( &ctx );
698 mbedtls_mpi_init( &sig_r );
699 mbedtls_mpi_init( &sig_s );
700
701 /* Prepare ECP group context */
Dave Rodgman584200c2022-10-27 20:24:46 +0100702 TEST_EQUAL( mbedtls_ecp_group_load( &ctx.grp, grp_id ), 0 );
Dave Rodgman535dcce2022-08-10 11:32:07 +0100703
704 /* Prepare public key */
Dave Rodgmanb9579fd2022-08-11 13:47:35 +0100705 TEST_EQUAL( mbedtls_test_read_mpi( &ctx.Q.X, x ), 0 );
706 TEST_EQUAL( mbedtls_test_read_mpi( &ctx.Q.Y, y ), 0 );
Dave Rodgman535dcce2022-08-10 11:32:07 +0100707 TEST_EQUAL( mbedtls_mpi_lset( &ctx.Q.Z, 1 ), 0 );
708
709 /* Prepare signature R & S */
Dave Rodgmanb9579fd2022-08-11 13:47:35 +0100710 TEST_EQUAL( mbedtls_test_read_mpi( &sig_r, r ), 0 );
711 TEST_EQUAL( mbedtls_test_read_mpi( &sig_s, s ), 0 );
Dave Rodgman535dcce2022-08-10 11:32:07 +0100712
713 /* Test whether public key has expected validity */
Dave Rodgman53cac342022-08-19 11:26:32 +0100714 TEST_EQUAL( mbedtls_ecp_check_pubkey( &ctx.grp, &ctx.Q ),
715 expected == MBEDTLS_ERR_ECP_INVALID_KEY ? MBEDTLS_ERR_ECP_INVALID_KEY : 0 );
Dave Rodgman535dcce2022-08-10 11:32:07 +0100716
717 /* Verification */
Dave Rodgmanbcbe3332022-08-18 15:48:46 +0100718 int result = mbedtls_ecdsa_verify( &ctx.grp, content->x, content->len, &ctx.Q, &sig_r, &sig_s );
Dave Rodgman535dcce2022-08-10 11:32:07 +0100719
720 TEST_EQUAL( result, expected );
Dave Rodgman535dcce2022-08-10 11:32:07 +0100721exit:
722 mbedtls_ecdsa_free( &ctx );
723 mbedtls_mpi_free( &sig_r );
724 mbedtls_mpi_free( &sig_s );
725}
Dave Rodgmanc763e172022-08-10 12:21:23 +0100726/* END_CASE */