blob: 1fcb005ed933c9eede7a453727d672b498c35350 [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/bignum.h"
Janos Follath0b741612018-09-05 17:04:49 +01003
4typedef struct mbedtls_test_mpi_random
5{
6 uint8_t *data;
7 uint32_t data_len;
8 size_t pos;
9 size_t chunk_len;
10} mbedtls_test_mpi_random;
11
12/*
13 * This function is called by the Miller-Rabin primality test each time it
14 * chooses a random witness. The witnesses (or non-witnesses as provided by the
15 * test) are stored in the data member of the state structure. Each number is in
16 * the format that mbedtls_mpi_read_string understands and is chunk_len long.
17 */
18int mbedtls_test_mpi_miller_rabin_determinizer( void* state,
19 unsigned char* buf,
20 size_t len )
21{
22 mbedtls_test_mpi_random *random = (mbedtls_test_mpi_random*) state;
23
24 if( random == NULL || random->data == NULL || buf == NULL )
25 return( -1 );
26
27 if( random->pos + random->chunk_len > random->data_len
28 || random->chunk_len > len )
29 {
30 return( -1 );
31 }
32
33 memset( buf, 0, len );
34
35 /* The witness is written to the end of the buffer, since the buffer is
36 * used as big endian, unsigned binary data in mbedtls_mpi_read_binary.
37 * Writing the witness to the start of the buffer would result in the
38 * buffer being 'witness 000...000', which would be treated as
39 * witness * 2^n for some n. */
40 memcpy( buf + len - random->chunk_len, &random->data[random->pos],
41 random->chunk_len );
42
43 random->pos += random->chunk_len;
44
45 return( 0 );
46}
Paul Bakker33b43f12013-08-20 11:48:36 +020047/* END_HEADER */
Paul Bakker367dae42009-06-28 21:50:27 +000048
Paul Bakker33b43f12013-08-20 11:48:36 +020049/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050 * depends_on:MBEDTLS_BIGNUM_C
Paul Bakker33b43f12013-08-20 11:48:36 +020051 * END_DEPENDENCIES
52 */
Paul Bakker5690efc2011-05-26 13:16:06 +000053
Paul Bakker33b43f12013-08-20 11:48:36 +020054/* BEGIN_CASE */
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +020055void mpi_null( )
56{
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +020057 mbedtls_mpi X, Y, Z;
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +020058
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +020059 mbedtls_mpi_init( &X );
60 mbedtls_mpi_init( &Y );
61 mbedtls_mpi_init( &Z );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +020062
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +020063 TEST_ASSERT( mbedtls_mpi_get_bit( &X, 42 ) == 0 );
64 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +020065 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == 0 );
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +020066 TEST_ASSERT( mbedtls_mpi_size( &X ) == 0 );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +020067
68exit:
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +020069 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +020070}
71/* END_CASE */
72
73/* BEGIN_CASE */
Paul Bakker33b43f12013-08-20 11:48:36 +020074void mpi_read_write_string( int radix_X, char *input_X, int radix_A,
75 char *input_A, int output_size, int result_read,
76 int result_write )
Paul Bakker367dae42009-06-28 21:50:27 +000077{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020078 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +000079 char str[1000];
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +010080 size_t len;
Paul Bakker367dae42009-06-28 21:50:27 +000081
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020082 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +000083
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020084 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == result_read );
Paul Bakker33b43f12013-08-20 11:48:36 +020085 if( result_read == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +000086 {
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +010087 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, str, output_size, &len ) == result_write );
Paul Bakker33b43f12013-08-20 11:48:36 +020088 if( result_write == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +000089 {
Paul Bakker33b43f12013-08-20 11:48:36 +020090 TEST_ASSERT( strcasecmp( str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +000091 }
92 }
Paul Bakker6c591fa2011-05-05 11:49:20 +000093
Paul Bakkerbd51b262014-07-10 15:26:12 +020094exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020095 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000096}
Paul Bakker33b43f12013-08-20 11:48:36 +020097/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000098
Paul Bakker33b43f12013-08-20 11:48:36 +020099/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200100void mbedtls_mpi_read_binary( char *input_X, int radix_A, char *input_A )
Paul Bakkere896fea2009-07-06 06:40:23 +0000101{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200102 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000103 unsigned char str[1000];
104 unsigned char buf[1000];
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100105 size_t len;
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000106 size_t input_len;
Paul Bakkere896fea2009-07-06 06:40:23 +0000107
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200108 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000109
Paul Bakker33b43f12013-08-20 11:48:36 +0200110 input_len = unhexify( buf, input_X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000111
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200112 TEST_ASSERT( mbedtls_mpi_read_binary( &X, buf, input_len ) == 0 );
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +0100113 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, (char *) str, sizeof( str ), &len ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +0200114 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000115
Paul Bakkerbd51b262014-07-10 15:26:12 +0200116exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200117 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000118}
Paul Bakker33b43f12013-08-20 11:48:36 +0200119/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000120
Paul Bakker33b43f12013-08-20 11:48:36 +0200121/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200122void mbedtls_mpi_write_binary( int radix_X, char *input_X, char *input_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200123 int output_size, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000124{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200125 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000126 unsigned char str[1000];
127 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000128 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +0000129
130 memset( buf, 0x00, 1000 );
131 memset( str, 0x00, 1000 );
132
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200133 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000134
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200135 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +0100136
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200137 buflen = mbedtls_mpi_size( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +0200138 if( buflen > (size_t) output_size )
139 buflen = (size_t) output_size;
Paul Bakkere896fea2009-07-06 06:40:23 +0000140
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200141 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == result );
Paul Bakker33b43f12013-08-20 11:48:36 +0200142 if( result == 0)
Paul Bakkerba48cb22009-07-12 11:01:32 +0000143 {
144 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +0000145
Paul Bakker33b43f12013-08-20 11:48:36 +0200146 TEST_ASSERT( strcasecmp( (char *) str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000147 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000148
Paul Bakkerbd51b262014-07-10 15:26:12 +0200149exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200150 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000151}
Paul Bakker33b43f12013-08-20 11:48:36 +0200152/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000153
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200154/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
155void mbedtls_mpi_read_file( int radix_X, char *input_file, char *input_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200156 int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000157{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200158 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000159 unsigned char str[1000];
160 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000161 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +0000162 FILE *file;
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000163 int ret;
Paul Bakkere896fea2009-07-06 06:40:23 +0000164
165 memset( buf, 0x00, 1000 );
166 memset( str, 0x00, 1000 );
167
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200168 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000169
Paul Bakker33b43f12013-08-20 11:48:36 +0200170 file = fopen( input_file, "r" );
Paul Bakker8a0c0a92014-04-17 16:08:20 +0200171 TEST_ASSERT( file != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200172 ret = mbedtls_mpi_read_file( &X, radix_X, file );
Paul Bakkere896fea2009-07-06 06:40:23 +0000173 fclose(file);
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000174 TEST_ASSERT( ret == result );
Paul Bakkere896fea2009-07-06 06:40:23 +0000175
Paul Bakker33b43f12013-08-20 11:48:36 +0200176 if( result == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000177 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200178 buflen = mbedtls_mpi_size( &X );
179 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000180
Paul Bakkerba48cb22009-07-12 11:01:32 +0000181 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +0000182
Paul Bakker33b43f12013-08-20 11:48:36 +0200183 TEST_ASSERT( strcasecmp( (char *) str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000184 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000185
Paul Bakkerbd51b262014-07-10 15:26:12 +0200186exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200187 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000188}
Paul Bakker33b43f12013-08-20 11:48:36 +0200189/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000190
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200191/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
192void mbedtls_mpi_write_file( int radix_X, char *input_X, int output_radix,
Paul Bakker33b43f12013-08-20 11:48:36 +0200193 char *output_file )
Paul Bakkere896fea2009-07-06 06:40:23 +0000194{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200195 mbedtls_mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000196 FILE *file_out, *file_in;
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200197 int ret;
Paul Bakker69998dd2009-07-11 19:15:20 +0000198
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200199 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000200
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200201 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000202
Paul Bakker33b43f12013-08-20 11:48:36 +0200203 file_out = fopen( output_file, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000204 TEST_ASSERT( file_out != NULL );
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200205 ret = mbedtls_mpi_write_file( NULL, &X, output_radix, file_out );
Paul Bakkere896fea2009-07-06 06:40:23 +0000206 fclose(file_out);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200207 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000208
Paul Bakker33b43f12013-08-20 11:48:36 +0200209 file_in = fopen( output_file, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000210 TEST_ASSERT( file_in != NULL );
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200211 ret = mbedtls_mpi_read_file( &Y, output_radix, file_in );
Paul Bakkere896fea2009-07-06 06:40:23 +0000212 fclose(file_in);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200213 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000214
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200215 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000216
Paul Bakkerbd51b262014-07-10 15:26:12 +0200217exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200218 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000219}
Paul Bakker33b43f12013-08-20 11:48:36 +0200220/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000221
Paul Bakker33b43f12013-08-20 11:48:36 +0200222/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200223void mbedtls_mpi_get_bit( int radix_X, char *input_X, int pos, int val )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000224{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200225 mbedtls_mpi X;
226 mbedtls_mpi_init( &X );
227 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
228 TEST_ASSERT( mbedtls_mpi_get_bit( &X, pos ) == val );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000229
Paul Bakkerbd51b262014-07-10 15:26:12 +0200230exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200231 mbedtls_mpi_free( &X );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000232}
Paul Bakker33b43f12013-08-20 11:48:36 +0200233/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000234
Paul Bakker33b43f12013-08-20 11:48:36 +0200235/* BEGIN_CASE */
Paul Bakkerec5ceb62016-07-14 12:47:07 +0100236void mbedtls_mpi_set_bit( int radix_X, char *input_X, int pos, int val,
237 int radix_Y, char *output_Y, int result )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000238{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200239 mbedtls_mpi X, Y;
240 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000241
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200242 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
243 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, output_Y ) == 0 );
Paul Bakkerec5ceb62016-07-14 12:47:07 +0100244 TEST_ASSERT( mbedtls_mpi_set_bit( &X, pos, val ) == result );
245
246 if( result == 0 )
247 {
248 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
249 }
Paul Bakker2f5947e2011-05-18 15:47:11 +0000250
Paul Bakkerbd51b262014-07-10 15:26:12 +0200251exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200252 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000253}
Paul Bakker33b43f12013-08-20 11:48:36 +0200254/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000255
Paul Bakker33b43f12013-08-20 11:48:36 +0200256/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200257void mbedtls_mpi_lsb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000258{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200259 mbedtls_mpi X;
260 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000261
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200262 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
263 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000264
Paul Bakkerbd51b262014-07-10 15:26:12 +0200265exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200266 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000267}
Paul Bakker33b43f12013-08-20 11:48:36 +0200268/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000269
Paul Bakker33b43f12013-08-20 11:48:36 +0200270/* BEGIN_CASE */
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200271void mbedtls_mpi_bitlen( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000272{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200273 mbedtls_mpi X;
274 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000275
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200276 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200277 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000278
Paul Bakkerbd51b262014-07-10 15:26:12 +0200279exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200280 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000281}
Paul Bakker33b43f12013-08-20 11:48:36 +0200282/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000283
Paul Bakker33b43f12013-08-20 11:48:36 +0200284/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200285void mbedtls_mpi_gcd( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200286 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000287{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200288 mbedtls_mpi A, X, Y, Z;
289 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000290
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200291 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
292 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
293 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
294 TEST_ASSERT( mbedtls_mpi_gcd( &Z, &X, &Y ) == 0 );
295 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000296
Paul Bakkerbd51b262014-07-10 15:26:12 +0200297exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200298 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000299}
Paul Bakker33b43f12013-08-20 11:48:36 +0200300/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000301
Paul Bakker33b43f12013-08-20 11:48:36 +0200302/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200303void mbedtls_mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000304{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200305 mbedtls_mpi X;
306 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000307
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200308 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0);
309 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000310
Paul Bakkerbd51b262014-07-10 15:26:12 +0200311exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200312 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000313}
Paul Bakker33b43f12013-08-20 11:48:36 +0200314/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000315
Paul Bakker33b43f12013-08-20 11:48:36 +0200316/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200317void mbedtls_mpi_cmp_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200318 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000319{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200320 mbedtls_mpi X, Y;
321 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000322
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200323 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
324 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
325 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000326
Paul Bakkerbd51b262014-07-10 15:26:12 +0200327exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200328 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000329}
Paul Bakker33b43f12013-08-20 11:48:36 +0200330/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000331
Paul Bakker33b43f12013-08-20 11:48:36 +0200332/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200333void mbedtls_mpi_cmp_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200334 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000335{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200336 mbedtls_mpi X, Y;
337 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000338
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200339 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
340 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
341 TEST_ASSERT( mbedtls_mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000342
Paul Bakkerbd51b262014-07-10 15:26:12 +0200343exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200344 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000345}
Paul Bakker33b43f12013-08-20 11:48:36 +0200346/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000347
Paul Bakker33b43f12013-08-20 11:48:36 +0200348/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200349void mbedtls_mpi_copy( int input_X, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000350{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200351 mbedtls_mpi X, Y, A;
352 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000353
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200354 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
355 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_A ) == 0 );
356 TEST_ASSERT( mbedtls_mpi_lset( &A, input_A ) == 0 );
357 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
358 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
359 TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 );
360 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
361 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) != 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000362
Paul Bakkerbd51b262014-07-10 15:26:12 +0200363exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200364 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000365}
Paul Bakker33b43f12013-08-20 11:48:36 +0200366/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000367
Paul Bakker33b43f12013-08-20 11:48:36 +0200368/* BEGIN_CASE */
369void mpi_copy_self( int input_X )
Paul Bakkere896fea2009-07-06 06:40:23 +0000370{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200371 mbedtls_mpi X;
372 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000373
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200374 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
375 TEST_ASSERT( mbedtls_mpi_copy( &X, &X ) == 0 );
376 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000377
Paul Bakkerbd51b262014-07-10 15:26:12 +0200378exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200379 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000380}
Paul Bakker33b43f12013-08-20 11:48:36 +0200381/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000382
Paul Bakker33b43f12013-08-20 11:48:36 +0200383/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200384void mbedtls_mpi_shrink( int before, int used, int min, int after )
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100385{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200386 mbedtls_mpi X;
387 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100388
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389 TEST_ASSERT( mbedtls_mpi_grow( &X, before ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100390 TEST_ASSERT( used <= before );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200391 memset( X.p, 0x2a, used * sizeof( mbedtls_mpi_uint ) );
392 TEST_ASSERT( mbedtls_mpi_shrink( &X, min ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100393 TEST_ASSERT( X.n == (size_t) after );
394
Paul Bakkerbd51b262014-07-10 15:26:12 +0200395exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200396 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100397}
398/* END_CASE */
399
400/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200401void mbedtls_mpi_safe_cond_assign( int x_sign, char *x_str,
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100402 int y_sign, char *y_str )
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100403{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200404 mbedtls_mpi X, Y, XX;
405 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100406
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200407 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100408 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100410 Y.s = y_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200411 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200413 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 0 ) == 0 );
414 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100415
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200416 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 1 ) == 0 );
417 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100418
Paul Bakkerbd51b262014-07-10 15:26:12 +0200419exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200420 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100421}
422/* END_CASE */
423
424/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200425void mbedtls_mpi_safe_cond_swap( int x_sign, char *x_str,
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100426 int y_sign, char *y_str )
427{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200428 mbedtls_mpi X, Y, XX, YY;
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100429
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200430 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
431 mbedtls_mpi_init( &XX ); mbedtls_mpi_init( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100432
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200433 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100434 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200435 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100436 Y.s = y_sign;
437
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200438 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
439 TEST_ASSERT( mbedtls_mpi_copy( &YY, &Y ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100440
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200441 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
442 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
443 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 1 ) == 0 );
446 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &XX ) == 0 );
447 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100448
Paul Bakkerbd51b262014-07-10 15:26:12 +0200449exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200450 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
451 mbedtls_mpi_free( &XX ); mbedtls_mpi_free( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100452}
453/* END_CASE */
454
455/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200456void mbedtls_mpi_swap( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000457{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200458 mbedtls_mpi X, Y, A;
459 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000460
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200461 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
462 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 );
463 TEST_ASSERT( mbedtls_mpi_lset( &A, input_X ) == 0 );
464 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
465 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
466 mbedtls_mpi_swap( &X, &Y );
467 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
468 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000469
Paul Bakkerbd51b262014-07-10 15:26:12 +0200470exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200471 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000472}
Paul Bakker33b43f12013-08-20 11:48:36 +0200473/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000474
Paul Bakker33b43f12013-08-20 11:48:36 +0200475/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200476void mbedtls_mpi_add_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200477 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000478{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200479 mbedtls_mpi X, Y, Z, A;
480 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000481
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200482 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
483 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
484 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
485 TEST_ASSERT( mbedtls_mpi_add_mpi( &Z, &X, &Y ) == 0 );
486 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000487
Paul Bakkerbd51b262014-07-10 15:26:12 +0200488exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200489 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000490}
Paul Bakker33b43f12013-08-20 11:48:36 +0200491/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000492
Paul Bakker33b43f12013-08-20 11:48:36 +0200493/* BEGIN_CASE */
Janos Follath044a86b2015-10-25 10:58:03 +0100494void mbedtls_mpi_add_mpi_inplace( int radix_X, char *input_X, int radix_A, char *input_A )
495{
496 mbedtls_mpi X, A;
497 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
498
Janos Follath044a86b2015-10-25 10:58:03 +0100499 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +0100500
501 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
502 TEST_ASSERT( mbedtls_mpi_sub_abs( &X, &X, &X ) == 0 );
503 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, 0 ) == 0 );
504
505 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
506 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &X ) == 0 );
507 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
508
509 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Janos Follath044a86b2015-10-25 10:58:03 +0100510 TEST_ASSERT( mbedtls_mpi_add_mpi( &X, &X, &X ) == 0 );
511 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
512
513exit:
514 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
515}
516/* END_CASE */
517
518
519/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200520void mbedtls_mpi_add_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200521 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000522{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200523 mbedtls_mpi X, Y, Z, A;
524 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000525
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200526 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
527 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
528 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
529 TEST_ASSERT( mbedtls_mpi_add_abs( &Z, &X, &Y ) == 0 );
530 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000531
Paul Bakkerbd51b262014-07-10 15:26:12 +0200532exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200533 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000534}
Paul Bakker33b43f12013-08-20 11:48:36 +0200535/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000536
Paul Bakker33b43f12013-08-20 11:48:36 +0200537/* BEGIN_CASE */
538void mpi_add_abs_add_first( int radix_X, char *input_X, int radix_Y,
539 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000540{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200541 mbedtls_mpi X, Y, A;
542 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000543
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200544 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
545 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
546 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
547 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &Y ) == 0 );
548 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000549
Paul Bakkerbd51b262014-07-10 15:26:12 +0200550exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200551 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000552}
Paul Bakker33b43f12013-08-20 11:48:36 +0200553/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000554
Paul Bakker33b43f12013-08-20 11:48:36 +0200555/* BEGIN_CASE */
556void mpi_add_abs_add_second( int radix_X, char *input_X, int radix_Y,
557 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000558{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200559 mbedtls_mpi X, Y, A;
560 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000561
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200562 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
563 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
564 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
565 TEST_ASSERT( mbedtls_mpi_add_abs( &Y, &X, &Y ) == 0 );
566 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000567
Paul Bakkerbd51b262014-07-10 15:26:12 +0200568exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200569 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000570}
Paul Bakker33b43f12013-08-20 11:48:36 +0200571/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000572
Paul Bakker33b43f12013-08-20 11:48:36 +0200573/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574void mbedtls_mpi_add_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200575 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000576{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200577 mbedtls_mpi X, Z, A;
578 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000579
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200580 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
581 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
582 TEST_ASSERT( mbedtls_mpi_add_int( &Z, &X, input_Y ) == 0 );
583 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000584
Paul Bakkerbd51b262014-07-10 15:26:12 +0200585exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200586 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000587}
Paul Bakker33b43f12013-08-20 11:48:36 +0200588/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000589
Paul Bakker33b43f12013-08-20 11:48:36 +0200590/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200591void mbedtls_mpi_sub_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200592 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000593{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200594 mbedtls_mpi X, Y, Z, A;
595 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000596
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200597 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
598 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
599 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
600 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Z, &X, &Y ) == 0 );
601 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000602
Paul Bakkerbd51b262014-07-10 15:26:12 +0200603exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200604 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000605}
Paul Bakker33b43f12013-08-20 11:48:36 +0200606/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000607
Paul Bakker33b43f12013-08-20 11:48:36 +0200608/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200609void mbedtls_mpi_sub_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200610 int radix_A, char *input_A, int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000611{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200612 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000613 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200614 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000615
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200616 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
617 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
618 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +0100619
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200620 res = mbedtls_mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200621 TEST_ASSERT( res == sub_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000622 if( res == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200623 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000624
Paul Bakkerbd51b262014-07-10 15:26:12 +0200625exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200626 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000627}
Paul Bakker33b43f12013-08-20 11:48:36 +0200628/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000629
Paul Bakker33b43f12013-08-20 11:48:36 +0200630/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200631void mbedtls_mpi_sub_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200632 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000633{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200634 mbedtls_mpi X, Z, A;
635 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000636
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200637 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
638 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
639 TEST_ASSERT( mbedtls_mpi_sub_int( &Z, &X, input_Y ) == 0 );
640 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000641
Paul Bakkerbd51b262014-07-10 15:26:12 +0200642exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200643 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000644}
Paul Bakker33b43f12013-08-20 11:48:36 +0200645/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000646
Paul Bakker33b43f12013-08-20 11:48:36 +0200647/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200648void mbedtls_mpi_mul_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200649 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000650{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200651 mbedtls_mpi X, Y, Z, A;
652 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000653
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200654 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
655 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
656 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
657 TEST_ASSERT( mbedtls_mpi_mul_mpi( &Z, &X, &Y ) == 0 );
658 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000659
Paul Bakkerbd51b262014-07-10 15:26:12 +0200660exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200661 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000662}
Paul Bakker33b43f12013-08-20 11:48:36 +0200663/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000664
Paul Bakker33b43f12013-08-20 11:48:36 +0200665/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200666void mbedtls_mpi_mul_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200667 char *input_A, char *result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +0000668{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200669 mbedtls_mpi X, Z, A;
670 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000671
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
673 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
674 TEST_ASSERT( mbedtls_mpi_mul_int( &Z, &X, input_Y ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200675 if( strcmp( result_comparison, "==" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200676 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200677 else if( strcmp( result_comparison, "!=" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200678 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) != 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200679 else
680 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000681
Paul Bakkerbd51b262014-07-10 15:26:12 +0200682exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200683 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000684}
Paul Bakker33b43f12013-08-20 11:48:36 +0200685/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000686
Paul Bakker33b43f12013-08-20 11:48:36 +0200687/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200688void mbedtls_mpi_div_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200689 int radix_A, char *input_A, int radix_B, char *input_B,
690 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000691{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200692 mbedtls_mpi X, Y, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000693 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200694 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R );
695 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000696
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200697 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
698 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
699 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
700 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
701 res = mbedtls_mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200702 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000703 if( res == 0 )
704 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200705 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
706 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000707 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000708
Paul Bakkerbd51b262014-07-10 15:26:12 +0200709exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200710 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R );
711 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000712}
Paul Bakker33b43f12013-08-20 11:48:36 +0200713/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000714
Paul Bakker33b43f12013-08-20 11:48:36 +0200715/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200716void mbedtls_mpi_div_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200717 char *input_A, int radix_B, char *input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000718{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200719 mbedtls_mpi X, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000720 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200721 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &A );
722 mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000723
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200724 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
725 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
726 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
727 res = mbedtls_mpi_div_int( &Q, &R, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200728 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000729 if( res == 0 )
730 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200731 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
732 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000733 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000734
Paul Bakkerbd51b262014-07-10 15:26:12 +0200735exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200736 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &A );
737 mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000738}
Paul Bakker33b43f12013-08-20 11:48:36 +0200739/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000740
Paul Bakker33b43f12013-08-20 11:48:36 +0200741/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200742void mbedtls_mpi_mod_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200743 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000744{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200745 mbedtls_mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000746 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200747 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000748
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200749 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
750 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
751 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
752 res = mbedtls_mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200753 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000754 if( res == 0 )
755 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200756 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000757 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000758
Paul Bakkerbd51b262014-07-10 15:26:12 +0200759exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200760 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000761}
Paul Bakker33b43f12013-08-20 11:48:36 +0200762/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000763
Paul Bakker33b43f12013-08-20 11:48:36 +0200764/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200765void mbedtls_mpi_mod_int( int radix_X, char *input_X, int input_Y, int input_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200766 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000767{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200768 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000769 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200770 mbedtls_mpi_uint r;
771 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000772
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200773 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
774 res = mbedtls_mpi_mod_int( &r, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200775 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000776 if( res == 0 )
777 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200778 TEST_ASSERT( r == (mbedtls_mpi_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +0000779 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000780
Paul Bakkerbd51b262014-07-10 15:26:12 +0200781exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200782 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000783}
Paul Bakker33b43f12013-08-20 11:48:36 +0200784/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000785
Paul Bakker33b43f12013-08-20 11:48:36 +0200786/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200787void mbedtls_mpi_exp_mod( int radix_A, char *input_A, int radix_E, char *input_E,
Paul Bakker33b43f12013-08-20 11:48:36 +0200788 int radix_N, char *input_N, int radix_RR, char *input_RR,
789 int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000790{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200791 mbedtls_mpi A, E, N, RR, Z, X;
Paul Bakker367dae42009-06-28 21:50:27 +0000792 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200793 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
794 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000795
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200796 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
797 TEST_ASSERT( mbedtls_mpi_read_string( &E, radix_E, input_E ) == 0 );
798 TEST_ASSERT( mbedtls_mpi_read_string( &N, radix_N, input_N ) == 0 );
799 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000800
Paul Bakker33b43f12013-08-20 11:48:36 +0200801 if( strlen( input_RR ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200802 TEST_ASSERT( mbedtls_mpi_read_string( &RR, radix_RR, input_RR ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000803
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200804 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR );
Paul Bakker33b43f12013-08-20 11:48:36 +0200805 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000806 if( res == 0 )
807 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200808 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000809 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000810
Paul Bakkerbd51b262014-07-10 15:26:12 +0200811exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200812 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
813 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000814}
Paul Bakker33b43f12013-08-20 11:48:36 +0200815/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000816
Paul Bakker33b43f12013-08-20 11:48:36 +0200817/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200818void mbedtls_mpi_inv_mod( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200819 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000820{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200821 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000822 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200823 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000824
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200825 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
826 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
827 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
828 res = mbedtls_mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200829 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000830 if( res == 0 )
831 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200832 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000833 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000834
Paul Bakkerbd51b262014-07-10 15:26:12 +0200835exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200836 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000837}
Paul Bakker33b43f12013-08-20 11:48:36 +0200838/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000839
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200840/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
841void mbedtls_mpi_is_prime( int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000842{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200843 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000844 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200845 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000846
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200847 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
848 res = mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200849 TEST_ASSERT( res == div_result );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000850
Paul Bakkerbd51b262014-07-10 15:26:12 +0200851exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200852 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000853}
Paul Bakker33b43f12013-08-20 11:48:36 +0200854/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000855
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200856/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Janos Follath0b741612018-09-05 17:04:49 +0100857void mbedtls_mpi_is_prime_det( char *input_X, char *witnesses,
858 int chunk_len, int div_result )
859{
860 mbedtls_mpi X;
861 int res;
862 mbedtls_test_mpi_random rand;
863 uint8_t witness_buf[1000];
864 uint8_t input_buf[1000];
865 size_t witness_len;
866 size_t input_len;
867
868 witness_len = unhexify( witness_buf, witnesses );
869 input_len = unhexify( input_buf, input_X );
870
871 mbedtls_mpi_init( &X );
872 rand.data = witness_buf;
873 rand.data_len = witness_len;
874 rand.pos = 0;
875 rand.chunk_len = chunk_len;
876
877 TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_buf, input_len ) == 0 );
878 res = mbedtls_mpi_is_prime( &X, mbedtls_test_mpi_miller_rabin_determinizer,
879 &rand );
880 TEST_ASSERT( res == div_result );
881
882exit:
883 mbedtls_mpi_free( &X );
884}
885/* END_CASE */
886
887/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200888void mbedtls_mpi_gen_prime( int bits, int safe, int ref_ret )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200889{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200890 mbedtls_mpi X;
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200891 int my_ret;
892
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200893 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200894
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200895 my_ret = mbedtls_mpi_gen_prime( &X, bits, safe, rnd_std_rand, NULL );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200896 TEST_ASSERT( my_ret == ref_ret );
897
898 if( ref_ret == 0 )
899 {
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200900 size_t actual_bits = mbedtls_mpi_bitlen( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200901
902 TEST_ASSERT( actual_bits >= (size_t) bits );
903 TEST_ASSERT( actual_bits <= (size_t) bits + 1 );
904
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200905 TEST_ASSERT( mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200906 if( safe )
907 {
Hanno Beckerd4d60572018-01-10 07:12:01 +0000908 /* X = ( X - 1 ) / 2 */
909 TEST_ASSERT( mbedtls_mpi_shift_r( &X, 1 ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200910 TEST_ASSERT( mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200911 }
912 }
913
Paul Bakkerbd51b262014-07-10 15:26:12 +0200914exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200915 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200916}
917/* END_CASE */
918
Paul Bakker33b43f12013-08-20 11:48:36 +0200919/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200920void mbedtls_mpi_shift_l( int radix_X, char *input_X, int shift_X, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200921 char *input_A)
Paul Bakker367dae42009-06-28 21:50:27 +0000922{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200923 mbedtls_mpi X, A;
924 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000925
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200926 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
927 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
928 TEST_ASSERT( mbedtls_mpi_shift_l( &X, shift_X ) == 0 );
929 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000930
Paul Bakkerbd51b262014-07-10 15:26:12 +0200931exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200932 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000933}
Paul Bakker33b43f12013-08-20 11:48:36 +0200934/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000935
Paul Bakker33b43f12013-08-20 11:48:36 +0200936/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200937void mbedtls_mpi_shift_r( int radix_X, char *input_X, int shift_X, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200938 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000939{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200940 mbedtls_mpi X, A;
941 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000942
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200943 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
944 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
945 TEST_ASSERT( mbedtls_mpi_shift_r( &X, shift_X ) == 0 );
946 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000947
Paul Bakkerbd51b262014-07-10 15:26:12 +0200948exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200949 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000950}
Paul Bakker33b43f12013-08-20 11:48:36 +0200951/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000952
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200953/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Paul Bakker33b43f12013-08-20 11:48:36 +0200954void mpi_selftest()
Paul Bakkere896fea2009-07-06 06:40:23 +0000955{
Andres AG93012e82016-09-09 09:10:28 +0100956 TEST_ASSERT( mbedtls_mpi_self_test( 1 ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000957}
Paul Bakker33b43f12013-08-20 11:48:36 +0200958/* END_CASE */