blob: 6d046f19653fee2c7c93c656f29c56a143c6e4dd [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"
Gabor Mezei23a1ce92022-08-02 11:54:44 +02004#include "bignum_mod.h"
5#include "bignum_mod_raw.h"
Janos Follath23bdeca2022-07-22 18:24:06 +01006#include "constant_time_internal.h"
7#include "test/constant_flow.h"
Janos Follath64eca052018-09-05 17:04:49 +01008
Chris Jonese64a46f2020-12-03 17:44:03 +00009#if MBEDTLS_MPI_MAX_BITS > 792
10#define MPI_MAX_BITS_LARGER_THAN_792
Chris Jones4592bd82020-12-03 14:24:33 +000011#endif
Gabor Mezei89e31462022-08-12 15:36:56 +020012
Gilles Peskinedffc7102021-06-10 15:34:15 +020013/* Check the validity of the sign bit in an MPI object. Reject representations
14 * that are not supported by the rest of the library and indicate a bug when
15 * constructing the value. */
16static int sign_is_valid( const mbedtls_mpi *X )
17{
18 if( X->s != 1 && X->s != -1 )
19 return( 0 ); // invalid sign bit, e.g. 0
20 if( mbedtls_mpi_bitlen( X ) == 0 && X->s != 1 )
21 return( 0 ); // negative zero
22 return( 1 );
23}
24
Janos Follath64eca052018-09-05 17:04:49 +010025typedef struct mbedtls_test_mpi_random
26{
27 data_t *data;
28 size_t pos;
29 size_t chunk_len;
30} mbedtls_test_mpi_random;
31
32/*
33 * This function is called by the Miller-Rabin primality test each time it
34 * chooses a random witness. The witnesses (or non-witnesses as provided by the
35 * test) are stored in the data member of the state structure. Each number is in
36 * the format that mbedtls_mpi_read_string understands and is chunk_len long.
37 */
38int mbedtls_test_mpi_miller_rabin_determinizer( void* state,
39 unsigned char* buf,
40 size_t len )
41{
42 mbedtls_test_mpi_random *random = (mbedtls_test_mpi_random*) state;
43
44 if( random == NULL || random->data->x == NULL || buf == NULL )
45 return( -1 );
46
47 if( random->pos + random->chunk_len > random->data->len
48 || random->chunk_len > len )
49 {
50 return( -1 );
51 }
52
53 memset( buf, 0, len );
54
55 /* The witness is written to the end of the buffer, since the buffer is
56 * used as big endian, unsigned binary data in mbedtls_mpi_read_binary.
57 * Writing the witness to the start of the buffer would result in the
58 * buffer being 'witness 000...000', which would be treated as
59 * witness * 2^n for some n. */
60 memcpy( buf + len - random->chunk_len, &random->data->x[random->pos],
61 random->chunk_len );
62
63 random->pos += random->chunk_len;
64
65 return( 0 );
66}
Gilles Peskine3cb1e292020-11-25 15:37:20 +010067
68/* Random generator that is told how many bytes to return. */
69static int f_rng_bytes_left( void *state, unsigned char *buf, size_t len )
70{
71 size_t *bytes_left = state;
72 size_t i;
73 for( i = 0; i < len; i++ )
74 {
75 if( *bytes_left == 0 )
76 return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
77 buf[i] = *bytes_left & 0xff;
78 --( *bytes_left );
79 }
80 return( 0 );
81}
82
Gilles Peskineeedefa52021-04-13 19:50:04 +020083/* Test whether bytes represents (in big-endian base 256) a number b that
84 * is significantly above a power of 2. That is, b must not have a long run
85 * of unset bits after the most significant bit.
86 *
87 * Let n be the bit-size of b, i.e. the integer such that 2^n <= b < 2^{n+1}.
88 * This function returns 1 if, when drawing a number between 0 and b,
89 * the probability that this number is at least 2^n is not negligible.
90 * This probability is (b - 2^n) / b and this function checks that this
91 * number is above some threshold A. The threshold value is heuristic and
92 * based on the needs of mpi_random_many().
Gilles Peskine02ac93a2021-03-29 22:02:55 +020093 */
94static int is_significantly_above_a_power_of_2( data_t *bytes )
95{
96 const uint8_t *p = bytes->x;
97 size_t len = bytes->len;
98 unsigned x;
Gilles Peskineeedefa52021-04-13 19:50:04 +020099
100 /* Skip leading null bytes */
Gilles Peskine02ac93a2021-03-29 22:02:55 +0200101 while( len > 0 && p[0] == 0 )
102 {
103 ++p;
104 --len;
105 }
Gilles Peskineeedefa52021-04-13 19:50:04 +0200106 /* 0 is not significantly above a power of 2 */
Gilles Peskine02ac93a2021-03-29 22:02:55 +0200107 if( len == 0 )
108 return( 0 );
Gilles Peskineeedefa52021-04-13 19:50:04 +0200109 /* Extract the (up to) 2 most significant bytes */
110 if( len == 1 )
Gilles Peskine02ac93a2021-03-29 22:02:55 +0200111 x = p[0];
112 else
113 x = ( p[0] << 8 ) | p[1];
114
Gilles Peskineeedefa52021-04-13 19:50:04 +0200115 /* Shift the most significant bit of x to position 8 and mask it out */
116 while( ( x & 0xfe00 ) != 0 )
117 x >>= 1;
118 x &= 0x00ff;
Gilles Peskine02ac93a2021-03-29 22:02:55 +0200119
Gilles Peskineeedefa52021-04-13 19:50:04 +0200120 /* At this point, x = floor((b - 2^n) / 2^(n-8)). b is significantly above
121 * a power of 2 iff x is significantly above 0 compared to 2^8.
122 * Testing x >= 2^4 amounts to picking A = 1/16 in the function
123 * description above. */
124 return( x >= 0x10 );
Gilles Peskine02ac93a2021-03-29 22:02:55 +0200125}
126
Paul Bakker33b43f12013-08-20 11:48:36 +0200127/* END_HEADER */
Paul Bakker367dae42009-06-28 21:50:27 +0000128
Paul Bakker33b43f12013-08-20 11:48:36 +0200129/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200130 * depends_on:MBEDTLS_BIGNUM_C
Paul Bakker33b43f12013-08-20 11:48:36 +0200131 * END_DEPENDENCIES
132 */
Paul Bakker5690efc2011-05-26 13:16:06 +0000133
Hanno Beckerb48e1aa2018-12-18 23:25:01 +0000134/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100135void mpi_null( )
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200136{
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200137 mbedtls_mpi X, Y, Z;
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200138
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200139 mbedtls_mpi_init( &X );
140 mbedtls_mpi_init( &Y );
141 mbedtls_mpi_init( &Z );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200142
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200143 TEST_ASSERT( mbedtls_mpi_get_bit( &X, 42 ) == 0 );
144 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200145 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == 0 );
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200146 TEST_ASSERT( mbedtls_mpi_size( &X ) == 0 );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200147
148exit:
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200149 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200150}
151/* END_CASE */
152
153/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100154void mpi_read_write_string( int radix_X, char * input_X, int radix_A,
155 char * input_A, int output_size, int result_read,
Paul Bakker33b43f12013-08-20 11:48:36 +0200156 int result_write )
Paul Bakker367dae42009-06-28 21:50:27 +0000157{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200158 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000159 char str[1000];
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100160 size_t len;
Paul Bakker367dae42009-06-28 21:50:27 +0000161
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200162 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000163
Janos Follath04dadb72019-03-06 12:29:37 +0000164 memset( str, '!', sizeof( str ) );
165
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200166 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == result_read );
Paul Bakker33b43f12013-08-20 11:48:36 +0200167 if( result_read == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000168 {
Gilles Peskinedffc7102021-06-10 15:34:15 +0200169 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100170 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, str, output_size, &len ) == result_write );
Paul Bakker33b43f12013-08-20 11:48:36 +0200171 if( result_write == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000172 {
Paul Bakker33b43f12013-08-20 11:48:36 +0200173 TEST_ASSERT( strcasecmp( str, input_A ) == 0 );
Janos Follath04dadb72019-03-06 12:29:37 +0000174 TEST_ASSERT( str[len] == '!' );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000175 }
176 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000177
Paul Bakkerbd51b262014-07-10 15:26:12 +0200178exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200179 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000180}
Paul Bakker33b43f12013-08-20 11:48:36 +0200181/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000182
Paul Bakker33b43f12013-08-20 11:48:36 +0200183/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100184void mpi_read_binary( data_t * buf, char * input_A )
Paul Bakkere896fea2009-07-06 06:40:23 +0000185{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200186 mbedtls_mpi X;
Janos Follathe5670f22019-02-25 16:11:58 +0000187 char str[1000];
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100188 size_t len;
Paul Bakkere896fea2009-07-06 06:40:23 +0000189
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200190 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000191
Paul Bakkere896fea2009-07-06 06:40:23 +0000192
Azim Khand30ca132017-06-09 04:32:58 +0100193 TEST_ASSERT( mbedtls_mpi_read_binary( &X, buf->x, buf->len ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +0200194 TEST_ASSERT( sign_is_valid( &X ) );
Werner Lewisf65a3272022-07-07 11:38:44 +0100195 TEST_ASSERT( mbedtls_mpi_write_string( &X, 16, str, sizeof( str ), &len ) == 0 );
Werner Lewisdc47fe72022-08-01 13:55:41 +0100196 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000197
Paul Bakkerbd51b262014-07-10 15:26:12 +0200198exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200199 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000200}
Paul Bakker33b43f12013-08-20 11:48:36 +0200201/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000202
Paul Bakker33b43f12013-08-20 11:48:36 +0200203/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100204void mpi_mod_setup( int ext_rep, int int_rep, int iret )
Janos Follath16949692022-08-08 13:37:20 +0100205{
206 #define MLIMBS 8
207 mbedtls_mpi_uint mp[MLIMBS];
208 mbedtls_mpi_mod_modulus m;
209 int ret;
210
211 memset( mp, 0xFF, sizeof(mp) );
212
213 mbedtls_mpi_mod_modulus_init( &m );
214 ret = mbedtls_mpi_mod_modulus_setup( &m, mp, MLIMBS, ext_rep, int_rep );
Janos Follath494a6d22022-08-22 09:36:17 +0100215 TEST_EQUAL( ret, iret );
Janos Follath16949692022-08-08 13:37:20 +0100216
217 /* Address sanitiser should catch if we try to free mp */
218 mbedtls_mpi_mod_modulus_free( &m );
219
220 /* Make sure that the modulus doesn't have reference to mp anymore */
221 TEST_ASSERT( m.p != mp );
222
223exit:
224 /* It should be safe to call an mbedtls free several times */
225 mbedtls_mpi_mod_modulus_free( &m );
226
227 #undef MLIMBS
228}
229/* END_CASE */
230
231
232/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100233void mpi_mod_raw_io( data_t *input, int nb_int, int nx_32_int,
234 int iendian, int iret, int oret )
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200235{
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200236 if( iret != 0 )
237 TEST_ASSERT( oret == 0 );
238
Tom Cosgrove1feb5ac2022-09-15 14:22:35 +0100239 TEST_LE_S( 0, nb_int );
Janos Follath81620642022-08-15 11:13:38 +0100240 size_t nb = nb_int;
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200241
Janos Follath81620642022-08-15 11:13:38 +0100242 unsigned char buf[1024];
Tom Cosgrove1feb5ac2022-09-15 14:22:35 +0100243 TEST_LE_U( nb, sizeof( buf ) );
Janos Follath81620642022-08-15 11:13:38 +0100244
Gabor Mezei7f081782022-08-12 18:00:33 +0200245 /* nx_32_int is the number of 32 bit limbs, if we have 64 bit limbs we need
246 * to halve the number of limbs to have the same size. */
Janos Follath6b8e0c22022-08-22 09:54:25 +0100247 size_t nx;
Tom Cosgrove1feb5ac2022-09-15 14:22:35 +0100248 TEST_LE_S( 0, nx_32_int );
Janos Follath6b8e0c22022-08-22 09:54:25 +0100249 if( sizeof( mbedtls_mpi_uint ) == 8 )
250 nx = nx_32_int / 2 + nx_32_int % 2;
251 else
252 nx = nx_32_int;
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200253
Janos Follath81620642022-08-15 11:13:38 +0100254 mbedtls_mpi_uint X[sizeof( buf ) / sizeof( mbedtls_mpi_uint )];
Tom Cosgrove1feb5ac2022-09-15 14:22:35 +0100255 TEST_LE_U( nx, sizeof( X ) / sizeof( X[0] ) );
Janos Follath81620642022-08-15 11:13:38 +0100256
257 int endian;
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200258 if( iendian == MBEDTLS_MPI_MOD_EXT_REP_INVALID )
259 endian = MBEDTLS_MPI_MOD_EXT_REP_LE;
260 else
261 endian = iendian;
262
Janos Follath81620642022-08-15 11:13:38 +0100263 mbedtls_mpi_mod_modulus m;
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200264 mbedtls_mpi_mod_modulus_init( &m );
Janos Follath81620642022-08-15 11:13:38 +0100265 mbedtls_mpi_uint init[sizeof( X ) / sizeof( X[0] )];
266 memset( init, 0xFF, sizeof( init ) );
267 int ret = mbedtls_mpi_mod_modulus_setup( &m, init, nx, endian,
268 MBEDTLS_MPI_MOD_REP_MONTGOMERY );
Janos Follath494a6d22022-08-22 09:36:17 +0100269 TEST_EQUAL( ret, 0 );
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200270
271 if( iendian == MBEDTLS_MPI_MOD_EXT_REP_INVALID && iret != 0 )
272 m.ext_rep = MBEDTLS_MPI_MOD_EXT_REP_INVALID;
273
274 ret = mbedtls_mpi_mod_raw_read( X, &m, input->x, input->len );
Janos Follath494a6d22022-08-22 09:36:17 +0100275 TEST_EQUAL( ret, iret );
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200276
277 if( iret == 0 )
278 {
279 if( iendian == MBEDTLS_MPI_MOD_EXT_REP_INVALID && oret != 0 )
280 m.ext_rep = MBEDTLS_MPI_MOD_EXT_REP_INVALID;
281
282 ret = mbedtls_mpi_mod_raw_write( X, &m, buf, nb );
Janos Follath494a6d22022-08-22 09:36:17 +0100283 TEST_EQUAL( ret, oret );
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200284 }
285
286 if( ( iret == 0 ) && ( oret == 0 ) )
287 {
288 if( nb > input->len )
289 {
290 if( endian == MBEDTLS_MPI_MOD_EXT_REP_BE )
291 {
292 size_t leading_zeroes = nb - input->len;
293 TEST_ASSERT( memcmp( buf + nb - input->len, input->x, input->len ) == 0 );
294 for( size_t i = 0; i < leading_zeroes; i++ )
Janos Follath494a6d22022-08-22 09:36:17 +0100295 TEST_EQUAL( buf[i], 0 );
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200296 }
297 else
298 {
299 TEST_ASSERT( memcmp( buf, input->x, input->len ) == 0 );
300 for( size_t i = input->len; i < nb; i++ )
Janos Follath494a6d22022-08-22 09:36:17 +0100301 TEST_EQUAL( buf[i], 0 );
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200302 }
303 }
304 else
305 {
306 if( endian == MBEDTLS_MPI_MOD_EXT_REP_BE )
307 {
308 size_t leading_zeroes = input->len - nb;
309 TEST_ASSERT( memcmp( input->x + input->len - nb, buf, nb ) == 0 );
310 for( size_t i = 0; i < leading_zeroes; i++ )
Janos Follath494a6d22022-08-22 09:36:17 +0100311 TEST_EQUAL( input->x[i], 0 );
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200312 }
313 else
314 {
315 TEST_ASSERT( memcmp( input->x, buf, nb ) == 0 );
316 for( size_t i = nb; i < input->len; i++ )
Janos Follath494a6d22022-08-22 09:36:17 +0100317 TEST_EQUAL( input->x[i], 0 );
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200318 }
319 }
320 }
321
322exit:
323 mbedtls_mpi_mod_modulus_free( &m );
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200324}
325/* END_CASE */
326
327/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100328void mpi_read_binary_le( data_t * buf, char * input_A )
Janos Follatha778a942019-02-13 10:28:28 +0000329{
330 mbedtls_mpi X;
Janos Follathe5670f22019-02-25 16:11:58 +0000331 char str[1000];
Janos Follatha778a942019-02-13 10:28:28 +0000332 size_t len;
333
334 mbedtls_mpi_init( &X );
335
336
337 TEST_ASSERT( mbedtls_mpi_read_binary_le( &X, buf->x, buf->len ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +0200338 TEST_ASSERT( sign_is_valid( &X ) );
Werner Lewisf65a3272022-07-07 11:38:44 +0100339 TEST_ASSERT( mbedtls_mpi_write_string( &X, 16, str, sizeof( str ), &len ) == 0 );
Werner Lewisdc47fe72022-08-01 13:55:41 +0100340 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
Janos Follatha778a942019-02-13 10:28:28 +0000341
342exit:
343 mbedtls_mpi_free( &X );
344}
345/* END_CASE */
346
347/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100348void mpi_write_binary( char * input_X, data_t * input_A,
349 int output_size, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000350{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200351 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000352 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000353 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +0000354
355 memset( buf, 0x00, 1000 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000356
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200357 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000358
Werner Lewis19b4cd82022-07-07 11:02:27 +0100359 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +0100360
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200361 buflen = mbedtls_mpi_size( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +0200362 if( buflen > (size_t) output_size )
363 buflen = (size_t) output_size;
Paul Bakkere896fea2009-07-06 06:40:23 +0000364
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200365 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == result );
Paul Bakker33b43f12013-08-20 11:48:36 +0200366 if( result == 0)
Paul Bakkerba48cb22009-07-12 11:01:32 +0000367 {
Paul Bakkere896fea2009-07-06 06:40:23 +0000368
Ronald Cron2dbba992020-06-10 11:42:32 +0200369 TEST_ASSERT( mbedtls_test_hexcmp( buf, input_A->x,
370 buflen, input_A->len ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000371 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000372
Paul Bakkerbd51b262014-07-10 15:26:12 +0200373exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200374 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000375}
Paul Bakker33b43f12013-08-20 11:48:36 +0200376/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000377
Janos Follathe344d0f2019-02-19 16:17:40 +0000378/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100379void mpi_write_binary_le( char * input_X, data_t * input_A,
380 int output_size, int result )
Janos Follathe344d0f2019-02-19 16:17:40 +0000381{
382 mbedtls_mpi X;
383 unsigned char buf[1000];
384 size_t buflen;
385
386 memset( buf, 0x00, 1000 );
387
388 mbedtls_mpi_init( &X );
389
Werner Lewis19b4cd82022-07-07 11:02:27 +0100390 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Janos Follathe344d0f2019-02-19 16:17:40 +0000391
392 buflen = mbedtls_mpi_size( &X );
393 if( buflen > (size_t) output_size )
394 buflen = (size_t) output_size;
395
396 TEST_ASSERT( mbedtls_mpi_write_binary_le( &X, buf, buflen ) == result );
397 if( result == 0)
398 {
399
Ronald Cron2dbba992020-06-10 11:42:32 +0200400 TEST_ASSERT( mbedtls_test_hexcmp( buf, input_A->x,
401 buflen, input_A->len ) == 0 );
Janos Follathe344d0f2019-02-19 16:17:40 +0000402 }
403
404exit:
405 mbedtls_mpi_free( &X );
406}
407/* END_CASE */
408
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100410void mpi_read_file( char * input_file, data_t * input_A, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000411{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200412 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000413 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000414 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +0000415 FILE *file;
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000416 int ret;
Paul Bakkere896fea2009-07-06 06:40:23 +0000417
418 memset( buf, 0x00, 1000 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000419
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200420 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000421
Paul Bakker33b43f12013-08-20 11:48:36 +0200422 file = fopen( input_file, "r" );
Paul Bakker8a0c0a92014-04-17 16:08:20 +0200423 TEST_ASSERT( file != NULL );
Werner Lewisf65a3272022-07-07 11:38:44 +0100424 ret = mbedtls_mpi_read_file( &X, 16, file );
Paul Bakkere896fea2009-07-06 06:40:23 +0000425 fclose(file);
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000426 TEST_ASSERT( ret == result );
Paul Bakkere896fea2009-07-06 06:40:23 +0000427
Paul Bakker33b43f12013-08-20 11:48:36 +0200428 if( result == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000429 {
Gilles Peskinedffc7102021-06-10 15:34:15 +0200430 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200431 buflen = mbedtls_mpi_size( &X );
432 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000433
Paul Bakkere896fea2009-07-06 06:40:23 +0000434
Ronald Cron2dbba992020-06-10 11:42:32 +0200435 TEST_ASSERT( mbedtls_test_hexcmp( buf, input_A->x,
436 buflen, input_A->len ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000437 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000438
Paul Bakkerbd51b262014-07-10 15:26:12 +0200439exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200440 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000441}
Paul Bakker33b43f12013-08-20 11:48:36 +0200442/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000443
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200444/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100445void mpi_write_file( char * input_X, char * output_file )
Paul Bakkere896fea2009-07-06 06:40:23 +0000446{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200447 mbedtls_mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000448 FILE *file_out, *file_in;
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200449 int ret;
Paul Bakker69998dd2009-07-11 19:15:20 +0000450
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200451 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000452
Werner Lewis19b4cd82022-07-07 11:02:27 +0100453 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000454
Paul Bakker33b43f12013-08-20 11:48:36 +0200455 file_out = fopen( output_file, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000456 TEST_ASSERT( file_out != NULL );
Werner Lewisf65a3272022-07-07 11:38:44 +0100457 ret = mbedtls_mpi_write_file( NULL, &X, 16, file_out );
Paul Bakkere896fea2009-07-06 06:40:23 +0000458 fclose(file_out);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200459 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000460
Paul Bakker33b43f12013-08-20 11:48:36 +0200461 file_in = fopen( output_file, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000462 TEST_ASSERT( file_in != NULL );
Werner Lewisf65a3272022-07-07 11:38:44 +0100463 ret = mbedtls_mpi_read_file( &Y, 16, file_in );
Paul Bakkere896fea2009-07-06 06:40:23 +0000464 fclose(file_in);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200465 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000466
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200467 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000468
Paul Bakkerbd51b262014-07-10 15:26:12 +0200469exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200470 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000471}
Paul Bakker33b43f12013-08-20 11:48:36 +0200472/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000473
Paul Bakker33b43f12013-08-20 11:48:36 +0200474/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100475void mpi_get_bit( char * input_X, int pos, int val )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000476{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200477 mbedtls_mpi X;
478 mbedtls_mpi_init( &X );
Werner Lewis19b4cd82022-07-07 11:02:27 +0100479 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200480 TEST_ASSERT( mbedtls_mpi_get_bit( &X, pos ) == val );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000481
Paul Bakkerbd51b262014-07-10 15:26:12 +0200482exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200483 mbedtls_mpi_free( &X );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000484}
Paul Bakker33b43f12013-08-20 11:48:36 +0200485/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000486
Paul Bakker33b43f12013-08-20 11:48:36 +0200487/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100488void mpi_set_bit( char * input_X, int pos, int val,
489 char * output_Y, int result )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000490{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200491 mbedtls_mpi X, Y;
492 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000493
Werner Lewis19b4cd82022-07-07 11:02:27 +0100494 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
495 TEST_ASSERT( mbedtls_test_read_mpi( &Y, output_Y ) == 0 );
Paul Bakkerec5ceb62016-07-14 12:47:07 +0100496 TEST_ASSERT( mbedtls_mpi_set_bit( &X, pos, val ) == result );
497
498 if( result == 0 )
499 {
Gilles Peskinedffc7102021-06-10 15:34:15 +0200500 TEST_ASSERT( sign_is_valid( &X ) );
Paul Bakkerec5ceb62016-07-14 12:47:07 +0100501 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
502 }
Paul Bakker2f5947e2011-05-18 15:47:11 +0000503
Paul Bakkerbd51b262014-07-10 15:26:12 +0200504exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200505 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000506}
Paul Bakker33b43f12013-08-20 11:48:36 +0200507/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000508
Paul Bakker33b43f12013-08-20 11:48:36 +0200509/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100510void mpi_lsb( char * input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000511{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200512 mbedtls_mpi X;
513 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000514
Werner Lewis19b4cd82022-07-07 11:02:27 +0100515 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200516 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000517
Paul Bakkerbd51b262014-07-10 15:26:12 +0200518exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200519 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000520}
Paul Bakker33b43f12013-08-20 11:48:36 +0200521/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000522
Paul Bakker33b43f12013-08-20 11:48:36 +0200523/* BEGIN_CASE */
Gilles Peskineb50e4332022-10-09 21:17:26 +0200524void mpi_core_bitlen( char *input_X, int nr_bits )
525{
526 mbedtls_mpi_uint *X = NULL;
527 size_t limbs;
528
529 TEST_EQUAL( mbedtls_test_read_mpi_core( &X, &limbs, input_X ), 0 );
530 TEST_EQUAL( mbedtls_mpi_core_bitlen( X, limbs ), nr_bits );
531
532exit:
533 mbedtls_free( X );
534}
535/* END_CASE */
536
537/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100538void mpi_bitlen( char * input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000539{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200540 mbedtls_mpi X;
541 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000542
Werner Lewis19b4cd82022-07-07 11:02:27 +0100543 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200544 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000545
Paul Bakkerbd51b262014-07-10 15:26:12 +0200546exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200547 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000548}
Paul Bakker33b43f12013-08-20 11:48:36 +0200549/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000550
Paul Bakker33b43f12013-08-20 11:48:36 +0200551/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100552void mpi_gcd( char * input_X, char * input_Y,
553 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000554{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200555 mbedtls_mpi A, X, Y, Z;
556 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000557
Werner Lewis19b4cd82022-07-07 11:02:27 +0100558 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
559 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
560 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200561 TEST_ASSERT( mbedtls_mpi_gcd( &Z, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +0200562 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200563 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000564
Paul Bakkerbd51b262014-07-10 15:26:12 +0200565exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200566 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000567}
Paul Bakker33b43f12013-08-20 11:48:36 +0200568/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000569
Paul Bakker33b43f12013-08-20 11:48:36 +0200570/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100571void mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000572{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200573 mbedtls_mpi X;
574 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000575
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200576 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0);
577 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000578
Paul Bakkerbd51b262014-07-10 15:26:12 +0200579exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200580 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000581}
Paul Bakker33b43f12013-08-20 11:48:36 +0200582/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000583
Paul Bakker33b43f12013-08-20 11:48:36 +0200584/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100585void mpi_cmp_mpi( char * input_X, char * input_Y,
586 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000587{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200588 mbedtls_mpi X, Y;
589 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000590
Werner Lewis19b4cd82022-07-07 11:02:27 +0100591 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
592 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200593 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +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 Bakker367dae42009-06-28 21:50:27 +0000597}
Paul Bakker33b43f12013-08-20 11:48:36 +0200598/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000599
Paul Bakker33b43f12013-08-20 11:48:36 +0200600/* BEGIN_CASE */
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200601void mpi_core_cond_assign( data_t * input_X,
Gabor Mezei02e5d432022-10-03 16:45:11 +0200602 data_t * input_Y,
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200603 int input_bytes )
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200604{
Gabor Mezeia7584882022-09-27 13:18:02 +0200605 mbedtls_mpi_uint *X = NULL;
606 mbedtls_mpi_uint *Y = NULL;
Gabor Mezeif5ca7262022-09-30 14:28:26 +0200607 size_t limbs_X = CHARS_TO_LIMBS( input_X->len );
608 size_t limbs_Y = CHARS_TO_LIMBS( input_Y->len );
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200609 size_t limbs = limbs_X;
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200610 size_t copy_limbs = CHARS_TO_LIMBS( input_bytes );
611 size_t bytes = limbs * sizeof( mbedtls_mpi_uint );
612 size_t copy_bytes = copy_limbs * sizeof( mbedtls_mpi_uint );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200613
Gabor Mezeid71eb0c2022-10-10 13:09:04 +0200614 TEST_EQUAL( limbs_X, limbs_Y );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200615 TEST_ASSERT( copy_limbs <= limbs );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200616
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200617 ASSERT_ALLOC( X, limbs );
618 ASSERT_ALLOC( Y, limbs );
Gabor Mezeia7584882022-09-27 13:18:02 +0200619
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200620 TEST_ASSERT( mbedtls_mpi_core_read_be( X, limbs, input_X->x, input_X->len )
Gabor Mezei027d6962022-09-16 17:16:27 +0200621 == 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200622
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200623 TEST_ASSERT( mbedtls_mpi_core_read_be( Y, limbs, input_Y->x, input_Y->len )
Gabor Mezei027d6962022-09-16 17:16:27 +0200624 == 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200625
Gabor Mezei821d1512022-09-27 12:41:28 +0200626 /* condition is false */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200627 TEST_CF_SECRET( X, bytes );
628 TEST_CF_SECRET( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200629
Gabor Mezei02e5d432022-10-03 16:45:11 +0200630 mbedtls_mpi_core_cond_assign( X, Y, copy_limbs, 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200631
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200632 TEST_CF_PUBLIC( X, bytes );
633 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200634
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200635 TEST_ASSERT( memcmp( X, Y, bytes ) != 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200636
Gabor Mezei821d1512022-09-27 12:41:28 +0200637 /* condition is true */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200638 TEST_CF_SECRET( X, bytes );
639 TEST_CF_SECRET( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200640
Gabor Mezei02e5d432022-10-03 16:45:11 +0200641 mbedtls_mpi_core_cond_assign( X, Y, copy_limbs, 1 );
Gabor Mezei821d1512022-09-27 12:41:28 +0200642
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200643 TEST_CF_PUBLIC( X, bytes );
644 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200645
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200646 /* Check if the given length is copied even it is smaller
Gabor Mezei4dceede2022-10-18 16:44:17 +0200647 than the length of the given MPIs. */
Gabor Mezei0c74e082022-10-17 16:09:58 +0200648 if( copy_limbs < limbs )
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200649 {
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200650 ASSERT_COMPARE( X, copy_bytes, Y, copy_bytes );
651 TEST_ASSERT( memcmp( X, Y, bytes ) != 0 );
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200652 }
Gabor Mezei02e5d432022-10-03 16:45:11 +0200653 else
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200654 ASSERT_COMPARE( X, bytes, Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200655
656exit:
Gabor Mezei8b05e3b2022-09-28 12:37:02 +0200657 mbedtls_free( X );
658 mbedtls_free( Y );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200659}
660/* END_CASE */
661
662/* BEGIN_CASE */
663void mpi_core_cond_swap( data_t * input_X,
Gabor Mezei02e5d432022-10-03 16:45:11 +0200664 data_t * input_Y,
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200665 int input_bytes )
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200666{
Gabor Mezeia7584882022-09-27 13:18:02 +0200667 mbedtls_mpi_uint *tmp_X = NULL;
668 mbedtls_mpi_uint *tmp_Y = NULL;
669 mbedtls_mpi_uint *X = NULL;
670 mbedtls_mpi_uint *Y = NULL;
Gabor Mezeif5ca7262022-09-30 14:28:26 +0200671 size_t limbs_X = CHARS_TO_LIMBS( input_X->len );
672 size_t limbs_Y = CHARS_TO_LIMBS( input_Y->len );
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200673 size_t limbs = limbs_X;
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200674 size_t copy_limbs = CHARS_TO_LIMBS( input_bytes );
675 size_t bytes = limbs * sizeof( mbedtls_mpi_uint );
676 size_t copy_bytes = copy_limbs * sizeof( mbedtls_mpi_uint );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200677
Gabor Mezeid71eb0c2022-10-10 13:09:04 +0200678 TEST_EQUAL( limbs_X, limbs_Y );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200679 TEST_ASSERT( copy_limbs <= limbs );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200680
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200681 ASSERT_ALLOC( tmp_X, limbs );
682 ASSERT_ALLOC( tmp_Y, limbs );
Gabor Mezeia7584882022-09-27 13:18:02 +0200683
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200684 TEST_ASSERT( mbedtls_mpi_core_read_be( tmp_X, limbs,
Gabor Mezei027d6962022-09-16 17:16:27 +0200685 input_X->x, input_X->len )
686 == 0 );
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200687 ASSERT_ALLOC( X, limbs );
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200688 memcpy( X, tmp_X, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200689
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200690 TEST_ASSERT( mbedtls_mpi_core_read_be( tmp_Y, limbs,
Gabor Mezei027d6962022-09-16 17:16:27 +0200691 input_Y->x, input_Y->len )
692 == 0 );
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200693 ASSERT_ALLOC( Y, limbs );
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200694 memcpy( Y, tmp_Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200695
Gabor Mezei821d1512022-09-27 12:41:28 +0200696 /* condition is false */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200697 TEST_CF_SECRET( X, bytes );
698 TEST_CF_SECRET( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200699
Gabor Mezei02e5d432022-10-03 16:45:11 +0200700 mbedtls_mpi_core_cond_swap( X, Y, copy_limbs, 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200701
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200702 TEST_CF_PUBLIC( X, bytes );
703 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200704
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200705 ASSERT_COMPARE( X, bytes, tmp_X, bytes );
706 ASSERT_COMPARE( Y, bytes, tmp_Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200707
Gabor Mezei821d1512022-09-27 12:41:28 +0200708 /* condition is true */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200709 TEST_CF_SECRET( X, bytes );
710 TEST_CF_SECRET( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200711
Gabor Mezei02e5d432022-10-03 16:45:11 +0200712 mbedtls_mpi_core_cond_swap( X, Y, copy_limbs, 1 );
Gabor Mezei821d1512022-09-27 12:41:28 +0200713
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200714 TEST_CF_PUBLIC( X, bytes );
715 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200716
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200717 /* Check if the given length is copied even it is smaller
718 than the length of the given MPIs. */
Gabor Mezei0c74e082022-10-17 16:09:58 +0200719 if( copy_limbs < limbs )
Gabor Mezei02e5d432022-10-03 16:45:11 +0200720 {
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200721 ASSERT_COMPARE( X, copy_bytes, tmp_Y, copy_bytes );
722 ASSERT_COMPARE( Y, copy_bytes, tmp_X, copy_bytes );
723 TEST_ASSERT( memcmp( X, tmp_X, bytes ) != 0 );
724 TEST_ASSERT( memcmp( X, tmp_Y, bytes ) != 0 );
725 TEST_ASSERT( memcmp( Y, tmp_X, bytes ) != 0 );
726 TEST_ASSERT( memcmp( Y, tmp_Y, bytes ) != 0 );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200727 }
728 else
729 {
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200730 ASSERT_COMPARE( X, bytes, tmp_Y, bytes );
731 ASSERT_COMPARE( Y, bytes, tmp_X, bytes );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200732 }
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200733
734exit:
Gabor Mezei8b05e3b2022-09-28 12:37:02 +0200735 mbedtls_free( tmp_X );
736 mbedtls_free( tmp_Y );
737 mbedtls_free( X );
738 mbedtls_free( Y );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200739}
740/* END_CASE */
741
742/* BEGIN_CASE */
743void mpi_mod_raw_cond_assign( data_t * input_X,
Gabor Mezei02e5d432022-10-03 16:45:11 +0200744 data_t * input_Y,
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200745 int input_bytes )
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200746{
Gabor Mezeia7584882022-09-27 13:18:02 +0200747 mbedtls_mpi_uint *X = NULL;
748 mbedtls_mpi_uint *Y = NULL;
Gabor Mezeiec5685f2022-09-30 14:41:13 +0200749 mbedtls_mpi_uint *buff_m = NULL;
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200750 mbedtls_mpi_mod_modulus m;
Gabor Mezeif5ca7262022-09-30 14:28:26 +0200751 size_t limbs_X = CHARS_TO_LIMBS( input_X->len );
752 size_t limbs_Y = CHARS_TO_LIMBS( input_Y->len );
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200753 size_t limbs = limbs_X;
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200754 size_t copy_limbs = CHARS_TO_LIMBS( input_bytes );
755 size_t bytes = limbs * sizeof( mbedtls_mpi_uint );
756 size_t copy_bytes = copy_limbs * sizeof( mbedtls_mpi_uint );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200757
Gabor Mezeid71eb0c2022-10-10 13:09:04 +0200758 TEST_EQUAL( limbs_X, limbs_Y );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200759 TEST_ASSERT( copy_limbs <= limbs );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200760
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200761 ASSERT_ALLOC( X, limbs );
762 ASSERT_ALLOC( Y, limbs );
Gabor Mezeia7584882022-09-27 13:18:02 +0200763
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200764 ASSERT_ALLOC( buff_m, limbs );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200765 mbedtls_mpi_mod_modulus_init( &m );
766 TEST_ASSERT( mbedtls_mpi_mod_modulus_setup(
Gabor Mezei02e5d432022-10-03 16:45:11 +0200767 &m, buff_m, copy_limbs,
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200768 MBEDTLS_MPI_MOD_EXT_REP_BE,
769 MBEDTLS_MPI_MOD_REP_MONTGOMERY )
770 == 0 );
771
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200772 TEST_ASSERT( mbedtls_mpi_core_read_be( X, limbs,
Gabor Mezei027d6962022-09-16 17:16:27 +0200773 input_X->x, input_X->len )
774 == 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200775
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200776 TEST_ASSERT( mbedtls_mpi_core_read_be( Y, limbs,
Gabor Mezei027d6962022-09-16 17:16:27 +0200777 input_Y->x, input_Y->len )
778 == 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200779
Gabor Mezei821d1512022-09-27 12:41:28 +0200780 /* condition is false */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200781 TEST_CF_SECRET( X, bytes );
782 TEST_CF_SECRET( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200783
Gabor Mezei821d1512022-09-27 12:41:28 +0200784 mbedtls_mpi_mod_raw_cond_assign( X, Y, &m, 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200785
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200786 TEST_CF_PUBLIC( X, bytes );
787 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200788
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200789 TEST_ASSERT( memcmp( X, Y, bytes ) != 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200790
Gabor Mezei821d1512022-09-27 12:41:28 +0200791 /* condition is true */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200792 TEST_CF_SECRET( X, bytes );
793 TEST_CF_SECRET( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200794
795 mbedtls_mpi_mod_raw_cond_assign( X, Y, &m, 1 );
796
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200797 TEST_CF_PUBLIC( X, bytes );
798 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200799
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200800 /* Check if the given length is copied even it is smaller
801 than the length of the given MPIs. */
Gabor Mezei0c74e082022-10-17 16:09:58 +0200802 if( copy_limbs <limbs )
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200803 {
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200804 ASSERT_COMPARE( X, copy_bytes, Y, copy_bytes );
805 TEST_ASSERT( memcmp( X, Y, bytes ) != 0 );
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200806 }
Gabor Mezei02e5d432022-10-03 16:45:11 +0200807 else
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200808 ASSERT_COMPARE( X, bytes, Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200809
810exit:
Gabor Mezei8b05e3b2022-09-28 12:37:02 +0200811 mbedtls_free( X );
812 mbedtls_free( Y );
813
814 mbedtls_mpi_mod_modulus_free( &m );
Gabor Mezeiec5685f2022-09-30 14:41:13 +0200815 mbedtls_free( buff_m );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200816}
817/* END_CASE */
818
819/* BEGIN_CASE */
820void mpi_mod_raw_cond_swap( data_t * input_X,
Gabor Mezei02e5d432022-10-03 16:45:11 +0200821 data_t * input_Y,
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200822 int input_bytes )
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200823{
Gabor Mezeia7584882022-09-27 13:18:02 +0200824 mbedtls_mpi_uint *tmp_X = NULL;
825 mbedtls_mpi_uint *tmp_Y = NULL;
826 mbedtls_mpi_uint *X = NULL;
827 mbedtls_mpi_uint *Y = NULL;
Gabor Mezeiec5685f2022-09-30 14:41:13 +0200828 mbedtls_mpi_uint *buff_m = NULL;
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200829 mbedtls_mpi_mod_modulus m;
Gabor Mezeif5ca7262022-09-30 14:28:26 +0200830 size_t limbs_X = CHARS_TO_LIMBS( input_X->len );
831 size_t limbs_Y = CHARS_TO_LIMBS( input_Y->len );
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200832 size_t limbs = limbs_X;
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200833 size_t copy_limbs = CHARS_TO_LIMBS( input_bytes );
834 size_t bytes = limbs * sizeof( mbedtls_mpi_uint );
835 size_t copy_bytes = copy_limbs * sizeof( mbedtls_mpi_uint );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200836
Gabor Mezeid71eb0c2022-10-10 13:09:04 +0200837 TEST_EQUAL( limbs_X, limbs_Y );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200838 TEST_ASSERT( copy_limbs <= limbs );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200839
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200840 ASSERT_ALLOC( tmp_X, limbs );
841 ASSERT_ALLOC( tmp_Y, limbs );
Gabor Mezeia7584882022-09-27 13:18:02 +0200842
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200843 ASSERT_ALLOC( buff_m, copy_limbs );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200844 mbedtls_mpi_mod_modulus_init( &m );
845 TEST_ASSERT( mbedtls_mpi_mod_modulus_setup(
Gabor Mezei02e5d432022-10-03 16:45:11 +0200846 &m, buff_m, copy_limbs,
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200847 MBEDTLS_MPI_MOD_EXT_REP_BE,
848 MBEDTLS_MPI_MOD_REP_MONTGOMERY )
849 == 0 );
850
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200851 TEST_ASSERT( mbedtls_mpi_core_read_be( tmp_X, limbs, input_X->x, input_X->len )
Gabor Mezei027d6962022-09-16 17:16:27 +0200852 == 0 );
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200853 ASSERT_ALLOC( X, limbs );
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200854 memcpy( X, tmp_X, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200855
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200856 TEST_ASSERT( mbedtls_mpi_core_read_be( tmp_Y, limbs, input_Y->x, input_Y->len )
Gabor Mezei027d6962022-09-16 17:16:27 +0200857 == 0 );
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200858 ASSERT_ALLOC( Y, bytes );
859 memcpy( Y, tmp_Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200860
Gabor Mezei821d1512022-09-27 12:41:28 +0200861 /* condition is false */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200862 TEST_CF_SECRET( X, bytes );
863 TEST_CF_SECRET( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200864
Gabor Mezei821d1512022-09-27 12:41:28 +0200865 mbedtls_mpi_mod_raw_cond_swap( X, Y, &m, 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200866
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200867 TEST_CF_PUBLIC( X, bytes );
868 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200869
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200870 ASSERT_COMPARE( X, bytes, tmp_X, bytes );
871 ASSERT_COMPARE( Y, bytes, tmp_Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200872
Gabor Mezei821d1512022-09-27 12:41:28 +0200873 /* condition is true */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200874 TEST_CF_SECRET( X, bytes );
875 TEST_CF_SECRET( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200876
877 mbedtls_mpi_mod_raw_cond_swap( X, Y, &m, 1 );
878
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200879 TEST_CF_PUBLIC( X, bytes );
880 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200881
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200882 /* Check if the given length is copied even it is smaller
883 than the length of the given MPIs. */
Gabor Mezei0c74e082022-10-17 16:09:58 +0200884 if( copy_limbs < limbs )
Gabor Mezei02e5d432022-10-03 16:45:11 +0200885 {
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200886 ASSERT_COMPARE( X, copy_bytes, tmp_Y, copy_bytes );
887 ASSERT_COMPARE( Y, copy_bytes, tmp_X, copy_bytes );
888 TEST_ASSERT( memcmp( X, tmp_X, bytes ) != 0 );
889 TEST_ASSERT( memcmp( X, tmp_Y, bytes ) != 0 );
890 TEST_ASSERT( memcmp( Y, tmp_X, bytes ) != 0 );
891 TEST_ASSERT( memcmp( Y, tmp_Y, bytes ) != 0 );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200892 }
893 else
894 {
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200895 ASSERT_COMPARE( X, bytes, tmp_Y, bytes );
896 ASSERT_COMPARE( Y, bytes, tmp_X, bytes );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200897 }
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200898
899exit:
Gabor Mezei8b05e3b2022-09-28 12:37:02 +0200900 mbedtls_free( tmp_X );
901 mbedtls_free( tmp_Y );
902 mbedtls_free( X );
903 mbedtls_free( Y );
904
905 mbedtls_mpi_mod_modulus_free( &m );
Gabor Mezeiec5685f2022-09-30 14:41:13 +0200906 mbedtls_free( buff_m );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200907}
908/* END_CASE */
909
910/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100911void mpi_lt_mpi_ct( int size_X, char * input_X,
912 int size_Y, char * input_Y,
913 int input_ret, int input_err )
Janos Follath385d5b82019-09-11 16:07:14 +0100914{
Gilles Peskine0deccf12020-09-02 15:18:07 +0200915 unsigned ret = -1;
Janos Follath0e5532d2019-10-11 14:21:53 +0100916 unsigned input_uret = input_ret;
Janos Follath385d5b82019-09-11 16:07:14 +0100917 mbedtls_mpi X, Y;
918 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
919
Werner Lewis19b4cd82022-07-07 11:02:27 +0100920 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
921 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
Janos Follath385d5b82019-09-11 16:07:14 +0100922
Gilles Peskine9018b112020-01-21 16:30:53 +0100923 TEST_ASSERT( mbedtls_mpi_grow( &X, size_X ) == 0 );
924 TEST_ASSERT( mbedtls_mpi_grow( &Y, size_Y ) == 0 );
Janos Follath385d5b82019-09-11 16:07:14 +0100925
Janos Follath0e5532d2019-10-11 14:21:53 +0100926 TEST_ASSERT( mbedtls_mpi_lt_mpi_ct( &X, &Y, &ret ) == input_err );
Janos Follath385d5b82019-09-11 16:07:14 +0100927 if( input_err == 0 )
Janos Follath0e5532d2019-10-11 14:21:53 +0100928 TEST_ASSERT( ret == input_uret );
Janos Follath385d5b82019-09-11 16:07:14 +0100929
930exit:
931 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
932}
933/* END_CASE */
934
935/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100936void mpi_cmp_abs( char * input_X, char * input_Y,
937 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000938{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200939 mbedtls_mpi X, Y;
940 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000941
Werner Lewis19b4cd82022-07-07 11:02:27 +0100942 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
943 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200944 TEST_ASSERT( mbedtls_mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000945
Paul Bakkerbd51b262014-07-10 15:26:12 +0200946exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200947 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000948}
Paul Bakker33b43f12013-08-20 11:48:36 +0200949/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000950
Paul Bakker33b43f12013-08-20 11:48:36 +0200951/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100952void mpi_copy( char *src_hex, char *dst_hex )
Paul Bakker367dae42009-06-28 21:50:27 +0000953{
Gilles Peskined0722f82021-06-10 23:00:33 +0200954 mbedtls_mpi src, dst, ref;
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200955 mbedtls_mpi_init( &src );
956 mbedtls_mpi_init( &dst );
Gilles Peskined0722f82021-06-10 23:00:33 +0200957 mbedtls_mpi_init( &ref );
Paul Bakker367dae42009-06-28 21:50:27 +0000958
Werner Lewis19b4cd82022-07-07 11:02:27 +0100959 TEST_ASSERT( mbedtls_test_read_mpi( &src, src_hex ) == 0 );
960 TEST_ASSERT( mbedtls_test_read_mpi( &ref, dst_hex ) == 0 );
Gilles Peskined0722f82021-06-10 23:00:33 +0200961
962 /* mbedtls_mpi_copy() */
Werner Lewis19b4cd82022-07-07 11:02:27 +0100963 TEST_ASSERT( mbedtls_test_read_mpi( &dst, dst_hex ) == 0 );
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200964 TEST_ASSERT( mbedtls_mpi_copy( &dst, &src ) == 0 );
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200965 TEST_ASSERT( sign_is_valid( &dst ) );
966 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &dst, &src ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000967
Gilles Peskined0722f82021-06-10 23:00:33 +0200968 /* mbedtls_mpi_safe_cond_assign(), assignment done */
969 mbedtls_mpi_free( &dst );
Werner Lewis19b4cd82022-07-07 11:02:27 +0100970 TEST_ASSERT( mbedtls_test_read_mpi( &dst, dst_hex ) == 0 );
Gilles Peskined0722f82021-06-10 23:00:33 +0200971 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &dst, &src, 1 ) == 0 );
972 TEST_ASSERT( sign_is_valid( &dst ) );
973 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &dst, &src ) == 0 );
974
975 /* mbedtls_mpi_safe_cond_assign(), assignment not done */
976 mbedtls_mpi_free( &dst );
Werner Lewis19b4cd82022-07-07 11:02:27 +0100977 TEST_ASSERT( mbedtls_test_read_mpi( &dst, dst_hex ) == 0 );
Gilles Peskined0722f82021-06-10 23:00:33 +0200978 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &dst, &src, 0 ) == 0 );
979 TEST_ASSERT( sign_is_valid( &dst ) );
980 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &dst, &ref ) == 0 );
981
Paul Bakkerbd51b262014-07-10 15:26:12 +0200982exit:
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200983 mbedtls_mpi_free( &src );
984 mbedtls_mpi_free( &dst );
Gilles Peskined0722f82021-06-10 23:00:33 +0200985 mbedtls_mpi_free( &ref );
Gilles Peskine7428b452020-01-20 21:01:51 +0100986}
987/* END_CASE */
988
989/* BEGIN_CASE */
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200990void mpi_copy_self( char *input_X )
Gilles Peskine7428b452020-01-20 21:01:51 +0100991{
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200992 mbedtls_mpi X, A;
993 mbedtls_mpi_init( &A );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200994 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000995
Werner Lewis19b4cd82022-07-07 11:02:27 +0100996 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200997 TEST_ASSERT( mbedtls_mpi_copy( &X, &X ) == 0 );
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200998
Werner Lewis19b4cd82022-07-07 11:02:27 +0100999 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_X ) == 0 );
Gilles Peskine90ec8e82021-06-10 15:17:30 +02001000 TEST_ASSERT( sign_is_valid( &X ) );
1001 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001002
Paul Bakkerbd51b262014-07-10 15:26:12 +02001003exit:
Gilles Peskine90ec8e82021-06-10 15:17:30 +02001004 mbedtls_mpi_free( &A );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001005 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +00001006}
Paul Bakker33b43f12013-08-20 11:48:36 +02001007/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +00001008
Paul Bakker33b43f12013-08-20 11:48:36 +02001009/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001010void mpi_swap( char *X_hex, char *Y_hex )
Gilles Peskinefc1eeef2021-06-10 22:29:57 +02001011{
1012 mbedtls_mpi X, Y, X0, Y0;
1013 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
1014 mbedtls_mpi_init( &X0 ); mbedtls_mpi_init( &Y0 );
1015
Werner Lewis19b4cd82022-07-07 11:02:27 +01001016 TEST_ASSERT( mbedtls_test_read_mpi( &X0, X_hex ) == 0 );
1017 TEST_ASSERT( mbedtls_test_read_mpi( &Y0, Y_hex ) == 0 );
Gilles Peskinefc1eeef2021-06-10 22:29:57 +02001018
Gilles Peskined0722f82021-06-10 23:00:33 +02001019 /* mbedtls_mpi_swap() */
Tom Cosgrovec71ca0c2022-09-15 15:38:17 +01001020 TEST_ASSERT( mbedtls_test_read_mpi( &X, X_hex ) == 0 );
1021 TEST_ASSERT( mbedtls_test_read_mpi( &Y, Y_hex ) == 0 );
Gilles Peskinefc1eeef2021-06-10 22:29:57 +02001022 mbedtls_mpi_swap( &X, &Y );
1023 TEST_ASSERT( sign_is_valid( &X ) );
1024 TEST_ASSERT( sign_is_valid( &Y ) );
1025 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y0 ) == 0 );
1026 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &X0 ) == 0 );
1027
Gilles Peskined0722f82021-06-10 23:00:33 +02001028 /* mbedtls_mpi_safe_cond_swap(), swap done */
1029 mbedtls_mpi_free( &X );
1030 mbedtls_mpi_free( &Y );
Tom Cosgrovec71ca0c2022-09-15 15:38:17 +01001031 TEST_ASSERT( mbedtls_test_read_mpi( &X, X_hex ) == 0 );
1032 TEST_ASSERT( mbedtls_test_read_mpi( &Y, Y_hex ) == 0 );
Gilles Peskined0722f82021-06-10 23:00:33 +02001033 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 1 ) == 0 );
1034 TEST_ASSERT( sign_is_valid( &X ) );
1035 TEST_ASSERT( sign_is_valid( &Y ) );
1036 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y0 ) == 0 );
1037 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &X0 ) == 0 );
1038
1039 /* mbedtls_mpi_safe_cond_swap(), swap not done */
1040 mbedtls_mpi_free( &X );
1041 mbedtls_mpi_free( &Y );
Tom Cosgrovec71ca0c2022-09-15 15:38:17 +01001042 TEST_ASSERT( mbedtls_test_read_mpi( &X, X_hex ) == 0 );
1043 TEST_ASSERT( mbedtls_test_read_mpi( &Y, Y_hex ) == 0 );
Gilles Peskined0722f82021-06-10 23:00:33 +02001044 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
1045 TEST_ASSERT( sign_is_valid( &X ) );
1046 TEST_ASSERT( sign_is_valid( &Y ) );
1047 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 );
1048 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &Y0 ) == 0 );
1049
Gilles Peskinefc1eeef2021-06-10 22:29:57 +02001050exit:
1051 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
1052 mbedtls_mpi_free( &X0 ); mbedtls_mpi_free( &Y0 );
1053}
1054/* END_CASE */
1055
1056/* BEGIN_CASE */
1057void mpi_swap_self( char *X_hex )
1058{
1059 mbedtls_mpi X, X0;
1060 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &X0 );
1061
Tom Cosgrovec71ca0c2022-09-15 15:38:17 +01001062 TEST_ASSERT( mbedtls_test_read_mpi( &X, X_hex ) == 0 );
Werner Lewis19b4cd82022-07-07 11:02:27 +01001063 TEST_ASSERT( mbedtls_test_read_mpi( &X0, X_hex ) == 0 );
Gilles Peskinefc1eeef2021-06-10 22:29:57 +02001064
1065 mbedtls_mpi_swap( &X, &X );
1066 TEST_ASSERT( sign_is_valid( &X ) );
1067 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 );
1068
1069exit:
1070 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &X0 );
1071}
1072/* END_CASE */
1073
1074/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001075void mpi_shrink( int before, int used, int min, int after )
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +01001076{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001077 mbedtls_mpi X;
1078 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +01001079
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001080 TEST_ASSERT( mbedtls_mpi_grow( &X, before ) == 0 );
Gilles Peskinee1091752021-06-15 21:19:18 +02001081 if( used > 0 )
1082 {
1083 size_t used_bit_count = used * 8 * sizeof( mbedtls_mpi_uint );
1084 TEST_ASSERT( mbedtls_mpi_set_bit( &X, used_bit_count - 1, 1 ) == 0 );
1085 }
1086 TEST_EQUAL( X.n, (size_t) before );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001087 TEST_ASSERT( mbedtls_mpi_shrink( &X, min ) == 0 );
Gilles Peskinee1091752021-06-15 21:19:18 +02001088 TEST_EQUAL( X.n, (size_t) after );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +01001089
Paul Bakkerbd51b262014-07-10 15:26:12 +02001090exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001091 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +01001092}
1093/* END_CASE */
1094
1095/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001096void mpi_add_mpi( char * input_X, char * input_Y,
1097 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001098{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001099 mbedtls_mpi X, Y, Z, A;
1100 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001101
Werner Lewis19b4cd82022-07-07 11:02:27 +01001102 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1103 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1104 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001105 TEST_ASSERT( mbedtls_mpi_add_mpi( &Z, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001106 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001107 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001108
Gilles Peskine56f943a2020-07-23 01:18:11 +02001109 /* result == first operand */
1110 TEST_ASSERT( mbedtls_mpi_add_mpi( &X, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001111 TEST_ASSERT( sign_is_valid( &X ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001112 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Werner Lewis19b4cd82022-07-07 11:02:27 +01001113 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001114
1115 /* result == second operand */
1116 TEST_ASSERT( mbedtls_mpi_add_mpi( &Y, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001117 TEST_ASSERT( sign_is_valid( &Y ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001118 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
1119
Paul Bakkerbd51b262014-07-10 15:26:12 +02001120exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001121 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001122}
Paul Bakker33b43f12013-08-20 11:48:36 +02001123/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001124
Paul Bakker33b43f12013-08-20 11:48:36 +02001125/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001126void mpi_add_mpi_inplace( char * input_X, char * input_A )
Janos Follath044a86b2015-10-25 10:58:03 +01001127{
1128 mbedtls_mpi X, A;
1129 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
1130
Werner Lewis19b4cd82022-07-07 11:02:27 +01001131 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +01001132
Werner Lewis19b4cd82022-07-07 11:02:27 +01001133 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +01001134 TEST_ASSERT( mbedtls_mpi_sub_abs( &X, &X, &X ) == 0 );
1135 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, 0 ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001136 TEST_ASSERT( sign_is_valid( &X ) );
Janos Follath6cbacec2015-10-25 12:29:13 +01001137
Werner Lewis19b4cd82022-07-07 11:02:27 +01001138 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +01001139 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &X ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001140 TEST_ASSERT( sign_is_valid( &X ) );
Janos Follath6cbacec2015-10-25 12:29:13 +01001141 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
1142
Werner Lewis19b4cd82022-07-07 11:02:27 +01001143 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Janos Follath044a86b2015-10-25 10:58:03 +01001144 TEST_ASSERT( mbedtls_mpi_add_mpi( &X, &X, &X ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001145 TEST_ASSERT( sign_is_valid( &X ) );
Janos Follath044a86b2015-10-25 10:58:03 +01001146 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
1147
1148exit:
1149 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
1150}
1151/* END_CASE */
1152
1153
1154/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001155void mpi_add_abs( char * input_X, char * input_Y,
1156 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001157{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001158 mbedtls_mpi X, Y, Z, A;
1159 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001160
Werner Lewis19b4cd82022-07-07 11:02:27 +01001161 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1162 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1163 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001164 TEST_ASSERT( mbedtls_mpi_add_abs( &Z, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001165 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001166 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001167
Gilles Peskine56f943a2020-07-23 01:18:11 +02001168 /* result == first operand */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001169 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001170 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001171 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Werner Lewis19b4cd82022-07-07 11:02:27 +01001172 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001173
1174 /* result == second operand */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001175 TEST_ASSERT( mbedtls_mpi_add_abs( &Y, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001176 TEST_ASSERT( sign_is_valid( &Y ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001177 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001178
Paul Bakkerbd51b262014-07-10 15:26:12 +02001179exit:
Gilles Peskine56f943a2020-07-23 01:18:11 +02001180 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +00001181}
Paul Bakker33b43f12013-08-20 11:48:36 +02001182/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +00001183
Paul Bakker33b43f12013-08-20 11:48:36 +02001184/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001185void mpi_add_int( char * input_X, int input_Y,
1186 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001187{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001188 mbedtls_mpi X, Z, A;
1189 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001190
Werner Lewis19b4cd82022-07-07 11:02:27 +01001191 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1192 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001193 TEST_ASSERT( mbedtls_mpi_add_int( &Z, &X, input_Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001194 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001195 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001196
Paul Bakkerbd51b262014-07-10 15:26:12 +02001197exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001198 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001199}
Paul Bakker33b43f12013-08-20 11:48:36 +02001200/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001201
Paul Bakker33b43f12013-08-20 11:48:36 +02001202/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001203void mpi_sub_mpi( char * input_X, char * input_Y,
1204 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001205{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001206 mbedtls_mpi X, Y, Z, A;
1207 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001208
Werner Lewis19b4cd82022-07-07 11:02:27 +01001209 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1210 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1211 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001212 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Z, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001213 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001214 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001215
Gilles Peskine56f943a2020-07-23 01:18:11 +02001216 /* result == first operand */
1217 TEST_ASSERT( mbedtls_mpi_sub_mpi( &X, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001218 TEST_ASSERT( sign_is_valid( &X ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001219 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Werner Lewis19b4cd82022-07-07 11:02:27 +01001220 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001221
1222 /* result == second operand */
1223 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Y, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001224 TEST_ASSERT( sign_is_valid( &Y ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001225 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
1226
Paul Bakkerbd51b262014-07-10 15:26:12 +02001227exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001228 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001229}
Paul Bakker33b43f12013-08-20 11:48:36 +02001230/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001231
Paul Bakker33b43f12013-08-20 11:48:36 +02001232/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001233void mpi_sub_abs( char * input_X, char * input_Y,
1234 char * input_A, int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001235{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001236 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +00001237 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001238 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001239
Werner Lewis19b4cd82022-07-07 11:02:27 +01001240 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1241 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1242 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +01001243
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001244 res = mbedtls_mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001245 TEST_ASSERT( res == sub_result );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001246 TEST_ASSERT( sign_is_valid( &Z ) );
Paul Bakker367dae42009-06-28 21:50:27 +00001247 if( res == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001248 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001249
Gilles Peskine56f943a2020-07-23 01:18:11 +02001250 /* result == first operand */
1251 TEST_ASSERT( mbedtls_mpi_sub_abs( &X, &X, &Y ) == sub_result );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001252 TEST_ASSERT( sign_is_valid( &X ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001253 if( sub_result == 0 )
1254 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Werner Lewis19b4cd82022-07-07 11:02:27 +01001255 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001256
1257 /* result == second operand */
1258 TEST_ASSERT( mbedtls_mpi_sub_abs( &Y, &X, &Y ) == sub_result );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001259 TEST_ASSERT( sign_is_valid( &Y ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001260 if( sub_result == 0 )
1261 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
1262
Paul Bakkerbd51b262014-07-10 15:26:12 +02001263exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001264 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001265}
Paul Bakker33b43f12013-08-20 11:48:36 +02001266/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001267
Paul Bakker33b43f12013-08-20 11:48:36 +02001268/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001269void mpi_sub_int( char * input_X, int input_Y,
1270 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001271{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001272 mbedtls_mpi X, Z, A;
1273 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001274
Werner Lewis19b4cd82022-07-07 11:02:27 +01001275 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1276 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001277 TEST_ASSERT( mbedtls_mpi_sub_int( &Z, &X, input_Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001278 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001279 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001280
Paul Bakkerbd51b262014-07-10 15:26:12 +02001281exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001282 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001283}
Paul Bakker33b43f12013-08-20 11:48:36 +02001284/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001285
Paul Bakker33b43f12013-08-20 11:48:36 +02001286/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001287void mpi_mul_mpi( char * input_X, char * input_Y,
1288 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001289{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001290 mbedtls_mpi X, Y, Z, A;
1291 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001292
Werner Lewis19b4cd82022-07-07 11:02:27 +01001293 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1294 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1295 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001296 TEST_ASSERT( mbedtls_mpi_mul_mpi( &Z, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001297 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001298 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001299
Paul Bakkerbd51b262014-07-10 15:26:12 +02001300exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001301 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001302}
Paul Bakker33b43f12013-08-20 11:48:36 +02001303/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001304
Paul Bakker33b43f12013-08-20 11:48:36 +02001305/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001306void mpi_mul_int( char * input_X, int input_Y,
1307 char * input_A, char * result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +00001308{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001309 mbedtls_mpi X, Z, A;
1310 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001311
Werner Lewis19b4cd82022-07-07 11:02:27 +01001312 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1313 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001314 TEST_ASSERT( mbedtls_mpi_mul_int( &Z, &X, input_Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001315 TEST_ASSERT( sign_is_valid( &Z ) );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001316 if( strcmp( result_comparison, "==" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001317 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001318 else if( strcmp( result_comparison, "!=" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001319 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) != 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001320 else
1321 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001322
Paul Bakkerbd51b262014-07-10 15:26:12 +02001323exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001324 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001325}
Paul Bakker33b43f12013-08-20 11:48:36 +02001326/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001327
Paul Bakker33b43f12013-08-20 11:48:36 +02001328/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001329void mpi_div_mpi( char * input_X, char * input_Y,
1330 char * input_A, char * input_B,
1331 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001332{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001333 mbedtls_mpi X, Y, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +00001334 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001335 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R );
1336 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001337
Werner Lewis19b4cd82022-07-07 11:02:27 +01001338 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1339 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1340 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
1341 TEST_ASSERT( mbedtls_test_read_mpi( &B, input_B ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001342 res = mbedtls_mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001343 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001344 if( res == 0 )
1345 {
Gilles Peskinedffc7102021-06-10 15:34:15 +02001346 TEST_ASSERT( sign_is_valid( &Q ) );
1347 TEST_ASSERT( sign_is_valid( &R ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001348 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
1349 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001350 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001351
Paul Bakkerbd51b262014-07-10 15:26:12 +02001352exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001353 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R );
1354 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001355}
Paul Bakker33b43f12013-08-20 11:48:36 +02001356/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001357
Paul Bakker33b43f12013-08-20 11:48:36 +02001358/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001359void mpi_div_int( char * input_X, int input_Y,
1360 char * input_A, char * input_B,
1361 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001362{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001363 mbedtls_mpi X, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +00001364 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001365 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &A );
1366 mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001367
Werner Lewis19b4cd82022-07-07 11:02:27 +01001368 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1369 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
1370 TEST_ASSERT( mbedtls_test_read_mpi( &B, input_B ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001371 res = mbedtls_mpi_div_int( &Q, &R, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001372 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001373 if( res == 0 )
1374 {
Gilles Peskinedffc7102021-06-10 15:34:15 +02001375 TEST_ASSERT( sign_is_valid( &Q ) );
1376 TEST_ASSERT( sign_is_valid( &R ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001377 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
1378 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001379 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001380
Paul Bakkerbd51b262014-07-10 15:26:12 +02001381exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001382 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &A );
1383 mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001384}
Paul Bakker33b43f12013-08-20 11:48:36 +02001385/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001386
Paul Bakker33b43f12013-08-20 11:48:36 +02001387/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001388void mpi_mod_mpi( char * input_X, char * input_Y,
1389 char * input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001390{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001391 mbedtls_mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +00001392 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001393 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001394
Werner Lewis19b4cd82022-07-07 11:02:27 +01001395 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1396 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1397 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001398 res = mbedtls_mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001399 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001400 if( res == 0 )
1401 {
Gilles Peskinedffc7102021-06-10 15:34:15 +02001402 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001403 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001404 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001405
Paul Bakkerbd51b262014-07-10 15:26:12 +02001406exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001407 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001408}
Paul Bakker33b43f12013-08-20 11:48:36 +02001409/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001410
Paul Bakker33b43f12013-08-20 11:48:36 +02001411/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001412void mpi_mod_int( char * input_X, int input_Y,
1413 int input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001414{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001415 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +00001416 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001417 mbedtls_mpi_uint r;
1418 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001419
Werner Lewis19b4cd82022-07-07 11:02:27 +01001420 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001421 res = mbedtls_mpi_mod_int( &r, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001422 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001423 if( res == 0 )
1424 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001425 TEST_ASSERT( r == (mbedtls_mpi_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +00001426 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001427
Paul Bakkerbd51b262014-07-10 15:26:12 +02001428exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001429 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001430}
Paul Bakker33b43f12013-08-20 11:48:36 +02001431/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001432
Paul Bakker33b43f12013-08-20 11:48:36 +02001433/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001434void mpi_exp_mod( char * input_A, char * input_E,
1435 char * input_N, char * input_X,
1436 int exp_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001437{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001438 mbedtls_mpi A, E, N, RR, Z, X;
Paul Bakker367dae42009-06-28 21:50:27 +00001439 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001440 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
1441 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001442
Werner Lewis19b4cd82022-07-07 11:02:27 +01001443 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
1444 TEST_ASSERT( mbedtls_test_read_mpi( &E, input_E ) == 0 );
1445 TEST_ASSERT( mbedtls_test_read_mpi( &N, input_N ) == 0 );
1446 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001447
Gilles Peskine342f71b2021-06-09 18:31:35 +02001448 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, NULL );
Gilles Peskine722c62c2021-06-15 21:55:05 +02001449 TEST_ASSERT( res == exp_result );
Gilles Peskine342f71b2021-06-09 18:31:35 +02001450 if( res == 0 )
1451 {
1452 TEST_ASSERT( sign_is_valid( &Z ) );
1453 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
1454 }
1455
1456 /* Now test again with the speed-up parameter supplied as an output. */
1457 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR );
Gilles Peskine722c62c2021-06-15 21:55:05 +02001458 TEST_ASSERT( res == exp_result );
Gilles Peskine342f71b2021-06-09 18:31:35 +02001459 if( res == 0 )
1460 {
1461 TEST_ASSERT( sign_is_valid( &Z ) );
1462 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
1463 }
1464
1465 /* Now test again with the speed-up parameter supplied in calculated form. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001466 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR );
Gilles Peskine722c62c2021-06-15 21:55:05 +02001467 TEST_ASSERT( res == exp_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001468 if( res == 0 )
1469 {
Gilles Peskinedffc7102021-06-10 15:34:15 +02001470 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001471 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001472 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001473
Paul Bakkerbd51b262014-07-10 15:26:12 +02001474exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001475 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
1476 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001477}
Paul Bakker33b43f12013-08-20 11:48:36 +02001478/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001479
Paul Bakker33b43f12013-08-20 11:48:36 +02001480/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001481void mpi_exp_mod_size( int A_bytes, int E_bytes, int N_bytes,
1482 char * input_RR, int exp_result )
Chris Jonesd10b3312020-12-02 10:41:50 +00001483{
1484 mbedtls_mpi A, E, N, RR, Z;
1485 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
1486 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z );
1487
Chris Jonesaa850cd2020-12-03 11:35:41 +00001488 /* Set A to 2^(A_bytes - 1) + 1 */
Chris Jonesd10b3312020-12-02 10:41:50 +00001489 TEST_ASSERT( mbedtls_mpi_lset( &A, 1 ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001490 TEST_ASSERT( mbedtls_mpi_shift_l( &A, ( A_bytes * 8 ) - 1 ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001491 TEST_ASSERT( mbedtls_mpi_set_bit( &A, 0, 1 ) == 0 );
Chris Jonesaa850cd2020-12-03 11:35:41 +00001492
1493 /* Set E to 2^(E_bytes - 1) + 1 */
1494 TEST_ASSERT( mbedtls_mpi_lset( &E, 1 ) == 0 );
1495 TEST_ASSERT( mbedtls_mpi_shift_l( &E, ( E_bytes * 8 ) - 1 ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001496 TEST_ASSERT( mbedtls_mpi_set_bit( &E, 0, 1 ) == 0 );
Chris Jonesaa850cd2020-12-03 11:35:41 +00001497
1498 /* Set N to 2^(N_bytes - 1) + 1 */
1499 TEST_ASSERT( mbedtls_mpi_lset( &N, 1 ) == 0 );
1500 TEST_ASSERT( mbedtls_mpi_shift_l( &N, ( N_bytes * 8 ) - 1 ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001501 TEST_ASSERT( mbedtls_mpi_set_bit( &N, 0, 1 ) == 0 );
1502
1503 if( strlen( input_RR ) )
Werner Lewis19b4cd82022-07-07 11:02:27 +01001504 TEST_ASSERT( mbedtls_test_read_mpi( &RR, input_RR ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001505
Chris Jonesaa850cd2020-12-03 11:35:41 +00001506 TEST_ASSERT( mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR ) == exp_result );
Chris Jonesd10b3312020-12-02 10:41:50 +00001507
1508exit:
1509 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
1510 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z );
1511}
1512/* END_CASE */
1513
1514/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001515void mpi_inv_mod( char * input_X, char * input_Y,
1516 char * input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001517{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001518 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +00001519 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001520 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001521
Werner Lewis19b4cd82022-07-07 11:02:27 +01001522 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1523 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1524 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001525 res = mbedtls_mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001526 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001527 if( res == 0 )
1528 {
Gilles Peskinedffc7102021-06-10 15:34:15 +02001529 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001530 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001531 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001532
Paul Bakkerbd51b262014-07-10 15:26:12 +02001533exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001534 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001535}
Paul Bakker33b43f12013-08-20 11:48:36 +02001536/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001537
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001538/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001539void mpi_is_prime( char * input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001540{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001541 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +00001542 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001543 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001544
Werner Lewis19b4cd82022-07-07 11:02:27 +01001545 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Ronald Cron351f0ee2020-06-10 12:12:18 +02001546 res = mbedtls_mpi_is_prime_ext( &X, 40, mbedtls_test_rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +02001547 TEST_ASSERT( res == div_result );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001548
Paul Bakkerbd51b262014-07-10 15:26:12 +02001549exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001550 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001551}
Paul Bakker33b43f12013-08-20 11:48:36 +02001552/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001553
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001554/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001555void mpi_is_prime_det( data_t * input_X, data_t * witnesses,
1556 int chunk_len, int rounds )
Janos Follath64eca052018-09-05 17:04:49 +01001557{
1558 mbedtls_mpi X;
1559 int res;
1560 mbedtls_test_mpi_random rand;
1561
1562 mbedtls_mpi_init( &X );
1563 rand.data = witnesses;
1564 rand.pos = 0;
1565 rand.chunk_len = chunk_len;
1566
1567 TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
Darryl Greenac2ead02018-10-02 15:30:39 +01001568 res = mbedtls_mpi_is_prime_ext( &X, rounds - 1,
1569 mbedtls_test_mpi_miller_rabin_determinizer,
1570 &rand );
1571 TEST_ASSERT( res == 0 );
1572
1573 rand.data = witnesses;
1574 rand.pos = 0;
1575 rand.chunk_len = chunk_len;
1576
Janos Follatha0b67c22018-09-18 14:48:23 +01001577 res = mbedtls_mpi_is_prime_ext( &X, rounds,
1578 mbedtls_test_mpi_miller_rabin_determinizer,
Janos Follath64eca052018-09-05 17:04:49 +01001579 &rand );
Darryl Greenac2ead02018-10-02 15:30:39 +01001580 TEST_ASSERT( res == MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
Janos Follath64eca052018-09-05 17:04:49 +01001581
1582exit:
1583 mbedtls_mpi_free( &X );
1584}
1585/* END_CASE */
1586
1587/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001588void mpi_gen_prime( int bits, int flags, int ref_ret )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001589{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001590 mbedtls_mpi X;
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001591 int my_ret;
1592
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001593 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001594
Ronald Cron6c5bd7f2020-06-10 14:08:26 +02001595 my_ret = mbedtls_mpi_gen_prime( &X, bits, flags,
1596 mbedtls_test_rnd_std_rand, NULL );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001597 TEST_ASSERT( my_ret == ref_ret );
1598
1599 if( ref_ret == 0 )
1600 {
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +02001601 size_t actual_bits = mbedtls_mpi_bitlen( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001602
1603 TEST_ASSERT( actual_bits >= (size_t) bits );
1604 TEST_ASSERT( actual_bits <= (size_t) bits + 1 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001605 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001606
Ronald Cron6c5bd7f2020-06-10 14:08:26 +02001607 TEST_ASSERT( mbedtls_mpi_is_prime_ext( &X, 40,
1608 mbedtls_test_rnd_std_rand,
1609 NULL ) == 0 );
Janos Follatha3cb7eb2018-08-14 15:31:54 +01001610 if( flags & MBEDTLS_MPI_GEN_PRIME_FLAG_DH )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001611 {
Hanno Beckerd4d60572018-01-10 07:12:01 +00001612 /* X = ( X - 1 ) / 2 */
1613 TEST_ASSERT( mbedtls_mpi_shift_r( &X, 1 ) == 0 );
Ronald Cron6c5bd7f2020-06-10 14:08:26 +02001614 TEST_ASSERT( mbedtls_mpi_is_prime_ext( &X, 40,
1615 mbedtls_test_rnd_std_rand,
1616 NULL ) == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001617 }
1618 }
1619
Paul Bakkerbd51b262014-07-10 15:26:12 +02001620exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001621 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001622}
1623/* END_CASE */
1624
Paul Bakker33b43f12013-08-20 11:48:36 +02001625/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001626void mpi_shift_l( char * input_X, int shift_X,
1627 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001628{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001629 mbedtls_mpi X, A;
1630 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001631
Werner Lewis19b4cd82022-07-07 11:02:27 +01001632 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1633 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001634 TEST_ASSERT( mbedtls_mpi_shift_l( &X, shift_X ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001635 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001636 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001637
Paul Bakkerbd51b262014-07-10 15:26:12 +02001638exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001639 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001640}
Paul Bakker33b43f12013-08-20 11:48:36 +02001641/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001642
Paul Bakker33b43f12013-08-20 11:48:36 +02001643/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001644void mpi_shift_r( char * input_X, int shift_X,
1645 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001646{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001647 mbedtls_mpi X, A;
1648 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001649
Werner Lewis19b4cd82022-07-07 11:02:27 +01001650 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1651 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001652 TEST_ASSERT( mbedtls_mpi_shift_r( &X, shift_X ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001653 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001654 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001655
Paul Bakkerbd51b262014-07-10 15:26:12 +02001656exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001657 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001658}
Paul Bakker33b43f12013-08-20 11:48:36 +02001659/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001660
Gilles Peskine3cb1e292020-11-25 15:37:20 +01001661/* BEGIN_CASE */
Gilles Peskine422e8672021-04-02 00:02:27 +02001662void mpi_fill_random( int wanted_bytes, int rng_bytes,
1663 int before, int expected_ret )
Gilles Peskine3cb1e292020-11-25 15:37:20 +01001664{
1665 mbedtls_mpi X;
1666 int ret;
1667 size_t bytes_left = rng_bytes;
1668 mbedtls_mpi_init( &X );
1669
Gilles Peskine422e8672021-04-02 00:02:27 +02001670 if( before != 0 )
1671 {
1672 /* Set X to sign(before) * 2^(|before|-1) */
1673 TEST_ASSERT( mbedtls_mpi_lset( &X, before > 0 ? 1 : -1 ) == 0 );
1674 if( before < 0 )
1675 before = - before;
1676 TEST_ASSERT( mbedtls_mpi_shift_l( &X, before - 1 ) == 0 );
1677 }
1678
Gilles Peskine3cb1e292020-11-25 15:37:20 +01001679 ret = mbedtls_mpi_fill_random( &X, wanted_bytes,
1680 f_rng_bytes_left, &bytes_left );
1681 TEST_ASSERT( ret == expected_ret );
1682
1683 if( expected_ret == 0 )
1684 {
1685 /* mbedtls_mpi_fill_random is documented to use bytes from the RNG
1686 * as a big-endian representation of the number. We know when
1687 * our RNG function returns null bytes, so we know how many
1688 * leading zero bytes the number has. */
1689 size_t leading_zeros = 0;
1690 if( wanted_bytes > 0 && rng_bytes % 256 == 0 )
1691 leading_zeros = 1;
1692 TEST_ASSERT( mbedtls_mpi_size( &X ) + leading_zeros ==
1693 (size_t) wanted_bytes );
1694 TEST_ASSERT( (int) bytes_left == rng_bytes - wanted_bytes );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001695 TEST_ASSERT( sign_is_valid( &X ) );
Gilles Peskine3cb1e292020-11-25 15:37:20 +01001696 }
1697
1698exit:
1699 mbedtls_mpi_free( &X );
1700}
1701/* END_CASE */
1702
Gilles Peskine02ac93a2021-03-29 22:02:55 +02001703/* BEGIN_CASE */
1704void mpi_random_many( int min, data_t *bound_bytes, int iterations )
1705{
1706 /* Generate numbers in the range 1..bound-1. Do it iterations times.
1707 * This function assumes that the value of bound is at least 2 and
1708 * that iterations is large enough that a one-in-2^iterations chance
1709 * effectively never occurs.
1710 */
1711
1712 mbedtls_mpi upper_bound;
1713 size_t n_bits;
1714 mbedtls_mpi result;
1715 size_t b;
1716 /* If upper_bound is small, stats[b] is the number of times the value b
1717 * has been generated. Otherwise stats[b] is the number of times a
1718 * value with bit b set has been generated. */
1719 size_t *stats = NULL;
1720 size_t stats_len;
1721 int full_stats;
1722 size_t i;
1723
1724 mbedtls_mpi_init( &upper_bound );
1725 mbedtls_mpi_init( &result );
1726
1727 TEST_EQUAL( 0, mbedtls_mpi_read_binary( &upper_bound,
1728 bound_bytes->x, bound_bytes->len ) );
1729 n_bits = mbedtls_mpi_bitlen( &upper_bound );
1730 /* Consider a bound "small" if it's less than 2^5. This value is chosen
1731 * to be small enough that the probability of missing one value is
1732 * negligible given the number of iterations. It must be less than
1733 * 256 because some of the code below assumes that "small" values
1734 * fit in a byte. */
1735 if( n_bits <= 5 )
1736 {
1737 full_stats = 1;
1738 stats_len = bound_bytes->x[bound_bytes->len - 1];
1739 }
1740 else
1741 {
1742 full_stats = 0;
1743 stats_len = n_bits;
1744 }
1745 ASSERT_ALLOC( stats, stats_len );
1746
1747 for( i = 0; i < (size_t) iterations; i++ )
1748 {
1749 mbedtls_test_set_step( i );
1750 TEST_EQUAL( 0, mbedtls_mpi_random( &result, min, &upper_bound,
1751 mbedtls_test_rnd_std_rand, NULL ) );
1752
Gilles Peskinedffc7102021-06-10 15:34:15 +02001753 TEST_ASSERT( sign_is_valid( &result ) );
Gilles Peskine02ac93a2021-03-29 22:02:55 +02001754 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &result, &upper_bound ) < 0 );
1755 TEST_ASSERT( mbedtls_mpi_cmp_int( &result, min ) >= 0 );
1756 if( full_stats )
1757 {
1758 uint8_t value;
1759 TEST_EQUAL( 0, mbedtls_mpi_write_binary( &result, &value, 1 ) );
1760 TEST_ASSERT( value < stats_len );
1761 ++stats[value];
1762 }
1763 else
1764 {
1765 for( b = 0; b < n_bits; b++ )
1766 stats[b] += mbedtls_mpi_get_bit( &result, b );
1767 }
1768 }
1769
1770 if( full_stats )
1771 {
Gilles Peskined463edf2021-04-13 20:45:05 +02001772 for( b = min; b < stats_len; b++ )
Gilles Peskine02ac93a2021-03-29 22:02:55 +02001773 {
1774 mbedtls_test_set_step( 1000000 + b );
1775 /* Assert that each value has been reached at least once.
1776 * This is almost guaranteed if the iteration count is large
1777 * enough. This is a very crude way of checking the distribution.
1778 */
1779 TEST_ASSERT( stats[b] > 0 );
1780 }
1781 }
1782 else
1783 {
Gilles Peskineceefe5d2021-06-02 21:24:04 +02001784 int statistically_safe_all_the_way =
1785 is_significantly_above_a_power_of_2( bound_bytes );
Gilles Peskine02ac93a2021-03-29 22:02:55 +02001786 for( b = 0; b < n_bits; b++ )
1787 {
1788 mbedtls_test_set_step( 1000000 + b );
1789 /* Assert that each bit has been set in at least one result and
1790 * clear in at least one result. Provided that iterations is not
1791 * too small, it would be extremely unlikely for this not to be
1792 * the case if the results are uniformly distributed.
1793 *
1794 * As an exception, the top bit may legitimately never be set
1795 * if bound is a power of 2 or only slightly above.
1796 */
Gilles Peskineceefe5d2021-06-02 21:24:04 +02001797 if( statistically_safe_all_the_way || b != n_bits - 1 )
Gilles Peskine02ac93a2021-03-29 22:02:55 +02001798 {
1799 TEST_ASSERT( stats[b] > 0 );
1800 }
1801 TEST_ASSERT( stats[b] < (size_t) iterations );
1802 }
1803 }
1804
1805exit:
1806 mbedtls_mpi_free( &upper_bound );
1807 mbedtls_mpi_free( &result );
1808 mbedtls_free( stats );
1809}
1810/* END_CASE */
1811
Gilles Peskine1e918f42021-03-29 22:14:51 +02001812/* BEGIN_CASE */
Gilles Peskine422e8672021-04-02 00:02:27 +02001813void mpi_random_sizes( int min, data_t *bound_bytes, int nlimbs, int before )
Gilles Peskine1a7df4e2021-04-01 15:57:18 +02001814{
1815 mbedtls_mpi upper_bound;
1816 mbedtls_mpi result;
1817
1818 mbedtls_mpi_init( &upper_bound );
1819 mbedtls_mpi_init( &result );
1820
Gilles Peskine422e8672021-04-02 00:02:27 +02001821 if( before != 0 )
1822 {
1823 /* Set result to sign(before) * 2^(|before|-1) */
1824 TEST_ASSERT( mbedtls_mpi_lset( &result, before > 0 ? 1 : -1 ) == 0 );
1825 if( before < 0 )
1826 before = - before;
1827 TEST_ASSERT( mbedtls_mpi_shift_l( &result, before - 1 ) == 0 );
1828 }
1829
Gilles Peskine1a7df4e2021-04-01 15:57:18 +02001830 TEST_EQUAL( 0, mbedtls_mpi_grow( &result, nlimbs ) );
1831 TEST_EQUAL( 0, mbedtls_mpi_read_binary( &upper_bound,
1832 bound_bytes->x, bound_bytes->len ) );
1833 TEST_EQUAL( 0, mbedtls_mpi_random( &result, min, &upper_bound,
1834 mbedtls_test_rnd_std_rand, NULL ) );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001835 TEST_ASSERT( sign_is_valid( &result ) );
Gilles Peskine1a7df4e2021-04-01 15:57:18 +02001836 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &result, &upper_bound ) < 0 );
1837 TEST_ASSERT( mbedtls_mpi_cmp_int( &result, min ) >= 0 );
1838
1839exit:
1840 mbedtls_mpi_free( &upper_bound );
1841 mbedtls_mpi_free( &result );
1842}
1843/* END_CASE */
1844
1845/* BEGIN_CASE */
Gilles Peskine1e918f42021-03-29 22:14:51 +02001846void mpi_random_fail( int min, data_t *bound_bytes, int expected_ret )
1847{
1848 mbedtls_mpi upper_bound;
1849 mbedtls_mpi result;
1850 int actual_ret;
1851
1852 mbedtls_mpi_init( &upper_bound );
1853 mbedtls_mpi_init( &result );
1854
1855 TEST_EQUAL( 0, mbedtls_mpi_read_binary( &upper_bound,
1856 bound_bytes->x, bound_bytes->len ) );
1857 actual_ret = mbedtls_mpi_random( &result, min, &upper_bound,
1858 mbedtls_test_rnd_std_rand, NULL );
1859 TEST_EQUAL( expected_ret, actual_ret );
1860
1861exit:
1862 mbedtls_mpi_free( &upper_bound );
1863 mbedtls_mpi_free( &result );
1864}
1865/* END_CASE */
1866
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001867/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Azim Khanf1aaec92017-05-30 14:23:15 +01001868void mpi_selftest( )
Paul Bakkere896fea2009-07-06 06:40:23 +00001869{
Andres AG93012e82016-09-09 09:10:28 +01001870 TEST_ASSERT( mbedtls_mpi_self_test( 1 ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +00001871}
Paul Bakker33b43f12013-08-20 11:48:36 +02001872/* END_CASE */