blob: 5b39d3ad2df8115b208844b7ff6b7987e11e2171 [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/bignum.h"
Janos Follath64eca052018-09-05 17:04:49 +01003
4typedef struct mbedtls_test_mpi_random
5{
6 data_t *data;
7 size_t pos;
8 size_t chunk_len;
9} mbedtls_test_mpi_random;
10
11/*
12 * This function is called by the Miller-Rabin primality test each time it
13 * chooses a random witness. The witnesses (or non-witnesses as provided by the
14 * test) are stored in the data member of the state structure. Each number is in
15 * the format that mbedtls_mpi_read_string understands and is chunk_len long.
16 */
17int mbedtls_test_mpi_miller_rabin_determinizer( void* state,
18 unsigned char* buf,
19 size_t len )
20{
21 mbedtls_test_mpi_random *random = (mbedtls_test_mpi_random*) state;
22
23 if( random == NULL || random->data->x == NULL || buf == NULL )
24 return( -1 );
25
26 if( random->pos + random->chunk_len > random->data->len
27 || random->chunk_len > len )
28 {
29 return( -1 );
30 }
31
32 memset( buf, 0, len );
33
34 /* The witness is written to the end of the buffer, since the buffer is
35 * used as big endian, unsigned binary data in mbedtls_mpi_read_binary.
36 * Writing the witness to the start of the buffer would result in the
37 * buffer being 'witness 000...000', which would be treated as
38 * witness * 2^n for some n. */
39 memcpy( buf + len - random->chunk_len, &random->data->x[random->pos],
40 random->chunk_len );
41
42 random->pos += random->chunk_len;
43
44 return( 0 );
45}
Paul Bakker33b43f12013-08-20 11:48:36 +020046/* END_HEADER */
Paul Bakker367dae42009-06-28 21:50:27 +000047
Paul Bakker33b43f12013-08-20 11:48:36 +020048/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020049 * depends_on:MBEDTLS_BIGNUM_C
Paul Bakker33b43f12013-08-20 11:48:36 +020050 * END_DEPENDENCIES
51 */
Paul Bakker5690efc2011-05-26 13:16:06 +000052
Hanno Beckerb48e1aa2018-12-18 23:25:01 +000053/* BEGIN_CASE */
54void mpi_valid_param( )
55{
56 TEST_VALID_PARAM( mbedtls_mpi_free( NULL ) );
57}
58/* END_CASE */
59
Hanno Beckerafb607b2018-12-11 14:27:08 +000060/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
61void mpi_invalid_param( )
62{
63 mbedtls_mpi X;
64 const char *s_in = "00101000101010";
65 char s_out[16] = { 0 };
66 unsigned char u_out[16] = { 0 };
67 unsigned char u_in[16] = { 0 };
68 size_t olen;
69 mbedtls_mpi_uint mpi_uint;
70
71 TEST_INVALID_PARAM( mbedtls_mpi_init( NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +000072
Hanno Beckerafb607b2018-12-11 14:27:08 +000073 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
74 mbedtls_mpi_grow( NULL, 42 ) );
75 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
76 mbedtls_mpi_copy( NULL, &X ) );
77 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
78 mbedtls_mpi_copy( &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +000079
Hanno Beckerafb607b2018-12-11 14:27:08 +000080 TEST_INVALID_PARAM( mbedtls_mpi_swap( NULL, &X ) );
81 TEST_INVALID_PARAM( mbedtls_mpi_swap( &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +000082
Hanno Beckerafb607b2018-12-11 14:27:08 +000083 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
84 mbedtls_mpi_safe_cond_assign( NULL, &X, 0 ) );
85 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
86 mbedtls_mpi_safe_cond_assign( &X, NULL, 0 ) );
Hanno Beckere1185042018-12-13 14:31:46 +000087
Hanno Beckerafb607b2018-12-11 14:27:08 +000088 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
89 mbedtls_mpi_safe_cond_swap( NULL, &X, 0 ) );
90 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
91 mbedtls_mpi_safe_cond_swap( &X, NULL, 0 ) );
Hanno Beckere1185042018-12-13 14:31:46 +000092
Hanno Beckerafb607b2018-12-11 14:27:08 +000093 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
94 mbedtls_mpi_lset( NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +000095
Hanno Beckerafb607b2018-12-11 14:27:08 +000096 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
97 mbedtls_mpi_get_bit( NULL, 42 ) );
98 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
99 mbedtls_mpi_set_bit( NULL, 42, 0 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000100
Hanno Beckerafb607b2018-12-11 14:27:08 +0000101 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
102 mbedtls_mpi_read_string( NULL, 2, s_in ) );
103 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
104 mbedtls_mpi_read_string( &X, 2, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000105
Hanno Beckerafb607b2018-12-11 14:27:08 +0000106 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
107 mbedtls_mpi_write_string( NULL, 2,
108 s_out, sizeof( s_out ),
109 &olen ) );
110 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
111 mbedtls_mpi_write_string( &X, 2,
112 NULL, sizeof( s_out ),
113 &olen ) );
114 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
115 mbedtls_mpi_write_string( &X, 2,
116 s_out, sizeof( s_out ),
117 NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000118
Hanno Beckerafb607b2018-12-11 14:27:08 +0000119#if defined(MBEDTLS_FS_IO)
120 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
121 mbedtls_mpi_read_file( NULL, 2, stdin ) );
122 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
123 mbedtls_mpi_read_file( &X, 2, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000124
Hanno Beckerafb607b2018-12-11 14:27:08 +0000125 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
126 mbedtls_mpi_write_file( "", NULL, 2, NULL ) );
127#endif /* MBEDTLS_FS_IO */
128
129 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
130 mbedtls_mpi_read_binary( NULL, u_in,
131 sizeof( u_in ) ) );
132 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
133 mbedtls_mpi_read_binary( &X, NULL,
134 sizeof( u_in ) ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000135
Hanno Beckerafb607b2018-12-11 14:27:08 +0000136 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
137 mbedtls_mpi_write_binary( NULL, u_out,
138 sizeof( u_out ) ) );
139 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
140 mbedtls_mpi_write_binary( &X, NULL,
141 sizeof( u_out ) ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000142
Hanno Beckerafb607b2018-12-11 14:27:08 +0000143 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
144 mbedtls_mpi_shift_l( NULL, 42 ) );
145 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
146 mbedtls_mpi_shift_r( NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000147
Hanno Beckerafb607b2018-12-11 14:27:08 +0000148 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
149 mbedtls_mpi_cmp_abs( NULL, &X ) );
150 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
151 mbedtls_mpi_cmp_abs( &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000152
Hanno Beckerafb607b2018-12-11 14:27:08 +0000153 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
154 mbedtls_mpi_cmp_mpi( NULL, &X ) );
155 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
156 mbedtls_mpi_cmp_mpi( &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000157
Hanno Beckerafb607b2018-12-11 14:27:08 +0000158 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
159 mbedtls_mpi_cmp_int( NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000160
Hanno Beckerafb607b2018-12-11 14:27:08 +0000161 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
162 mbedtls_mpi_add_abs( NULL, &X, &X ) );
163 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
164 mbedtls_mpi_add_abs( &X, NULL, &X ) );
165 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
166 mbedtls_mpi_add_abs( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000167
Hanno Beckerafb607b2018-12-11 14:27:08 +0000168 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
169 mbedtls_mpi_sub_abs( NULL, &X, &X ) );
170 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
171 mbedtls_mpi_sub_abs( &X, NULL, &X ) );
172 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
173 mbedtls_mpi_sub_abs( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000174
Hanno Beckerafb607b2018-12-11 14:27:08 +0000175 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
176 mbedtls_mpi_add_mpi( NULL, &X, &X ) );
177 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
178 mbedtls_mpi_add_mpi( &X, NULL, &X ) );
179 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
180 mbedtls_mpi_add_mpi( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000181
Hanno Beckerafb607b2018-12-11 14:27:08 +0000182 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
183 mbedtls_mpi_sub_mpi( NULL, &X, &X ) );
184 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
185 mbedtls_mpi_sub_mpi( &X, NULL, &X ) );
186 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
187 mbedtls_mpi_sub_mpi( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000188
Hanno Beckerafb607b2018-12-11 14:27:08 +0000189 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
190 mbedtls_mpi_add_int( NULL, &X, 42 ) );
191 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
192 mbedtls_mpi_add_int( &X, NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000193
Hanno Beckerafb607b2018-12-11 14:27:08 +0000194 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
195 mbedtls_mpi_sub_int( NULL, &X, 42 ) );
196 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
197 mbedtls_mpi_sub_int( &X, NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000198
Hanno Beckerafb607b2018-12-11 14:27:08 +0000199 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
200 mbedtls_mpi_mul_mpi( NULL, &X, &X ) );
201 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
202 mbedtls_mpi_mul_mpi( &X, NULL, &X ) );
203 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
204 mbedtls_mpi_mul_mpi( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000205
Hanno Beckerafb607b2018-12-11 14:27:08 +0000206 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
207 mbedtls_mpi_mul_int( NULL, &X, 42 ) );
208 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
209 mbedtls_mpi_mul_int( &X, NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000210
Hanno Beckerafb607b2018-12-11 14:27:08 +0000211 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
212 mbedtls_mpi_div_mpi( &X, &X, NULL, &X ) );
213 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
214 mbedtls_mpi_div_mpi( &X, &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000215
Hanno Beckerafb607b2018-12-11 14:27:08 +0000216 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
217 mbedtls_mpi_div_int( &X, &X, NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000218
Hanno Beckerf25ee7f2018-12-19 16:51:02 +0000219 TEST_INVALID_PARAM_RET( 0, mbedtls_mpi_lsb( NULL ) );
220
Hanno Beckerafb607b2018-12-11 14:27:08 +0000221 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
222 mbedtls_mpi_mod_mpi( NULL, &X, &X ) );
223 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
224 mbedtls_mpi_mod_mpi( &X, NULL, &X ) );
225 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
226 mbedtls_mpi_mod_mpi( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000227
Hanno Beckerafb607b2018-12-11 14:27:08 +0000228 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
229 mbedtls_mpi_mod_int( NULL, &X, 42 ) );
230 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
231 mbedtls_mpi_mod_int( &mpi_uint, NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000232
Hanno Beckerafb607b2018-12-11 14:27:08 +0000233 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
234 mbedtls_mpi_exp_mod( NULL, &X, &X, &X, NULL ) );
235 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
236 mbedtls_mpi_exp_mod( &X, NULL, &X, &X, NULL ) );
237 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
238 mbedtls_mpi_exp_mod( &X, &X, NULL, &X, NULL ) );
239 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
240 mbedtls_mpi_exp_mod( &X, &X, &X, NULL, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000241
Hanno Beckerafb607b2018-12-11 14:27:08 +0000242 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
243 mbedtls_mpi_fill_random( NULL, 42, rnd_std_rand,
244 NULL ) );
245 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
246 mbedtls_mpi_fill_random( &X, 42, NULL, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000247
Hanno Beckerafb607b2018-12-11 14:27:08 +0000248 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
249 mbedtls_mpi_gcd( NULL, &X, &X ) );
250 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
251 mbedtls_mpi_gcd( &X, NULL, &X ) );
252 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
253 mbedtls_mpi_gcd( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000254
Hanno Beckerafb607b2018-12-11 14:27:08 +0000255 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
256 mbedtls_mpi_inv_mod( NULL, &X, &X ) );
257 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
258 mbedtls_mpi_inv_mod( &X, NULL, &X ) );
259 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
Hanno Beckere1185042018-12-13 14:31:46 +0000260 mbedtls_mpi_inv_mod( &X, &X, NULL ) );
Hanno Beckerafb607b2018-12-11 14:27:08 +0000261
262exit:
263 return;
Hanno Beckerafb607b2018-12-11 14:27:08 +0000264}
265/* END_CASE */
266
Paul Bakker33b43f12013-08-20 11:48:36 +0200267/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100268void mpi_null( )
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200269{
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200270 mbedtls_mpi X, Y, Z;
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200271
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200272 mbedtls_mpi_init( &X );
273 mbedtls_mpi_init( &Y );
274 mbedtls_mpi_init( &Z );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200275
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200276 TEST_ASSERT( mbedtls_mpi_get_bit( &X, 42 ) == 0 );
277 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200278 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == 0 );
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200279 TEST_ASSERT( mbedtls_mpi_size( &X ) == 0 );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200280
281exit:
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200282 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200283}
284/* END_CASE */
285
286/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100287void mpi_read_write_string( int radix_X, char * input_X, int radix_A,
288 char * input_A, int output_size, int result_read,
Paul Bakker33b43f12013-08-20 11:48:36 +0200289 int result_write )
Paul Bakker367dae42009-06-28 21:50:27 +0000290{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200291 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000292 char str[1000];
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100293 size_t len;
Paul Bakker367dae42009-06-28 21:50:27 +0000294
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200295 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000296
Janos Follath276284f2019-03-06 12:29:37 +0000297 memset( str, '!', sizeof( str ) );
298
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200299 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == result_read );
Paul Bakker33b43f12013-08-20 11:48:36 +0200300 if( result_read == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000301 {
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100302 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, str, output_size, &len ) == result_write );
Paul Bakker33b43f12013-08-20 11:48:36 +0200303 if( result_write == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000304 {
Paul Bakker33b43f12013-08-20 11:48:36 +0200305 TEST_ASSERT( strcasecmp( str, input_A ) == 0 );
Janos Follath276284f2019-03-06 12:29:37 +0000306 TEST_ASSERT( str[len] == '!' );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000307 }
308 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000309
Paul Bakkerbd51b262014-07-10 15:26:12 +0200310exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200311 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000312}
Paul Bakker33b43f12013-08-20 11:48:36 +0200313/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000314
Paul Bakker33b43f12013-08-20 11:48:36 +0200315/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +0100316void mbedtls_mpi_read_binary( data_t * buf, int radix_A, char * input_A )
Paul Bakkere896fea2009-07-06 06:40:23 +0000317{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200318 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000319 unsigned char str[1000];
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100320 size_t len;
Paul Bakkere896fea2009-07-06 06:40:23 +0000321
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200322 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000323
Paul Bakkere896fea2009-07-06 06:40:23 +0000324
Azim Khand30ca132017-06-09 04:32:58 +0100325 TEST_ASSERT( mbedtls_mpi_read_binary( &X, buf->x, buf->len ) == 0 );
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100326 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, (char *) str, sizeof( str ), &len ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +0200327 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000328
Paul Bakkerbd51b262014-07-10 15:26:12 +0200329exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200330 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000331}
Paul Bakker33b43f12013-08-20 11:48:36 +0200332/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000333
Paul Bakker33b43f12013-08-20 11:48:36 +0200334/* BEGIN_CASE */
Azim Khand30ca132017-06-09 04:32:58 +0100335void mbedtls_mpi_write_binary( int radix_X, char * input_X,
Azim Khan5fcca462018-06-29 11:05:32 +0100336 data_t * input_A, int output_size,
Azim Khanf1aaec92017-05-30 14:23:15 +0100337 int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000338{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200339 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000340 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000341 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +0000342
343 memset( buf, 0x00, 1000 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000344
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200345 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000346
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200347 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +0100348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200349 buflen = mbedtls_mpi_size( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +0200350 if( buflen > (size_t) output_size )
351 buflen = (size_t) output_size;
Paul Bakkere896fea2009-07-06 06:40:23 +0000352
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200353 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == result );
Paul Bakker33b43f12013-08-20 11:48:36 +0200354 if( result == 0)
Paul Bakkerba48cb22009-07-12 11:01:32 +0000355 {
Paul Bakkere896fea2009-07-06 06:40:23 +0000356
Ronald Cron9fde3532020-06-10 11:42:32 +0200357 TEST_ASSERT( mbedtls_test_hexcmp( buf, input_A->x,
358 buflen, input_A->len ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000359 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000360
Paul Bakkerbd51b262014-07-10 15:26:12 +0200361exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200362 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000363}
Paul Bakker33b43f12013-08-20 11:48:36 +0200364/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000365
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200366/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Azim Khand30ca132017-06-09 04:32:58 +0100367void mbedtls_mpi_read_file( int radix_X, char * input_file,
Azim Khan5fcca462018-06-29 11:05:32 +0100368 data_t * input_A, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000369{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200370 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000371 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000372 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +0000373 FILE *file;
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000374 int ret;
Paul Bakkere896fea2009-07-06 06:40:23 +0000375
376 memset( buf, 0x00, 1000 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000377
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200378 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000379
Paul Bakker33b43f12013-08-20 11:48:36 +0200380 file = fopen( input_file, "r" );
Paul Bakker8a0c0a92014-04-17 16:08:20 +0200381 TEST_ASSERT( file != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200382 ret = mbedtls_mpi_read_file( &X, radix_X, file );
Paul Bakkere896fea2009-07-06 06:40:23 +0000383 fclose(file);
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000384 TEST_ASSERT( ret == result );
Paul Bakkere896fea2009-07-06 06:40:23 +0000385
Paul Bakker33b43f12013-08-20 11:48:36 +0200386 if( result == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000387 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200388 buflen = mbedtls_mpi_size( &X );
389 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000390
Paul Bakkere896fea2009-07-06 06:40:23 +0000391
Ronald Cron9fde3532020-06-10 11:42:32 +0200392 TEST_ASSERT( mbedtls_test_hexcmp( buf, input_A->x,
393 buflen, input_A->len ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000394 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000395
Paul Bakkerbd51b262014-07-10 15:26:12 +0200396exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200397 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000398}
Paul Bakker33b43f12013-08-20 11:48:36 +0200399/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000400
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200401/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Azim Khanf1aaec92017-05-30 14:23:15 +0100402void mbedtls_mpi_write_file( int radix_X, char * input_X, int output_radix,
403 char * output_file )
Paul Bakkere896fea2009-07-06 06:40:23 +0000404{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200405 mbedtls_mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000406 FILE *file_out, *file_in;
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200407 int ret;
Paul Bakker69998dd2009-07-11 19:15:20 +0000408
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000410
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200411 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000412
Paul Bakker33b43f12013-08-20 11:48:36 +0200413 file_out = fopen( output_file, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000414 TEST_ASSERT( file_out != NULL );
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200415 ret = mbedtls_mpi_write_file( NULL, &X, output_radix, file_out );
Paul Bakkere896fea2009-07-06 06:40:23 +0000416 fclose(file_out);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200417 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000418
Paul Bakker33b43f12013-08-20 11:48:36 +0200419 file_in = fopen( output_file, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000420 TEST_ASSERT( file_in != NULL );
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200421 ret = mbedtls_mpi_read_file( &Y, output_radix, file_in );
Paul Bakkere896fea2009-07-06 06:40:23 +0000422 fclose(file_in);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200423 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000424
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200425 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000426
Paul Bakkerbd51b262014-07-10 15:26:12 +0200427exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200428 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000429}
Paul Bakker33b43f12013-08-20 11:48:36 +0200430/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000431
Paul Bakker33b43f12013-08-20 11:48:36 +0200432/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100433void mbedtls_mpi_get_bit( int radix_X, char * input_X, int pos, int val )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000434{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200435 mbedtls_mpi X;
436 mbedtls_mpi_init( &X );
437 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
438 TEST_ASSERT( mbedtls_mpi_get_bit( &X, pos ) == val );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000439
Paul Bakkerbd51b262014-07-10 15:26:12 +0200440exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200441 mbedtls_mpi_free( &X );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000442}
Paul Bakker33b43f12013-08-20 11:48:36 +0200443/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000444
Paul Bakker33b43f12013-08-20 11:48:36 +0200445/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100446void mbedtls_mpi_set_bit( int radix_X, char * input_X, int pos, int val,
447 int radix_Y, char * output_Y, int result )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000448{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200449 mbedtls_mpi X, Y;
450 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000451
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200452 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
453 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, output_Y ) == 0 );
Paul Bakkerec5ceb62016-07-14 12:47:07 +0100454 TEST_ASSERT( mbedtls_mpi_set_bit( &X, pos, val ) == result );
455
456 if( result == 0 )
457 {
458 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
459 }
Paul Bakker2f5947e2011-05-18 15:47:11 +0000460
Paul Bakkerbd51b262014-07-10 15:26:12 +0200461exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200462 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000463}
Paul Bakker33b43f12013-08-20 11:48:36 +0200464/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000465
Paul Bakker33b43f12013-08-20 11:48:36 +0200466/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100467void mbedtls_mpi_lsb( int radix_X, char * input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000468{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200469 mbedtls_mpi X;
470 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000471
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200472 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
473 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000474
Paul Bakkerbd51b262014-07-10 15:26:12 +0200475exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200476 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000477}
Paul Bakker33b43f12013-08-20 11:48:36 +0200478/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000479
Paul Bakker33b43f12013-08-20 11:48:36 +0200480/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100481void mbedtls_mpi_bitlen( int radix_X, char * input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000482{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200483 mbedtls_mpi X;
484 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000485
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200486 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200487 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000488
Paul Bakkerbd51b262014-07-10 15:26:12 +0200489exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200490 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000491}
Paul Bakker33b43f12013-08-20 11:48:36 +0200492/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000493
Paul Bakker33b43f12013-08-20 11:48:36 +0200494/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100495void mbedtls_mpi_gcd( int radix_X, char * input_X, int radix_Y,
496 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000497{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200498 mbedtls_mpi A, X, Y, Z;
499 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000500
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200501 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
502 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
503 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
504 TEST_ASSERT( mbedtls_mpi_gcd( &Z, &X, &Y ) == 0 );
505 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000506
Paul Bakkerbd51b262014-07-10 15:26:12 +0200507exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200508 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000509}
Paul Bakker33b43f12013-08-20 11:48:36 +0200510/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000511
Paul Bakker33b43f12013-08-20 11:48:36 +0200512/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200513void mbedtls_mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000514{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200515 mbedtls_mpi X;
516 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000517
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200518 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0);
519 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000520
Paul Bakkerbd51b262014-07-10 15:26:12 +0200521exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200522 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000523}
Paul Bakker33b43f12013-08-20 11:48:36 +0200524/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000525
Paul Bakker33b43f12013-08-20 11:48:36 +0200526/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100527void mbedtls_mpi_cmp_mpi( int radix_X, char * input_X, int radix_Y,
528 char * input_Y, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000529{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200530 mbedtls_mpi X, Y;
531 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000532
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200533 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
534 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
535 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000536
Paul Bakkerbd51b262014-07-10 15:26:12 +0200537exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200538 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000539}
Paul Bakker33b43f12013-08-20 11:48:36 +0200540/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000541
Paul Bakker33b43f12013-08-20 11:48:36 +0200542/* BEGIN_CASE */
Janos Follath27d221a2019-10-14 09:21:49 +0100543void mbedtls_mpi_lt_mpi_ct( int size_X, char * input_X,
544 int size_Y, char * input_Y,
Janos Follath867a3ab2019-10-11 14:21:53 +0100545 int input_ret, int input_err )
Janos Follathe9ae6302019-09-11 16:07:14 +0100546{
Janos Follath867a3ab2019-10-11 14:21:53 +0100547 unsigned ret;
548 unsigned input_uret = input_ret;
Janos Follathe9ae6302019-09-11 16:07:14 +0100549 mbedtls_mpi X, Y;
550 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
551
Janos Follath27d221a2019-10-14 09:21:49 +0100552 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, input_X ) == 0 );
553 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, input_Y ) == 0 );
Janos Follathe9ae6302019-09-11 16:07:14 +0100554
Gilles Peskine1a30fbb2020-01-21 16:30:53 +0100555 TEST_ASSERT( mbedtls_mpi_grow( &X, size_X ) == 0 );
556 TEST_ASSERT( mbedtls_mpi_grow( &Y, size_Y ) == 0 );
Janos Follathe9ae6302019-09-11 16:07:14 +0100557
Janos Follath867a3ab2019-10-11 14:21:53 +0100558 TEST_ASSERT( mbedtls_mpi_lt_mpi_ct( &X, &Y, &ret ) == input_err );
Janos Follathe9ae6302019-09-11 16:07:14 +0100559 if( input_err == 0 )
Janos Follath867a3ab2019-10-11 14:21:53 +0100560 TEST_ASSERT( ret == input_uret );
Janos Follathe9ae6302019-09-11 16:07:14 +0100561
562exit:
563 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
564}
565/* END_CASE */
566
567/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100568void mbedtls_mpi_cmp_abs( int radix_X, char * input_X, int radix_Y,
569 char * input_Y, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000570{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200571 mbedtls_mpi X, Y;
572 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000573
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
575 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
576 TEST_ASSERT( mbedtls_mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000577
Paul Bakkerbd51b262014-07-10 15:26:12 +0200578exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200579 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000580}
Paul Bakker33b43f12013-08-20 11:48:36 +0200581/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000582
Paul Bakker33b43f12013-08-20 11:48:36 +0200583/* BEGIN_CASE */
Gilles Peskine8fe3b792020-01-20 21:01:51 +0100584void mbedtls_mpi_copy_sint( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000585{
Gilles Peskine8fe3b792020-01-20 21:01:51 +0100586 mbedtls_mpi X, Y;
587 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000588
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200589 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
Gilles Peskine8fe3b792020-01-20 21:01:51 +0100590 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 );
591
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200592 TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 );
Gilles Peskine8fe3b792020-01-20 21:01:51 +0100593 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
594 TEST_ASSERT( mbedtls_mpi_cmp_int( &Y, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000595
Paul Bakkerbd51b262014-07-10 15:26:12 +0200596exit:
Gilles Peskine8fe3b792020-01-20 21:01:51 +0100597 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
598}
599/* END_CASE */
600
601/* BEGIN_CASE */
602void mbedtls_mpi_copy_binary( data_t *input_X, data_t *input_Y )
603{
604 mbedtls_mpi X, Y, X0;
605 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &X0 );
606
Gilles Peskinee0ced3a2020-02-03 16:15:47 +0100607 TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
608 TEST_ASSERT( mbedtls_mpi_read_binary( &Y, input_Y->x, input_Y->len ) == 0 );
609 TEST_ASSERT( mbedtls_mpi_read_binary( &X0, input_X->x, input_X->len ) == 0 );
Gilles Peskine8fe3b792020-01-20 21:01:51 +0100610 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 );
611
612 TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 );
613 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 );
614 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &X0 ) == 0 );
615
616exit:
617 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &X0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000618}
Paul Bakker33b43f12013-08-20 11:48:36 +0200619/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000620
Paul Bakker33b43f12013-08-20 11:48:36 +0200621/* BEGIN_CASE */
622void mpi_copy_self( int input_X )
Paul Bakkere896fea2009-07-06 06:40:23 +0000623{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200624 mbedtls_mpi X;
625 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000626
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200627 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
628 TEST_ASSERT( mbedtls_mpi_copy( &X, &X ) == 0 );
629 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000630
Paul Bakkerbd51b262014-07-10 15:26:12 +0200631exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200632 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000633}
Paul Bakker33b43f12013-08-20 11:48:36 +0200634/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000635
Paul Bakker33b43f12013-08-20 11:48:36 +0200636/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200637void mbedtls_mpi_shrink( int before, int used, int min, int after )
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100638{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200639 mbedtls_mpi X;
640 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100641
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200642 TEST_ASSERT( mbedtls_mpi_grow( &X, before ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100643 TEST_ASSERT( used <= before );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200644 memset( X.p, 0x2a, used * sizeof( mbedtls_mpi_uint ) );
645 TEST_ASSERT( mbedtls_mpi_shrink( &X, min ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100646 TEST_ASSERT( X.n == (size_t) after );
647
Paul Bakkerbd51b262014-07-10 15:26:12 +0200648exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200649 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100650}
651/* END_CASE */
652
653/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100654void mbedtls_mpi_safe_cond_assign( int x_sign, char * x_str, int y_sign,
655 char * y_str )
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100656{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200657 mbedtls_mpi X, Y, XX;
658 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100659
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200660 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100661 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200662 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100663 Y.s = y_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200664 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100665
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200666 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 0 ) == 0 );
667 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100668
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200669 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 1 ) == 0 );
670 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100671
Paul Bakkerbd51b262014-07-10 15:26:12 +0200672exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200673 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100674}
675/* END_CASE */
676
677/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100678void mbedtls_mpi_safe_cond_swap( int x_sign, char * x_str, int y_sign,
679 char * y_str )
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100680{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200681 mbedtls_mpi X, Y, XX, YY;
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100682
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200683 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
684 mbedtls_mpi_init( &XX ); mbedtls_mpi_init( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100685
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200686 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100687 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200688 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100689 Y.s = y_sign;
690
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200691 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
692 TEST_ASSERT( mbedtls_mpi_copy( &YY, &Y ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100693
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200694 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
695 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
696 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100697
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200698 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 1 ) == 0 );
699 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &XX ) == 0 );
700 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100701
Paul Bakkerbd51b262014-07-10 15:26:12 +0200702exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200703 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
704 mbedtls_mpi_free( &XX ); mbedtls_mpi_free( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100705}
706/* END_CASE */
707
708/* BEGIN_CASE */
Gilles Peskine8fe3b792020-01-20 21:01:51 +0100709void mbedtls_mpi_swap_sint( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000710{
Gilles Peskine8fe3b792020-01-20 21:01:51 +0100711 mbedtls_mpi X, Y;
712 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000713
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200714 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
715 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 );
Gilles Peskine8fe3b792020-01-20 21:01:51 +0100716 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
717 TEST_ASSERT( mbedtls_mpi_cmp_int( &Y, input_Y ) == 0 );
718
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200719 mbedtls_mpi_swap( &X, &Y );
Gilles Peskine8fe3b792020-01-20 21:01:51 +0100720 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_Y ) == 0 );
721 TEST_ASSERT( mbedtls_mpi_cmp_int( &Y, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000722
Paul Bakkerbd51b262014-07-10 15:26:12 +0200723exit:
Gilles Peskine8fe3b792020-01-20 21:01:51 +0100724 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
725}
726/* END_CASE */
727
728/* BEGIN_CASE */
729void mbedtls_mpi_swap_binary( data_t *input_X, data_t *input_Y )
730{
731 mbedtls_mpi X, Y, X0, Y0;
732 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
733 mbedtls_mpi_init( &X0 ); mbedtls_mpi_init( &Y0 );
734
Gilles Peskinee0ced3a2020-02-03 16:15:47 +0100735 TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
736 TEST_ASSERT( mbedtls_mpi_read_binary( &Y, input_Y->x, input_Y->len ) == 0 );
737 TEST_ASSERT( mbedtls_mpi_read_binary( &X0, input_X->x, input_X->len ) == 0 );
738 TEST_ASSERT( mbedtls_mpi_read_binary( &Y0, input_Y->x, input_Y->len ) == 0 );
Gilles Peskine8fe3b792020-01-20 21:01:51 +0100739
740 mbedtls_mpi_swap( &X, &Y );
741 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y0 ) == 0 );
742 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &X0 ) == 0 );
743
744exit:
745 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
746 mbedtls_mpi_free( &X0 ); mbedtls_mpi_free( &Y0 );
747}
748/* END_CASE */
749
750/* BEGIN_CASE */
751void mpi_swap_self( data_t *input_X )
752{
753 mbedtls_mpi X, X0;
754 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &X0 );
755
Gilles Peskinee0ced3a2020-02-03 16:15:47 +0100756 TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
757 TEST_ASSERT( mbedtls_mpi_read_binary( &X0, input_X->x, input_X->len ) == 0 );
Gilles Peskine8fe3b792020-01-20 21:01:51 +0100758
759 mbedtls_mpi_swap( &X, &X );
760 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 );
761
762exit:
763 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &X0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000764}
Paul Bakker33b43f12013-08-20 11:48:36 +0200765/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000766
Paul Bakker33b43f12013-08-20 11:48:36 +0200767/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100768void mbedtls_mpi_add_mpi( int radix_X, char * input_X, int radix_Y,
769 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000770{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200771 mbedtls_mpi X, Y, Z, A;
772 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000773
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200774 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
775 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
776 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
777 TEST_ASSERT( mbedtls_mpi_add_mpi( &Z, &X, &Y ) == 0 );
778 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000779
Paul Bakkerbd51b262014-07-10 15:26:12 +0200780exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200781 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000782}
Paul Bakker33b43f12013-08-20 11:48:36 +0200783/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000784
Paul Bakker33b43f12013-08-20 11:48:36 +0200785/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100786void mbedtls_mpi_add_mpi_inplace( int radix_X, char * input_X, int radix_A,
787 char * input_A )
Janos Follath044a86b2015-10-25 10:58:03 +0100788{
789 mbedtls_mpi X, A;
790 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
791
Janos Follath044a86b2015-10-25 10:58:03 +0100792 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +0100793
794 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
795 TEST_ASSERT( mbedtls_mpi_sub_abs( &X, &X, &X ) == 0 );
796 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, 0 ) == 0 );
797
798 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
799 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &X ) == 0 );
800 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
801
802 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Janos Follath044a86b2015-10-25 10:58:03 +0100803 TEST_ASSERT( mbedtls_mpi_add_mpi( &X, &X, &X ) == 0 );
804 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
805
806exit:
807 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
808}
809/* END_CASE */
810
811
812/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100813void mbedtls_mpi_add_abs( int radix_X, char * input_X, int radix_Y,
814 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000815{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200816 mbedtls_mpi X, Y, Z, A;
817 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000818
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200819 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
820 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
821 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
822 TEST_ASSERT( mbedtls_mpi_add_abs( &Z, &X, &Y ) == 0 );
823 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000824
Paul Bakkerbd51b262014-07-10 15:26:12 +0200825exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200826 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000827}
Paul Bakker33b43f12013-08-20 11:48:36 +0200828/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000829
Paul Bakker33b43f12013-08-20 11:48:36 +0200830/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100831void mpi_add_abs_add_first( int radix_X, char * input_X, int radix_Y,
832 char * input_Y, int radix_A, char * input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000833{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200834 mbedtls_mpi X, Y, A;
835 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000836
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200837 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
838 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
839 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
840 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &Y ) == 0 );
841 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000842
Paul Bakkerbd51b262014-07-10 15:26:12 +0200843exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200844 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000845}
Paul Bakker33b43f12013-08-20 11:48:36 +0200846/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000847
Paul Bakker33b43f12013-08-20 11:48:36 +0200848/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100849void mpi_add_abs_add_second( int radix_X, char * input_X, int radix_Y,
850 char * input_Y, int radix_A, char * input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000851{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200852 mbedtls_mpi X, Y, A;
853 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000854
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200855 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
856 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
857 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
858 TEST_ASSERT( mbedtls_mpi_add_abs( &Y, &X, &Y ) == 0 );
859 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000860
Paul Bakkerbd51b262014-07-10 15:26:12 +0200861exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200862 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000863}
Paul Bakker33b43f12013-08-20 11:48:36 +0200864/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000865
Paul Bakker33b43f12013-08-20 11:48:36 +0200866/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100867void mbedtls_mpi_add_int( int radix_X, char * input_X, int input_Y,
868 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000869{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200870 mbedtls_mpi X, Z, A;
871 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000872
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200873 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
874 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
875 TEST_ASSERT( mbedtls_mpi_add_int( &Z, &X, input_Y ) == 0 );
876 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000877
Paul Bakkerbd51b262014-07-10 15:26:12 +0200878exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200879 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000880}
Paul Bakker33b43f12013-08-20 11:48:36 +0200881/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000882
Paul Bakker33b43f12013-08-20 11:48:36 +0200883/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100884void mbedtls_mpi_sub_mpi( int radix_X, char * input_X, int radix_Y,
885 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000886{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200887 mbedtls_mpi X, Y, Z, A;
888 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000889
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200890 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
891 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
892 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
893 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Z, &X, &Y ) == 0 );
894 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000895
Paul Bakkerbd51b262014-07-10 15:26:12 +0200896exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200897 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000898}
Paul Bakker33b43f12013-08-20 11:48:36 +0200899/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000900
Paul Bakker33b43f12013-08-20 11:48:36 +0200901/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100902void mbedtls_mpi_sub_abs( int radix_X, char * input_X, int radix_Y,
903 char * input_Y, int radix_A, char * input_A,
904 int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000905{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200906 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000907 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200908 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000909
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200910 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
911 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
912 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +0100913
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200914 res = mbedtls_mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200915 TEST_ASSERT( res == sub_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000916 if( res == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200917 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000918
Paul Bakkerbd51b262014-07-10 15:26:12 +0200919exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200920 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000921}
Paul Bakker33b43f12013-08-20 11:48:36 +0200922/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000923
Paul Bakker33b43f12013-08-20 11:48:36 +0200924/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100925void mbedtls_mpi_sub_int( int radix_X, char * input_X, int input_Y,
926 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000927{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200928 mbedtls_mpi X, Z, A;
929 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000930
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200931 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
932 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
933 TEST_ASSERT( mbedtls_mpi_sub_int( &Z, &X, input_Y ) == 0 );
934 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000935
Paul Bakkerbd51b262014-07-10 15:26:12 +0200936exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200937 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000938}
Paul Bakker33b43f12013-08-20 11:48:36 +0200939/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000940
Paul Bakker33b43f12013-08-20 11:48:36 +0200941/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100942void mbedtls_mpi_mul_mpi( int radix_X, char * input_X, int radix_Y,
943 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000944{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200945 mbedtls_mpi X, Y, Z, A;
946 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000947
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200948 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
949 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
950 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
951 TEST_ASSERT( mbedtls_mpi_mul_mpi( &Z, &X, &Y ) == 0 );
952 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000953
Paul Bakkerbd51b262014-07-10 15:26:12 +0200954exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200955 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000956}
Paul Bakker33b43f12013-08-20 11:48:36 +0200957/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000958
Paul Bakker33b43f12013-08-20 11:48:36 +0200959/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100960void mbedtls_mpi_mul_int( int radix_X, char * input_X, int input_Y,
961 int radix_A, char * input_A,
962 char * result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +0000963{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200964 mbedtls_mpi X, Z, A;
965 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000966
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200967 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
968 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
969 TEST_ASSERT( mbedtls_mpi_mul_int( &Z, &X, input_Y ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200970 if( strcmp( result_comparison, "==" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200971 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200972 else if( strcmp( result_comparison, "!=" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200973 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) != 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200974 else
975 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000976
Paul Bakkerbd51b262014-07-10 15:26:12 +0200977exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200978 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000979}
Paul Bakker33b43f12013-08-20 11:48:36 +0200980/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000981
Paul Bakker33b43f12013-08-20 11:48:36 +0200982/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100983void mbedtls_mpi_div_mpi( int radix_X, char * input_X, int radix_Y,
984 char * input_Y, int radix_A, char * input_A,
985 int radix_B, char * input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000986{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200987 mbedtls_mpi X, Y, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000988 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200989 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R );
990 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000991
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200992 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
993 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
994 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
995 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
996 res = mbedtls_mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200997 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000998 if( res == 0 )
999 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001000 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
1001 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001002 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001003
Paul Bakkerbd51b262014-07-10 15:26:12 +02001004exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001005 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R );
1006 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001007}
Paul Bakker33b43f12013-08-20 11:48:36 +02001008/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001009
Paul Bakker33b43f12013-08-20 11:48:36 +02001010/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001011void mbedtls_mpi_div_int( int radix_X, char * input_X, int input_Y,
1012 int radix_A, char * input_A, int radix_B,
1013 char * input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001014{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001015 mbedtls_mpi X, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +00001016 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001017 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &A );
1018 mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001019
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001020 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
1021 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
1022 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
1023 res = mbedtls_mpi_div_int( &Q, &R, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001024 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001025 if( res == 0 )
1026 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001027 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
1028 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001029 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001030
Paul Bakkerbd51b262014-07-10 15:26:12 +02001031exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001032 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &A );
1033 mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001034}
Paul Bakker33b43f12013-08-20 11:48:36 +02001035/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001036
Paul Bakker33b43f12013-08-20 11:48:36 +02001037/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001038void mbedtls_mpi_mod_mpi( int radix_X, char * input_X, int radix_Y,
1039 char * input_Y, int radix_A, char * input_A,
1040 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001041{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001042 mbedtls_mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +00001043 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001044 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001045
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001046 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
1047 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
1048 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
1049 res = mbedtls_mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001050 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001051 if( res == 0 )
1052 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001053 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001054 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001055
Paul Bakkerbd51b262014-07-10 15:26:12 +02001056exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001057 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001058}
Paul Bakker33b43f12013-08-20 11:48:36 +02001059/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001060
Paul Bakker33b43f12013-08-20 11:48:36 +02001061/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001062void mbedtls_mpi_mod_int( int radix_X, char * input_X, int input_Y,
1063 int input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001064{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001065 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +00001066 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001067 mbedtls_mpi_uint r;
1068 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001069
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001070 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
1071 res = mbedtls_mpi_mod_int( &r, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001072 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001073 if( res == 0 )
1074 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001075 TEST_ASSERT( r == (mbedtls_mpi_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +00001076 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001077
Paul Bakkerbd51b262014-07-10 15:26:12 +02001078exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001079 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001080}
Paul Bakker33b43f12013-08-20 11:48:36 +02001081/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001082
Paul Bakker33b43f12013-08-20 11:48:36 +02001083/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001084void mbedtls_mpi_exp_mod( int radix_A, char * input_A, int radix_E,
1085 char * input_E, int radix_N, char * input_N,
1086 int radix_RR, char * input_RR, int radix_X,
1087 char * input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001088{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001089 mbedtls_mpi A, E, N, RR, Z, X;
Paul Bakker367dae42009-06-28 21:50:27 +00001090 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001091 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
1092 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001093
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001094 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
1095 TEST_ASSERT( mbedtls_mpi_read_string( &E, radix_E, input_E ) == 0 );
1096 TEST_ASSERT( mbedtls_mpi_read_string( &N, radix_N, input_N ) == 0 );
1097 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001098
Paul Bakker33b43f12013-08-20 11:48:36 +02001099 if( strlen( input_RR ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001100 TEST_ASSERT( mbedtls_mpi_read_string( &RR, radix_RR, input_RR ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001101
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001102 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR );
Paul Bakker33b43f12013-08-20 11:48:36 +02001103 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001104 if( res == 0 )
1105 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001106 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001107 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001108
Paul Bakkerbd51b262014-07-10 15:26:12 +02001109exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001110 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
1111 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001112}
Paul Bakker33b43f12013-08-20 11:48:36 +02001113/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001114
Paul Bakker33b43f12013-08-20 11:48:36 +02001115/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001116void mbedtls_mpi_inv_mod( int radix_X, char * input_X, int radix_Y,
1117 char * input_Y, int radix_A, char * input_A,
1118 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001119{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001120 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +00001121 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001122 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001123
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001124 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
1125 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
1126 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
1127 res = mbedtls_mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001128 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001129 if( res == 0 )
1130 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001131 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001132 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001133
Paul Bakkerbd51b262014-07-10 15:26:12 +02001134exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001135 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001136}
Paul Bakker33b43f12013-08-20 11:48:36 +02001137/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001138
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001139/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Azim Khanf1aaec92017-05-30 14:23:15 +01001140void mbedtls_mpi_is_prime( int radix_X, char * input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001141{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001142 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +00001143 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001144 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001145
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001146 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Janos Follatha0b67c22018-09-18 14:48:23 +01001147 res = mbedtls_mpi_is_prime_ext( &X, 40, rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +02001148 TEST_ASSERT( res == div_result );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001149
Paul Bakkerbd51b262014-07-10 15:26:12 +02001150exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001151 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001152}
Paul Bakker33b43f12013-08-20 11:48:36 +02001153/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001154
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001155/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Janos Follath64eca052018-09-05 17:04:49 +01001156void mbedtls_mpi_is_prime_det( data_t * input_X, data_t * witnesses,
Darryl Greenac2ead02018-10-02 15:30:39 +01001157 int chunk_len, int rounds )
Janos Follath64eca052018-09-05 17:04:49 +01001158{
1159 mbedtls_mpi X;
1160 int res;
1161 mbedtls_test_mpi_random rand;
1162
1163 mbedtls_mpi_init( &X );
1164 rand.data = witnesses;
1165 rand.pos = 0;
1166 rand.chunk_len = chunk_len;
1167
1168 TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
Darryl Greenac2ead02018-10-02 15:30:39 +01001169 res = mbedtls_mpi_is_prime_ext( &X, rounds - 1,
1170 mbedtls_test_mpi_miller_rabin_determinizer,
1171 &rand );
1172 TEST_ASSERT( res == 0 );
1173
1174 rand.data = witnesses;
1175 rand.pos = 0;
1176 rand.chunk_len = chunk_len;
1177
Janos Follatha0b67c22018-09-18 14:48:23 +01001178 res = mbedtls_mpi_is_prime_ext( &X, rounds,
1179 mbedtls_test_mpi_miller_rabin_determinizer,
Janos Follath64eca052018-09-05 17:04:49 +01001180 &rand );
Darryl Greenac2ead02018-10-02 15:30:39 +01001181 TEST_ASSERT( res == MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
Janos Follath64eca052018-09-05 17:04:49 +01001182
1183exit:
1184 mbedtls_mpi_free( &X );
1185}
1186/* END_CASE */
1187
1188/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Janos Follatha3cb7eb2018-08-14 15:31:54 +01001189void mbedtls_mpi_gen_prime( int bits, int flags, int ref_ret )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001190{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001191 mbedtls_mpi X;
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001192 int my_ret;
1193
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001194 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001195
Janos Follatha3cb7eb2018-08-14 15:31:54 +01001196 my_ret = mbedtls_mpi_gen_prime( &X, bits, flags, rnd_std_rand, NULL );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001197 TEST_ASSERT( my_ret == ref_ret );
1198
1199 if( ref_ret == 0 )
1200 {
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +02001201 size_t actual_bits = mbedtls_mpi_bitlen( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001202
1203 TEST_ASSERT( actual_bits >= (size_t) bits );
1204 TEST_ASSERT( actual_bits <= (size_t) bits + 1 );
1205
Janos Follatha0b67c22018-09-18 14:48:23 +01001206 TEST_ASSERT( mbedtls_mpi_is_prime_ext( &X, 40, rnd_std_rand, NULL )
1207 == 0 );
Janos Follatha3cb7eb2018-08-14 15:31:54 +01001208 if( flags & MBEDTLS_MPI_GEN_PRIME_FLAG_DH )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001209 {
Hanno Beckerd4d60572018-01-10 07:12:01 +00001210 /* X = ( X - 1 ) / 2 */
1211 TEST_ASSERT( mbedtls_mpi_shift_r( &X, 1 ) == 0 );
Janos Follatha0b67c22018-09-18 14:48:23 +01001212 TEST_ASSERT( mbedtls_mpi_is_prime_ext( &X, 40, rnd_std_rand, NULL )
1213 == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001214 }
1215 }
1216
Paul Bakkerbd51b262014-07-10 15:26:12 +02001217exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001218 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001219}
1220/* END_CASE */
1221
Paul Bakker33b43f12013-08-20 11:48:36 +02001222/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001223void mbedtls_mpi_shift_l( int radix_X, char * input_X, int shift_X,
1224 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001225{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001226 mbedtls_mpi X, A;
1227 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001228
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001229 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
1230 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
1231 TEST_ASSERT( mbedtls_mpi_shift_l( &X, shift_X ) == 0 );
1232 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001233
Paul Bakkerbd51b262014-07-10 15:26:12 +02001234exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001235 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001236}
Paul Bakker33b43f12013-08-20 11:48:36 +02001237/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001238
Paul Bakker33b43f12013-08-20 11:48:36 +02001239/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001240void mbedtls_mpi_shift_r( int radix_X, char * input_X, int shift_X,
1241 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001242{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001243 mbedtls_mpi X, A;
1244 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001245
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001246 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
1247 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
1248 TEST_ASSERT( mbedtls_mpi_shift_r( &X, shift_X ) == 0 );
1249 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001250
Paul Bakkerbd51b262014-07-10 15:26:12 +02001251exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001252 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001253}
Paul Bakker33b43f12013-08-20 11:48:36 +02001254/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001255
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001256/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Azim Khanf1aaec92017-05-30 14:23:15 +01001257void mpi_selftest( )
Paul Bakkere896fea2009-07-06 06:40:23 +00001258{
Andres AG93012e82016-09-09 09:10:28 +01001259 TEST_ASSERT( mbedtls_mpi_self_test( 1 ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +00001260}
Paul Bakker33b43f12013-08-20 11:48:36 +02001261/* END_CASE */