blob: ca30d18ab7aed8951f30da28022e049978e90fcc [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"
Janos Follath23bdeca2022-07-22 18:24:06 +01005#include "constant_time_internal.h"
6#include "test/constant_flow.h"
Janos Follath64eca052018-09-05 17:04:49 +01007
Chris Jonese64a46f2020-12-03 17:44:03 +00008#if MBEDTLS_MPI_MAX_BITS > 792
9#define MPI_MAX_BITS_LARGER_THAN_792
Chris Jones4592bd82020-12-03 14:24:33 +000010#endif
Gabor Mezei89e31462022-08-12 15:36:56 +020011
Gilles Peskinedffc7102021-06-10 15:34:15 +020012/* Check the validity of the sign bit in an MPI object. Reject representations
13 * that are not supported by the rest of the library and indicate a bug when
14 * constructing the value. */
15static int sign_is_valid( const mbedtls_mpi *X )
16{
17 if( X->s != 1 && X->s != -1 )
18 return( 0 ); // invalid sign bit, e.g. 0
19 if( mbedtls_mpi_bitlen( X ) == 0 && X->s != 1 )
20 return( 0 ); // negative zero
21 return( 1 );
22}
23
Janos Follath64eca052018-09-05 17:04:49 +010024typedef struct mbedtls_test_mpi_random
25{
26 data_t *data;
27 size_t pos;
28 size_t chunk_len;
29} mbedtls_test_mpi_random;
30
31/*
32 * This function is called by the Miller-Rabin primality test each time it
33 * chooses a random witness. The witnesses (or non-witnesses as provided by the
34 * test) are stored in the data member of the state structure. Each number is in
35 * the format that mbedtls_mpi_read_string understands and is chunk_len long.
36 */
37int mbedtls_test_mpi_miller_rabin_determinizer( void* state,
38 unsigned char* buf,
39 size_t len )
40{
41 mbedtls_test_mpi_random *random = (mbedtls_test_mpi_random*) state;
42
43 if( random == NULL || random->data->x == NULL || buf == NULL )
44 return( -1 );
45
46 if( random->pos + random->chunk_len > random->data->len
47 || random->chunk_len > len )
48 {
49 return( -1 );
50 }
51
52 memset( buf, 0, len );
53
54 /* The witness is written to the end of the buffer, since the buffer is
55 * used as big endian, unsigned binary data in mbedtls_mpi_read_binary.
56 * Writing the witness to the start of the buffer would result in the
57 * buffer being 'witness 000...000', which would be treated as
58 * witness * 2^n for some n. */
59 memcpy( buf + len - random->chunk_len, &random->data->x[random->pos],
60 random->chunk_len );
61
62 random->pos += random->chunk_len;
63
64 return( 0 );
65}
Gilles Peskine3cb1e292020-11-25 15:37:20 +010066
67/* Random generator that is told how many bytes to return. */
68static int f_rng_bytes_left( void *state, unsigned char *buf, size_t len )
69{
70 size_t *bytes_left = state;
71 size_t i;
72 for( i = 0; i < len; i++ )
73 {
74 if( *bytes_left == 0 )
75 return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
76 buf[i] = *bytes_left & 0xff;
77 --( *bytes_left );
78 }
79 return( 0 );
80}
81
Gilles Peskineeedefa52021-04-13 19:50:04 +020082/* Test whether bytes represents (in big-endian base 256) a number b that
83 * is significantly above a power of 2. That is, b must not have a long run
84 * of unset bits after the most significant bit.
85 *
86 * Let n be the bit-size of b, i.e. the integer such that 2^n <= b < 2^{n+1}.
87 * This function returns 1 if, when drawing a number between 0 and b,
88 * the probability that this number is at least 2^n is not negligible.
89 * This probability is (b - 2^n) / b and this function checks that this
90 * number is above some threshold A. The threshold value is heuristic and
91 * based on the needs of mpi_random_many().
Gilles Peskine02ac93a2021-03-29 22:02:55 +020092 */
93static int is_significantly_above_a_power_of_2( data_t *bytes )
94{
95 const uint8_t *p = bytes->x;
96 size_t len = bytes->len;
97 unsigned x;
Gilles Peskineeedefa52021-04-13 19:50:04 +020098
99 /* Skip leading null bytes */
Gilles Peskine02ac93a2021-03-29 22:02:55 +0200100 while( len > 0 && p[0] == 0 )
101 {
102 ++p;
103 --len;
104 }
Gilles Peskineeedefa52021-04-13 19:50:04 +0200105 /* 0 is not significantly above a power of 2 */
Gilles Peskine02ac93a2021-03-29 22:02:55 +0200106 if( len == 0 )
107 return( 0 );
Gilles Peskineeedefa52021-04-13 19:50:04 +0200108 /* Extract the (up to) 2 most significant bytes */
109 if( len == 1 )
Gilles Peskine02ac93a2021-03-29 22:02:55 +0200110 x = p[0];
111 else
112 x = ( p[0] << 8 ) | p[1];
113
Gilles Peskineeedefa52021-04-13 19:50:04 +0200114 /* Shift the most significant bit of x to position 8 and mask it out */
115 while( ( x & 0xfe00 ) != 0 )
116 x >>= 1;
117 x &= 0x00ff;
Gilles Peskine02ac93a2021-03-29 22:02:55 +0200118
Gilles Peskineeedefa52021-04-13 19:50:04 +0200119 /* At this point, x = floor((b - 2^n) / 2^(n-8)). b is significantly above
120 * a power of 2 iff x is significantly above 0 compared to 2^8.
121 * Testing x >= 2^4 amounts to picking A = 1/16 in the function
122 * description above. */
123 return( x >= 0x10 );
Gilles Peskine02ac93a2021-03-29 22:02:55 +0200124}
125
Paul Bakker33b43f12013-08-20 11:48:36 +0200126/* END_HEADER */
Paul Bakker367dae42009-06-28 21:50:27 +0000127
Paul Bakker33b43f12013-08-20 11:48:36 +0200128/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200129 * depends_on:MBEDTLS_BIGNUM_C
Paul Bakker33b43f12013-08-20 11:48:36 +0200130 * END_DEPENDENCIES
131 */
Paul Bakker5690efc2011-05-26 13:16:06 +0000132
Hanno Beckerb48e1aa2018-12-18 23:25:01 +0000133/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100134void mpi_null( )
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200135{
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200136 mbedtls_mpi X, Y, Z;
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200137
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200138 mbedtls_mpi_init( &X );
139 mbedtls_mpi_init( &Y );
140 mbedtls_mpi_init( &Z );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200141
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200142 TEST_ASSERT( mbedtls_mpi_get_bit( &X, 42 ) == 0 );
143 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200144 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == 0 );
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200145 TEST_ASSERT( mbedtls_mpi_size( &X ) == 0 );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200146
147exit:
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +0200148 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +0200149}
150/* END_CASE */
151
152/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100153void mpi_read_write_string( int radix_X, char * input_X, int radix_A,
154 char * input_A, int output_size, int result_read,
Paul Bakker33b43f12013-08-20 11:48:36 +0200155 int result_write )
Paul Bakker367dae42009-06-28 21:50:27 +0000156{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200157 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000158 char str[1000];
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100159 size_t len;
Paul Bakker367dae42009-06-28 21:50:27 +0000160
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200161 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000162
Janos Follath04dadb72019-03-06 12:29:37 +0000163 memset( str, '!', sizeof( str ) );
164
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200165 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == result_read );
Paul Bakker33b43f12013-08-20 11:48:36 +0200166 if( result_read == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000167 {
Gilles Peskinedffc7102021-06-10 15:34:15 +0200168 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100169 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, str, output_size, &len ) == result_write );
Paul Bakker33b43f12013-08-20 11:48:36 +0200170 if( result_write == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000171 {
Paul Bakker33b43f12013-08-20 11:48:36 +0200172 TEST_ASSERT( strcasecmp( str, input_A ) == 0 );
Janos Follath04dadb72019-03-06 12:29:37 +0000173 TEST_ASSERT( str[len] == '!' );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000174 }
175 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000176
Paul Bakkerbd51b262014-07-10 15:26:12 +0200177exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200178 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000179}
Paul Bakker33b43f12013-08-20 11:48:36 +0200180/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000181
Paul Bakker33b43f12013-08-20 11:48:36 +0200182/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100183void mpi_read_binary( data_t * buf, char * input_A )
Paul Bakkere896fea2009-07-06 06:40:23 +0000184{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200185 mbedtls_mpi X;
Janos Follathe5670f22019-02-25 16:11:58 +0000186 char str[1000];
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100187 size_t len;
Paul Bakkere896fea2009-07-06 06:40:23 +0000188
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200189 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000190
Paul Bakkere896fea2009-07-06 06:40:23 +0000191
Azim Khand30ca132017-06-09 04:32:58 +0100192 TEST_ASSERT( mbedtls_mpi_read_binary( &X, buf->x, buf->len ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +0200193 TEST_ASSERT( sign_is_valid( &X ) );
Werner Lewisf65a3272022-07-07 11:38:44 +0100194 TEST_ASSERT( mbedtls_mpi_write_string( &X, 16, str, sizeof( str ), &len ) == 0 );
Werner Lewisdc47fe72022-08-01 13:55:41 +0100195 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000196
Paul Bakkerbd51b262014-07-10 15:26:12 +0200197exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200198 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000199}
Paul Bakker33b43f12013-08-20 11:48:36 +0200200/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000201
Paul Bakker33b43f12013-08-20 11:48:36 +0200202/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100203void mpi_mod_setup( int ext_rep, int int_rep, int iret )
Janos Follath16949692022-08-08 13:37:20 +0100204{
205 #define MLIMBS 8
206 mbedtls_mpi_uint mp[MLIMBS];
207 mbedtls_mpi_mod_modulus m;
208 int ret;
209
210 memset( mp, 0xFF, sizeof(mp) );
211
212 mbedtls_mpi_mod_modulus_init( &m );
213 ret = mbedtls_mpi_mod_modulus_setup( &m, mp, MLIMBS, ext_rep, int_rep );
Janos Follath494a6d22022-08-22 09:36:17 +0100214 TEST_EQUAL( ret, iret );
Janos Follath16949692022-08-08 13:37:20 +0100215
216 /* Address sanitiser should catch if we try to free mp */
217 mbedtls_mpi_mod_modulus_free( &m );
218
219 /* Make sure that the modulus doesn't have reference to mp anymore */
220 TEST_ASSERT( m.p != mp );
221
222exit:
223 /* It should be safe to call an mbedtls free several times */
224 mbedtls_mpi_mod_modulus_free( &m );
225
226 #undef MLIMBS
227}
228/* END_CASE */
229
Gabor Mezei23a1ce92022-08-02 11:54:44 +0200230/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100231void mpi_read_binary_le( data_t * buf, char * input_A )
Janos Follatha778a942019-02-13 10:28:28 +0000232{
233 mbedtls_mpi X;
Janos Follathe5670f22019-02-25 16:11:58 +0000234 char str[1000];
Janos Follatha778a942019-02-13 10:28:28 +0000235 size_t len;
236
237 mbedtls_mpi_init( &X );
238
239
240 TEST_ASSERT( mbedtls_mpi_read_binary_le( &X, buf->x, buf->len ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +0200241 TEST_ASSERT( sign_is_valid( &X ) );
Werner Lewisf65a3272022-07-07 11:38:44 +0100242 TEST_ASSERT( mbedtls_mpi_write_string( &X, 16, str, sizeof( str ), &len ) == 0 );
Werner Lewisdc47fe72022-08-01 13:55:41 +0100243 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
Janos Follatha778a942019-02-13 10:28:28 +0000244
245exit:
246 mbedtls_mpi_free( &X );
247}
248/* END_CASE */
249
250/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100251void mpi_write_binary( char * input_X, data_t * input_A,
252 int output_size, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000253{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200254 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000255 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000256 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +0000257
258 memset( buf, 0x00, 1000 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000259
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200260 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000261
Werner Lewis19b4cd82022-07-07 11:02:27 +0100262 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +0100263
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200264 buflen = mbedtls_mpi_size( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +0200265 if( buflen > (size_t) output_size )
266 buflen = (size_t) output_size;
Paul Bakkere896fea2009-07-06 06:40:23 +0000267
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200268 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == result );
Paul Bakker33b43f12013-08-20 11:48:36 +0200269 if( result == 0)
Paul Bakkerba48cb22009-07-12 11:01:32 +0000270 {
Paul Bakkere896fea2009-07-06 06:40:23 +0000271
Ronald Cron2dbba992020-06-10 11:42:32 +0200272 TEST_ASSERT( mbedtls_test_hexcmp( buf, input_A->x,
273 buflen, input_A->len ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000274 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000275
Paul Bakkerbd51b262014-07-10 15:26:12 +0200276exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200277 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000278}
Paul Bakker33b43f12013-08-20 11:48:36 +0200279/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000280
Janos Follathe344d0f2019-02-19 16:17:40 +0000281/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100282void mpi_write_binary_le( char * input_X, data_t * input_A,
283 int output_size, int result )
Janos Follathe344d0f2019-02-19 16:17:40 +0000284{
285 mbedtls_mpi X;
286 unsigned char buf[1000];
287 size_t buflen;
288
289 memset( buf, 0x00, 1000 );
290
291 mbedtls_mpi_init( &X );
292
Werner Lewis19b4cd82022-07-07 11:02:27 +0100293 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Janos Follathe344d0f2019-02-19 16:17:40 +0000294
295 buflen = mbedtls_mpi_size( &X );
296 if( buflen > (size_t) output_size )
297 buflen = (size_t) output_size;
298
299 TEST_ASSERT( mbedtls_mpi_write_binary_le( &X, buf, buflen ) == result );
300 if( result == 0)
301 {
302
Ronald Cron2dbba992020-06-10 11:42:32 +0200303 TEST_ASSERT( mbedtls_test_hexcmp( buf, input_A->x,
304 buflen, input_A->len ) == 0 );
Janos Follathe344d0f2019-02-19 16:17:40 +0000305 }
306
307exit:
308 mbedtls_mpi_free( &X );
309}
310/* END_CASE */
311
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200312/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100313void mpi_read_file( char * input_file, data_t * input_A, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000314{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200315 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000316 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000317 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +0000318 FILE *file;
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000319 int ret;
Paul Bakkere896fea2009-07-06 06:40:23 +0000320
321 memset( buf, 0x00, 1000 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000322
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200323 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000324
Paul Bakker33b43f12013-08-20 11:48:36 +0200325 file = fopen( input_file, "r" );
Paul Bakker8a0c0a92014-04-17 16:08:20 +0200326 TEST_ASSERT( file != NULL );
Werner Lewisf65a3272022-07-07 11:38:44 +0100327 ret = mbedtls_mpi_read_file( &X, 16, file );
Paul Bakkere896fea2009-07-06 06:40:23 +0000328 fclose(file);
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000329 TEST_ASSERT( ret == result );
Paul Bakkere896fea2009-07-06 06:40:23 +0000330
Paul Bakker33b43f12013-08-20 11:48:36 +0200331 if( result == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000332 {
Gilles Peskinedffc7102021-06-10 15:34:15 +0200333 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200334 buflen = mbedtls_mpi_size( &X );
335 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000336
Paul Bakkere896fea2009-07-06 06:40:23 +0000337
Ronald Cron2dbba992020-06-10 11:42:32 +0200338 TEST_ASSERT( mbedtls_test_hexcmp( buf, input_A->x,
339 buflen, input_A->len ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000340 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000341
Paul Bakkerbd51b262014-07-10 15:26:12 +0200342exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200343 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000344}
Paul Bakker33b43f12013-08-20 11:48:36 +0200345/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000346
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200347/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100348void mpi_write_file( char * input_X, char * output_file )
Paul Bakkere896fea2009-07-06 06:40:23 +0000349{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200350 mbedtls_mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000351 FILE *file_out, *file_in;
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200352 int ret;
Paul Bakker69998dd2009-07-11 19:15:20 +0000353
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200354 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000355
Werner Lewis19b4cd82022-07-07 11:02:27 +0100356 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000357
Paul Bakker33b43f12013-08-20 11:48:36 +0200358 file_out = fopen( output_file, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000359 TEST_ASSERT( file_out != NULL );
Werner Lewisf65a3272022-07-07 11:38:44 +0100360 ret = mbedtls_mpi_write_file( NULL, &X, 16, file_out );
Paul Bakkere896fea2009-07-06 06:40:23 +0000361 fclose(file_out);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200362 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000363
Paul Bakker33b43f12013-08-20 11:48:36 +0200364 file_in = fopen( output_file, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000365 TEST_ASSERT( file_in != NULL );
Werner Lewisf65a3272022-07-07 11:38:44 +0100366 ret = mbedtls_mpi_read_file( &Y, 16, file_in );
Paul Bakkere896fea2009-07-06 06:40:23 +0000367 fclose(file_in);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200368 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000369
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200370 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000371
Paul Bakkerbd51b262014-07-10 15:26:12 +0200372exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200373 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000374}
Paul Bakker33b43f12013-08-20 11:48:36 +0200375/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000376
Paul Bakker33b43f12013-08-20 11:48:36 +0200377/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100378void mpi_get_bit( char * input_X, int pos, int val )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000379{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200380 mbedtls_mpi X;
381 mbedtls_mpi_init( &X );
Werner Lewis19b4cd82022-07-07 11:02:27 +0100382 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200383 TEST_ASSERT( mbedtls_mpi_get_bit( &X, pos ) == val );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000384
Paul Bakkerbd51b262014-07-10 15:26:12 +0200385exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200386 mbedtls_mpi_free( &X );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000387}
Paul Bakker33b43f12013-08-20 11:48:36 +0200388/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000389
Paul Bakker33b43f12013-08-20 11:48:36 +0200390/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100391void mpi_set_bit( char * input_X, int pos, int val,
392 char * output_Y, int result )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000393{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200394 mbedtls_mpi X, Y;
395 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000396
Werner Lewis19b4cd82022-07-07 11:02:27 +0100397 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
398 TEST_ASSERT( mbedtls_test_read_mpi( &Y, output_Y ) == 0 );
Paul Bakkerec5ceb62016-07-14 12:47:07 +0100399 TEST_ASSERT( mbedtls_mpi_set_bit( &X, pos, val ) == result );
400
401 if( result == 0 )
402 {
Gilles Peskinedffc7102021-06-10 15:34:15 +0200403 TEST_ASSERT( sign_is_valid( &X ) );
Paul Bakkerec5ceb62016-07-14 12:47:07 +0100404 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
405 }
Paul Bakker2f5947e2011-05-18 15:47:11 +0000406
Paul Bakkerbd51b262014-07-10 15:26:12 +0200407exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200408 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000409}
Paul Bakker33b43f12013-08-20 11:48:36 +0200410/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000411
Paul Bakker33b43f12013-08-20 11:48:36 +0200412/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100413void mpi_lsb( char * input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000414{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200415 mbedtls_mpi X;
416 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000417
Werner Lewis19b4cd82022-07-07 11:02:27 +0100418 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200419 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000420
Paul Bakkerbd51b262014-07-10 15:26:12 +0200421exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200422 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000423}
Paul Bakker33b43f12013-08-20 11:48:36 +0200424/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000425
Paul Bakker33b43f12013-08-20 11:48:36 +0200426/* BEGIN_CASE */
Gilles Peskineb50e4332022-10-09 21:17:26 +0200427void mpi_core_bitlen( char *input_X, int nr_bits )
428{
429 mbedtls_mpi_uint *X = NULL;
430 size_t limbs;
431
432 TEST_EQUAL( mbedtls_test_read_mpi_core( &X, &limbs, input_X ), 0 );
433 TEST_EQUAL( mbedtls_mpi_core_bitlen( X, limbs ), nr_bits );
434
435exit:
436 mbedtls_free( X );
437}
438/* END_CASE */
439
440/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100441void mpi_bitlen( char * input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000442{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200443 mbedtls_mpi X;
444 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000445
Werner Lewis19b4cd82022-07-07 11:02:27 +0100446 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200447 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000448
Paul Bakkerbd51b262014-07-10 15:26:12 +0200449exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200450 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000451}
Paul Bakker33b43f12013-08-20 11:48:36 +0200452/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000453
Paul Bakker33b43f12013-08-20 11:48:36 +0200454/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100455void mpi_gcd( char * input_X, char * input_Y,
456 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000457{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200458 mbedtls_mpi A, X, Y, Z;
459 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000460
Werner Lewis19b4cd82022-07-07 11:02:27 +0100461 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
462 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
463 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200464 TEST_ASSERT( mbedtls_mpi_gcd( &Z, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +0200465 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200466 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000467
Paul Bakkerbd51b262014-07-10 15:26:12 +0200468exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200469 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000470}
Paul Bakker33b43f12013-08-20 11:48:36 +0200471/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000472
Paul Bakker33b43f12013-08-20 11:48:36 +0200473/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100474void mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000475{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200476 mbedtls_mpi X;
477 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000478
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200479 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0);
480 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000481
Paul Bakkerbd51b262014-07-10 15:26:12 +0200482exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200483 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000484}
Paul Bakker33b43f12013-08-20 11:48:36 +0200485/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000486
Paul Bakker33b43f12013-08-20 11:48:36 +0200487/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100488void mpi_cmp_mpi( char * input_X, char * input_Y,
489 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +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 Bakker367dae42009-06-28 21:50:27 +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, input_Y ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200496 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000497
Paul Bakkerbd51b262014-07-10 15:26:12 +0200498exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200499 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000500}
Paul Bakker33b43f12013-08-20 11:48:36 +0200501/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000502
Paul Bakker33b43f12013-08-20 11:48:36 +0200503/* BEGIN_CASE */
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200504void mpi_core_cond_assign( data_t * input_X,
Gabor Mezei02e5d432022-10-03 16:45:11 +0200505 data_t * input_Y,
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200506 int input_bytes )
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200507{
Gabor Mezeia7584882022-09-27 13:18:02 +0200508 mbedtls_mpi_uint *X = NULL;
509 mbedtls_mpi_uint *Y = NULL;
Gabor Mezeif5ca7262022-09-30 14:28:26 +0200510 size_t limbs_X = CHARS_TO_LIMBS( input_X->len );
511 size_t limbs_Y = CHARS_TO_LIMBS( input_Y->len );
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200512 size_t limbs = limbs_X;
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200513 size_t copy_limbs = CHARS_TO_LIMBS( input_bytes );
514 size_t bytes = limbs * sizeof( mbedtls_mpi_uint );
515 size_t copy_bytes = copy_limbs * sizeof( mbedtls_mpi_uint );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200516
Gabor Mezeid71eb0c2022-10-10 13:09:04 +0200517 TEST_EQUAL( limbs_X, limbs_Y );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200518 TEST_ASSERT( copy_limbs <= limbs );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200519
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200520 ASSERT_ALLOC( X, limbs );
521 ASSERT_ALLOC( Y, limbs );
Gabor Mezeia7584882022-09-27 13:18:02 +0200522
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200523 TEST_ASSERT( mbedtls_mpi_core_read_be( X, limbs, input_X->x, input_X->len )
Gabor Mezei027d6962022-09-16 17:16:27 +0200524 == 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200525
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200526 TEST_ASSERT( mbedtls_mpi_core_read_be( Y, limbs, input_Y->x, input_Y->len )
Gabor Mezei027d6962022-09-16 17:16:27 +0200527 == 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200528
Gabor Mezei821d1512022-09-27 12:41:28 +0200529 /* condition is false */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200530 TEST_CF_SECRET( X, bytes );
531 TEST_CF_SECRET( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200532
Gabor Mezei02e5d432022-10-03 16:45:11 +0200533 mbedtls_mpi_core_cond_assign( X, Y, copy_limbs, 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200534
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200535 TEST_CF_PUBLIC( X, bytes );
536 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200537
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200538 TEST_ASSERT( memcmp( X, Y, bytes ) != 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200539
Gabor Mezei821d1512022-09-27 12:41:28 +0200540 /* condition is true */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200541 TEST_CF_SECRET( X, bytes );
542 TEST_CF_SECRET( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200543
Gabor Mezei02e5d432022-10-03 16:45:11 +0200544 mbedtls_mpi_core_cond_assign( X, Y, copy_limbs, 1 );
Gabor Mezei821d1512022-09-27 12:41:28 +0200545
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200546 TEST_CF_PUBLIC( X, bytes );
547 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200548
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200549 /* Check if the given length is copied even it is smaller
Gabor Mezei4dceede2022-10-18 16:44:17 +0200550 than the length of the given MPIs. */
Gabor Mezei0c74e082022-10-17 16:09:58 +0200551 if( copy_limbs < limbs )
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200552 {
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200553 ASSERT_COMPARE( X, copy_bytes, Y, copy_bytes );
554 TEST_ASSERT( memcmp( X, Y, bytes ) != 0 );
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200555 }
Gabor Mezei02e5d432022-10-03 16:45:11 +0200556 else
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200557 ASSERT_COMPARE( X, bytes, Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200558
559exit:
Gabor Mezei8b05e3b2022-09-28 12:37:02 +0200560 mbedtls_free( X );
561 mbedtls_free( Y );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200562}
563/* END_CASE */
564
565/* BEGIN_CASE */
566void mpi_core_cond_swap( data_t * input_X,
Gabor Mezei02e5d432022-10-03 16:45:11 +0200567 data_t * input_Y,
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200568 int input_bytes )
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200569{
Gabor Mezeia7584882022-09-27 13:18:02 +0200570 mbedtls_mpi_uint *tmp_X = NULL;
571 mbedtls_mpi_uint *tmp_Y = NULL;
572 mbedtls_mpi_uint *X = NULL;
573 mbedtls_mpi_uint *Y = NULL;
Gabor Mezeif5ca7262022-09-30 14:28:26 +0200574 size_t limbs_X = CHARS_TO_LIMBS( input_X->len );
575 size_t limbs_Y = CHARS_TO_LIMBS( input_Y->len );
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200576 size_t limbs = limbs_X;
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200577 size_t copy_limbs = CHARS_TO_LIMBS( input_bytes );
578 size_t bytes = limbs * sizeof( mbedtls_mpi_uint );
579 size_t copy_bytes = copy_limbs * sizeof( mbedtls_mpi_uint );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200580
Gabor Mezeid71eb0c2022-10-10 13:09:04 +0200581 TEST_EQUAL( limbs_X, limbs_Y );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200582 TEST_ASSERT( copy_limbs <= limbs );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200583
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200584 ASSERT_ALLOC( tmp_X, limbs );
585 ASSERT_ALLOC( tmp_Y, limbs );
Gabor Mezeia7584882022-09-27 13:18:02 +0200586
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200587 TEST_ASSERT( mbedtls_mpi_core_read_be( tmp_X, limbs,
Gabor Mezei027d6962022-09-16 17:16:27 +0200588 input_X->x, input_X->len )
589 == 0 );
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200590 ASSERT_ALLOC( X, limbs );
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200591 memcpy( X, tmp_X, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200592
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200593 TEST_ASSERT( mbedtls_mpi_core_read_be( tmp_Y, limbs,
Gabor Mezei027d6962022-09-16 17:16:27 +0200594 input_Y->x, input_Y->len )
595 == 0 );
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200596 ASSERT_ALLOC( Y, limbs );
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200597 memcpy( Y, tmp_Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200598
Gabor Mezei821d1512022-09-27 12:41:28 +0200599 /* condition is false */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200600 TEST_CF_SECRET( X, bytes );
601 TEST_CF_SECRET( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200602
Gabor Mezei02e5d432022-10-03 16:45:11 +0200603 mbedtls_mpi_core_cond_swap( X, Y, copy_limbs, 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200604
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200605 TEST_CF_PUBLIC( X, bytes );
606 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200607
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200608 ASSERT_COMPARE( X, bytes, tmp_X, bytes );
609 ASSERT_COMPARE( Y, bytes, tmp_Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200610
Gabor Mezei821d1512022-09-27 12:41:28 +0200611 /* condition is true */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200612 TEST_CF_SECRET( X, bytes );
613 TEST_CF_SECRET( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200614
Gabor Mezei02e5d432022-10-03 16:45:11 +0200615 mbedtls_mpi_core_cond_swap( X, Y, copy_limbs, 1 );
Gabor Mezei821d1512022-09-27 12:41:28 +0200616
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200617 TEST_CF_PUBLIC( X, bytes );
618 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200619
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200620 /* Check if the given length is copied even it is smaller
621 than the length of the given MPIs. */
Gabor Mezei0c74e082022-10-17 16:09:58 +0200622 if( copy_limbs < limbs )
Gabor Mezei02e5d432022-10-03 16:45:11 +0200623 {
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200624 ASSERT_COMPARE( X, copy_bytes, tmp_Y, copy_bytes );
625 ASSERT_COMPARE( Y, copy_bytes, tmp_X, copy_bytes );
626 TEST_ASSERT( memcmp( X, tmp_X, bytes ) != 0 );
627 TEST_ASSERT( memcmp( X, tmp_Y, bytes ) != 0 );
628 TEST_ASSERT( memcmp( Y, tmp_X, bytes ) != 0 );
629 TEST_ASSERT( memcmp( Y, tmp_Y, bytes ) != 0 );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200630 }
631 else
632 {
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200633 ASSERT_COMPARE( X, bytes, tmp_Y, bytes );
634 ASSERT_COMPARE( Y, bytes, tmp_X, bytes );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200635 }
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200636
637exit:
Gabor Mezei8b05e3b2022-09-28 12:37:02 +0200638 mbedtls_free( tmp_X );
639 mbedtls_free( tmp_Y );
640 mbedtls_free( X );
641 mbedtls_free( Y );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200642}
643/* END_CASE */
644
645/* BEGIN_CASE */
646void mpi_mod_raw_cond_assign( data_t * input_X,
Gabor Mezei02e5d432022-10-03 16:45:11 +0200647 data_t * input_Y,
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200648 int input_bytes )
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200649{
Gabor Mezeia7584882022-09-27 13:18:02 +0200650 mbedtls_mpi_uint *X = NULL;
651 mbedtls_mpi_uint *Y = NULL;
Gabor Mezeiec5685f2022-09-30 14:41:13 +0200652 mbedtls_mpi_uint *buff_m = NULL;
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200653 mbedtls_mpi_mod_modulus m;
Gabor Mezeif5ca7262022-09-30 14:28:26 +0200654 size_t limbs_X = CHARS_TO_LIMBS( input_X->len );
655 size_t limbs_Y = CHARS_TO_LIMBS( input_Y->len );
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200656 size_t limbs = limbs_X;
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200657 size_t copy_limbs = CHARS_TO_LIMBS( input_bytes );
658 size_t bytes = limbs * sizeof( mbedtls_mpi_uint );
659 size_t copy_bytes = copy_limbs * sizeof( mbedtls_mpi_uint );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200660
Gabor Mezeid71eb0c2022-10-10 13:09:04 +0200661 TEST_EQUAL( limbs_X, limbs_Y );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200662 TEST_ASSERT( copy_limbs <= limbs );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200663
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200664 ASSERT_ALLOC( X, limbs );
665 ASSERT_ALLOC( Y, limbs );
Gabor Mezeia7584882022-09-27 13:18:02 +0200666
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200667 ASSERT_ALLOC( buff_m, limbs );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200668 mbedtls_mpi_mod_modulus_init( &m );
669 TEST_ASSERT( mbedtls_mpi_mod_modulus_setup(
Gabor Mezei02e5d432022-10-03 16:45:11 +0200670 &m, buff_m, copy_limbs,
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200671 MBEDTLS_MPI_MOD_EXT_REP_BE,
672 MBEDTLS_MPI_MOD_REP_MONTGOMERY )
673 == 0 );
674
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200675 TEST_ASSERT( mbedtls_mpi_core_read_be( X, limbs,
Gabor Mezei027d6962022-09-16 17:16:27 +0200676 input_X->x, input_X->len )
677 == 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200678
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200679 TEST_ASSERT( mbedtls_mpi_core_read_be( Y, limbs,
Gabor Mezei027d6962022-09-16 17:16:27 +0200680 input_Y->x, input_Y->len )
681 == 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200682
Gabor Mezei821d1512022-09-27 12:41:28 +0200683 /* condition is false */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200684 TEST_CF_SECRET( X, bytes );
685 TEST_CF_SECRET( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200686
Gabor Mezei821d1512022-09-27 12:41:28 +0200687 mbedtls_mpi_mod_raw_cond_assign( X, Y, &m, 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200688
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200689 TEST_CF_PUBLIC( X, bytes );
690 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200691
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200692 TEST_ASSERT( memcmp( X, Y, bytes ) != 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200693
Gabor Mezei821d1512022-09-27 12:41:28 +0200694 /* condition is true */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200695 TEST_CF_SECRET( X, bytes );
696 TEST_CF_SECRET( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200697
698 mbedtls_mpi_mod_raw_cond_assign( X, Y, &m, 1 );
699
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200700 TEST_CF_PUBLIC( X, bytes );
701 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200702
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200703 /* Check if the given length is copied even it is smaller
704 than the length of the given MPIs. */
Gabor Mezei0c74e082022-10-17 16:09:58 +0200705 if( copy_limbs <limbs )
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200706 {
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200707 ASSERT_COMPARE( X, copy_bytes, Y, copy_bytes );
708 TEST_ASSERT( memcmp( X, Y, bytes ) != 0 );
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200709 }
Gabor Mezei02e5d432022-10-03 16:45:11 +0200710 else
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200711 ASSERT_COMPARE( X, bytes, Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200712
713exit:
Gabor Mezei8b05e3b2022-09-28 12:37:02 +0200714 mbedtls_free( X );
715 mbedtls_free( Y );
716
717 mbedtls_mpi_mod_modulus_free( &m );
Gabor Mezeiec5685f2022-09-30 14:41:13 +0200718 mbedtls_free( buff_m );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200719}
720/* END_CASE */
721
722/* BEGIN_CASE */
723void mpi_mod_raw_cond_swap( data_t * input_X,
Gabor Mezei02e5d432022-10-03 16:45:11 +0200724 data_t * input_Y,
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200725 int input_bytes )
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200726{
Gabor Mezeia7584882022-09-27 13:18:02 +0200727 mbedtls_mpi_uint *tmp_X = NULL;
728 mbedtls_mpi_uint *tmp_Y = NULL;
729 mbedtls_mpi_uint *X = NULL;
730 mbedtls_mpi_uint *Y = NULL;
Gabor Mezeiec5685f2022-09-30 14:41:13 +0200731 mbedtls_mpi_uint *buff_m = NULL;
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200732 mbedtls_mpi_mod_modulus m;
Gabor Mezeif5ca7262022-09-30 14:28:26 +0200733 size_t limbs_X = CHARS_TO_LIMBS( input_X->len );
734 size_t limbs_Y = CHARS_TO_LIMBS( input_Y->len );
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200735 size_t limbs = limbs_X;
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200736 size_t copy_limbs = CHARS_TO_LIMBS( input_bytes );
737 size_t bytes = limbs * sizeof( mbedtls_mpi_uint );
738 size_t copy_bytes = copy_limbs * sizeof( mbedtls_mpi_uint );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200739
Gabor Mezeid71eb0c2022-10-10 13:09:04 +0200740 TEST_EQUAL( limbs_X, limbs_Y );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200741 TEST_ASSERT( copy_limbs <= limbs );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200742
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200743 ASSERT_ALLOC( tmp_X, limbs );
744 ASSERT_ALLOC( tmp_Y, limbs );
Gabor Mezeia7584882022-09-27 13:18:02 +0200745
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200746 ASSERT_ALLOC( buff_m, copy_limbs );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200747 mbedtls_mpi_mod_modulus_init( &m );
748 TEST_ASSERT( mbedtls_mpi_mod_modulus_setup(
Gabor Mezei02e5d432022-10-03 16:45:11 +0200749 &m, buff_m, copy_limbs,
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200750 MBEDTLS_MPI_MOD_EXT_REP_BE,
751 MBEDTLS_MPI_MOD_REP_MONTGOMERY )
752 == 0 );
753
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200754 TEST_ASSERT( mbedtls_mpi_core_read_be( tmp_X, limbs, input_X->x, input_X->len )
Gabor Mezei027d6962022-09-16 17:16:27 +0200755 == 0 );
Gabor Mezei8bcd7cc2022-10-14 16:18:10 +0200756 ASSERT_ALLOC( X, limbs );
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200757 memcpy( X, tmp_X, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200758
Gabor Mezei6546a6c2022-09-30 14:55:16 +0200759 TEST_ASSERT( mbedtls_mpi_core_read_be( tmp_Y, limbs, input_Y->x, input_Y->len )
Gabor Mezei027d6962022-09-16 17:16:27 +0200760 == 0 );
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200761 ASSERT_ALLOC( Y, bytes );
762 memcpy( Y, tmp_Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200763
Gabor Mezei821d1512022-09-27 12:41:28 +0200764 /* condition is false */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200765 TEST_CF_SECRET( X, bytes );
766 TEST_CF_SECRET( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200767
Gabor Mezei821d1512022-09-27 12:41:28 +0200768 mbedtls_mpi_mod_raw_cond_swap( X, Y, &m, 0 );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200769
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200770 TEST_CF_PUBLIC( X, bytes );
771 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200772
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200773 ASSERT_COMPARE( X, bytes, tmp_X, bytes );
774 ASSERT_COMPARE( Y, bytes, tmp_Y, bytes );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200775
Gabor Mezei821d1512022-09-27 12:41:28 +0200776 /* condition is true */
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200777 TEST_CF_SECRET( X, bytes );
778 TEST_CF_SECRET( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200779
780 mbedtls_mpi_mod_raw_cond_swap( X, Y, &m, 1 );
781
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200782 TEST_CF_PUBLIC( X, bytes );
783 TEST_CF_PUBLIC( Y, bytes );
Gabor Mezei821d1512022-09-27 12:41:28 +0200784
Gabor Mezeia67a1a32022-10-10 15:25:59 +0200785 /* Check if the given length is copied even it is smaller
786 than the length of the given MPIs. */
Gabor Mezei0c74e082022-10-17 16:09:58 +0200787 if( copy_limbs < limbs )
Gabor Mezei02e5d432022-10-03 16:45:11 +0200788 {
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200789 ASSERT_COMPARE( X, copy_bytes, tmp_Y, copy_bytes );
790 ASSERT_COMPARE( Y, copy_bytes, tmp_X, copy_bytes );
791 TEST_ASSERT( memcmp( X, tmp_X, bytes ) != 0 );
792 TEST_ASSERT( memcmp( X, tmp_Y, bytes ) != 0 );
793 TEST_ASSERT( memcmp( Y, tmp_X, bytes ) != 0 );
794 TEST_ASSERT( memcmp( Y, tmp_Y, bytes ) != 0 );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200795 }
796 else
797 {
Gabor Mezeiffb4aa02022-10-14 16:39:04 +0200798 ASSERT_COMPARE( X, bytes, tmp_Y, bytes );
799 ASSERT_COMPARE( Y, bytes, tmp_X, bytes );
Gabor Mezei02e5d432022-10-03 16:45:11 +0200800 }
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200801
802exit:
Gabor Mezei8b05e3b2022-09-28 12:37:02 +0200803 mbedtls_free( tmp_X );
804 mbedtls_free( tmp_Y );
805 mbedtls_free( X );
806 mbedtls_free( Y );
807
808 mbedtls_mpi_mod_modulus_free( &m );
Gabor Mezeiec5685f2022-09-30 14:41:13 +0200809 mbedtls_free( buff_m );
Gabor Mezeib27b1c52022-09-12 16:36:48 +0200810}
811/* END_CASE */
812
813/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100814void mpi_lt_mpi_ct( int size_X, char * input_X,
815 int size_Y, char * input_Y,
816 int input_ret, int input_err )
Janos Follath385d5b82019-09-11 16:07:14 +0100817{
Gilles Peskine0deccf12020-09-02 15:18:07 +0200818 unsigned ret = -1;
Janos Follath0e5532d2019-10-11 14:21:53 +0100819 unsigned input_uret = input_ret;
Janos Follath385d5b82019-09-11 16:07:14 +0100820 mbedtls_mpi X, Y;
821 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
822
Werner Lewis19b4cd82022-07-07 11:02:27 +0100823 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
824 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
Janos Follath385d5b82019-09-11 16:07:14 +0100825
Gilles Peskine9018b112020-01-21 16:30:53 +0100826 TEST_ASSERT( mbedtls_mpi_grow( &X, size_X ) == 0 );
827 TEST_ASSERT( mbedtls_mpi_grow( &Y, size_Y ) == 0 );
Janos Follath385d5b82019-09-11 16:07:14 +0100828
Janos Follath0e5532d2019-10-11 14:21:53 +0100829 TEST_ASSERT( mbedtls_mpi_lt_mpi_ct( &X, &Y, &ret ) == input_err );
Janos Follath385d5b82019-09-11 16:07:14 +0100830 if( input_err == 0 )
Janos Follath0e5532d2019-10-11 14:21:53 +0100831 TEST_ASSERT( ret == input_uret );
Janos Follath385d5b82019-09-11 16:07:14 +0100832
833exit:
834 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
835}
836/* END_CASE */
837
838/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100839void mpi_cmp_abs( char * input_X, char * input_Y,
840 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000841{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200842 mbedtls_mpi X, Y;
843 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000844
Werner Lewis19b4cd82022-07-07 11:02:27 +0100845 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
846 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200847 TEST_ASSERT( mbedtls_mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000848
Paul Bakkerbd51b262014-07-10 15:26:12 +0200849exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200850 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000851}
Paul Bakker33b43f12013-08-20 11:48:36 +0200852/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000853
Paul Bakker33b43f12013-08-20 11:48:36 +0200854/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100855void mpi_copy( char *src_hex, char *dst_hex )
Paul Bakker367dae42009-06-28 21:50:27 +0000856{
Gilles Peskined0722f82021-06-10 23:00:33 +0200857 mbedtls_mpi src, dst, ref;
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200858 mbedtls_mpi_init( &src );
859 mbedtls_mpi_init( &dst );
Gilles Peskined0722f82021-06-10 23:00:33 +0200860 mbedtls_mpi_init( &ref );
Paul Bakker367dae42009-06-28 21:50:27 +0000861
Werner Lewis19b4cd82022-07-07 11:02:27 +0100862 TEST_ASSERT( mbedtls_test_read_mpi( &src, src_hex ) == 0 );
863 TEST_ASSERT( mbedtls_test_read_mpi( &ref, dst_hex ) == 0 );
Gilles Peskined0722f82021-06-10 23:00:33 +0200864
865 /* mbedtls_mpi_copy() */
Werner Lewis19b4cd82022-07-07 11:02:27 +0100866 TEST_ASSERT( mbedtls_test_read_mpi( &dst, dst_hex ) == 0 );
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200867 TEST_ASSERT( mbedtls_mpi_copy( &dst, &src ) == 0 );
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200868 TEST_ASSERT( sign_is_valid( &dst ) );
869 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &dst, &src ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000870
Gilles Peskined0722f82021-06-10 23:00:33 +0200871 /* mbedtls_mpi_safe_cond_assign(), assignment done */
872 mbedtls_mpi_free( &dst );
Werner Lewis19b4cd82022-07-07 11:02:27 +0100873 TEST_ASSERT( mbedtls_test_read_mpi( &dst, dst_hex ) == 0 );
Gilles Peskined0722f82021-06-10 23:00:33 +0200874 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &dst, &src, 1 ) == 0 );
875 TEST_ASSERT( sign_is_valid( &dst ) );
876 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &dst, &src ) == 0 );
877
878 /* mbedtls_mpi_safe_cond_assign(), assignment not done */
879 mbedtls_mpi_free( &dst );
Werner Lewis19b4cd82022-07-07 11:02:27 +0100880 TEST_ASSERT( mbedtls_test_read_mpi( &dst, dst_hex ) == 0 );
Gilles Peskined0722f82021-06-10 23:00:33 +0200881 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &dst, &src, 0 ) == 0 );
882 TEST_ASSERT( sign_is_valid( &dst ) );
883 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &dst, &ref ) == 0 );
884
Paul Bakkerbd51b262014-07-10 15:26:12 +0200885exit:
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200886 mbedtls_mpi_free( &src );
887 mbedtls_mpi_free( &dst );
Gilles Peskined0722f82021-06-10 23:00:33 +0200888 mbedtls_mpi_free( &ref );
Gilles Peskine7428b452020-01-20 21:01:51 +0100889}
890/* END_CASE */
891
892/* BEGIN_CASE */
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200893void mpi_copy_self( char *input_X )
Gilles Peskine7428b452020-01-20 21:01:51 +0100894{
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200895 mbedtls_mpi X, A;
896 mbedtls_mpi_init( &A );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200897 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000898
Werner Lewis19b4cd82022-07-07 11:02:27 +0100899 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200900 TEST_ASSERT( mbedtls_mpi_copy( &X, &X ) == 0 );
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200901
Werner Lewis19b4cd82022-07-07 11:02:27 +0100902 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_X ) == 0 );
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200903 TEST_ASSERT( sign_is_valid( &X ) );
904 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000905
Paul Bakkerbd51b262014-07-10 15:26:12 +0200906exit:
Gilles Peskine90ec8e82021-06-10 15:17:30 +0200907 mbedtls_mpi_free( &A );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200908 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000909}
Paul Bakker33b43f12013-08-20 11:48:36 +0200910/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000911
Paul Bakker33b43f12013-08-20 11:48:36 +0200912/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100913void mpi_swap( char *X_hex, char *Y_hex )
Gilles Peskinefc1eeef2021-06-10 22:29:57 +0200914{
915 mbedtls_mpi X, Y, X0, Y0;
916 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
917 mbedtls_mpi_init( &X0 ); mbedtls_mpi_init( &Y0 );
918
Werner Lewis19b4cd82022-07-07 11:02:27 +0100919 TEST_ASSERT( mbedtls_test_read_mpi( &X0, X_hex ) == 0 );
920 TEST_ASSERT( mbedtls_test_read_mpi( &Y0, Y_hex ) == 0 );
Gilles Peskinefc1eeef2021-06-10 22:29:57 +0200921
Gilles Peskined0722f82021-06-10 23:00:33 +0200922 /* mbedtls_mpi_swap() */
Tom Cosgrovec71ca0c2022-09-15 15:38:17 +0100923 TEST_ASSERT( mbedtls_test_read_mpi( &X, X_hex ) == 0 );
924 TEST_ASSERT( mbedtls_test_read_mpi( &Y, Y_hex ) == 0 );
Gilles Peskinefc1eeef2021-06-10 22:29:57 +0200925 mbedtls_mpi_swap( &X, &Y );
926 TEST_ASSERT( sign_is_valid( &X ) );
927 TEST_ASSERT( sign_is_valid( &Y ) );
928 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y0 ) == 0 );
929 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &X0 ) == 0 );
930
Gilles Peskined0722f82021-06-10 23:00:33 +0200931 /* mbedtls_mpi_safe_cond_swap(), swap done */
932 mbedtls_mpi_free( &X );
933 mbedtls_mpi_free( &Y );
Tom Cosgrovec71ca0c2022-09-15 15:38:17 +0100934 TEST_ASSERT( mbedtls_test_read_mpi( &X, X_hex ) == 0 );
935 TEST_ASSERT( mbedtls_test_read_mpi( &Y, Y_hex ) == 0 );
Gilles Peskined0722f82021-06-10 23:00:33 +0200936 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 1 ) == 0 );
937 TEST_ASSERT( sign_is_valid( &X ) );
938 TEST_ASSERT( sign_is_valid( &Y ) );
939 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y0 ) == 0 );
940 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &X0 ) == 0 );
941
942 /* mbedtls_mpi_safe_cond_swap(), swap not done */
943 mbedtls_mpi_free( &X );
944 mbedtls_mpi_free( &Y );
Tom Cosgrovec71ca0c2022-09-15 15:38:17 +0100945 TEST_ASSERT( mbedtls_test_read_mpi( &X, X_hex ) == 0 );
946 TEST_ASSERT( mbedtls_test_read_mpi( &Y, Y_hex ) == 0 );
Gilles Peskined0722f82021-06-10 23:00:33 +0200947 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
948 TEST_ASSERT( sign_is_valid( &X ) );
949 TEST_ASSERT( sign_is_valid( &Y ) );
950 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 );
951 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &Y0 ) == 0 );
952
Gilles Peskinefc1eeef2021-06-10 22:29:57 +0200953exit:
954 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
955 mbedtls_mpi_free( &X0 ); mbedtls_mpi_free( &Y0 );
956}
957/* END_CASE */
958
959/* BEGIN_CASE */
960void mpi_swap_self( char *X_hex )
961{
962 mbedtls_mpi X, X0;
963 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &X0 );
964
Tom Cosgrovec71ca0c2022-09-15 15:38:17 +0100965 TEST_ASSERT( mbedtls_test_read_mpi( &X, X_hex ) == 0 );
Werner Lewis19b4cd82022-07-07 11:02:27 +0100966 TEST_ASSERT( mbedtls_test_read_mpi( &X0, X_hex ) == 0 );
Gilles Peskinefc1eeef2021-06-10 22:29:57 +0200967
968 mbedtls_mpi_swap( &X, &X );
969 TEST_ASSERT( sign_is_valid( &X ) );
970 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 );
971
972exit:
973 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &X0 );
974}
975/* END_CASE */
976
977/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100978void mpi_shrink( int before, int used, int min, int after )
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100979{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200980 mbedtls_mpi X;
981 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100982
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200983 TEST_ASSERT( mbedtls_mpi_grow( &X, before ) == 0 );
Gilles Peskinee1091752021-06-15 21:19:18 +0200984 if( used > 0 )
985 {
986 size_t used_bit_count = used * 8 * sizeof( mbedtls_mpi_uint );
987 TEST_ASSERT( mbedtls_mpi_set_bit( &X, used_bit_count - 1, 1 ) == 0 );
988 }
989 TEST_EQUAL( X.n, (size_t) before );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200990 TEST_ASSERT( mbedtls_mpi_shrink( &X, min ) == 0 );
Gilles Peskinee1091752021-06-15 21:19:18 +0200991 TEST_EQUAL( X.n, (size_t) after );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100992
Paul Bakkerbd51b262014-07-10 15:26:12 +0200993exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200994 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100995}
996/* END_CASE */
997
998/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +0100999void mpi_add_mpi( char * input_X, char * input_Y,
1000 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001001{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001002 mbedtls_mpi X, Y, Z, A;
1003 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001004
Werner Lewis19b4cd82022-07-07 11:02:27 +01001005 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1006 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1007 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001008 TEST_ASSERT( mbedtls_mpi_add_mpi( &Z, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001009 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001010 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001011
Gilles Peskine56f943a2020-07-23 01:18:11 +02001012 /* result == first operand */
1013 TEST_ASSERT( mbedtls_mpi_add_mpi( &X, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001014 TEST_ASSERT( sign_is_valid( &X ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001015 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Werner Lewis19b4cd82022-07-07 11:02:27 +01001016 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001017
1018 /* result == second operand */
1019 TEST_ASSERT( mbedtls_mpi_add_mpi( &Y, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001020 TEST_ASSERT( sign_is_valid( &Y ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001021 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
1022
Paul Bakkerbd51b262014-07-10 15:26:12 +02001023exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001024 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001025}
Paul Bakker33b43f12013-08-20 11:48:36 +02001026/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001027
Paul Bakker33b43f12013-08-20 11:48:36 +02001028/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001029void mpi_add_mpi_inplace( char * input_X, char * input_A )
Janos Follath044a86b2015-10-25 10:58:03 +01001030{
1031 mbedtls_mpi X, A;
1032 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
1033
Werner Lewis19b4cd82022-07-07 11:02:27 +01001034 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +01001035
Werner Lewis19b4cd82022-07-07 11:02:27 +01001036 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +01001037 TEST_ASSERT( mbedtls_mpi_sub_abs( &X, &X, &X ) == 0 );
1038 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, 0 ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001039 TEST_ASSERT( sign_is_valid( &X ) );
Janos Follath6cbacec2015-10-25 12:29:13 +01001040
Werner Lewis19b4cd82022-07-07 11:02:27 +01001041 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +01001042 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &X ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001043 TEST_ASSERT( sign_is_valid( &X ) );
Janos Follath6cbacec2015-10-25 12:29:13 +01001044 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
1045
Werner Lewis19b4cd82022-07-07 11:02:27 +01001046 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Janos Follath044a86b2015-10-25 10:58:03 +01001047 TEST_ASSERT( mbedtls_mpi_add_mpi( &X, &X, &X ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001048 TEST_ASSERT( sign_is_valid( &X ) );
Janos Follath044a86b2015-10-25 10:58:03 +01001049 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
1050
1051exit:
1052 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
1053}
1054/* END_CASE */
1055
1056
1057/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001058void mpi_add_abs( char * input_X, char * input_Y,
1059 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001060{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001061 mbedtls_mpi X, Y, Z, A;
1062 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001063
Werner Lewis19b4cd82022-07-07 11:02:27 +01001064 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1065 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1066 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001067 TEST_ASSERT( mbedtls_mpi_add_abs( &Z, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001068 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001069 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001070
Gilles Peskine56f943a2020-07-23 01:18:11 +02001071 /* result == first operand */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001072 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001073 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001074 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Werner Lewis19b4cd82022-07-07 11:02:27 +01001075 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001076
1077 /* result == second operand */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001078 TEST_ASSERT( mbedtls_mpi_add_abs( &Y, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001079 TEST_ASSERT( sign_is_valid( &Y ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001080 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001081
Paul Bakkerbd51b262014-07-10 15:26:12 +02001082exit:
Gilles Peskine56f943a2020-07-23 01:18:11 +02001083 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +00001084}
Paul Bakker33b43f12013-08-20 11:48:36 +02001085/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +00001086
Paul Bakker33b43f12013-08-20 11:48:36 +02001087/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001088void mpi_add_int( char * input_X, int input_Y,
1089 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001090{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001091 mbedtls_mpi X, Z, A;
1092 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001093
Werner Lewis19b4cd82022-07-07 11:02:27 +01001094 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1095 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001096 TEST_ASSERT( mbedtls_mpi_add_int( &Z, &X, input_Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001097 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001098 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001099
Paul Bakkerbd51b262014-07-10 15:26:12 +02001100exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001101 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001102}
Paul Bakker33b43f12013-08-20 11:48:36 +02001103/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001104
Paul Bakker33b43f12013-08-20 11:48:36 +02001105/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001106void mpi_sub_mpi( char * input_X, char * input_Y,
1107 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001108{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001109 mbedtls_mpi X, Y, Z, A;
1110 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001111
Werner Lewis19b4cd82022-07-07 11:02:27 +01001112 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1113 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1114 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001115 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Z, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001116 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001117 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001118
Gilles Peskine56f943a2020-07-23 01:18:11 +02001119 /* result == first operand */
1120 TEST_ASSERT( mbedtls_mpi_sub_mpi( &X, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001121 TEST_ASSERT( sign_is_valid( &X ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001122 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Werner Lewis19b4cd82022-07-07 11:02:27 +01001123 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001124
1125 /* result == second operand */
1126 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Y, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001127 TEST_ASSERT( sign_is_valid( &Y ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001128 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
1129
Paul Bakkerbd51b262014-07-10 15:26:12 +02001130exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001131 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001132}
Paul Bakker33b43f12013-08-20 11:48:36 +02001133/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001134
Paul Bakker33b43f12013-08-20 11:48:36 +02001135/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001136void mpi_sub_abs( char * input_X, char * input_Y,
1137 char * input_A, int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001138{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001139 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +00001140 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001141 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001142
Werner Lewis19b4cd82022-07-07 11:02:27 +01001143 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1144 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1145 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +01001146
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001147 res = mbedtls_mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001148 TEST_ASSERT( res == sub_result );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001149 TEST_ASSERT( sign_is_valid( &Z ) );
Paul Bakker367dae42009-06-28 21:50:27 +00001150 if( res == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001151 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001152
Gilles Peskine56f943a2020-07-23 01:18:11 +02001153 /* result == first operand */
1154 TEST_ASSERT( mbedtls_mpi_sub_abs( &X, &X, &Y ) == sub_result );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001155 TEST_ASSERT( sign_is_valid( &X ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001156 if( sub_result == 0 )
1157 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Werner Lewis19b4cd82022-07-07 11:02:27 +01001158 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001159
1160 /* result == second operand */
1161 TEST_ASSERT( mbedtls_mpi_sub_abs( &Y, &X, &Y ) == sub_result );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001162 TEST_ASSERT( sign_is_valid( &Y ) );
Gilles Peskine56f943a2020-07-23 01:18:11 +02001163 if( sub_result == 0 )
1164 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
1165
Paul Bakkerbd51b262014-07-10 15:26:12 +02001166exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001167 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001168}
Paul Bakker33b43f12013-08-20 11:48:36 +02001169/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001170
Paul Bakker33b43f12013-08-20 11:48:36 +02001171/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001172void mpi_sub_int( char * input_X, int input_Y,
1173 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001174{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001175 mbedtls_mpi X, Z, A;
1176 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001177
Werner Lewis19b4cd82022-07-07 11:02:27 +01001178 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1179 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001180 TEST_ASSERT( mbedtls_mpi_sub_int( &Z, &X, input_Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001181 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001182 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001183
Paul Bakkerbd51b262014-07-10 15:26:12 +02001184exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001185 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001186}
Paul Bakker33b43f12013-08-20 11:48:36 +02001187/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001188
Paul Bakker33b43f12013-08-20 11:48:36 +02001189/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001190void mpi_mul_mpi( char * input_X, char * input_Y,
1191 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001192{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001193 mbedtls_mpi X, Y, Z, A;
1194 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001195
Werner Lewis19b4cd82022-07-07 11:02:27 +01001196 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1197 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1198 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001199 TEST_ASSERT( mbedtls_mpi_mul_mpi( &Z, &X, &Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001200 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001201 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001202
Paul Bakkerbd51b262014-07-10 15:26:12 +02001203exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001204 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001205}
Paul Bakker33b43f12013-08-20 11:48:36 +02001206/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001207
Paul Bakker33b43f12013-08-20 11:48:36 +02001208/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001209void mpi_mul_int( char * input_X, int input_Y,
1210 char * input_A, char * result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +00001211{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001212 mbedtls_mpi X, Z, A;
1213 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001214
Werner Lewis19b4cd82022-07-07 11:02:27 +01001215 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1216 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001217 TEST_ASSERT( mbedtls_mpi_mul_int( &Z, &X, input_Y ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001218 TEST_ASSERT( sign_is_valid( &Z ) );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001219 if( strcmp( result_comparison, "==" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001220 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001221 else if( strcmp( result_comparison, "!=" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001222 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) != 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001223 else
1224 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001225
Paul Bakkerbd51b262014-07-10 15:26:12 +02001226exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001227 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001228}
Paul Bakker33b43f12013-08-20 11:48:36 +02001229/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001230
Paul Bakker33b43f12013-08-20 11:48:36 +02001231/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001232void mpi_div_mpi( char * input_X, char * input_Y,
1233 char * input_A, char * input_B,
1234 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001235{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001236 mbedtls_mpi X, Y, Q, R, A, B;
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( &Q ); mbedtls_mpi_init( &R );
1239 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001240
Werner Lewis19b4cd82022-07-07 11:02:27 +01001241 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1242 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1243 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
1244 TEST_ASSERT( mbedtls_test_read_mpi( &B, input_B ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001245 res = mbedtls_mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001246 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001247 if( res == 0 )
1248 {
Gilles Peskinedffc7102021-06-10 15:34:15 +02001249 TEST_ASSERT( sign_is_valid( &Q ) );
1250 TEST_ASSERT( sign_is_valid( &R ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001251 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
1252 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001253 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001254
Paul Bakkerbd51b262014-07-10 15:26:12 +02001255exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001256 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R );
1257 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001258}
Paul Bakker33b43f12013-08-20 11:48:36 +02001259/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001260
Paul Bakker33b43f12013-08-20 11:48:36 +02001261/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001262void mpi_div_int( char * input_X, int input_Y,
1263 char * input_A, char * input_B,
1264 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001265{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001266 mbedtls_mpi X, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +00001267 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001268 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &A );
1269 mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001270
Werner Lewis19b4cd82022-07-07 11:02:27 +01001271 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1272 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
1273 TEST_ASSERT( mbedtls_test_read_mpi( &B, input_B ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001274 res = mbedtls_mpi_div_int( &Q, &R, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001275 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001276 if( res == 0 )
1277 {
Gilles Peskinedffc7102021-06-10 15:34:15 +02001278 TEST_ASSERT( sign_is_valid( &Q ) );
1279 TEST_ASSERT( sign_is_valid( &R ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001280 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
1281 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001282 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001283
Paul Bakkerbd51b262014-07-10 15:26:12 +02001284exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001285 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &A );
1286 mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +00001287}
Paul Bakker33b43f12013-08-20 11:48:36 +02001288/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001289
Paul Bakker33b43f12013-08-20 11:48:36 +02001290/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001291void mpi_mod_mpi( char * input_X, char * input_Y,
1292 char * input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001293{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001294 mbedtls_mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +00001295 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001296 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001297
Werner Lewis19b4cd82022-07-07 11:02:27 +01001298 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1299 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1300 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001301 res = mbedtls_mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001302 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001303 if( res == 0 )
1304 {
Gilles Peskinedffc7102021-06-10 15:34:15 +02001305 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001306 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001307 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001308
Paul Bakkerbd51b262014-07-10 15:26:12 +02001309exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001310 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001311}
Paul Bakker33b43f12013-08-20 11:48:36 +02001312/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001313
Paul Bakker33b43f12013-08-20 11:48:36 +02001314/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001315void mpi_mod_int( char * input_X, int input_Y,
1316 int input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001317{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001318 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +00001319 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001320 mbedtls_mpi_uint r;
1321 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001322
Werner Lewis19b4cd82022-07-07 11:02:27 +01001323 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001324 res = mbedtls_mpi_mod_int( &r, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001325 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001326 if( res == 0 )
1327 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001328 TEST_ASSERT( r == (mbedtls_mpi_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +00001329 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001330
Paul Bakkerbd51b262014-07-10 15:26:12 +02001331exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001332 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001333}
Paul Bakker33b43f12013-08-20 11:48:36 +02001334/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001335
Paul Bakker33b43f12013-08-20 11:48:36 +02001336/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001337void mpi_exp_mod( char * input_A, char * input_E,
1338 char * input_N, char * input_X,
1339 int exp_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001340{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001341 mbedtls_mpi A, E, N, RR, Z, X;
Paul Bakker367dae42009-06-28 21:50:27 +00001342 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001343 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
1344 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001345
Werner Lewis19b4cd82022-07-07 11:02:27 +01001346 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
1347 TEST_ASSERT( mbedtls_test_read_mpi( &E, input_E ) == 0 );
1348 TEST_ASSERT( mbedtls_test_read_mpi( &N, input_N ) == 0 );
1349 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001350
Gilles Peskine342f71b2021-06-09 18:31:35 +02001351 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, NULL );
Gilles Peskine722c62c2021-06-15 21:55:05 +02001352 TEST_ASSERT( res == exp_result );
Gilles Peskine342f71b2021-06-09 18:31:35 +02001353 if( res == 0 )
1354 {
1355 TEST_ASSERT( sign_is_valid( &Z ) );
1356 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
1357 }
1358
1359 /* Now test again with the speed-up parameter supplied as an output. */
1360 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR );
Gilles Peskine722c62c2021-06-15 21:55:05 +02001361 TEST_ASSERT( res == exp_result );
Gilles Peskine342f71b2021-06-09 18:31:35 +02001362 if( res == 0 )
1363 {
1364 TEST_ASSERT( sign_is_valid( &Z ) );
1365 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
1366 }
1367
1368 /* Now test again with the speed-up parameter supplied in calculated form. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001369 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR );
Gilles Peskine722c62c2021-06-15 21:55:05 +02001370 TEST_ASSERT( res == exp_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001371 if( res == 0 )
1372 {
Gilles Peskinedffc7102021-06-10 15:34:15 +02001373 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001374 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001375 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001376
Paul Bakkerbd51b262014-07-10 15:26:12 +02001377exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001378 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
1379 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001380}
Paul Bakker33b43f12013-08-20 11:48:36 +02001381/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001382
Paul Bakker33b43f12013-08-20 11:48:36 +02001383/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001384void mpi_exp_mod_size( int A_bytes, int E_bytes, int N_bytes,
1385 char * input_RR, int exp_result )
Chris Jonesd10b3312020-12-02 10:41:50 +00001386{
1387 mbedtls_mpi A, E, N, RR, Z;
1388 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
1389 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z );
1390
Chris Jonesaa850cd2020-12-03 11:35:41 +00001391 /* Set A to 2^(A_bytes - 1) + 1 */
Chris Jonesd10b3312020-12-02 10:41:50 +00001392 TEST_ASSERT( mbedtls_mpi_lset( &A, 1 ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001393 TEST_ASSERT( mbedtls_mpi_shift_l( &A, ( A_bytes * 8 ) - 1 ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001394 TEST_ASSERT( mbedtls_mpi_set_bit( &A, 0, 1 ) == 0 );
Chris Jonesaa850cd2020-12-03 11:35:41 +00001395
1396 /* Set E to 2^(E_bytes - 1) + 1 */
1397 TEST_ASSERT( mbedtls_mpi_lset( &E, 1 ) == 0 );
1398 TEST_ASSERT( mbedtls_mpi_shift_l( &E, ( E_bytes * 8 ) - 1 ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001399 TEST_ASSERT( mbedtls_mpi_set_bit( &E, 0, 1 ) == 0 );
Chris Jonesaa850cd2020-12-03 11:35:41 +00001400
1401 /* Set N to 2^(N_bytes - 1) + 1 */
1402 TEST_ASSERT( mbedtls_mpi_lset( &N, 1 ) == 0 );
1403 TEST_ASSERT( mbedtls_mpi_shift_l( &N, ( N_bytes * 8 ) - 1 ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001404 TEST_ASSERT( mbedtls_mpi_set_bit( &N, 0, 1 ) == 0 );
1405
1406 if( strlen( input_RR ) )
Werner Lewis19b4cd82022-07-07 11:02:27 +01001407 TEST_ASSERT( mbedtls_test_read_mpi( &RR, input_RR ) == 0 );
Chris Jonesd10b3312020-12-02 10:41:50 +00001408
Chris Jonesaa850cd2020-12-03 11:35:41 +00001409 TEST_ASSERT( mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR ) == exp_result );
Chris Jonesd10b3312020-12-02 10:41:50 +00001410
1411exit:
1412 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
1413 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z );
1414}
1415/* END_CASE */
1416
1417/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001418void mpi_inv_mod( char * input_X, char * input_Y,
1419 char * input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001420{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001421 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +00001422 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001423 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001424
Werner Lewis19b4cd82022-07-07 11:02:27 +01001425 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1426 TEST_ASSERT( mbedtls_test_read_mpi( &Y, input_Y ) == 0 );
1427 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001428 res = mbedtls_mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +02001429 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +00001430 if( res == 0 )
1431 {
Gilles Peskinedffc7102021-06-10 15:34:15 +02001432 TEST_ASSERT( sign_is_valid( &Z ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001433 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +00001434 }
Paul Bakker6c591fa2011-05-05 11:49:20 +00001435
Paul Bakkerbd51b262014-07-10 15:26:12 +02001436exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001437 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001438}
Paul Bakker33b43f12013-08-20 11:48:36 +02001439/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001440
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001441/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001442void mpi_is_prime( char * input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +00001443{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001444 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +00001445 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001446 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001447
Werner Lewis19b4cd82022-07-07 11:02:27 +01001448 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
Ronald Cron351f0ee2020-06-10 12:12:18 +02001449 res = mbedtls_mpi_is_prime_ext( &X, 40, mbedtls_test_rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +02001450 TEST_ASSERT( res == div_result );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001451
Paul Bakkerbd51b262014-07-10 15:26:12 +02001452exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001453 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +00001454}
Paul Bakker33b43f12013-08-20 11:48:36 +02001455/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001456
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001457/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001458void mpi_is_prime_det( data_t * input_X, data_t * witnesses,
1459 int chunk_len, int rounds )
Janos Follath64eca052018-09-05 17:04:49 +01001460{
1461 mbedtls_mpi X;
1462 int res;
1463 mbedtls_test_mpi_random rand;
1464
1465 mbedtls_mpi_init( &X );
1466 rand.data = witnesses;
1467 rand.pos = 0;
1468 rand.chunk_len = chunk_len;
1469
1470 TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
Darryl Greenac2ead02018-10-02 15:30:39 +01001471 res = mbedtls_mpi_is_prime_ext( &X, rounds - 1,
1472 mbedtls_test_mpi_miller_rabin_determinizer,
1473 &rand );
1474 TEST_ASSERT( res == 0 );
1475
1476 rand.data = witnesses;
1477 rand.pos = 0;
1478 rand.chunk_len = chunk_len;
1479
Janos Follatha0b67c22018-09-18 14:48:23 +01001480 res = mbedtls_mpi_is_prime_ext( &X, rounds,
1481 mbedtls_test_mpi_miller_rabin_determinizer,
Janos Follath64eca052018-09-05 17:04:49 +01001482 &rand );
Darryl Greenac2ead02018-10-02 15:30:39 +01001483 TEST_ASSERT( res == MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
Janos Follath64eca052018-09-05 17:04:49 +01001484
1485exit:
1486 mbedtls_mpi_free( &X );
1487}
1488/* END_CASE */
1489
1490/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001491void mpi_gen_prime( int bits, int flags, int ref_ret )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001492{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001493 mbedtls_mpi X;
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001494 int my_ret;
1495
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001496 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001497
Ronald Cron6c5bd7f2020-06-10 14:08:26 +02001498 my_ret = mbedtls_mpi_gen_prime( &X, bits, flags,
1499 mbedtls_test_rnd_std_rand, NULL );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001500 TEST_ASSERT( my_ret == ref_ret );
1501
1502 if( ref_ret == 0 )
1503 {
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +02001504 size_t actual_bits = mbedtls_mpi_bitlen( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001505
1506 TEST_ASSERT( actual_bits >= (size_t) bits );
1507 TEST_ASSERT( actual_bits <= (size_t) bits + 1 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001508 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001509
Ronald Cron6c5bd7f2020-06-10 14:08:26 +02001510 TEST_ASSERT( mbedtls_mpi_is_prime_ext( &X, 40,
1511 mbedtls_test_rnd_std_rand,
1512 NULL ) == 0 );
Janos Follatha3cb7eb2018-08-14 15:31:54 +01001513 if( flags & MBEDTLS_MPI_GEN_PRIME_FLAG_DH )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001514 {
Hanno Beckerd4d60572018-01-10 07:12:01 +00001515 /* X = ( X - 1 ) / 2 */
1516 TEST_ASSERT( mbedtls_mpi_shift_r( &X, 1 ) == 0 );
Ronald Cron6c5bd7f2020-06-10 14:08:26 +02001517 TEST_ASSERT( mbedtls_mpi_is_prime_ext( &X, 40,
1518 mbedtls_test_rnd_std_rand,
1519 NULL ) == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001520 }
1521 }
1522
Paul Bakkerbd51b262014-07-10 15:26:12 +02001523exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001524 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +02001525}
1526/* END_CASE */
1527
Paul Bakker33b43f12013-08-20 11:48:36 +02001528/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001529void mpi_shift_l( char * input_X, int shift_X,
1530 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001531{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001532 mbedtls_mpi X, A;
1533 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001534
Werner Lewis19b4cd82022-07-07 11:02:27 +01001535 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1536 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001537 TEST_ASSERT( mbedtls_mpi_shift_l( &X, shift_X ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001538 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001539 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001540
Paul Bakkerbd51b262014-07-10 15:26:12 +02001541exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001542 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001543}
Paul Bakker33b43f12013-08-20 11:48:36 +02001544/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001545
Paul Bakker33b43f12013-08-20 11:48:36 +02001546/* BEGIN_CASE */
Tom Cosgrove1b2947a2022-09-02 10:24:55 +01001547void mpi_shift_r( char * input_X, int shift_X,
1548 char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +00001549{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001550 mbedtls_mpi X, A;
1551 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001552
Werner Lewis19b4cd82022-07-07 11:02:27 +01001553 TEST_ASSERT( mbedtls_test_read_mpi( &X, input_X ) == 0 );
1554 TEST_ASSERT( mbedtls_test_read_mpi( &A, input_A ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001555 TEST_ASSERT( mbedtls_mpi_shift_r( &X, shift_X ) == 0 );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001556 TEST_ASSERT( sign_is_valid( &X ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001557 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +00001558
Paul Bakkerbd51b262014-07-10 15:26:12 +02001559exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001560 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +00001561}
Paul Bakker33b43f12013-08-20 11:48:36 +02001562/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +00001563
Gilles Peskine3cb1e292020-11-25 15:37:20 +01001564/* BEGIN_CASE */
Gilles Peskine422e8672021-04-02 00:02:27 +02001565void mpi_fill_random( int wanted_bytes, int rng_bytes,
1566 int before, int expected_ret )
Gilles Peskine3cb1e292020-11-25 15:37:20 +01001567{
1568 mbedtls_mpi X;
1569 int ret;
1570 size_t bytes_left = rng_bytes;
1571 mbedtls_mpi_init( &X );
1572
Gilles Peskine422e8672021-04-02 00:02:27 +02001573 if( before != 0 )
1574 {
1575 /* Set X to sign(before) * 2^(|before|-1) */
1576 TEST_ASSERT( mbedtls_mpi_lset( &X, before > 0 ? 1 : -1 ) == 0 );
1577 if( before < 0 )
1578 before = - before;
1579 TEST_ASSERT( mbedtls_mpi_shift_l( &X, before - 1 ) == 0 );
1580 }
1581
Gilles Peskine3cb1e292020-11-25 15:37:20 +01001582 ret = mbedtls_mpi_fill_random( &X, wanted_bytes,
1583 f_rng_bytes_left, &bytes_left );
1584 TEST_ASSERT( ret == expected_ret );
1585
1586 if( expected_ret == 0 )
1587 {
1588 /* mbedtls_mpi_fill_random is documented to use bytes from the RNG
1589 * as a big-endian representation of the number. We know when
1590 * our RNG function returns null bytes, so we know how many
1591 * leading zero bytes the number has. */
1592 size_t leading_zeros = 0;
1593 if( wanted_bytes > 0 && rng_bytes % 256 == 0 )
1594 leading_zeros = 1;
1595 TEST_ASSERT( mbedtls_mpi_size( &X ) + leading_zeros ==
1596 (size_t) wanted_bytes );
1597 TEST_ASSERT( (int) bytes_left == rng_bytes - wanted_bytes );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001598 TEST_ASSERT( sign_is_valid( &X ) );
Gilles Peskine3cb1e292020-11-25 15:37:20 +01001599 }
1600
1601exit:
1602 mbedtls_mpi_free( &X );
1603}
1604/* END_CASE */
1605
Gilles Peskine02ac93a2021-03-29 22:02:55 +02001606/* BEGIN_CASE */
1607void mpi_random_many( int min, data_t *bound_bytes, int iterations )
1608{
1609 /* Generate numbers in the range 1..bound-1. Do it iterations times.
1610 * This function assumes that the value of bound is at least 2 and
1611 * that iterations is large enough that a one-in-2^iterations chance
1612 * effectively never occurs.
1613 */
1614
1615 mbedtls_mpi upper_bound;
1616 size_t n_bits;
1617 mbedtls_mpi result;
1618 size_t b;
1619 /* If upper_bound is small, stats[b] is the number of times the value b
1620 * has been generated. Otherwise stats[b] is the number of times a
1621 * value with bit b set has been generated. */
1622 size_t *stats = NULL;
1623 size_t stats_len;
1624 int full_stats;
1625 size_t i;
1626
1627 mbedtls_mpi_init( &upper_bound );
1628 mbedtls_mpi_init( &result );
1629
1630 TEST_EQUAL( 0, mbedtls_mpi_read_binary( &upper_bound,
1631 bound_bytes->x, bound_bytes->len ) );
1632 n_bits = mbedtls_mpi_bitlen( &upper_bound );
1633 /* Consider a bound "small" if it's less than 2^5. This value is chosen
1634 * to be small enough that the probability of missing one value is
1635 * negligible given the number of iterations. It must be less than
1636 * 256 because some of the code below assumes that "small" values
1637 * fit in a byte. */
1638 if( n_bits <= 5 )
1639 {
1640 full_stats = 1;
1641 stats_len = bound_bytes->x[bound_bytes->len - 1];
1642 }
1643 else
1644 {
1645 full_stats = 0;
1646 stats_len = n_bits;
1647 }
1648 ASSERT_ALLOC( stats, stats_len );
1649
1650 for( i = 0; i < (size_t) iterations; i++ )
1651 {
1652 mbedtls_test_set_step( i );
1653 TEST_EQUAL( 0, mbedtls_mpi_random( &result, min, &upper_bound,
1654 mbedtls_test_rnd_std_rand, NULL ) );
1655
Gilles Peskinedffc7102021-06-10 15:34:15 +02001656 TEST_ASSERT( sign_is_valid( &result ) );
Gilles Peskine02ac93a2021-03-29 22:02:55 +02001657 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &result, &upper_bound ) < 0 );
1658 TEST_ASSERT( mbedtls_mpi_cmp_int( &result, min ) >= 0 );
1659 if( full_stats )
1660 {
1661 uint8_t value;
1662 TEST_EQUAL( 0, mbedtls_mpi_write_binary( &result, &value, 1 ) );
1663 TEST_ASSERT( value < stats_len );
1664 ++stats[value];
1665 }
1666 else
1667 {
1668 for( b = 0; b < n_bits; b++ )
1669 stats[b] += mbedtls_mpi_get_bit( &result, b );
1670 }
1671 }
1672
1673 if( full_stats )
1674 {
Gilles Peskined463edf2021-04-13 20:45:05 +02001675 for( b = min; b < stats_len; b++ )
Gilles Peskine02ac93a2021-03-29 22:02:55 +02001676 {
1677 mbedtls_test_set_step( 1000000 + b );
1678 /* Assert that each value has been reached at least once.
1679 * This is almost guaranteed if the iteration count is large
1680 * enough. This is a very crude way of checking the distribution.
1681 */
1682 TEST_ASSERT( stats[b] > 0 );
1683 }
1684 }
1685 else
1686 {
Gilles Peskineceefe5d2021-06-02 21:24:04 +02001687 int statistically_safe_all_the_way =
1688 is_significantly_above_a_power_of_2( bound_bytes );
Gilles Peskine02ac93a2021-03-29 22:02:55 +02001689 for( b = 0; b < n_bits; b++ )
1690 {
1691 mbedtls_test_set_step( 1000000 + b );
1692 /* Assert that each bit has been set in at least one result and
1693 * clear in at least one result. Provided that iterations is not
1694 * too small, it would be extremely unlikely for this not to be
1695 * the case if the results are uniformly distributed.
1696 *
1697 * As an exception, the top bit may legitimately never be set
1698 * if bound is a power of 2 or only slightly above.
1699 */
Gilles Peskineceefe5d2021-06-02 21:24:04 +02001700 if( statistically_safe_all_the_way || b != n_bits - 1 )
Gilles Peskine02ac93a2021-03-29 22:02:55 +02001701 {
1702 TEST_ASSERT( stats[b] > 0 );
1703 }
1704 TEST_ASSERT( stats[b] < (size_t) iterations );
1705 }
1706 }
1707
1708exit:
1709 mbedtls_mpi_free( &upper_bound );
1710 mbedtls_mpi_free( &result );
1711 mbedtls_free( stats );
1712}
1713/* END_CASE */
1714
Gilles Peskine1e918f42021-03-29 22:14:51 +02001715/* BEGIN_CASE */
Gilles Peskine422e8672021-04-02 00:02:27 +02001716void mpi_random_sizes( int min, data_t *bound_bytes, int nlimbs, int before )
Gilles Peskine1a7df4e2021-04-01 15:57:18 +02001717{
1718 mbedtls_mpi upper_bound;
1719 mbedtls_mpi result;
1720
1721 mbedtls_mpi_init( &upper_bound );
1722 mbedtls_mpi_init( &result );
1723
Gilles Peskine422e8672021-04-02 00:02:27 +02001724 if( before != 0 )
1725 {
1726 /* Set result to sign(before) * 2^(|before|-1) */
1727 TEST_ASSERT( mbedtls_mpi_lset( &result, before > 0 ? 1 : -1 ) == 0 );
1728 if( before < 0 )
1729 before = - before;
1730 TEST_ASSERT( mbedtls_mpi_shift_l( &result, before - 1 ) == 0 );
1731 }
1732
Gilles Peskine1a7df4e2021-04-01 15:57:18 +02001733 TEST_EQUAL( 0, mbedtls_mpi_grow( &result, nlimbs ) );
1734 TEST_EQUAL( 0, mbedtls_mpi_read_binary( &upper_bound,
1735 bound_bytes->x, bound_bytes->len ) );
1736 TEST_EQUAL( 0, mbedtls_mpi_random( &result, min, &upper_bound,
1737 mbedtls_test_rnd_std_rand, NULL ) );
Gilles Peskinedffc7102021-06-10 15:34:15 +02001738 TEST_ASSERT( sign_is_valid( &result ) );
Gilles Peskine1a7df4e2021-04-01 15:57:18 +02001739 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &result, &upper_bound ) < 0 );
1740 TEST_ASSERT( mbedtls_mpi_cmp_int( &result, min ) >= 0 );
1741
1742exit:
1743 mbedtls_mpi_free( &upper_bound );
1744 mbedtls_mpi_free( &result );
1745}
1746/* END_CASE */
1747
1748/* BEGIN_CASE */
Gilles Peskine1e918f42021-03-29 22:14:51 +02001749void mpi_random_fail( int min, data_t *bound_bytes, int expected_ret )
1750{
1751 mbedtls_mpi upper_bound;
1752 mbedtls_mpi result;
1753 int actual_ret;
1754
1755 mbedtls_mpi_init( &upper_bound );
1756 mbedtls_mpi_init( &result );
1757
1758 TEST_EQUAL( 0, mbedtls_mpi_read_binary( &upper_bound,
1759 bound_bytes->x, bound_bytes->len ) );
1760 actual_ret = mbedtls_mpi_random( &result, min, &upper_bound,
1761 mbedtls_test_rnd_std_rand, NULL );
1762 TEST_EQUAL( expected_ret, actual_ret );
1763
1764exit:
1765 mbedtls_mpi_free( &upper_bound );
1766 mbedtls_mpi_free( &result );
1767}
1768/* END_CASE */
1769
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001770/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Azim Khanf1aaec92017-05-30 14:23:15 +01001771void mpi_selftest( )
Paul Bakkere896fea2009-07-06 06:40:23 +00001772{
Andres AG93012e82016-09-09 09:10:28 +01001773 TEST_ASSERT( mbedtls_mpi_self_test( 1 ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +00001774}
Paul Bakker33b43f12013-08-20 11:48:36 +02001775/* END_CASE */