blob: 8b37c02b3e8cfbb2e1f139b4a2a3631e0a76b2c9 [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"
Gilles Peskine3cb1e292020-11-25 15:37:20 +01003#include "mbedtls/entropy.h"
Janos Follath64eca052018-09-05 17:04:49 +01004
Chris Jonese64a46f2020-12-03 17:44:03 +00005#if MBEDTLS_MPI_MAX_BITS > 792
6#define MPI_MAX_BITS_LARGER_THAN_792
Chris Jones4592bd82020-12-03 14:24:33 +00007#endif
Janos Follath64eca052018-09-05 17:04:49 +01008
Gilles Peskineb53b2182021-06-10 15:34:15 +02009/* Check the validity of the sign bit in an MPI object. Reject representations
10 * that are not supported by the rest of the library and indicate a bug when
11 * constructing the value. */
12static int sign_is_valid( const mbedtls_mpi *X )
13{
14 if( X->s != 1 && X->s != -1 )
15 return( 0 ); // invalid sign bit, e.g. 0
16 if( mbedtls_mpi_bitlen( X ) == 0 && X->s != 1 )
17 return( 0 ); // negative zero
18 return( 1 );
19}
20
Janos Follath64eca052018-09-05 17:04:49 +010021typedef struct mbedtls_test_mpi_random
22{
23 data_t *data;
24 size_t pos;
25 size_t chunk_len;
26} mbedtls_test_mpi_random;
27
28/*
29 * This function is called by the Miller-Rabin primality test each time it
30 * chooses a random witness. The witnesses (or non-witnesses as provided by the
31 * test) are stored in the data member of the state structure. Each number is in
32 * the format that mbedtls_mpi_read_string understands and is chunk_len long.
33 */
34int mbedtls_test_mpi_miller_rabin_determinizer( void* state,
35 unsigned char* buf,
36 size_t len )
37{
38 mbedtls_test_mpi_random *random = (mbedtls_test_mpi_random*) state;
39
40 if( random == NULL || random->data->x == NULL || buf == NULL )
41 return( -1 );
42
43 if( random->pos + random->chunk_len > random->data->len
44 || random->chunk_len > len )
45 {
46 return( -1 );
47 }
48
49 memset( buf, 0, len );
50
51 /* The witness is written to the end of the buffer, since the buffer is
52 * used as big endian, unsigned binary data in mbedtls_mpi_read_binary.
53 * Writing the witness to the start of the buffer would result in the
54 * buffer being 'witness 000...000', which would be treated as
55 * witness * 2^n for some n. */
56 memcpy( buf + len - random->chunk_len, &random->data->x[random->pos],
57 random->chunk_len );
58
59 random->pos += random->chunk_len;
60
61 return( 0 );
62}
Gilles Peskine3cb1e292020-11-25 15:37:20 +010063
64/* Random generator that is told how many bytes to return. */
65static int f_rng_bytes_left( void *state, unsigned char *buf, size_t len )
66{
67 size_t *bytes_left = state;
68 size_t i;
69 for( i = 0; i < len; i++ )
70 {
71 if( *bytes_left == 0 )
72 return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
73 buf[i] = *bytes_left & 0xff;
74 --( *bytes_left );
75 }
76 return( 0 );
77}
78
Gilles Peskine3b056152021-04-13 19:50:04 +020079/* Test whether bytes represents (in big-endian base 256) a number b that
80 * is significantly above a power of 2. That is, b must not have a long run
81 * of unset bits after the most significant bit.
82 *
83 * Let n be the bit-size of b, i.e. the integer such that 2^n <= b < 2^{n+1}.
84 * This function returns 1 if, when drawing a number between 0 and b,
85 * the probability that this number is at least 2^n is not negligible.
86 * This probability is (b - 2^n) / b and this function checks that this
87 * number is above some threshold A. The threshold value is heuristic and
88 * based on the needs of mpi_random_many().
Gilles Peskine4699fa42021-03-29 22:02:55 +020089 */
90static int is_significantly_above_a_power_of_2( data_t *bytes )
91{
92 const uint8_t *p = bytes->x;
93 size_t len = bytes->len;
94 unsigned x;
Gilles Peskine3b056152021-04-13 19:50:04 +020095
96 /* Skip leading null bytes */
Gilles Peskine4699fa42021-03-29 22:02:55 +020097 while( len > 0 && p[0] == 0 )
98 {
99 ++p;
100 --len;
101 }
Gilles Peskine3b056152021-04-13 19:50:04 +0200102 /* 0 is not significantly above a power of 2 */
Gilles Peskine4699fa42021-03-29 22:02:55 +0200103 if( len == 0 )
104 return( 0 );
Gilles Peskine3b056152021-04-13 19:50:04 +0200105 /* Extract the (up to) 2 most significant bytes */
106 if( len == 1 )
Gilles Peskine4699fa42021-03-29 22:02:55 +0200107 x = p[0];
108 else
109 x = ( p[0] << 8 ) | p[1];
110
Gilles Peskine3b056152021-04-13 19:50:04 +0200111 /* Shift the most significant bit of x to position 8 and mask it out */
112 while( ( x & 0xfe00 ) != 0 )
113 x >>= 1;
114 x &= 0x00ff;
Gilles Peskine4699fa42021-03-29 22:02:55 +0200115
Gilles Peskine3b056152021-04-13 19:50:04 +0200116 /* At this point, x = floor((b - 2^n) / 2^(n-8)). b is significantly above
117 * a power of 2 iff x is significantly above 0 compared to 2^8.
118 * Testing x >= 2^4 amounts to picking A = 1/16 in the function
119 * description above. */
120 return( x >= 0x10 );
Gilles Peskine4699fa42021-03-29 22:02:55 +0200121}
122
Paul Bakker33b43f12013-08-20 11:48:36 +0200123/* END_HEADER */
Paul Bakker367dae42009-06-28 21:50:27 +0000124
Paul Bakker33b43f12013-08-20 11:48:36 +0200125/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200126 * depends_on:MBEDTLS_BIGNUM_C
Paul Bakker33b43f12013-08-20 11:48:36 +0200127 * END_DEPENDENCIES
128 */
Paul Bakker5690efc2011-05-26 13:16:06 +0000129
Hanno Beckerb48e1aa2018-12-18 23:25:01 +0000130/* BEGIN_CASE */
131void mpi_valid_param( )
132{
133 TEST_VALID_PARAM( mbedtls_mpi_free( NULL ) );
134}
135/* END_CASE */
136
Hanno Beckerafb607b2018-12-11 14:27:08 +0000137/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
138void mpi_invalid_param( )
139{
140 mbedtls_mpi X;
141 const char *s_in = "00101000101010";
142 char s_out[16] = { 0 };
143 unsigned char u_out[16] = { 0 };
144 unsigned char u_in[16] = { 0 };
145 size_t olen;
146 mbedtls_mpi_uint mpi_uint;
147
148 TEST_INVALID_PARAM( mbedtls_mpi_init( NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000149
Hanno Beckerafb607b2018-12-11 14:27:08 +0000150 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
151 mbedtls_mpi_grow( NULL, 42 ) );
152 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
153 mbedtls_mpi_copy( NULL, &X ) );
154 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
155 mbedtls_mpi_copy( &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000156
Hanno Beckerafb607b2018-12-11 14:27:08 +0000157 TEST_INVALID_PARAM( mbedtls_mpi_swap( NULL, &X ) );
158 TEST_INVALID_PARAM( mbedtls_mpi_swap( &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000159
Hanno Beckerafb607b2018-12-11 14:27:08 +0000160 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
161 mbedtls_mpi_safe_cond_assign( NULL, &X, 0 ) );
162 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
163 mbedtls_mpi_safe_cond_assign( &X, NULL, 0 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000164
Hanno Beckerafb607b2018-12-11 14:27:08 +0000165 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
166 mbedtls_mpi_safe_cond_swap( NULL, &X, 0 ) );
167 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
168 mbedtls_mpi_safe_cond_swap( &X, NULL, 0 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000169
Hanno Beckerafb607b2018-12-11 14:27:08 +0000170 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
171 mbedtls_mpi_lset( NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000172
Hanno Beckerafb607b2018-12-11 14:27:08 +0000173 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
174 mbedtls_mpi_get_bit( NULL, 42 ) );
175 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
176 mbedtls_mpi_set_bit( NULL, 42, 0 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000177
Hanno Beckerafb607b2018-12-11 14:27:08 +0000178 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
179 mbedtls_mpi_read_string( NULL, 2, s_in ) );
180 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
181 mbedtls_mpi_read_string( &X, 2, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000182
Hanno Beckerafb607b2018-12-11 14:27:08 +0000183 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
184 mbedtls_mpi_write_string( NULL, 2,
185 s_out, sizeof( s_out ),
186 &olen ) );
187 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
188 mbedtls_mpi_write_string( &X, 2,
189 NULL, sizeof( s_out ),
190 &olen ) );
191 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
192 mbedtls_mpi_write_string( &X, 2,
193 s_out, sizeof( s_out ),
194 NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000195
Hanno Beckerafb607b2018-12-11 14:27:08 +0000196#if defined(MBEDTLS_FS_IO)
197 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
198 mbedtls_mpi_read_file( NULL, 2, stdin ) );
199 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
200 mbedtls_mpi_read_file( &X, 2, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000201
Hanno Beckerafb607b2018-12-11 14:27:08 +0000202 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
203 mbedtls_mpi_write_file( "", NULL, 2, NULL ) );
204#endif /* MBEDTLS_FS_IO */
205
206 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
207 mbedtls_mpi_read_binary( NULL, u_in,
208 sizeof( u_in ) ) );
209 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
210 mbedtls_mpi_read_binary( &X, NULL,
211 sizeof( u_in ) ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000212
Hanno Beckerafb607b2018-12-11 14:27:08 +0000213 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
214 mbedtls_mpi_write_binary( NULL, u_out,
215 sizeof( u_out ) ) );
216 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
217 mbedtls_mpi_write_binary( &X, NULL,
218 sizeof( u_out ) ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000219
Hanno Beckerafb607b2018-12-11 14:27:08 +0000220 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
221 mbedtls_mpi_shift_l( NULL, 42 ) );
222 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
223 mbedtls_mpi_shift_r( NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000224
Hanno Beckerafb607b2018-12-11 14:27:08 +0000225 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
226 mbedtls_mpi_cmp_abs( NULL, &X ) );
227 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
228 mbedtls_mpi_cmp_abs( &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000229
Hanno Beckerafb607b2018-12-11 14:27:08 +0000230 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
231 mbedtls_mpi_cmp_mpi( NULL, &X ) );
232 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
233 mbedtls_mpi_cmp_mpi( &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000234
Hanno Beckerafb607b2018-12-11 14:27:08 +0000235 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
236 mbedtls_mpi_cmp_int( NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000237
Hanno Beckerafb607b2018-12-11 14:27:08 +0000238 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
239 mbedtls_mpi_add_abs( NULL, &X, &X ) );
240 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
241 mbedtls_mpi_add_abs( &X, NULL, &X ) );
242 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
243 mbedtls_mpi_add_abs( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000244
Hanno Beckerafb607b2018-12-11 14:27:08 +0000245 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
246 mbedtls_mpi_sub_abs( NULL, &X, &X ) );
247 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
248 mbedtls_mpi_sub_abs( &X, NULL, &X ) );
249 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
250 mbedtls_mpi_sub_abs( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000251
Hanno Beckerafb607b2018-12-11 14:27:08 +0000252 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
253 mbedtls_mpi_add_mpi( NULL, &X, &X ) );
254 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
255 mbedtls_mpi_add_mpi( &X, NULL, &X ) );
256 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
257 mbedtls_mpi_add_mpi( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000258
Hanno Beckerafb607b2018-12-11 14:27:08 +0000259 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
260 mbedtls_mpi_sub_mpi( NULL, &X, &X ) );
261 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
262 mbedtls_mpi_sub_mpi( &X, NULL, &X ) );
263 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
264 mbedtls_mpi_sub_mpi( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000265
Hanno Beckerafb607b2018-12-11 14:27:08 +0000266 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
267 mbedtls_mpi_add_int( NULL, &X, 42 ) );
268 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
269 mbedtls_mpi_add_int( &X, NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000270
Hanno Beckerafb607b2018-12-11 14:27:08 +0000271 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
272 mbedtls_mpi_sub_int( NULL, &X, 42 ) );
273 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
274 mbedtls_mpi_sub_int( &X, NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000275
Hanno Beckerafb607b2018-12-11 14:27:08 +0000276 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
277 mbedtls_mpi_mul_mpi( NULL, &X, &X ) );
278 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
279 mbedtls_mpi_mul_mpi( &X, NULL, &X ) );
280 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
281 mbedtls_mpi_mul_mpi( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000282
Hanno Beckerafb607b2018-12-11 14:27:08 +0000283 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
284 mbedtls_mpi_mul_int( NULL, &X, 42 ) );
285 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
286 mbedtls_mpi_mul_int( &X, NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000287
Hanno Beckerafb607b2018-12-11 14:27:08 +0000288 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
289 mbedtls_mpi_div_mpi( &X, &X, NULL, &X ) );
290 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
291 mbedtls_mpi_div_mpi( &X, &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000292
Hanno Beckerafb607b2018-12-11 14:27:08 +0000293 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
294 mbedtls_mpi_div_int( &X, &X, NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000295
Hanno Beckerf25ee7f2018-12-19 16:51:02 +0000296 TEST_INVALID_PARAM_RET( 0, mbedtls_mpi_lsb( NULL ) );
297
Hanno Beckerafb607b2018-12-11 14:27:08 +0000298 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
299 mbedtls_mpi_mod_mpi( NULL, &X, &X ) );
300 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
301 mbedtls_mpi_mod_mpi( &X, NULL, &X ) );
302 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
303 mbedtls_mpi_mod_mpi( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000304
Hanno Beckerafb607b2018-12-11 14:27:08 +0000305 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
306 mbedtls_mpi_mod_int( NULL, &X, 42 ) );
307 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
308 mbedtls_mpi_mod_int( &mpi_uint, NULL, 42 ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000309
Hanno Beckerafb607b2018-12-11 14:27:08 +0000310 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
311 mbedtls_mpi_exp_mod( NULL, &X, &X, &X, NULL ) );
312 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
313 mbedtls_mpi_exp_mod( &X, NULL, &X, &X, NULL ) );
314 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
315 mbedtls_mpi_exp_mod( &X, &X, NULL, &X, NULL ) );
316 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
317 mbedtls_mpi_exp_mod( &X, &X, &X, NULL, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000318
Hanno Beckerafb607b2018-12-11 14:27:08 +0000319 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200320 mbedtls_mpi_fill_random( NULL, 42,
321 mbedtls_test_rnd_std_rand,
Hanno Beckerafb607b2018-12-11 14:27:08 +0000322 NULL ) );
323 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
324 mbedtls_mpi_fill_random( &X, 42, NULL, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000325
Hanno Beckerafb607b2018-12-11 14:27:08 +0000326 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
327 mbedtls_mpi_gcd( NULL, &X, &X ) );
328 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
329 mbedtls_mpi_gcd( &X, NULL, &X ) );
330 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
331 mbedtls_mpi_gcd( &X, &X, NULL ) );
Hanno Beckere1185042018-12-13 14:31:46 +0000332
Hanno Beckerafb607b2018-12-11 14:27:08 +0000333 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
334 mbedtls_mpi_inv_mod( NULL, &X, &X ) );
335 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
336 mbedtls_mpi_inv_mod( &X, NULL, &X ) );
337 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_MPI_BAD_INPUT_DATA,
Hanno Beckere1185042018-12-13 14:31:46 +0000338 mbedtls_mpi_inv_mod( &X, &X, NULL ) );
Hanno Beckerafb607b2018-12-11 14:27:08 +0000339
340exit:
341 return;
Hanno Beckerafb607b2018-12-11 14:27:08 +0000342}
343/* END_CASE */
344
Paul Bakker33b43f12013-08-20 11:48:36 +0200345/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100346void mpi_null( )
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200347{
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200348 mbedtls_mpi X, Y, Z;
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200349
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200350 mbedtls_mpi_init( &X );
351 mbedtls_mpi_init( &Y );
352 mbedtls_mpi_init( &Z );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200353
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200354 TEST_ASSERT( mbedtls_mpi_get_bit( &X, 42 ) == 0 );
355 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200356 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == 0 );
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200357 TEST_ASSERT( mbedtls_mpi_size( &X ) == 0 );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200358
359exit:
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200360 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200361}
362/* END_CASE */
363
364/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100365void mpi_read_write_string( int radix_X, char * input_X, int radix_A,
366 char * input_A, int output_size, int result_read,
Paul Bakker33b43f12013-08-20 11:48:36 +0200367 int result_write )
Paul Bakker367dae42009-06-28 21:50:27 +0000368{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200369 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000370 char str[1000];
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100371 size_t len;
Paul Bakker367dae42009-06-28 21:50:27 +0000372
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200373 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000374
Janos Follath04dadb72019-03-06 12:29:37 +0000375 memset( str, '!', sizeof( str ) );
376
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200377 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == result_read );
Paul Bakker33b43f12013-08-20 11:48:36 +0200378 if( result_read == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000379 {
Gilles Peskineb53b2182021-06-10 15:34:15 +0200380 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100381 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, str, output_size, &len ) == result_write );
Paul Bakker33b43f12013-08-20 11:48:36 +0200382 if( result_write == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000383 {
Paul Bakker33b43f12013-08-20 11:48:36 +0200384 TEST_ASSERT( strcasecmp( str, input_A ) == 0 );
Janos Follath04dadb72019-03-06 12:29:37 +0000385 TEST_ASSERT( str[len] == '!' );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000386 }
387 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000388
Paul Bakkerbd51b262014-07-10 15:26:12 +0200389exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200390 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000391}
Paul Bakker33b43f12013-08-20 11:48:36 +0200392/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000393
Paul Bakker33b43f12013-08-20 11:48:36 +0200394/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +0100395void mbedtls_mpi_read_binary( data_t * buf, int radix_A, char * input_A )
Paul Bakkere896fea2009-07-06 06:40:23 +0000396{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200397 mbedtls_mpi X;
Janos Follathe5670f22019-02-25 16:11:58 +0000398 char str[1000];
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100399 size_t len;
Paul Bakkere896fea2009-07-06 06:40:23 +0000400
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200401 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000402
Paul Bakkere896fea2009-07-06 06:40:23 +0000403
Azim Khand30ca132017-06-09 04:32:58 +0100404 TEST_ASSERT( mbedtls_mpi_read_binary( &X, buf->x, buf->len ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200405 TEST_ASSERT( sign_is_valid( &X ) );
Janos Follathe5670f22019-02-25 16:11:58 +0000406 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, str, sizeof( str ), &len ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +0200407 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000408
Paul Bakkerbd51b262014-07-10 15:26:12 +0200409exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200410 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000411}
Paul Bakker33b43f12013-08-20 11:48:36 +0200412/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000413
Paul Bakker33b43f12013-08-20 11:48:36 +0200414/* BEGIN_CASE */
Janos Follatha778a942019-02-13 10:28:28 +0000415void mbedtls_mpi_read_binary_le( data_t * buf, int radix_A, char * input_A )
416{
417 mbedtls_mpi X;
Janos Follathe5670f22019-02-25 16:11:58 +0000418 char str[1000];
Janos Follatha778a942019-02-13 10:28:28 +0000419 size_t len;
420
421 mbedtls_mpi_init( &X );
422
423
424 TEST_ASSERT( mbedtls_mpi_read_binary_le( &X, buf->x, buf->len ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200425 TEST_ASSERT( sign_is_valid( &X ) );
Janos Follathe5670f22019-02-25 16:11:58 +0000426 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, str, sizeof( str ), &len ) == 0 );
Janos Follatha778a942019-02-13 10:28:28 +0000427 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
428
429exit:
430 mbedtls_mpi_free( &X );
431}
432/* END_CASE */
433
434/* BEGIN_CASE */
Azim Khand30ca132017-06-09 04:32:58 +0100435void mbedtls_mpi_write_binary( int radix_X, char * input_X,
Azim Khan5fcca462018-06-29 11:05:32 +0100436 data_t * input_A, int output_size,
Azim Khanf1aaec92017-05-30 14:23:15 +0100437 int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000438{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200439 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000440 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000441 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +0000442
443 memset( buf, 0x00, 1000 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000446
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200447 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +0100448
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200449 buflen = mbedtls_mpi_size( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +0200450 if( buflen > (size_t) output_size )
451 buflen = (size_t) output_size;
Paul Bakkere896fea2009-07-06 06:40:23 +0000452
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200453 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == result );
Paul Bakker33b43f12013-08-20 11:48:36 +0200454 if( result == 0)
Paul Bakkerba48cb22009-07-12 11:01:32 +0000455 {
Paul Bakkere896fea2009-07-06 06:40:23 +0000456
Ronald Cron2dbba992020-06-10 11:42:32 +0200457 TEST_ASSERT( mbedtls_test_hexcmp( buf, input_A->x,
458 buflen, input_A->len ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000459 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000460
Paul Bakkerbd51b262014-07-10 15:26:12 +0200461exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200462 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000463}
Paul Bakker33b43f12013-08-20 11:48:36 +0200464/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000465
Janos Follathe344d0f2019-02-19 16:17:40 +0000466/* BEGIN_CASE */
467void mbedtls_mpi_write_binary_le( int radix_X, char * input_X,
468 data_t * input_A, int output_size,
469 int result )
470{
471 mbedtls_mpi X;
472 unsigned char buf[1000];
473 size_t buflen;
474
475 memset( buf, 0x00, 1000 );
476
477 mbedtls_mpi_init( &X );
478
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200479 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Janos Follathe344d0f2019-02-19 16:17:40 +0000480
481 buflen = mbedtls_mpi_size( &X );
482 if( buflen > (size_t) output_size )
483 buflen = (size_t) output_size;
484
485 TEST_ASSERT( mbedtls_mpi_write_binary_le( &X, buf, buflen ) == result );
486 if( result == 0)
487 {
488
Ronald Cron2dbba992020-06-10 11:42:32 +0200489 TEST_ASSERT( mbedtls_test_hexcmp( buf, input_A->x,
490 buflen, input_A->len ) == 0 );
Janos Follathe344d0f2019-02-19 16:17:40 +0000491 }
492
493exit:
494 mbedtls_mpi_free( &X );
495}
496/* END_CASE */
497
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200498/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Azim Khand30ca132017-06-09 04:32:58 +0100499void mbedtls_mpi_read_file( int radix_X, char * input_file,
Azim Khan5fcca462018-06-29 11:05:32 +0100500 data_t * input_A, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000501{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200502 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000503 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000504 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +0000505 FILE *file;
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000506 int ret;
Paul Bakkere896fea2009-07-06 06:40:23 +0000507
508 memset( buf, 0x00, 1000 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000509
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200510 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000511
Paul Bakker33b43f12013-08-20 11:48:36 +0200512 file = fopen( input_file, "r" );
Paul Bakker8a0c0a92014-04-17 16:08:20 +0200513 TEST_ASSERT( file != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200514 ret = mbedtls_mpi_read_file( &X, radix_X, file );
Paul Bakkere896fea2009-07-06 06:40:23 +0000515 fclose(file);
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000516 TEST_ASSERT( ret == result );
Paul Bakkere896fea2009-07-06 06:40:23 +0000517
Paul Bakker33b43f12013-08-20 11:48:36 +0200518 if( result == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000519 {
Gilles Peskineb53b2182021-06-10 15:34:15 +0200520 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200521 buflen = mbedtls_mpi_size( &X );
522 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000523
Paul Bakkere896fea2009-07-06 06:40:23 +0000524
Ronald Cron2dbba992020-06-10 11:42:32 +0200525 TEST_ASSERT( mbedtls_test_hexcmp( buf, input_A->x,
526 buflen, input_A->len ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000527 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000528
Paul Bakkerbd51b262014-07-10 15:26:12 +0200529exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200530 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000531}
Paul Bakker33b43f12013-08-20 11:48:36 +0200532/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000533
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200534/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Azim Khanf1aaec92017-05-30 14:23:15 +0100535void mbedtls_mpi_write_file( int radix_X, char * input_X, int output_radix,
536 char * output_file )
Paul Bakkere896fea2009-07-06 06:40:23 +0000537{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200538 mbedtls_mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000539 FILE *file_out, *file_in;
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200540 int ret;
Paul Bakker69998dd2009-07-11 19:15:20 +0000541
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200542 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000543
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200544 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000545
Paul Bakker33b43f12013-08-20 11:48:36 +0200546 file_out = fopen( output_file, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000547 TEST_ASSERT( file_out != NULL );
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200548 ret = mbedtls_mpi_write_file( NULL, &X, output_radix, file_out );
Paul Bakkere896fea2009-07-06 06:40:23 +0000549 fclose(file_out);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200550 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000551
Paul Bakker33b43f12013-08-20 11:48:36 +0200552 file_in = fopen( output_file, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000553 TEST_ASSERT( file_in != NULL );
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200554 ret = mbedtls_mpi_read_file( &Y, output_radix, file_in );
Paul Bakkere896fea2009-07-06 06:40:23 +0000555 fclose(file_in);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200556 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000557
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200558 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000559
Paul Bakkerbd51b262014-07-10 15:26:12 +0200560exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200561 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000562}
Paul Bakker33b43f12013-08-20 11:48:36 +0200563/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000564
Paul Bakker33b43f12013-08-20 11:48:36 +0200565/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100566void mbedtls_mpi_get_bit( int radix_X, char * input_X, int pos, int val )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000567{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200568 mbedtls_mpi X;
569 mbedtls_mpi_init( &X );
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200570 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200571 TEST_ASSERT( mbedtls_mpi_get_bit( &X, pos ) == val );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000572
Paul Bakkerbd51b262014-07-10 15:26:12 +0200573exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574 mbedtls_mpi_free( &X );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000575}
Paul Bakker33b43f12013-08-20 11:48:36 +0200576/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000577
Paul Bakker33b43f12013-08-20 11:48:36 +0200578/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100579void mbedtls_mpi_set_bit( int radix_X, char * input_X, int pos, int val,
580 int radix_Y, char * output_Y, int result )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000581{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200582 mbedtls_mpi X, Y;
583 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000584
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200585 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
586 TEST_ASSERT( mbedtls_test_read_mpi( &Y, radix_Y, output_Y ) == 0 );
Paul Bakkerec5ceb62016-07-14 12:47:07 +0100587 TEST_ASSERT( mbedtls_mpi_set_bit( &X, pos, val ) == result );
588
589 if( result == 0 )
590 {
Gilles Peskineb53b2182021-06-10 15:34:15 +0200591 TEST_ASSERT( sign_is_valid( &X ) );
Paul Bakkerec5ceb62016-07-14 12:47:07 +0100592 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
593 }
Paul Bakker2f5947e2011-05-18 15:47:11 +0000594
Paul Bakkerbd51b262014-07-10 15:26:12 +0200595exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200596 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000597}
Paul Bakker33b43f12013-08-20 11:48:36 +0200598/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000599
Paul Bakker33b43f12013-08-20 11:48:36 +0200600/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100601void mbedtls_mpi_lsb( int radix_X, char * input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000602{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200603 mbedtls_mpi X;
604 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000605
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200606 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200607 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000608
Paul Bakkerbd51b262014-07-10 15:26:12 +0200609exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200610 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000611}
Paul Bakker33b43f12013-08-20 11:48:36 +0200612/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000613
Paul Bakker33b43f12013-08-20 11:48:36 +0200614/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100615void mbedtls_mpi_bitlen( int radix_X, char * input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000616{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200617 mbedtls_mpi X;
618 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000619
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200620 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200621 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000622
Paul Bakkerbd51b262014-07-10 15:26:12 +0200623exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200624 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000625}
Paul Bakker33b43f12013-08-20 11:48:36 +0200626/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000627
Paul Bakker33b43f12013-08-20 11:48:36 +0200628/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100629void mbedtls_mpi_gcd( int radix_X, char * input_X, int radix_Y,
630 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000631{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200632 mbedtls_mpi A, X, Y, Z;
633 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000634
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200635 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
636 TEST_ASSERT( mbedtls_test_read_mpi( &Y, radix_Y, input_Y ) == 0 );
637 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200638 TEST_ASSERT( mbedtls_mpi_gcd( &Z, &X, &Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200639 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200640 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000641
Paul Bakkerbd51b262014-07-10 15:26:12 +0200642exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200643 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000644}
Paul Bakker33b43f12013-08-20 11:48:36 +0200645/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000646
Paul Bakker33b43f12013-08-20 11:48:36 +0200647/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200648void mbedtls_mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000649{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200650 mbedtls_mpi X;
651 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000652
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200653 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0);
654 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000655
Paul Bakkerbd51b262014-07-10 15:26:12 +0200656exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200657 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000658}
Paul Bakker33b43f12013-08-20 11:48:36 +0200659/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000660
Paul Bakker33b43f12013-08-20 11:48:36 +0200661/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100662void mbedtls_mpi_cmp_mpi( int radix_X, char * input_X, int radix_Y,
663 char * input_Y, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000664{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200665 mbedtls_mpi X, Y;
666 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000667
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200668 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
669 TEST_ASSERT( mbedtls_test_read_mpi( &Y, radix_Y, input_Y ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200670 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000671
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 );
Paul Bakker367dae42009-06-28 21:50:27 +0000674}
Paul Bakker33b43f12013-08-20 11:48:36 +0200675/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000676
Paul Bakker33b43f12013-08-20 11:48:36 +0200677/* BEGIN_CASE */
Janos Follathb7e1b492019-10-14 09:21:49 +0100678void mbedtls_mpi_lt_mpi_ct( int size_X, char * input_X,
679 int size_Y, char * input_Y,
Janos Follath0e5532d2019-10-11 14:21:53 +0100680 int input_ret, int input_err )
Janos Follath385d5b82019-09-11 16:07:14 +0100681{
Gilles Peskine0deccf12020-09-02 15:18:07 +0200682 unsigned ret = -1;
Janos Follath0e5532d2019-10-11 14:21:53 +0100683 unsigned input_uret = input_ret;
Janos Follath385d5b82019-09-11 16:07:14 +0100684 mbedtls_mpi X, Y;
685 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
686
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200687 TEST_ASSERT( mbedtls_test_read_mpi( &X, 16, input_X ) == 0 );
688 TEST_ASSERT( mbedtls_test_read_mpi( &Y, 16, input_Y ) == 0 );
Janos Follath385d5b82019-09-11 16:07:14 +0100689
Gilles Peskine9018b112020-01-21 16:30:53 +0100690 TEST_ASSERT( mbedtls_mpi_grow( &X, size_X ) == 0 );
691 TEST_ASSERT( mbedtls_mpi_grow( &Y, size_Y ) == 0 );
Janos Follath385d5b82019-09-11 16:07:14 +0100692
Janos Follath0e5532d2019-10-11 14:21:53 +0100693 TEST_ASSERT( mbedtls_mpi_lt_mpi_ct( &X, &Y, &ret ) == input_err );
Janos Follath385d5b82019-09-11 16:07:14 +0100694 if( input_err == 0 )
Janos Follath0e5532d2019-10-11 14:21:53 +0100695 TEST_ASSERT( ret == input_uret );
Janos Follath385d5b82019-09-11 16:07:14 +0100696
697exit:
698 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
699}
700/* END_CASE */
701
702/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100703void mbedtls_mpi_cmp_abs( int radix_X, char * input_X, int radix_Y,
704 char * input_Y, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000705{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200706 mbedtls_mpi X, Y;
707 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000708
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200709 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
710 TEST_ASSERT( mbedtls_test_read_mpi( &Y, radix_Y, input_Y ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200711 TEST_ASSERT( mbedtls_mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000712
Paul Bakkerbd51b262014-07-10 15:26:12 +0200713exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200714 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000715}
Paul Bakker33b43f12013-08-20 11:48:36 +0200716/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000717
Paul Bakker33b43f12013-08-20 11:48:36 +0200718/* BEGIN_CASE */
Gilles Peskine7428b452020-01-20 21:01:51 +0100719void mbedtls_mpi_copy_sint( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000720{
Gilles Peskine7428b452020-01-20 21:01:51 +0100721 mbedtls_mpi X, Y;
722 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000723
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200724 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
Gilles Peskine7428b452020-01-20 21:01:51 +0100725 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 );
726
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200727 TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200728 TEST_ASSERT( sign_is_valid( &Y ) );
Gilles Peskine7428b452020-01-20 21:01:51 +0100729 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
730 TEST_ASSERT( mbedtls_mpi_cmp_int( &Y, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000731
Paul Bakkerbd51b262014-07-10 15:26:12 +0200732exit:
Gilles Peskine7428b452020-01-20 21:01:51 +0100733 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
734}
735/* END_CASE */
736
737/* BEGIN_CASE */
738void mbedtls_mpi_copy_binary( data_t *input_X, data_t *input_Y )
739{
740 mbedtls_mpi X, Y, X0;
741 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &X0 );
742
Gilles Peskine9a6ecee2020-02-03 16:15:47 +0100743 TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
744 TEST_ASSERT( mbedtls_mpi_read_binary( &Y, input_Y->x, input_Y->len ) == 0 );
745 TEST_ASSERT( mbedtls_mpi_read_binary( &X0, input_X->x, input_X->len ) == 0 );
Gilles Peskine7428b452020-01-20 21:01:51 +0100746 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 );
747
748 TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200749 TEST_ASSERT( sign_is_valid( &Y ) );
Gilles Peskine7428b452020-01-20 21:01:51 +0100750 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 );
751 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &X0 ) == 0 );
752
753exit:
754 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &X0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000755}
Paul Bakker33b43f12013-08-20 11:48:36 +0200756/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000757
Paul Bakker33b43f12013-08-20 11:48:36 +0200758/* BEGIN_CASE */
759void mpi_copy_self( int input_X )
Paul Bakkere896fea2009-07-06 06:40:23 +0000760{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200761 mbedtls_mpi X;
762 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000763
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200764 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
765 TEST_ASSERT( mbedtls_mpi_copy( &X, &X ) == 0 );
766 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000767
Paul Bakkerbd51b262014-07-10 15:26:12 +0200768exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200769 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000770}
Paul Bakker33b43f12013-08-20 11:48:36 +0200771/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000772
Paul Bakker33b43f12013-08-20 11:48:36 +0200773/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200774void mbedtls_mpi_shrink( int before, int used, int min, int after )
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100775{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200776 mbedtls_mpi X;
777 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100778
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200779 TEST_ASSERT( mbedtls_mpi_grow( &X, before ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100780 TEST_ASSERT( used <= before );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200781 memset( X.p, 0x2a, used * sizeof( mbedtls_mpi_uint ) );
782 TEST_ASSERT( mbedtls_mpi_shrink( &X, min ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100783 TEST_ASSERT( X.n == (size_t) after );
784
Paul Bakkerbd51b262014-07-10 15:26:12 +0200785exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200786 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100787}
788/* END_CASE */
789
790/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100791void mbedtls_mpi_safe_cond_assign( int x_sign, char * x_str, int y_sign,
792 char * y_str )
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100793{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200794 mbedtls_mpi X, Y, XX;
795 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100796
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200797 TEST_ASSERT( mbedtls_test_read_mpi( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100798 X.s = x_sign;
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200799 TEST_ASSERT( mbedtls_test_read_mpi( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100800 Y.s = y_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200801 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100802
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200803 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 0 ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200804 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200805 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100806
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200807 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 1 ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200808 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200809 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100810
Paul Bakkerbd51b262014-07-10 15:26:12 +0200811exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200812 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100813}
814/* END_CASE */
815
816/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100817void mbedtls_mpi_safe_cond_swap( int x_sign, char * x_str, int y_sign,
818 char * y_str )
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100819{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200820 mbedtls_mpi X, Y, XX, YY;
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100821
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200822 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
823 mbedtls_mpi_init( &XX ); mbedtls_mpi_init( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100824
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200825 TEST_ASSERT( mbedtls_test_read_mpi( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100826 X.s = x_sign;
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200827 TEST_ASSERT( mbedtls_test_read_mpi( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100828 Y.s = y_sign;
829
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200830 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
831 TEST_ASSERT( mbedtls_mpi_copy( &YY, &Y ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100832
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200833 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200834 TEST_ASSERT( sign_is_valid( &X ) );
835 TEST_ASSERT( sign_is_valid( &Y ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200836 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
837 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100838
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200839 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 1 ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200840 TEST_ASSERT( sign_is_valid( &X ) );
841 TEST_ASSERT( sign_is_valid( &Y ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200842 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &XX ) == 0 );
843 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100844
Paul Bakkerbd51b262014-07-10 15:26:12 +0200845exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200846 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
847 mbedtls_mpi_free( &XX ); mbedtls_mpi_free( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100848}
849/* END_CASE */
850
851/* BEGIN_CASE */
Gilles Peskine7428b452020-01-20 21:01:51 +0100852void mbedtls_mpi_swap_sint( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000853{
Gilles Peskine7428b452020-01-20 21:01:51 +0100854 mbedtls_mpi X, Y;
855 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000856
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200857 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
858 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 );
Gilles Peskine7428b452020-01-20 21:01:51 +0100859 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
860 TEST_ASSERT( mbedtls_mpi_cmp_int( &Y, input_Y ) == 0 );
861
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200862 mbedtls_mpi_swap( &X, &Y );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200863 TEST_ASSERT( sign_is_valid( &X ) );
864 TEST_ASSERT( sign_is_valid( &Y ) );
Gilles Peskine7428b452020-01-20 21:01:51 +0100865 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_Y ) == 0 );
866 TEST_ASSERT( mbedtls_mpi_cmp_int( &Y, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000867
Paul Bakkerbd51b262014-07-10 15:26:12 +0200868exit:
Gilles Peskine7428b452020-01-20 21:01:51 +0100869 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
870}
871/* END_CASE */
872
873/* BEGIN_CASE */
874void mbedtls_mpi_swap_binary( data_t *input_X, data_t *input_Y )
875{
876 mbedtls_mpi X, Y, X0, Y0;
877 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
878 mbedtls_mpi_init( &X0 ); mbedtls_mpi_init( &Y0 );
879
Gilles Peskine9a6ecee2020-02-03 16:15:47 +0100880 TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
881 TEST_ASSERT( mbedtls_mpi_read_binary( &Y, input_Y->x, input_Y->len ) == 0 );
882 TEST_ASSERT( mbedtls_mpi_read_binary( &X0, input_X->x, input_X->len ) == 0 );
883 TEST_ASSERT( mbedtls_mpi_read_binary( &Y0, input_Y->x, input_Y->len ) == 0 );
Gilles Peskine7428b452020-01-20 21:01:51 +0100884
885 mbedtls_mpi_swap( &X, &Y );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200886 TEST_ASSERT( sign_is_valid( &X ) );
887 TEST_ASSERT( sign_is_valid( &Y ) );
Gilles Peskine7428b452020-01-20 21:01:51 +0100888 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y0 ) == 0 );
889 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &X0 ) == 0 );
890
891exit:
892 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
893 mbedtls_mpi_free( &X0 ); mbedtls_mpi_free( &Y0 );
894}
895/* END_CASE */
896
897/* BEGIN_CASE */
898void mpi_swap_self( data_t *input_X )
899{
900 mbedtls_mpi X, X0;
901 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &X0 );
902
Gilles Peskine9a6ecee2020-02-03 16:15:47 +0100903 TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
904 TEST_ASSERT( mbedtls_mpi_read_binary( &X0, input_X->x, input_X->len ) == 0 );
Gilles Peskine7428b452020-01-20 21:01:51 +0100905
906 mbedtls_mpi_swap( &X, &X );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200907 TEST_ASSERT( sign_is_valid( &X ) );
Gilles Peskine7428b452020-01-20 21:01:51 +0100908 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 );
909
910exit:
911 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &X0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000912}
Paul Bakker33b43f12013-08-20 11:48:36 +0200913/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000914
Paul Bakker33b43f12013-08-20 11:48:36 +0200915/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100916void mbedtls_mpi_add_mpi( int radix_X, char * input_X, int radix_Y,
917 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000918{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200919 mbedtls_mpi X, Y, Z, A;
920 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000921
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200922 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
923 TEST_ASSERT( mbedtls_test_read_mpi( &Y, radix_Y, input_Y ) == 0 );
924 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200925 TEST_ASSERT( mbedtls_mpi_add_mpi( &Z, &X, &Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200926 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200927 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000928
Gilles Peskine56f943a2020-07-23 01:18:11 +0200929 /* result == first operand */
930 TEST_ASSERT( mbedtls_mpi_add_mpi( &X, &X, &Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200931 TEST_ASSERT( sign_is_valid( &X ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +0200932 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200933 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Gilles Peskine56f943a2020-07-23 01:18:11 +0200934
935 /* result == second operand */
936 TEST_ASSERT( mbedtls_mpi_add_mpi( &Y, &X, &Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200937 TEST_ASSERT( sign_is_valid( &Y ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +0200938 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
939
Paul Bakkerbd51b262014-07-10 15:26:12 +0200940exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200941 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000942}
Paul Bakker33b43f12013-08-20 11:48:36 +0200943/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000944
Paul Bakker33b43f12013-08-20 11:48:36 +0200945/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100946void mbedtls_mpi_add_mpi_inplace( int radix_X, char * input_X, int radix_A,
947 char * input_A )
Janos Follath044a86b2015-10-25 10:58:03 +0100948{
949 mbedtls_mpi X, A;
950 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
951
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200952 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +0100953
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200954 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +0100955 TEST_ASSERT( mbedtls_mpi_sub_abs( &X, &X, &X ) == 0 );
956 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, 0 ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200957 TEST_ASSERT( sign_is_valid( &X ) );
Janos Follath6cbacec2015-10-25 12:29:13 +0100958
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200959 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +0100960 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &X ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200961 TEST_ASSERT( sign_is_valid( &X ) );
Janos Follath6cbacec2015-10-25 12:29:13 +0100962 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
963
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200964 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Janos Follath044a86b2015-10-25 10:58:03 +0100965 TEST_ASSERT( mbedtls_mpi_add_mpi( &X, &X, &X ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200966 TEST_ASSERT( sign_is_valid( &X ) );
Janos Follath044a86b2015-10-25 10:58:03 +0100967 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
968
969exit:
970 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
971}
972/* END_CASE */
973
974
975/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100976void mbedtls_mpi_add_abs( int radix_X, char * input_X, int radix_Y,
977 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000978{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200979 mbedtls_mpi X, Y, Z, A;
980 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000981
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200982 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
983 TEST_ASSERT( mbedtls_test_read_mpi( &Y, radix_Y, input_Y ) == 0 );
984 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200985 TEST_ASSERT( mbedtls_mpi_add_abs( &Z, &X, &Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200986 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200987 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000988
Gilles Peskine56f943a2020-07-23 01:18:11 +0200989 /* result == first operand */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200990 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200991 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200992 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Gilles Peskinea0f4e102021-06-10 23:18:39 +0200993 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Gilles Peskine56f943a2020-07-23 01:18:11 +0200994
995 /* result == second operand */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200996 TEST_ASSERT( mbedtls_mpi_add_abs( &Y, &X, &Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +0200997 TEST_ASSERT( sign_is_valid( &Y ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200998 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000999
Paul Bakkerbd51b262014-07-10 15:26:12 +02001000exit:
Gilles Peskine56f943a2020-07-23 01:18:11 +02001001 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +00001002}
Paul Bakker33b43f12013-08-20 11:48:36 +02001003/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +00001004
Paul Bakker33b43f12013-08-20 11:48:36 +02001005/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001006void mbedtls_mpi_add_int( int radix_X, char * input_X, int input_Y,
1007 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001008{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001009 mbedtls_mpi X, Z, A;
1010 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001011
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001012 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
1013 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001014 TEST_ASSERT( mbedtls_mpi_add_int( &Z, &X, input_Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001015 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001016 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001017
Paul Bakkerbd51b262014-07-10 15:26:12 +02001018exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001019 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001020}
Paul Bakker33b43f12013-08-20 11:48:36 +02001021/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001022
Paul Bakker33b43f12013-08-20 11:48:36 +02001023/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001024void mbedtls_mpi_sub_mpi( int radix_X, char * input_X, int radix_Y,
1025 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001026{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001027 mbedtls_mpi X, Y, Z, A;
1028 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001029
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001030 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
1031 TEST_ASSERT( mbedtls_test_read_mpi( &Y, radix_Y, input_Y ) == 0 );
1032 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001033 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Z, &X, &Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001034 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001035 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001036
Gilles Peskine56f943a2020-07-23 01:18:11 +02001037 /* result == first operand */
1038 TEST_ASSERT( mbedtls_mpi_sub_mpi( &X, &X, &Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001039 TEST_ASSERT( sign_is_valid( &X ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001040 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001041 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001042
1043 /* result == second operand */
1044 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Y, &X, &Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001045 TEST_ASSERT( sign_is_valid( &Y ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001046 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
1047
Paul Bakkerbd51b262014-07-10 15:26:12 +02001048exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001049 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001050}
Paul Bakker33b43f12013-08-20 11:48:36 +02001051/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001052
Paul Bakker33b43f12013-08-20 11:48:36 +02001053/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001054void mbedtls_mpi_sub_abs( int radix_X, char * input_X, int radix_Y,
1055 char * input_Y, int radix_A, char * input_A,
1056 int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001057{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001058 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +00001059 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001060 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001061
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001062 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
1063 TEST_ASSERT( mbedtls_test_read_mpi( &Y, radix_Y, input_Y ) == 0 );
1064 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +01001065
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001066 res = mbedtls_mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001067 TEST_ASSERT( res == sub_result );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001068 TEST_ASSERT( sign_is_valid( &Z ) );
Paul Bakker367dae42009-06-28 21:50:27 +00001069 if( res == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001070 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001071
Gilles Peskine56f943a2020-07-23 01:18:11 +02001072 /* result == first operand */
1073 TEST_ASSERT( mbedtls_mpi_sub_abs( &X, &X, &Y ) == sub_result );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001074 TEST_ASSERT( sign_is_valid( &X ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001075 if( sub_result == 0 )
1076 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001077 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001078
1079 /* result == second operand */
1080 TEST_ASSERT( mbedtls_mpi_sub_abs( &Y, &X, &Y ) == sub_result );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001081 TEST_ASSERT( sign_is_valid( &Y ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001082 if( sub_result == 0 )
1083 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
1084
Paul Bakkerbd51b262014-07-10 15:26:12 +02001085exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001086 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001087}
Paul Bakker33b43f12013-08-20 11:48:36 +02001088/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001089
Paul Bakker33b43f12013-08-20 11:48:36 +02001090/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001091void mbedtls_mpi_sub_int( int radix_X, char * input_X, int input_Y,
1092 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001093{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001094 mbedtls_mpi X, Z, A;
1095 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001096
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001097 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
1098 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001099 TEST_ASSERT( mbedtls_mpi_sub_int( &Z, &X, input_Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001100 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001101 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001102
Paul Bakkerbd51b262014-07-10 15:26:12 +02001103exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001104 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001105}
Paul Bakker33b43f12013-08-20 11:48:36 +02001106/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001107
Paul Bakker33b43f12013-08-20 11:48:36 +02001108/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001109void mbedtls_mpi_mul_mpi( int radix_X, char * input_X, int radix_Y,
1110 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001111{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001112 mbedtls_mpi X, Y, Z, A;
1113 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001114
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001115 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
1116 TEST_ASSERT( mbedtls_test_read_mpi( &Y, radix_Y, input_Y ) == 0 );
1117 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001118 TEST_ASSERT( mbedtls_mpi_mul_mpi( &Z, &X, &Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001119 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001120 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001121
Paul Bakkerbd51b262014-07-10 15:26:12 +02001122exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001123 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001124}
Paul Bakker33b43f12013-08-20 11:48:36 +02001125/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001126
Paul Bakker33b43f12013-08-20 11:48:36 +02001127/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001128void mbedtls_mpi_mul_int( int radix_X, char * input_X, int input_Y,
1129 int radix_A, char * input_A,
1130 char * result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +00001131{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001132 mbedtls_mpi X, Z, A;
1133 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001134
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001135 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
1136 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001137 TEST_ASSERT( mbedtls_mpi_mul_int( &Z, &X, input_Y ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001138 TEST_ASSERT( sign_is_valid( &Z ) );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001139 if( strcmp( result_comparison, "==" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001140 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001141 else if( strcmp( result_comparison, "!=" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001142 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) != 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001143 else
1144 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001145
Paul Bakkerbd51b262014-07-10 15:26:12 +02001146exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001147 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001148}
Paul Bakker33b43f12013-08-20 11:48:36 +02001149/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001150
Paul Bakker33b43f12013-08-20 11:48:36 +02001151/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001152void mbedtls_mpi_div_mpi( int radix_X, char * input_X, int radix_Y,
1153 char * input_Y, int radix_A, char * input_A,
1154 int radix_B, char * input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001155{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001156 mbedtls_mpi X, Y, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +00001157 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001158 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R );
1159 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001160
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001161 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
1162 TEST_ASSERT( mbedtls_test_read_mpi( &Y, radix_Y, input_Y ) == 0 );
1163 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
1164 TEST_ASSERT( mbedtls_test_read_mpi( &B, radix_B, input_B ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001165 res = mbedtls_mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001166 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001167 if( res == 0 )
1168 {
Gilles Peskineb53b2182021-06-10 15:34:15 +02001169 TEST_ASSERT( sign_is_valid( &Q ) );
1170 TEST_ASSERT( sign_is_valid( &R ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001171 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
1172 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001173 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001174
Paul Bakkerbd51b262014-07-10 15:26:12 +02001175exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001176 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R );
1177 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001178}
Paul Bakker33b43f12013-08-20 11:48:36 +02001179/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001180
Paul Bakker33b43f12013-08-20 11:48:36 +02001181/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001182void mbedtls_mpi_div_int( int radix_X, char * input_X, int input_Y,
1183 int radix_A, char * input_A, int radix_B,
1184 char * input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001185{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001186 mbedtls_mpi X, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +00001187 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001188 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &A );
1189 mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001190
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001191 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
1192 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
1193 TEST_ASSERT( mbedtls_test_read_mpi( &B, radix_B, input_B ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001194 res = mbedtls_mpi_div_int( &Q, &R, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001195 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001196 if( res == 0 )
1197 {
Gilles Peskineb53b2182021-06-10 15:34:15 +02001198 TEST_ASSERT( sign_is_valid( &Q ) );
1199 TEST_ASSERT( sign_is_valid( &R ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001200 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
1201 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001202 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001203
Paul Bakkerbd51b262014-07-10 15:26:12 +02001204exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001205 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &A );
1206 mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001207}
Paul Bakker33b43f12013-08-20 11:48:36 +02001208/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001209
Paul Bakker33b43f12013-08-20 11:48:36 +02001210/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001211void mbedtls_mpi_mod_mpi( int radix_X, char * input_X, int radix_Y,
1212 char * input_Y, int radix_A, char * input_A,
1213 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001214{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001215 mbedtls_mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +00001216 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001217 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001218
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001219 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
1220 TEST_ASSERT( mbedtls_test_read_mpi( &Y, radix_Y, input_Y ) == 0 );
1221 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001222 res = mbedtls_mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001223 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001224 if( res == 0 )
1225 {
Gilles Peskineb53b2182021-06-10 15:34:15 +02001226 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001227 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001228 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001229
Paul Bakkerbd51b262014-07-10 15:26:12 +02001230exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001231 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001232}
Paul Bakker33b43f12013-08-20 11:48:36 +02001233/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001234
Paul Bakker33b43f12013-08-20 11:48:36 +02001235/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001236void mbedtls_mpi_mod_int( int radix_X, char * input_X, int input_Y,
1237 int input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001238{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001239 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +00001240 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001241 mbedtls_mpi_uint r;
1242 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001243
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001244 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001245 res = mbedtls_mpi_mod_int( &r, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001246 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001247 if( res == 0 )
1248 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001249 TEST_ASSERT( r == (mbedtls_mpi_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +00001250 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001251
Paul Bakkerbd51b262014-07-10 15:26:12 +02001252exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001253 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001254}
Paul Bakker33b43f12013-08-20 11:48:36 +02001255/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001256
Paul Bakker33b43f12013-08-20 11:48:36 +02001257/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001258void mbedtls_mpi_exp_mod( int radix_A, char * input_A, int radix_E,
1259 char * input_E, int radix_N, char * input_N,
1260 int radix_RR, char * input_RR, int radix_X,
1261 char * input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001262{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001263 mbedtls_mpi A, E, N, RR, Z, X;
Paul Bakker367dae42009-06-28 21:50:27 +00001264 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001265 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
1266 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001267
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001268 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
1269 TEST_ASSERT( mbedtls_test_read_mpi( &E, radix_E, input_E ) == 0 );
1270 TEST_ASSERT( mbedtls_test_read_mpi( &N, radix_N, input_N ) == 0 );
1271 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001272
Paul Bakker33b43f12013-08-20 11:48:36 +02001273 if( strlen( input_RR ) )
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001274 TEST_ASSERT( mbedtls_test_read_mpi( &RR, radix_RR, input_RR ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001275
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001276 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR );
Paul Bakker33b43f12013-08-20 11:48:36 +02001277 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001278 if( res == 0 )
1279 {
Gilles Peskineb53b2182021-06-10 15:34:15 +02001280 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001281 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001282 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001283
Paul Bakkerbd51b262014-07-10 15:26:12 +02001284exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001285 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
1286 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001287}
Paul Bakker33b43f12013-08-20 11:48:36 +02001288/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001289
Paul Bakker33b43f12013-08-20 11:48:36 +02001290/* BEGIN_CASE */
Chris Jonesd10b3312020-12-02 10:41:50 +00001291void mbedtls_mpi_exp_mod_size( int A_bytes, int E_bytes, int N_bytes,
Chris Jonesaa850cd2020-12-03 11:35:41 +00001292 int radix_RR, char * input_RR, int exp_result )
Chris Jonesd10b3312020-12-02 10:41:50 +00001293{
1294 mbedtls_mpi A, E, N, RR, Z;
1295 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
1296 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z );
1297
Chris Jonesaa850cd2020-12-03 11:35:41 +00001298 /* Set A to 2^(A_bytes - 1) + 1 */
Chris Jonesd10b3312020-12-02 10:41:50 +00001299 TEST_ASSERT( mbedtls_mpi_lset( &A, 1 ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001300 TEST_ASSERT( mbedtls_mpi_shift_l( &A, ( A_bytes * 8 ) - 1 ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001301 TEST_ASSERT( mbedtls_mpi_set_bit( &A, 0, 1 ) == 0 );
Chris Jonesaa850cd2020-12-03 11:35:41 +00001302
1303 /* Set E to 2^(E_bytes - 1) + 1 */
1304 TEST_ASSERT( mbedtls_mpi_lset( &E, 1 ) == 0 );
1305 TEST_ASSERT( mbedtls_mpi_shift_l( &E, ( E_bytes * 8 ) - 1 ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001306 TEST_ASSERT( mbedtls_mpi_set_bit( &E, 0, 1 ) == 0 );
Chris Jonesaa850cd2020-12-03 11:35:41 +00001307
1308 /* Set N to 2^(N_bytes - 1) + 1 */
1309 TEST_ASSERT( mbedtls_mpi_lset( &N, 1 ) == 0 );
1310 TEST_ASSERT( mbedtls_mpi_shift_l( &N, ( N_bytes * 8 ) - 1 ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001311 TEST_ASSERT( mbedtls_mpi_set_bit( &N, 0, 1 ) == 0 );
1312
1313 if( strlen( input_RR ) )
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001314 TEST_ASSERT( mbedtls_test_read_mpi( &RR, radix_RR, input_RR ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001315
Chris Jonesaa850cd2020-12-03 11:35:41 +00001316 TEST_ASSERT( mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR ) == exp_result );
Chris Jonesd10b3312020-12-02 10:41:50 +00001317
1318exit:
1319 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
1320 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z );
1321}
1322/* END_CASE */
1323
1324/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001325void mbedtls_mpi_inv_mod( int radix_X, char * input_X, int radix_Y,
1326 char * input_Y, int radix_A, char * input_A,
1327 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001328{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001329 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +00001330 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001331 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001332
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001333 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
1334 TEST_ASSERT( mbedtls_test_read_mpi( &Y, radix_Y, input_Y ) == 0 );
1335 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001336 res = mbedtls_mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001337 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001338 if( res == 0 )
1339 {
Gilles Peskineb53b2182021-06-10 15:34:15 +02001340 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001341 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001342 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001343
Paul Bakkerbd51b262014-07-10 15:26:12 +02001344exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001345 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001346}
Paul Bakker33b43f12013-08-20 11:48:36 +02001347/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001349/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Azim Khanf1aaec92017-05-30 14:23:15 +01001350void mbedtls_mpi_is_prime( int radix_X, char * input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001351{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001352 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +00001353 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001354 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001355
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001356 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
Ronald Cron351f0ee2020-06-10 12:12:18 +02001357 res = mbedtls_mpi_is_prime_ext( &X, 40, mbedtls_test_rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +02001358 TEST_ASSERT( res == div_result );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001359
Paul Bakkerbd51b262014-07-10 15:26:12 +02001360exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001361 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001362}
Paul Bakker33b43f12013-08-20 11:48:36 +02001363/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001364
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001365/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Janos Follath64eca052018-09-05 17:04:49 +01001366void mbedtls_mpi_is_prime_det( data_t * input_X, data_t * witnesses,
Darryl Greenac2ead02018-10-02 15:30:39 +01001367 int chunk_len, int rounds )
Janos Follath64eca052018-09-05 17:04:49 +01001368{
1369 mbedtls_mpi X;
1370 int res;
1371 mbedtls_test_mpi_random rand;
1372
1373 mbedtls_mpi_init( &X );
1374 rand.data = witnesses;
1375 rand.pos = 0;
1376 rand.chunk_len = chunk_len;
1377
1378 TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
Darryl Greenac2ead02018-10-02 15:30:39 +01001379 res = mbedtls_mpi_is_prime_ext( &X, rounds - 1,
1380 mbedtls_test_mpi_miller_rabin_determinizer,
1381 &rand );
1382 TEST_ASSERT( res == 0 );
1383
1384 rand.data = witnesses;
1385 rand.pos = 0;
1386 rand.chunk_len = chunk_len;
1387
Janos Follatha0b67c22018-09-18 14:48:23 +01001388 res = mbedtls_mpi_is_prime_ext( &X, rounds,
1389 mbedtls_test_mpi_miller_rabin_determinizer,
Janos Follath64eca052018-09-05 17:04:49 +01001390 &rand );
Darryl Greenac2ead02018-10-02 15:30:39 +01001391 TEST_ASSERT( res == MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
Janos Follath64eca052018-09-05 17:04:49 +01001392
1393exit:
1394 mbedtls_mpi_free( &X );
1395}
1396/* END_CASE */
1397
1398/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Janos Follatha3cb7eb2018-08-14 15:31:54 +01001399void mbedtls_mpi_gen_prime( int bits, int flags, int ref_ret )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001400{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001401 mbedtls_mpi X;
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001402 int my_ret;
1403
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001404 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001405
Ronald Cron6c5bd7f2020-06-10 14:08:26 +02001406 my_ret = mbedtls_mpi_gen_prime( &X, bits, flags,
1407 mbedtls_test_rnd_std_rand, NULL );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001408 TEST_ASSERT( my_ret == ref_ret );
1409
1410 if( ref_ret == 0 )
1411 {
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +02001412 size_t actual_bits = mbedtls_mpi_bitlen( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001413
1414 TEST_ASSERT( actual_bits >= (size_t) bits );
1415 TEST_ASSERT( actual_bits <= (size_t) bits + 1 );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001416 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001417
Ronald Cron6c5bd7f2020-06-10 14:08:26 +02001418 TEST_ASSERT( mbedtls_mpi_is_prime_ext( &X, 40,
1419 mbedtls_test_rnd_std_rand,
1420 NULL ) == 0 );
Janos Follatha3cb7eb2018-08-14 15:31:54 +01001421 if( flags & MBEDTLS_MPI_GEN_PRIME_FLAG_DH )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001422 {
Hanno Beckerd4d60572018-01-10 07:12:01 +00001423 /* X = ( X - 1 ) / 2 */
1424 TEST_ASSERT( mbedtls_mpi_shift_r( &X, 1 ) == 0 );
Ronald Cron6c5bd7f2020-06-10 14:08:26 +02001425 TEST_ASSERT( mbedtls_mpi_is_prime_ext( &X, 40,
1426 mbedtls_test_rnd_std_rand,
1427 NULL ) == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001428 }
1429 }
1430
Paul Bakkerbd51b262014-07-10 15:26:12 +02001431exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001432 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001433}
1434/* END_CASE */
1435
Paul Bakker33b43f12013-08-20 11:48:36 +02001436/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001437void mbedtls_mpi_shift_l( int radix_X, char * input_X, int shift_X,
1438 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001439{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001440 mbedtls_mpi X, A;
1441 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001442
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001443 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
1444 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001445 TEST_ASSERT( mbedtls_mpi_shift_l( &X, shift_X ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001446 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001447 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001448
Paul Bakkerbd51b262014-07-10 15:26:12 +02001449exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001450 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001451}
Paul Bakker33b43f12013-08-20 11:48:36 +02001452/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001453
Paul Bakker33b43f12013-08-20 11:48:36 +02001454/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +01001455void mbedtls_mpi_shift_r( int radix_X, char * input_X, int shift_X,
1456 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001457{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001458 mbedtls_mpi X, A;
1459 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001460
Gilles Peskinea0f4e102021-06-10 23:18:39 +02001461 TEST_ASSERT( mbedtls_test_read_mpi( &X, radix_X, input_X ) == 0 );
1462 TEST_ASSERT( mbedtls_test_read_mpi( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001463 TEST_ASSERT( mbedtls_mpi_shift_r( &X, shift_X ) == 0 );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001464 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001465 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001466
Paul Bakkerbd51b262014-07-10 15:26:12 +02001467exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001468 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001469}
Paul Bakker33b43f12013-08-20 11:48:36 +02001470/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001471
Gilles Peskine3cb1e292020-11-25 15:37:20 +01001472/* BEGIN_CASE */
Gilles Peskinef467e1a2021-04-02 00:02:27 +02001473void mpi_fill_random( int wanted_bytes, int rng_bytes,
1474 int before, int expected_ret )
Gilles Peskine3cb1e292020-11-25 15:37:20 +01001475{
1476 mbedtls_mpi X;
1477 int ret;
1478 size_t bytes_left = rng_bytes;
1479 mbedtls_mpi_init( &X );
1480
Gilles Peskinef467e1a2021-04-02 00:02:27 +02001481 if( before != 0 )
1482 {
1483 /* Set X to sign(before) * 2^(|before|-1) */
1484 TEST_ASSERT( mbedtls_mpi_lset( &X, before > 0 ? 1 : -1 ) == 0 );
1485 if( before < 0 )
1486 before = - before;
1487 TEST_ASSERT( mbedtls_mpi_shift_l( &X, before - 1 ) == 0 );
1488 }
1489
Gilles Peskine3cb1e292020-11-25 15:37:20 +01001490 ret = mbedtls_mpi_fill_random( &X, wanted_bytes,
1491 f_rng_bytes_left, &bytes_left );
1492 TEST_ASSERT( ret == expected_ret );
1493
1494 if( expected_ret == 0 )
1495 {
1496 /* mbedtls_mpi_fill_random is documented to use bytes from the RNG
1497 * as a big-endian representation of the number. We know when
1498 * our RNG function returns null bytes, so we know how many
1499 * leading zero bytes the number has. */
1500 size_t leading_zeros = 0;
1501 if( wanted_bytes > 0 && rng_bytes % 256 == 0 )
1502 leading_zeros = 1;
1503 TEST_ASSERT( mbedtls_mpi_size( &X ) + leading_zeros ==
1504 (size_t) wanted_bytes );
1505 TEST_ASSERT( (int) bytes_left == rng_bytes - wanted_bytes );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001506 TEST_ASSERT( sign_is_valid( &X ) );
Gilles Peskine3cb1e292020-11-25 15:37:20 +01001507 }
1508
1509exit:
1510 mbedtls_mpi_free( &X );
1511}
1512/* END_CASE */
1513
Gilles Peskine4699fa42021-03-29 22:02:55 +02001514/* BEGIN_CASE */
1515void mpi_random_many( int min, data_t *bound_bytes, int iterations )
1516{
1517 /* Generate numbers in the range 1..bound-1. Do it iterations times.
1518 * This function assumes that the value of bound is at least 2 and
1519 * that iterations is large enough that a one-in-2^iterations chance
1520 * effectively never occurs.
1521 */
1522
1523 mbedtls_mpi upper_bound;
1524 size_t n_bits;
1525 mbedtls_mpi result;
1526 size_t b;
1527 /* If upper_bound is small, stats[b] is the number of times the value b
1528 * has been generated. Otherwise stats[b] is the number of times a
1529 * value with bit b set has been generated. */
1530 size_t *stats = NULL;
1531 size_t stats_len;
1532 int full_stats;
1533 size_t i;
1534
1535 mbedtls_mpi_init( &upper_bound );
1536 mbedtls_mpi_init( &result );
1537
1538 TEST_EQUAL( 0, mbedtls_mpi_read_binary( &upper_bound,
1539 bound_bytes->x, bound_bytes->len ) );
1540 n_bits = mbedtls_mpi_bitlen( &upper_bound );
1541 /* Consider a bound "small" if it's less than 2^5. This value is chosen
1542 * to be small enough that the probability of missing one value is
1543 * negligible given the number of iterations. It must be less than
1544 * 256 because some of the code below assumes that "small" values
1545 * fit in a byte. */
1546 if( n_bits <= 5 )
1547 {
1548 full_stats = 1;
1549 stats_len = bound_bytes->x[bound_bytes->len - 1];
1550 }
1551 else
1552 {
1553 full_stats = 0;
1554 stats_len = n_bits;
1555 }
1556 ASSERT_ALLOC( stats, stats_len );
1557
1558 for( i = 0; i < (size_t) iterations; i++ )
1559 {
1560 mbedtls_test_set_step( i );
1561 TEST_EQUAL( 0, mbedtls_mpi_random( &result, min, &upper_bound,
1562 mbedtls_test_rnd_std_rand, NULL ) );
1563
Gilles Peskineb53b2182021-06-10 15:34:15 +02001564 TEST_ASSERT( sign_is_valid( &result ) );
Gilles Peskine4699fa42021-03-29 22:02:55 +02001565 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &result, &upper_bound ) < 0 );
1566 TEST_ASSERT( mbedtls_mpi_cmp_int( &result, min ) >= 0 );
1567 if( full_stats )
1568 {
1569 uint8_t value;
1570 TEST_EQUAL( 0, mbedtls_mpi_write_binary( &result, &value, 1 ) );
1571 TEST_ASSERT( value < stats_len );
1572 ++stats[value];
1573 }
1574 else
1575 {
1576 for( b = 0; b < n_bits; b++ )
1577 stats[b] += mbedtls_mpi_get_bit( &result, b );
1578 }
1579 }
1580
1581 if( full_stats )
1582 {
Gilles Peskinec520d7a2021-04-13 20:45:05 +02001583 for( b = min; b < stats_len; b++ )
Gilles Peskine4699fa42021-03-29 22:02:55 +02001584 {
1585 mbedtls_test_set_step( 1000000 + b );
1586 /* Assert that each value has been reached at least once.
1587 * This is almost guaranteed if the iteration count is large
1588 * enough. This is a very crude way of checking the distribution.
1589 */
1590 TEST_ASSERT( stats[b] > 0 );
1591 }
1592 }
1593 else
1594 {
Gilles Peskinee4f937f2021-06-02 21:24:04 +02001595 int statistically_safe_all_the_way =
1596 is_significantly_above_a_power_of_2( bound_bytes );
Gilles Peskine4699fa42021-03-29 22:02:55 +02001597 for( b = 0; b < n_bits; b++ )
1598 {
1599 mbedtls_test_set_step( 1000000 + b );
1600 /* Assert that each bit has been set in at least one result and
1601 * clear in at least one result. Provided that iterations is not
1602 * too small, it would be extremely unlikely for this not to be
1603 * the case if the results are uniformly distributed.
1604 *
1605 * As an exception, the top bit may legitimately never be set
1606 * if bound is a power of 2 or only slightly above.
1607 */
Gilles Peskinee4f937f2021-06-02 21:24:04 +02001608 if( statistically_safe_all_the_way || b != n_bits - 1 )
Gilles Peskine4699fa42021-03-29 22:02:55 +02001609 {
1610 TEST_ASSERT( stats[b] > 0 );
1611 }
1612 TEST_ASSERT( stats[b] < (size_t) iterations );
1613 }
1614 }
1615
1616exit:
1617 mbedtls_mpi_free( &upper_bound );
1618 mbedtls_mpi_free( &result );
1619 mbedtls_free( stats );
1620}
1621/* END_CASE */
1622
Gilles Peskine9312ba52021-03-29 22:14:51 +02001623/* BEGIN_CASE */
Gilles Peskinef467e1a2021-04-02 00:02:27 +02001624void mpi_random_sizes( int min, data_t *bound_bytes, int nlimbs, int before )
Gilles Peskine8f454702021-04-01 15:57:18 +02001625{
1626 mbedtls_mpi upper_bound;
1627 mbedtls_mpi result;
1628
1629 mbedtls_mpi_init( &upper_bound );
1630 mbedtls_mpi_init( &result );
1631
Gilles Peskinef467e1a2021-04-02 00:02:27 +02001632 if( before != 0 )
1633 {
1634 /* Set result to sign(before) * 2^(|before|-1) */
1635 TEST_ASSERT( mbedtls_mpi_lset( &result, before > 0 ? 1 : -1 ) == 0 );
1636 if( before < 0 )
1637 before = - before;
1638 TEST_ASSERT( mbedtls_mpi_shift_l( &result, before - 1 ) == 0 );
1639 }
1640
Gilles Peskine8f454702021-04-01 15:57:18 +02001641 TEST_EQUAL( 0, mbedtls_mpi_grow( &result, nlimbs ) );
1642 TEST_EQUAL( 0, mbedtls_mpi_read_binary( &upper_bound,
1643 bound_bytes->x, bound_bytes->len ) );
1644 TEST_EQUAL( 0, mbedtls_mpi_random( &result, min, &upper_bound,
1645 mbedtls_test_rnd_std_rand, NULL ) );
Gilles Peskineb53b2182021-06-10 15:34:15 +02001646 TEST_ASSERT( sign_is_valid( &result ) );
Gilles Peskine8f454702021-04-01 15:57:18 +02001647 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &result, &upper_bound ) < 0 );
1648 TEST_ASSERT( mbedtls_mpi_cmp_int( &result, min ) >= 0 );
1649
1650exit:
1651 mbedtls_mpi_free( &upper_bound );
1652 mbedtls_mpi_free( &result );
1653}
1654/* END_CASE */
1655
1656/* BEGIN_CASE */
Gilles Peskine9312ba52021-03-29 22:14:51 +02001657void mpi_random_fail( int min, data_t *bound_bytes, int expected_ret )
1658{
1659 mbedtls_mpi upper_bound;
1660 mbedtls_mpi result;
1661 int actual_ret;
1662
1663 mbedtls_mpi_init( &upper_bound );
1664 mbedtls_mpi_init( &result );
1665
1666 TEST_EQUAL( 0, mbedtls_mpi_read_binary( &upper_bound,
1667 bound_bytes->x, bound_bytes->len ) );
1668 actual_ret = mbedtls_mpi_random( &result, min, &upper_bound,
1669 mbedtls_test_rnd_std_rand, NULL );
1670 TEST_EQUAL( expected_ret, actual_ret );
1671
1672exit:
1673 mbedtls_mpi_free( &upper_bound );
1674 mbedtls_mpi_free( &result );
1675}
1676/* END_CASE */
1677
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001678/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Azim Khanf1aaec92017-05-30 14:23:15 +01001679void mpi_selftest( )
Paul Bakkere896fea2009-07-06 06:40:23 +00001680{
Andres AG93012e82016-09-09 09:10:28 +01001681 TEST_ASSERT( mbedtls_mpi_self_test( 1 ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +00001682}
Paul Bakker33b43f12013-08-20 11:48:36 +02001683/* END_CASE */