blob: 97fd7b9834d2f51335db9489a061110c33ffd2da [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 Follath04dadb72019-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 Follath04dadb72019-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;
Janos Follathe5670f22019-02-25 16:11:58 +0000319 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 );
Janos Follathe5670f22019-02-25 16:11:58 +0000326 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, 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 */
Janos Follatha778a942019-02-13 10:28:28 +0000335void mbedtls_mpi_read_binary_le( data_t * buf, int radix_A, char * input_A )
336{
337 mbedtls_mpi X;
Janos Follathe5670f22019-02-25 16:11:58 +0000338 char str[1000];
Janos Follatha778a942019-02-13 10:28:28 +0000339 size_t len;
340
341 mbedtls_mpi_init( &X );
342
343
344 TEST_ASSERT( mbedtls_mpi_read_binary_le( &X, buf->x, buf->len ) == 0 );
Janos Follathe5670f22019-02-25 16:11:58 +0000345 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, str, sizeof( str ), &len ) == 0 );
Janos Follatha778a942019-02-13 10:28:28 +0000346 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
347
348exit:
349 mbedtls_mpi_free( &X );
350}
351/* END_CASE */
352
353/* BEGIN_CASE */
Azim Khand30ca132017-06-09 04:32:58 +0100354void mbedtls_mpi_write_binary( int radix_X, char * input_X,
Azim Khan5fcca462018-06-29 11:05:32 +0100355 data_t * input_A, int output_size,
Azim Khanf1aaec92017-05-30 14:23:15 +0100356 int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000357{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200358 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000359 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000360 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +0000361
362 memset( buf, 0x00, 1000 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000363
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200364 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000365
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200366 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +0100367
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200368 buflen = mbedtls_mpi_size( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +0200369 if( buflen > (size_t) output_size )
370 buflen = (size_t) output_size;
Paul Bakkere896fea2009-07-06 06:40:23 +0000371
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200372 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == result );
Paul Bakker33b43f12013-08-20 11:48:36 +0200373 if( result == 0)
Paul Bakkerba48cb22009-07-12 11:01:32 +0000374 {
Paul Bakkere896fea2009-07-06 06:40:23 +0000375
Azim Khand30ca132017-06-09 04:32:58 +0100376 TEST_ASSERT( hexcmp( buf, input_A->x, buflen, input_A->len ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000377 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000378
Paul Bakkerbd51b262014-07-10 15:26:12 +0200379exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200380 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000381}
Paul Bakker33b43f12013-08-20 11:48:36 +0200382/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000383
Janos Follathe344d0f2019-02-19 16:17:40 +0000384/* BEGIN_CASE */
385void mbedtls_mpi_write_binary_le( int radix_X, char * input_X,
386 data_t * input_A, int output_size,
387 int result )
388{
389 mbedtls_mpi X;
390 unsigned char buf[1000];
391 size_t buflen;
392
393 memset( buf, 0x00, 1000 );
394
395 mbedtls_mpi_init( &X );
396
397 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
398
399 buflen = mbedtls_mpi_size( &X );
400 if( buflen > (size_t) output_size )
401 buflen = (size_t) output_size;
402
403 TEST_ASSERT( mbedtls_mpi_write_binary_le( &X, buf, buflen ) == result );
404 if( result == 0)
405 {
406
407 TEST_ASSERT( hexcmp( buf, input_A->x, buflen, input_A->len ) == 0 );
408 }
409
410exit:
411 mbedtls_mpi_free( &X );
412}
413/* END_CASE */
414
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200415/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Azim Khand30ca132017-06-09 04:32:58 +0100416void mbedtls_mpi_read_file( int radix_X, char * input_file,
Azim Khan5fcca462018-06-29 11:05:32 +0100417 data_t * input_A, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000418{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200419 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000420 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000421 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +0000422 FILE *file;
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000423 int ret;
Paul Bakkere896fea2009-07-06 06:40:23 +0000424
425 memset( buf, 0x00, 1000 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000426
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200427 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000428
Paul Bakker33b43f12013-08-20 11:48:36 +0200429 file = fopen( input_file, "r" );
Paul Bakker8a0c0a92014-04-17 16:08:20 +0200430 TEST_ASSERT( file != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200431 ret = mbedtls_mpi_read_file( &X, radix_X, file );
Paul Bakkere896fea2009-07-06 06:40:23 +0000432 fclose(file);
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000433 TEST_ASSERT( ret == result );
Paul Bakkere896fea2009-07-06 06:40:23 +0000434
Paul Bakker33b43f12013-08-20 11:48:36 +0200435 if( result == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000436 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200437 buflen = mbedtls_mpi_size( &X );
438 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000439
Paul Bakkere896fea2009-07-06 06:40:23 +0000440
Azim Khand30ca132017-06-09 04:32:58 +0100441 TEST_ASSERT( hexcmp( buf, input_A->x, buflen, input_A->len ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000442 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000443
Paul Bakkerbd51b262014-07-10 15:26:12 +0200444exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000446}
Paul Bakker33b43f12013-08-20 11:48:36 +0200447/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000448
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200449/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Azim Khanf1aaec92017-05-30 14:23:15 +0100450void mbedtls_mpi_write_file( int radix_X, char * input_X, int output_radix,
451 char * output_file )
Paul Bakkere896fea2009-07-06 06:40:23 +0000452{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200453 mbedtls_mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000454 FILE *file_out, *file_in;
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200455 int ret;
Paul Bakker69998dd2009-07-11 19:15:20 +0000456
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200457 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000458
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200459 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000460
Paul Bakker33b43f12013-08-20 11:48:36 +0200461 file_out = fopen( output_file, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000462 TEST_ASSERT( file_out != NULL );
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200463 ret = mbedtls_mpi_write_file( NULL, &X, output_radix, file_out );
Paul Bakkere896fea2009-07-06 06:40:23 +0000464 fclose(file_out);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200465 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000466
Paul Bakker33b43f12013-08-20 11:48:36 +0200467 file_in = fopen( output_file, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000468 TEST_ASSERT( file_in != NULL );
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200469 ret = mbedtls_mpi_read_file( &Y, output_radix, file_in );
Paul Bakkere896fea2009-07-06 06:40:23 +0000470 fclose(file_in);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200471 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000472
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200473 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
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 ); mbedtls_mpi_free( &Y );
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_get_bit( int radix_X, char * input_X, int pos, int val )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000482{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200483 mbedtls_mpi X;
484 mbedtls_mpi_init( &X );
485 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
486 TEST_ASSERT( mbedtls_mpi_get_bit( &X, pos ) == val );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000487
Paul Bakkerbd51b262014-07-10 15:26:12 +0200488exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200489 mbedtls_mpi_free( &X );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000490}
Paul Bakker33b43f12013-08-20 11:48:36 +0200491/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000492
Paul Bakker33b43f12013-08-20 11:48:36 +0200493/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100494void mbedtls_mpi_set_bit( int radix_X, char * input_X, int pos, int val,
495 int radix_Y, char * output_Y, int result )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000496{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200497 mbedtls_mpi X, Y;
498 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000499
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200500 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
501 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, output_Y ) == 0 );
Paul Bakkerec5ceb62016-07-14 12:47:07 +0100502 TEST_ASSERT( mbedtls_mpi_set_bit( &X, pos, val ) == result );
503
504 if( result == 0 )
505 {
506 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
507 }
Paul Bakker2f5947e2011-05-18 15:47:11 +0000508
Paul Bakkerbd51b262014-07-10 15:26:12 +0200509exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200510 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000511}
Paul Bakker33b43f12013-08-20 11:48:36 +0200512/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000513
Paul Bakker33b43f12013-08-20 11:48:36 +0200514/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100515void mbedtls_mpi_lsb( int radix_X, char * input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000516{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200517 mbedtls_mpi X;
518 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000519
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200520 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
521 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000522
Paul Bakkerbd51b262014-07-10 15:26:12 +0200523exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200524 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000525}
Paul Bakker33b43f12013-08-20 11:48:36 +0200526/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000527
Paul Bakker33b43f12013-08-20 11:48:36 +0200528/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100529void mbedtls_mpi_bitlen( int radix_X, char * input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000530{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200531 mbedtls_mpi X;
532 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000533
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200534 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200535 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == (size_t) nr_bits );
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 );
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 */
Azim Khanf1aaec92017-05-30 14:23:15 +0100543void mbedtls_mpi_gcd( int radix_X, char * input_X, int radix_Y,
544 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000545{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200546 mbedtls_mpi A, X, Y, Z;
547 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000548
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200549 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
550 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
551 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
552 TEST_ASSERT( mbedtls_mpi_gcd( &Z, &X, &Y ) == 0 );
553 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000554
Paul Bakkerbd51b262014-07-10 15:26:12 +0200555exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200556 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000557}
Paul Bakker33b43f12013-08-20 11:48:36 +0200558/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000559
Paul Bakker33b43f12013-08-20 11:48:36 +0200560/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200561void mbedtls_mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000562{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200563 mbedtls_mpi X;
564 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000565
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200566 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0);
567 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000568
Paul Bakkerbd51b262014-07-10 15:26:12 +0200569exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200570 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000571}
Paul Bakker33b43f12013-08-20 11:48:36 +0200572/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000573
Paul Bakker33b43f12013-08-20 11:48:36 +0200574/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100575void mbedtls_mpi_cmp_mpi( int radix_X, char * input_X, int radix_Y,
576 char * input_Y, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000577{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200578 mbedtls_mpi X, Y;
579 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000580
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200581 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
582 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
583 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000584
Paul Bakkerbd51b262014-07-10 15:26:12 +0200585exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200586 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000587}
Paul Bakker33b43f12013-08-20 11:48:36 +0200588/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000589
Paul Bakker33b43f12013-08-20 11:48:36 +0200590/* BEGIN_CASE */
Janos Follath385d5b82019-09-11 16:07:14 +0100591void mbedtls_mpi_cmp_mpi_ct( int size_X, int radix_X, char * input_X, int size_Y,
592 int radix_Y, char * input_Y, int input_ret, int input_err )
593{
594 int ret;
595 mbedtls_mpi X, Y;
596 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
597
598 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
599 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
600
601 mbedtls_mpi_grow( &X, size_X );
602 mbedtls_mpi_grow( &Y, size_Y );
603
604 TEST_ASSERT( mbedtls_mpi_cmp_mpi_ct( &X, &Y, &ret ) == input_err );
605 if( input_err == 0 )
606 TEST_ASSERT( ret == input_ret );
607
608exit:
609 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
610}
611/* END_CASE */
612
613/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100614void mbedtls_mpi_cmp_abs( int radix_X, char * input_X, int radix_Y,
615 char * input_Y, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000616{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200617 mbedtls_mpi X, Y;
618 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000619
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200620 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
621 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
622 TEST_ASSERT( mbedtls_mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000623
Paul Bakkerbd51b262014-07-10 15:26:12 +0200624exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200625 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000626}
Paul Bakker33b43f12013-08-20 11:48:36 +0200627/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000628
Paul Bakker33b43f12013-08-20 11:48:36 +0200629/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200630void mbedtls_mpi_copy( int input_X, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000631{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200632 mbedtls_mpi X, Y, A;
633 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000634
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200635 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
636 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_A ) == 0 );
637 TEST_ASSERT( mbedtls_mpi_lset( &A, input_A ) == 0 );
638 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
639 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
640 TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 );
641 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
642 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) != 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000643
Paul Bakkerbd51b262014-07-10 15:26:12 +0200644exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200645 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000646}
Paul Bakker33b43f12013-08-20 11:48:36 +0200647/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000648
Paul Bakker33b43f12013-08-20 11:48:36 +0200649/* BEGIN_CASE */
650void mpi_copy_self( int input_X )
Paul Bakkere896fea2009-07-06 06:40:23 +0000651{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200652 mbedtls_mpi X;
653 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000654
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200655 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
656 TEST_ASSERT( mbedtls_mpi_copy( &X, &X ) == 0 );
657 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000658
Paul Bakkerbd51b262014-07-10 15:26:12 +0200659exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200660 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000661}
Paul Bakker33b43f12013-08-20 11:48:36 +0200662/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000663
Paul Bakker33b43f12013-08-20 11:48:36 +0200664/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200665void mbedtls_mpi_shrink( int before, int used, int min, int after )
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100666{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200667 mbedtls_mpi X;
668 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100669
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200670 TEST_ASSERT( mbedtls_mpi_grow( &X, before ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100671 TEST_ASSERT( used <= before );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672 memset( X.p, 0x2a, used * sizeof( mbedtls_mpi_uint ) );
673 TEST_ASSERT( mbedtls_mpi_shrink( &X, min ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100674 TEST_ASSERT( X.n == (size_t) after );
675
Paul Bakkerbd51b262014-07-10 15:26:12 +0200676exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200677 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100678}
679/* END_CASE */
680
681/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100682void mbedtls_mpi_safe_cond_assign( int x_sign, char * x_str, int y_sign,
683 char * y_str )
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100684{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200685 mbedtls_mpi X, Y, XX;
686 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100687
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200688 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100689 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200690 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100691 Y.s = y_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200692 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100693
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200694 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 0 ) == 0 );
695 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100696
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200697 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 1 ) == 0 );
698 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100699
Paul Bakkerbd51b262014-07-10 15:26:12 +0200700exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200701 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100702}
703/* END_CASE */
704
705/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100706void mbedtls_mpi_safe_cond_swap( int x_sign, char * x_str, int y_sign,
707 char * y_str )
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100708{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200709 mbedtls_mpi X, Y, XX, YY;
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100710
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200711 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
712 mbedtls_mpi_init( &XX ); mbedtls_mpi_init( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100713
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200714 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100715 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200716 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100717 Y.s = y_sign;
718
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200719 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
720 TEST_ASSERT( mbedtls_mpi_copy( &YY, &Y ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100721
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200722 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
723 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
724 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100725
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200726 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 1 ) == 0 );
727 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &XX ) == 0 );
728 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100729
Paul Bakkerbd51b262014-07-10 15:26:12 +0200730exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200731 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
732 mbedtls_mpi_free( &XX ); mbedtls_mpi_free( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100733}
734/* END_CASE */
735
736/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100737void mbedtls_mpi_swap( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000738{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200739 mbedtls_mpi X, Y, A;
740 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000741
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200742 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
743 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 );
744 TEST_ASSERT( mbedtls_mpi_lset( &A, input_X ) == 0 );
745 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
746 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
747 mbedtls_mpi_swap( &X, &Y );
748 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
749 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000750
Paul Bakkerbd51b262014-07-10 15:26:12 +0200751exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200752 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000753}
Paul Bakker33b43f12013-08-20 11:48:36 +0200754/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000755
Paul Bakker33b43f12013-08-20 11:48:36 +0200756/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100757void mbedtls_mpi_add_mpi( int radix_X, char * input_X, int radix_Y,
758 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000759{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200760 mbedtls_mpi X, Y, Z, A;
761 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000762
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200763 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
764 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
765 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
766 TEST_ASSERT( mbedtls_mpi_add_mpi( &Z, &X, &Y ) == 0 );
767 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000768
Paul Bakkerbd51b262014-07-10 15:26:12 +0200769exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200770 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000771}
Paul Bakker33b43f12013-08-20 11:48:36 +0200772/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000773
Paul Bakker33b43f12013-08-20 11:48:36 +0200774/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100775void mbedtls_mpi_add_mpi_inplace( int radix_X, char * input_X, int radix_A,
776 char * input_A )
Janos Follath044a86b2015-10-25 10:58:03 +0100777{
778 mbedtls_mpi X, A;
779 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
780
Janos Follath044a86b2015-10-25 10:58:03 +0100781 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +0100782
783 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
784 TEST_ASSERT( mbedtls_mpi_sub_abs( &X, &X, &X ) == 0 );
785 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, 0 ) == 0 );
786
787 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
788 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &X ) == 0 );
789 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
790
791 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Janos Follath044a86b2015-10-25 10:58:03 +0100792 TEST_ASSERT( mbedtls_mpi_add_mpi( &X, &X, &X ) == 0 );
793 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
794
795exit:
796 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
797}
798/* END_CASE */
799
800
801/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100802void mbedtls_mpi_add_abs( int radix_X, char * input_X, int radix_Y,
803 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000804{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200805 mbedtls_mpi X, Y, Z, A;
806 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000807
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200808 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
809 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
810 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
811 TEST_ASSERT( mbedtls_mpi_add_abs( &Z, &X, &Y ) == 0 );
812 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000813
Paul Bakkerbd51b262014-07-10 15:26:12 +0200814exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200815 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000816}
Paul Bakker33b43f12013-08-20 11:48:36 +0200817/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000818
Paul Bakker33b43f12013-08-20 11:48:36 +0200819/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100820void mpi_add_abs_add_first( int radix_X, char * input_X, int radix_Y,
821 char * input_Y, int radix_A, char * input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000822{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200823 mbedtls_mpi X, Y, A;
824 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000825
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200826 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
827 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
828 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
829 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &Y ) == 0 );
830 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000831
Paul Bakkerbd51b262014-07-10 15:26:12 +0200832exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200833 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000834}
Paul Bakker33b43f12013-08-20 11:48:36 +0200835/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000836
Paul Bakker33b43f12013-08-20 11:48:36 +0200837/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100838void mpi_add_abs_add_second( int radix_X, char * input_X, int radix_Y,
839 char * input_Y, int radix_A, char * input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000840{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200841 mbedtls_mpi X, Y, A;
842 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000843
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200844 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
845 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
846 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
847 TEST_ASSERT( mbedtls_mpi_add_abs( &Y, &X, &Y ) == 0 );
848 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000849
Paul Bakkerbd51b262014-07-10 15:26:12 +0200850exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200851 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000852}
Paul Bakker33b43f12013-08-20 11:48:36 +0200853/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000854
Paul Bakker33b43f12013-08-20 11:48:36 +0200855/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100856void mbedtls_mpi_add_int( int radix_X, char * input_X, int input_Y,
857 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000858{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200859 mbedtls_mpi X, Z, A;
860 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000861
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200862 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
863 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
864 TEST_ASSERT( mbedtls_mpi_add_int( &Z, &X, input_Y ) == 0 );
865 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000866
Paul Bakkerbd51b262014-07-10 15:26:12 +0200867exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200868 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000869}
Paul Bakker33b43f12013-08-20 11:48:36 +0200870/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000871
Paul Bakker33b43f12013-08-20 11:48:36 +0200872/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100873void mbedtls_mpi_sub_mpi( int radix_X, char * input_X, int radix_Y,
874 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000875{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200876 mbedtls_mpi X, Y, Z, A;
877 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000878
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200879 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
880 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
881 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
882 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Z, &X, &Y ) == 0 );
883 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000884
Paul Bakkerbd51b262014-07-10 15:26:12 +0200885exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200886 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000887}
Paul Bakker33b43f12013-08-20 11:48:36 +0200888/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000889
Paul Bakker33b43f12013-08-20 11:48:36 +0200890/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100891void mbedtls_mpi_sub_abs( int radix_X, char * input_X, int radix_Y,
892 char * input_Y, int radix_A, char * input_A,
893 int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000894{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200895 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000896 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200897 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000898
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200899 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
900 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
901 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +0100902
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200903 res = mbedtls_mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200904 TEST_ASSERT( res == sub_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000905 if( res == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200906 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000907
Paul Bakkerbd51b262014-07-10 15:26:12 +0200908exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200909 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000910}
Paul Bakker33b43f12013-08-20 11:48:36 +0200911/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000912
Paul Bakker33b43f12013-08-20 11:48:36 +0200913/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100914void mbedtls_mpi_sub_int( int radix_X, char * input_X, int input_Y,
915 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000916{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200917 mbedtls_mpi X, Z, A;
918 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000919
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200920 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
921 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
922 TEST_ASSERT( mbedtls_mpi_sub_int( &Z, &X, input_Y ) == 0 );
923 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000924
Paul Bakkerbd51b262014-07-10 15:26:12 +0200925exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200926 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000927}
Paul Bakker33b43f12013-08-20 11:48:36 +0200928/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000929
Paul Bakker33b43f12013-08-20 11:48:36 +0200930/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100931void mbedtls_mpi_mul_mpi( int radix_X, char * input_X, int radix_Y,
932 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000933{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200934 mbedtls_mpi X, Y, Z, A;
935 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000936
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200937 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
938 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
939 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
940 TEST_ASSERT( mbedtls_mpi_mul_mpi( &Z, &X, &Y ) == 0 );
941 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000942
Paul Bakkerbd51b262014-07-10 15:26:12 +0200943exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200944 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000945}
Paul Bakker33b43f12013-08-20 11:48:36 +0200946/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000947
Paul Bakker33b43f12013-08-20 11:48:36 +0200948/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100949void mbedtls_mpi_mul_int( int radix_X, char * input_X, int input_Y,
950 int radix_A, char * input_A,
951 char * result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +0000952{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200953 mbedtls_mpi X, Z, A;
954 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000955
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200956 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
957 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
958 TEST_ASSERT( mbedtls_mpi_mul_int( &Z, &X, input_Y ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200959 if( strcmp( result_comparison, "==" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200960 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200961 else if( strcmp( result_comparison, "!=" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200962 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) != 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200963 else
964 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000965
Paul Bakkerbd51b262014-07-10 15:26:12 +0200966exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200967 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000968}
Paul Bakker33b43f12013-08-20 11:48:36 +0200969/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000970
Paul Bakker33b43f12013-08-20 11:48:36 +0200971/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100972void mbedtls_mpi_div_mpi( int radix_X, char * input_X, int radix_Y,
973 char * input_Y, int radix_A, char * input_A,
974 int radix_B, char * input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000975{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200976 mbedtls_mpi X, Y, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000977 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200978 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R );
979 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000980
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200981 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
982 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
983 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
984 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
985 res = mbedtls_mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200986 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000987 if( res == 0 )
988 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200989 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
990 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000991 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000992
Paul Bakkerbd51b262014-07-10 15:26:12 +0200993exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200994 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R );
995 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000996}
Paul Bakker33b43f12013-08-20 11:48:36 +0200997/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000998
Paul Bakker33b43f12013-08-20 11:48:36 +0200999/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001000void mbedtls_mpi_div_int( int radix_X, char * input_X, int input_Y,
1001 int radix_A, char * input_A, int radix_B,
1002 char * input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001003{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001004 mbedtls_mpi X, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +00001005 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001006 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &A );
1007 mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001008
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001009 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
1010 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
1011 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
1012 res = mbedtls_mpi_div_int( &Q, &R, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001013 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001014 if( res == 0 )
1015 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001016 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
1017 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001018 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001019
Paul Bakkerbd51b262014-07-10 15:26:12 +02001020exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001021 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &A );
1022 mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001023}
Paul Bakker33b43f12013-08-20 11:48:36 +02001024/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001025
Paul Bakker33b43f12013-08-20 11:48:36 +02001026/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001027void mbedtls_mpi_mod_mpi( int radix_X, char * input_X, int radix_Y,
1028 char * input_Y, int radix_A, char * input_A,
1029 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001030{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001031 mbedtls_mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +00001032 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001033 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001034
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001035 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
1036 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
1037 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
1038 res = mbedtls_mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001039 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001040 if( res == 0 )
1041 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001042 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001043 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001044
Paul Bakkerbd51b262014-07-10 15:26:12 +02001045exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001046 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001047}
Paul Bakker33b43f12013-08-20 11:48:36 +02001048/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001049
Paul Bakker33b43f12013-08-20 11:48:36 +02001050/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001051void mbedtls_mpi_mod_int( int radix_X, char * input_X, int input_Y,
1052 int input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001053{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001054 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +00001055 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001056 mbedtls_mpi_uint r;
1057 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001058
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001059 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
1060 res = mbedtls_mpi_mod_int( &r, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001061 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001062 if( res == 0 )
1063 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001064 TEST_ASSERT( r == (mbedtls_mpi_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +00001065 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001066
Paul Bakkerbd51b262014-07-10 15:26:12 +02001067exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001068 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001069}
Paul Bakker33b43f12013-08-20 11:48:36 +02001070/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001071
Paul Bakker33b43f12013-08-20 11:48:36 +02001072/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001073void mbedtls_mpi_exp_mod( int radix_A, char * input_A, int radix_E,
1074 char * input_E, int radix_N, char * input_N,
1075 int radix_RR, char * input_RR, int radix_X,
1076 char * input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001077{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001078 mbedtls_mpi A, E, N, RR, Z, X;
Paul Bakker367dae42009-06-28 21:50:27 +00001079 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001080 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
1081 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001082
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001083 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
1084 TEST_ASSERT( mbedtls_mpi_read_string( &E, radix_E, input_E ) == 0 );
1085 TEST_ASSERT( mbedtls_mpi_read_string( &N, radix_N, input_N ) == 0 );
1086 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001087
Paul Bakker33b43f12013-08-20 11:48:36 +02001088 if( strlen( input_RR ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001089 TEST_ASSERT( mbedtls_mpi_read_string( &RR, radix_RR, input_RR ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001090
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001091 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR );
Paul Bakker33b43f12013-08-20 11:48:36 +02001092 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001093 if( res == 0 )
1094 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001095 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001096 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001097
Paul Bakkerbd51b262014-07-10 15:26:12 +02001098exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001099 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
1100 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001101}
Paul Bakker33b43f12013-08-20 11:48:36 +02001102/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001103
Paul Bakker33b43f12013-08-20 11:48:36 +02001104/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001105void mbedtls_mpi_inv_mod( int radix_X, char * input_X, int radix_Y,
1106 char * input_Y, int radix_A, char * input_A,
1107 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001108{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001109 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +00001110 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001111 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001112
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001113 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
1114 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
1115 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
1116 res = mbedtls_mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001117 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001118 if( res == 0 )
1119 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001120 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001121 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001122
Paul Bakkerbd51b262014-07-10 15:26:12 +02001123exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001124 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001125}
Paul Bakker33b43f12013-08-20 11:48:36 +02001126/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001127
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001128/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Azim Khanf1aaec92017-05-30 14:23:15 +01001129void mbedtls_mpi_is_prime( int radix_X, char * input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001130{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001131 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +00001132 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001133 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001134
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001135 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Janos Follatha0b67c22018-09-18 14:48:23 +01001136 res = mbedtls_mpi_is_prime_ext( &X, 40, rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +02001137 TEST_ASSERT( res == div_result );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001138
Paul Bakkerbd51b262014-07-10 15:26:12 +02001139exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001140 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001141}
Paul Bakker33b43f12013-08-20 11:48:36 +02001142/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001143
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001144/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Janos Follath64eca052018-09-05 17:04:49 +01001145void mbedtls_mpi_is_prime_det( data_t * input_X, data_t * witnesses,
Darryl Greenac2ead02018-10-02 15:30:39 +01001146 int chunk_len, int rounds )
Janos Follath64eca052018-09-05 17:04:49 +01001147{
1148 mbedtls_mpi X;
1149 int res;
1150 mbedtls_test_mpi_random rand;
1151
1152 mbedtls_mpi_init( &X );
1153 rand.data = witnesses;
1154 rand.pos = 0;
1155 rand.chunk_len = chunk_len;
1156
1157 TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
Darryl Greenac2ead02018-10-02 15:30:39 +01001158 res = mbedtls_mpi_is_prime_ext( &X, rounds - 1,
1159 mbedtls_test_mpi_miller_rabin_determinizer,
1160 &rand );
1161 TEST_ASSERT( res == 0 );
1162
1163 rand.data = witnesses;
1164 rand.pos = 0;
1165 rand.chunk_len = chunk_len;
1166
Janos Follatha0b67c22018-09-18 14:48:23 +01001167 res = mbedtls_mpi_is_prime_ext( &X, rounds,
1168 mbedtls_test_mpi_miller_rabin_determinizer,
Janos Follath64eca052018-09-05 17:04:49 +01001169 &rand );
Darryl Greenac2ead02018-10-02 15:30:39 +01001170 TEST_ASSERT( res == MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
Janos Follath64eca052018-09-05 17:04:49 +01001171
1172exit:
1173 mbedtls_mpi_free( &X );
1174}
1175/* END_CASE */
1176
1177/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Janos Follatha3cb7eb2018-08-14 15:31:54 +01001178void mbedtls_mpi_gen_prime( int bits, int flags, int ref_ret )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001179{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001180 mbedtls_mpi X;
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001181 int my_ret;
1182
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001183 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001184
Janos Follatha3cb7eb2018-08-14 15:31:54 +01001185 my_ret = mbedtls_mpi_gen_prime( &X, bits, flags, rnd_std_rand, NULL );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001186 TEST_ASSERT( my_ret == ref_ret );
1187
1188 if( ref_ret == 0 )
1189 {
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +02001190 size_t actual_bits = mbedtls_mpi_bitlen( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001191
1192 TEST_ASSERT( actual_bits >= (size_t) bits );
1193 TEST_ASSERT( actual_bits <= (size_t) bits + 1 );
1194
Janos Follatha0b67c22018-09-18 14:48:23 +01001195 TEST_ASSERT( mbedtls_mpi_is_prime_ext( &X, 40, rnd_std_rand, NULL )
1196 == 0 );
Janos Follatha3cb7eb2018-08-14 15:31:54 +01001197 if( flags & MBEDTLS_MPI_GEN_PRIME_FLAG_DH )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001198 {
Hanno Beckerd4d60572018-01-10 07:12:01 +00001199 /* X = ( X - 1 ) / 2 */
1200 TEST_ASSERT( mbedtls_mpi_shift_r( &X, 1 ) == 0 );
Janos Follatha0b67c22018-09-18 14:48:23 +01001201 TEST_ASSERT( mbedtls_mpi_is_prime_ext( &X, 40, rnd_std_rand, NULL )
1202 == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001203 }
1204 }
1205
Paul Bakkerbd51b262014-07-10 15:26:12 +02001206exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001207 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001208}
1209/* END_CASE */
1210
Paul Bakker33b43f12013-08-20 11:48:36 +02001211/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001212void mbedtls_mpi_shift_l( int radix_X, char * input_X, int shift_X,
1213 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001214{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001215 mbedtls_mpi X, A;
1216 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001217
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001218 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
1219 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
1220 TEST_ASSERT( mbedtls_mpi_shift_l( &X, shift_X ) == 0 );
1221 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001222
Paul Bakkerbd51b262014-07-10 15:26:12 +02001223exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001224 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001225}
Paul Bakker33b43f12013-08-20 11:48:36 +02001226/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001227
Paul Bakker33b43f12013-08-20 11:48:36 +02001228/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001229void mbedtls_mpi_shift_r( int radix_X, char * input_X, int shift_X,
1230 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001231{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001232 mbedtls_mpi X, A;
1233 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001234
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001235 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
1236 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
1237 TEST_ASSERT( mbedtls_mpi_shift_r( &X, shift_X ) == 0 );
1238 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001239
Paul Bakkerbd51b262014-07-10 15:26:12 +02001240exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001241 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001242}
Paul Bakker33b43f12013-08-20 11:48:36 +02001243/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001244
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001245/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Azim Khanf1aaec92017-05-30 14:23:15 +01001246void mpi_selftest( )
Paul Bakkere896fea2009-07-06 06:40:23 +00001247{
Andres AG93012e82016-09-09 09:10:28 +01001248 TEST_ASSERT( mbedtls_mpi_self_test( 1 ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +00001249}
Paul Bakker33b43f12013-08-20 11:48:36 +02001250/* END_CASE */