blob: 76f72e249565cdabc233ef0bf62a09a690404fb1 [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];
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
222 /* prepare material for signature */
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200223 TEST_ASSERT( mbedtls_test_rnd_pseudo_rand( &rnd_info,
224 buf, sizeof( buf ) ) == 0 );
Manuel Pégourié-Gonnarde3a062b2015-05-11 18:46:47 +0200225 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200226 TEST_ASSERT( mbedtls_ecp_gen_keypair( &grp, &d, &Q,
227 &mbedtls_test_rnd_pseudo_rand,
228 &rnd_info ) == 0 );
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100229
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200230 TEST_ASSERT( mbedtls_ecdsa_sign( &grp, &r, &s, &d, buf, sizeof( buf ),
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200231 &mbedtls_test_rnd_pseudo_rand,
232 &rnd_info ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200233 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, buf, sizeof( buf ), &Q, &r, &s ) == 0 );
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100234
Paul Bakkerbd51b262014-07-10 15:26:12 +0200235exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200236 mbedtls_ecp_group_free( &grp );
237 mbedtls_ecp_point_free( &Q );
238 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
Manuel Pégourié-Gonnardd1c71502013-01-26 19:09:07 +0100239}
Paul Bakker33b43f12013-08-20 11:48:36 +0200240/* END_CASE */
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100241
Paul Bakker33b43f12013-08-20 11:48:36 +0200242/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100243void ecdsa_prim_test_vectors( int id, char * d_str, char * xQ_str,
Azim Khan5fcca462018-06-29 11:05:32 +0100244 char * yQ_str, data_t * rnd_buf,
245 data_t * hash, char * r_str, char * s_str,
Azim Khanf1aaec92017-05-30 14:23:15 +0100246 int result )
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100247{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200248 mbedtls_ecp_group grp;
249 mbedtls_ecp_point Q;
250 mbedtls_mpi d, r, s, r_check, s_check;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200251 mbedtls_test_rnd_buf_info rnd_info;
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100252
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200253 mbedtls_ecp_group_init( &grp );
254 mbedtls_ecp_point_init( &Q );
255 mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
256 mbedtls_mpi_init( &r_check ); mbedtls_mpi_init( &s_check );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100257
Manuel Pégourié-Gonnarde3a062b2015-05-11 18:46:47 +0200258 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200259 TEST_ASSERT( mbedtls_ecp_point_read_string( &Q, 16, xQ_str, yQ_str ) == 0 );
260 TEST_ASSERT( mbedtls_mpi_read_string( &d, 16, d_str ) == 0 );
261 TEST_ASSERT( mbedtls_mpi_read_string( &r_check, 16, r_str ) == 0 );
262 TEST_ASSERT( mbedtls_mpi_read_string( &s_check, 16, s_str ) == 0 );
Azim Khand30ca132017-06-09 04:32:58 +0100263 rnd_info.buf = rnd_buf->x;
264 rnd_info.length = rnd_buf->len;
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100265
Azim Khand30ca132017-06-09 04:32:58 +0100266 /* Fix rnd_buf->x by shifting it left if necessary */
Manuel Pégourié-Gonnardfae079e2014-01-06 11:00:07 +0100267 if( grp.nbits % 8 != 0 )
268 {
269 unsigned char shift = 8 - ( grp.nbits % 8 );
270 size_t i;
271
272 for( i = 0; i < rnd_info.length - 1; i++ )
Azim Khand30ca132017-06-09 04:32:58 +0100273 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 +0100274
Azim Khand30ca132017-06-09 04:32:58 +0100275 rnd_buf->x[rnd_info.length-1] <<= shift;
Manuel Pégourié-Gonnardfae079e2014-01-06 11:00:07 +0100276 }
277
Azim Khand30ca132017-06-09 04:32:58 +0100278 TEST_ASSERT( mbedtls_ecdsa_sign( &grp, &r, &s, &d, hash->x, hash->len,
Ronald Cron351f0ee2020-06-10 12:12:18 +0200279 mbedtls_test_rnd_buffer_rand, &rnd_info ) == result );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100280
Darryl Greenf5bcbed2017-11-17 17:09:31 +0000281 if ( result == 0)
282 {
283 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &r, &r_check ) == 0 );
284 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &s, &s_check ) == 0 );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100285
Azim Khand30ca132017-06-09 04:32:58 +0100286 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 +0200287
288 TEST_ASSERT( mbedtls_mpi_sub_int( &r, &r, 1 ) == 0 );
289 TEST_ASSERT( mbedtls_mpi_add_int( &s, &s, 1 ) == 0 );
290
Manuel Pégourié-Gonnard125af942018-09-11 11:08:12 +0200291 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, hash->x, hash->len,
Manuel Pégourié-Gonnardd0a66cc2018-06-13 09:53:21 +0200292 &Q, &r, &s_check ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Manuel Pégourié-Gonnard125af942018-09-11 11:08:12 +0200293 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, hash->x, hash->len,
Manuel Pégourié-Gonnardd0a66cc2018-06-13 09:53:21 +0200294 &Q, &r_check, &s ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Manuel Pégourié-Gonnard125af942018-09-11 11:08:12 +0200295 TEST_ASSERT( mbedtls_ecdsa_verify( &grp, hash->x, hash->len,
Manuel Pégourié-Gonnardd0a66cc2018-06-13 09:53:21 +0200296 &grp.G, &r_check, &s_check ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Darryl Greenf5bcbed2017-11-17 17:09:31 +0000297 }
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100298
Paul Bakkerbd51b262014-07-10 15:26:12 +0200299exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200300 mbedtls_ecp_group_free( &grp );
301 mbedtls_ecp_point_free( &Q );
302 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
303 mbedtls_mpi_free( &r_check ); mbedtls_mpi_free( &s_check );
Manuel Pégourié-Gonnard602a8972013-01-27 08:10:28 +0100304}
Paul Bakker33b43f12013-08-20 11:48:36 +0200305/* END_CASE */
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200306
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200307/* BEGIN_CASE depends_on:MBEDTLS_ECDSA_DETERMINISTIC */
Azim Khanf1aaec92017-05-30 14:23:15 +0100308void ecdsa_det_test_vectors( int id, char * d_str, int md_alg, char * msg,
309 char * r_str, char * s_str )
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100310{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200311 mbedtls_ecp_group grp;
312 mbedtls_mpi d, r, s, r_check, s_check;
313 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100314 size_t hlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200315 const mbedtls_md_info_t *md_info;
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100316
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200317 mbedtls_ecp_group_init( &grp );
318 mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
319 mbedtls_mpi_init( &r_check ); mbedtls_mpi_init( &s_check );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100320 memset( hash, 0, sizeof( hash ) );
321
Manuel Pégourié-Gonnarde3a062b2015-05-11 18:46:47 +0200322 TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200323 TEST_ASSERT( mbedtls_mpi_read_string( &d, 16, d_str ) == 0 );
324 TEST_ASSERT( mbedtls_mpi_read_string( &r_check, 16, r_str ) == 0 );
325 TEST_ASSERT( mbedtls_mpi_read_string( &s_check, 16, s_str ) == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327 md_info = mbedtls_md_info_from_type( md_alg );
Paul Bakker94b916c2014-04-17 16:07:20 +0200328 TEST_ASSERT( md_info != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200329 hlen = mbedtls_md_get_size( md_info );
Hanno Becker198611d2018-10-17 13:58:19 +0100330 TEST_ASSERT( mbedtls_md( md_info, (const unsigned char *) msg,
331 strlen( msg ), hash ) == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100332
Janos Follath651eac82019-01-04 15:51:24 +0000333 TEST_ASSERT(
334 mbedtls_ecdsa_sign_det_ext( &grp, &r, &s, &d, hash, hlen,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200335 md_alg, mbedtls_test_rnd_std_rand,
336 NULL )
Janos Follath651eac82019-01-04 15:51:24 +0000337 == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100338
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200339 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &r, &r_check ) == 0 );
340 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &s, &s_check ) == 0 );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100341
Paul Bakkerbd51b262014-07-10 15:26:12 +0200342exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200343 mbedtls_ecp_group_free( &grp );
344 mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
345 mbedtls_mpi_free( &r_check ); mbedtls_mpi_free( &s_check );
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100346}
347/* END_CASE */
348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200349/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200350void ecdsa_write_read_random( int id )
351{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200352 mbedtls_ecdsa_context ctx;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200353 mbedtls_test_rnd_pseudo_info rnd_info;
Manuel Pégourié-Gonnarddfdcac92015-03-31 11:41:42 +0200354 unsigned char hash[32];
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200355 unsigned char sig[200];
356 size_t sig_len, i;
357
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200358 mbedtls_ecdsa_init( &ctx );
Ronald Cron351f0ee2020-06-10 12:12:18 +0200359 memset( &rnd_info, 0x00, sizeof( mbedtls_test_rnd_pseudo_info ) );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200360 memset( hash, 0, sizeof( hash ) );
361 memset( sig, 0x2a, sizeof( sig ) );
362
363 /* prepare material for signature */
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200364 TEST_ASSERT( mbedtls_test_rnd_pseudo_rand( &rnd_info,
365 hash, sizeof( hash ) ) == 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200366
367 /* generate signing key */
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200368 TEST_ASSERT( mbedtls_ecdsa_genkey( &ctx, id,
369 &mbedtls_test_rnd_pseudo_rand,
370 &rnd_info ) == 0 );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200371
372 /* generate and write signature, then read and verify it */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200373 TEST_ASSERT( mbedtls_ecdsa_write_signature( &ctx, MBEDTLS_MD_SHA256,
Manuel Pégourié-Gonnarddfdcac92015-03-31 11:41:42 +0200374 hash, sizeof( hash ),
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200375 sig, &sig_len, &mbedtls_test_rnd_pseudo_rand,
376 &rnd_info ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200377 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200378 sig, sig_len ) == 0 );
379
380 /* check we didn't write past the announced length */
381 for( i = sig_len; i < sizeof( sig ); i++ )
382 TEST_ASSERT( sig[i] == 0x2a );
383
384 /* try verification with invalid length */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200385 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200386 sig, sig_len - 1 ) != 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200387 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200388 sig, sig_len + 1 ) != 0 );
389
390 /* try invalid sequence tag */
391 sig[0]++;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200392 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200393 sig, sig_len ) != 0 );
394 sig[0]--;
395
396 /* try modifying r */
397 sig[10]++;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200398 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
Manuel Pégourié-Gonnard1ed25052017-04-21 10:04:02 +0200399 sig, sig_len ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200400 sig[10]--;
401
402 /* try modifying s */
403 sig[sig_len - 1]++;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200404 TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
Manuel Pégourié-Gonnard1ed25052017-04-21 10:04:02 +0200405 sig, sig_len ) == MBEDTLS_ERR_ECP_VERIFY_FAILED );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200406 sig[sig_len - 1]--;
407
Paul Bakkerbd51b262014-07-10 15:26:12 +0200408exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 mbedtls_ecdsa_free( &ctx );
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200410}
411/* END_CASE */
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100412
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200413/* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE */
414void ecdsa_read_restart( int id, char *k_str, char *h_str, char *s_str,
415 int max_ops, int min_restart, int max_restart )
416{
417 mbedtls_ecdsa_context ctx;
418 mbedtls_ecdsa_restart_ctx rs_ctx;
419 unsigned char hash[64];
420 unsigned char sig[200];
421 unsigned char pk[65];
422 size_t sig_len, hash_len, pk_len;
423 int ret, cnt_restart;
424
425 mbedtls_ecdsa_init( &ctx );
426 mbedtls_ecdsa_restart_init( &rs_ctx );
427
Ronald Cron72d628f2020-06-08 17:05:57 +0200428 hash_len = mbedtls_test_unhexify(hash, h_str);
429 sig_len = mbedtls_test_unhexify(sig, s_str);
430 pk_len = mbedtls_test_unhexify(pk, k_str);
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200431
432 TEST_ASSERT( mbedtls_ecp_group_load( &ctx.grp, id ) == 0 );
433 TEST_ASSERT( mbedtls_ecp_point_read_binary( &ctx.grp, &ctx.Q, pk, pk_len ) == 0 );
434
435 mbedtls_ecp_set_max_ops( max_ops );
436
437 cnt_restart = 0;
438 do {
439 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
440 hash, hash_len, sig, sig_len, &rs_ctx );
441 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart );
442
443 TEST_ASSERT( ret == 0 );
444 TEST_ASSERT( cnt_restart >= min_restart );
445 TEST_ASSERT( cnt_restart <= max_restart );
446
447 /* try modifying r */
448 sig[10]++;
449 do {
450 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
451 hash, hash_len, sig, sig_len, &rs_ctx );
452 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
453 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_VERIFY_FAILED );
454 sig[10]--;
455
456 /* try modifying s */
457 sig[sig_len - 1]++;
458 do {
459 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
460 hash, hash_len, sig, sig_len, &rs_ctx );
461 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
462 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_VERIFY_FAILED );
463 sig[sig_len - 1]--;
464
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200465 /* Do we leak memory when aborting an operation?
466 * This test only makes sense when we actually restart */
467 if( min_restart > 0 )
468 {
469 ret = mbedtls_ecdsa_read_signature_restartable( &ctx,
470 hash, hash_len, sig, sig_len, &rs_ctx );
471 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
472 }
Manuel Pégourié-Gonnard722e5152017-04-21 11:04:47 +0200473
474exit:
475 mbedtls_ecdsa_free( &ctx );
476 mbedtls_ecdsa_restart_free( &rs_ctx );
477}
478/* END_CASE */
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200479
480/* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE:MBEDTLS_ECDSA_DETERMINISTIC */
481void ecdsa_write_restart( int id, char *d_str, int md_alg,
482 char *msg, char *sig_str,
483 int max_ops, int min_restart, int max_restart )
484{
485 int ret, cnt_restart;
486 mbedtls_ecdsa_restart_ctx rs_ctx;
487 mbedtls_ecdsa_context ctx;
488 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
489 unsigned char sig[MBEDTLS_ECDSA_MAX_LEN];
490 unsigned char sig_check[MBEDTLS_ECDSA_MAX_LEN];
491 size_t hlen, slen, slen_check;
492 const mbedtls_md_info_t *md_info;
493
494 mbedtls_ecdsa_restart_init( &rs_ctx );
495 mbedtls_ecdsa_init( &ctx );
496 memset( hash, 0, sizeof( hash ) );
497 memset( sig, 0, sizeof( sig ) );
498 memset( sig_check, 0, sizeof( sig_check ) );
499
500 TEST_ASSERT( mbedtls_ecp_group_load( &ctx.grp, id ) == 0 );
501 TEST_ASSERT( mbedtls_mpi_read_string( &ctx.d, 16, d_str ) == 0 );
Ronald Cron72d628f2020-06-08 17:05:57 +0200502 slen_check = mbedtls_test_unhexify( sig_check, sig_str );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200503
504 md_info = mbedtls_md_info_from_type( md_alg );
505 TEST_ASSERT( md_info != NULL );
506
507 hlen = mbedtls_md_get_size( md_info );
Gilles Peskine84984ae2020-01-21 16:52:08 +0100508 TEST_ASSERT( mbedtls_md( md_info,
509 (const unsigned char *) msg, strlen( msg ),
510 hash ) == 0 );
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200511
512 mbedtls_ecp_set_max_ops( max_ops );
513
514 slen = sizeof( sig );
515 cnt_restart = 0;
516 do {
517 ret = mbedtls_ecdsa_write_signature_restartable( &ctx,
518 md_alg, hash, hlen, sig, &slen, NULL, NULL, &rs_ctx );
519 } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart );
520
521 TEST_ASSERT( ret == 0 );
522 TEST_ASSERT( slen == slen_check );
523 TEST_ASSERT( memcmp( sig, sig_check, slen ) == 0 );
524
525 TEST_ASSERT( cnt_restart >= min_restart );
526 TEST_ASSERT( cnt_restart <= max_restart );
527
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200528 /* Do we leak memory when aborting an operation?
529 * This test only makes sense when we actually restart */
530 if( min_restart > 0 )
531 {
532 ret = mbedtls_ecdsa_write_signature_restartable( &ctx,
533 md_alg, hash, hlen, sig, &slen, NULL, NULL, &rs_ctx );
534 TEST_ASSERT( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
535 }
Manuel Pégourié-Gonnardeb402f32017-04-25 10:57:30 +0200536
537exit:
538 mbedtls_ecdsa_restart_free( &rs_ctx );
539 mbedtls_ecdsa_free( &ctx );
540}
541/* END_CASE */