blob: 0aee445433a05b2cbed18e3cd69861a9fa332bc2 [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 Follath18b08c62018-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é-Gonnardfd1f9e72015-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 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200236void mbedtls_mpi_set_bit( int radix_X, char *input_X, int pos, int val, int radix_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200237 char *output_Y )
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 );
244 TEST_ASSERT( mbedtls_mpi_set_bit( &X, pos, val ) == 0 );
245 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000246
Paul Bakkerbd51b262014-07-10 15:26:12 +0200247exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200248 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000249}
Paul Bakker33b43f12013-08-20 11:48:36 +0200250/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000251
Paul Bakker33b43f12013-08-20 11:48:36 +0200252/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200253void mbedtls_mpi_lsb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000254{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200255 mbedtls_mpi X;
256 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000257
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200258 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
259 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000260
Paul Bakkerbd51b262014-07-10 15:26:12 +0200261exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200262 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000263}
Paul Bakker33b43f12013-08-20 11:48:36 +0200264/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000265
Paul Bakker33b43f12013-08-20 11:48:36 +0200266/* BEGIN_CASE */
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200267void mbedtls_mpi_bitlen( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000268{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200269 mbedtls_mpi X;
270 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000271
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200272 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200273 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000274
Paul Bakkerbd51b262014-07-10 15:26:12 +0200275exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200276 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000277}
Paul Bakker33b43f12013-08-20 11:48:36 +0200278/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000279
Paul Bakker33b43f12013-08-20 11:48:36 +0200280/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200281void mbedtls_mpi_gcd( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200282 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000283{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200284 mbedtls_mpi A, X, Y, Z;
285 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000286
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200287 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
288 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
289 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
290 TEST_ASSERT( mbedtls_mpi_gcd( &Z, &X, &Y ) == 0 );
291 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000292
Paul Bakkerbd51b262014-07-10 15:26:12 +0200293exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200294 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000295}
Paul Bakker33b43f12013-08-20 11:48:36 +0200296/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000297
Paul Bakker33b43f12013-08-20 11:48:36 +0200298/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200299void mbedtls_mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000300{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200301 mbedtls_mpi X;
302 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000303
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200304 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0);
305 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000306
Paul Bakkerbd51b262014-07-10 15:26:12 +0200307exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200308 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000309}
Paul Bakker33b43f12013-08-20 11:48:36 +0200310/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000311
Paul Bakker33b43f12013-08-20 11:48:36 +0200312/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200313void mbedtls_mpi_cmp_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200314 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000315{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200316 mbedtls_mpi X, Y;
317 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000318
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200319 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
320 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
321 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000322
Paul Bakkerbd51b262014-07-10 15:26:12 +0200323exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200324 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000325}
Paul Bakker33b43f12013-08-20 11:48:36 +0200326/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000327
Paul Bakker33b43f12013-08-20 11:48:36 +0200328/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200329void mbedtls_mpi_cmp_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200330 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000331{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200332 mbedtls_mpi X, Y;
333 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000334
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200335 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
336 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
337 TEST_ASSERT( mbedtls_mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000338
Paul Bakkerbd51b262014-07-10 15:26:12 +0200339exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200340 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000341}
Paul Bakker33b43f12013-08-20 11:48:36 +0200342/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000343
Paul Bakker33b43f12013-08-20 11:48:36 +0200344/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200345void mbedtls_mpi_copy( int input_X, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000346{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200347 mbedtls_mpi X, Y, A;
348 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200350 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
351 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_A ) == 0 );
352 TEST_ASSERT( mbedtls_mpi_lset( &A, input_A ) == 0 );
353 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
354 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
355 TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 );
356 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
357 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) != 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000358
Paul Bakkerbd51b262014-07-10 15:26:12 +0200359exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200360 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000361}
Paul Bakker33b43f12013-08-20 11:48:36 +0200362/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000363
Paul Bakker33b43f12013-08-20 11:48:36 +0200364/* BEGIN_CASE */
365void mpi_copy_self( int input_X )
Paul Bakkere896fea2009-07-06 06:40:23 +0000366{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200367 mbedtls_mpi X;
368 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000369
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200370 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
371 TEST_ASSERT( mbedtls_mpi_copy( &X, &X ) == 0 );
372 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000373
Paul Bakkerbd51b262014-07-10 15:26:12 +0200374exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000376}
Paul Bakker33b43f12013-08-20 11:48:36 +0200377/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000378
Paul Bakker33b43f12013-08-20 11:48:36 +0200379/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200380void mbedtls_mpi_shrink( int before, int used, int min, int after )
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100381{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200382 mbedtls_mpi X;
383 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100384
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200385 TEST_ASSERT( mbedtls_mpi_grow( &X, before ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100386 TEST_ASSERT( used <= before );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200387 memset( X.p, 0x2a, used * sizeof( mbedtls_mpi_uint ) );
388 TEST_ASSERT( mbedtls_mpi_shrink( &X, min ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100389 TEST_ASSERT( X.n == (size_t) after );
390
Paul Bakkerbd51b262014-07-10 15:26:12 +0200391exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200392 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100393}
394/* END_CASE */
395
396/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200397void mbedtls_mpi_safe_cond_assign( int x_sign, char *x_str,
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100398 int y_sign, char *y_str )
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100399{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200400 mbedtls_mpi X, Y, XX;
401 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100402
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200403 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100404 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200405 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100406 Y.s = y_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200407 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100408
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 0 ) == 0 );
410 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100411
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200412 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 1 ) == 0 );
413 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100414
Paul Bakkerbd51b262014-07-10 15:26:12 +0200415exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200416 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100417}
418/* END_CASE */
419
420/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200421void mbedtls_mpi_safe_cond_swap( int x_sign, char *x_str,
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100422 int y_sign, char *y_str )
423{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200424 mbedtls_mpi X, Y, XX, YY;
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100425
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200426 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
427 mbedtls_mpi_init( &XX ); mbedtls_mpi_init( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100428
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200429 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100430 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200431 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100432 Y.s = y_sign;
433
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200434 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
435 TEST_ASSERT( mbedtls_mpi_copy( &YY, &Y ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100436
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200437 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
438 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
439 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &YY ) == 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, 1 ) == 0 );
442 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &XX ) == 0 );
443 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100444
Paul Bakkerbd51b262014-07-10 15:26:12 +0200445exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200446 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
447 mbedtls_mpi_free( &XX ); mbedtls_mpi_free( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100448}
449/* END_CASE */
450
451/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200452void mbedtls_mpi_swap( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000453{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200454 mbedtls_mpi X, Y, A;
455 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000456
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200457 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
458 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 );
459 TEST_ASSERT( mbedtls_mpi_lset( &A, input_X ) == 0 );
460 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
461 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
462 mbedtls_mpi_swap( &X, &Y );
463 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
464 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000465
Paul Bakkerbd51b262014-07-10 15:26:12 +0200466exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200467 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000468}
Paul Bakker33b43f12013-08-20 11:48:36 +0200469/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000470
Paul Bakker33b43f12013-08-20 11:48:36 +0200471/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200472void mbedtls_mpi_add_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200473 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000474{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200475 mbedtls_mpi X, Y, Z, A;
476 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000477
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200478 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
479 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
480 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
481 TEST_ASSERT( mbedtls_mpi_add_mpi( &Z, &X, &Y ) == 0 );
482 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000483
Paul Bakkerbd51b262014-07-10 15:26:12 +0200484exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200485 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000486}
Paul Bakker33b43f12013-08-20 11:48:36 +0200487/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000488
Paul Bakker33b43f12013-08-20 11:48:36 +0200489/* BEGIN_CASE */
Janos Follathd0e0c032015-10-25 10:58:03 +0100490void mbedtls_mpi_add_mpi_inplace( int radix_X, char *input_X, int radix_A, char *input_A )
491{
492 mbedtls_mpi X, A;
493 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
494
Janos Follathd0e0c032015-10-25 10:58:03 +0100495 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Janos Follath5429c0a2015-10-25 12:29:13 +0100496
497 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
498 TEST_ASSERT( mbedtls_mpi_sub_abs( &X, &X, &X ) == 0 );
499 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, 0 ) == 0 );
500
501 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
502 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &X ) == 0 );
503 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
504
505 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Janos Follathd0e0c032015-10-25 10:58:03 +0100506 TEST_ASSERT( mbedtls_mpi_add_mpi( &X, &X, &X ) == 0 );
507 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
508
509exit:
510 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
511}
512/* END_CASE */
513
514
515/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200516void mbedtls_mpi_add_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200517 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000518{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200519 mbedtls_mpi X, Y, Z, A;
520 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000521
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200522 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
523 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
524 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
525 TEST_ASSERT( mbedtls_mpi_add_abs( &Z, &X, &Y ) == 0 );
526 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000527
Paul Bakkerbd51b262014-07-10 15:26:12 +0200528exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200529 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000530}
Paul Bakker33b43f12013-08-20 11:48:36 +0200531/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000532
Paul Bakker33b43f12013-08-20 11:48:36 +0200533/* BEGIN_CASE */
534void mpi_add_abs_add_first( int radix_X, char *input_X, int radix_Y,
535 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000536{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200537 mbedtls_mpi X, Y, A;
538 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000539
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200540 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
541 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
542 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
543 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &Y ) == 0 );
544 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000545
Paul Bakkerbd51b262014-07-10 15:26:12 +0200546exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200547 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000548}
Paul Bakker33b43f12013-08-20 11:48:36 +0200549/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000550
Paul Bakker33b43f12013-08-20 11:48:36 +0200551/* BEGIN_CASE */
552void mpi_add_abs_add_second( int radix_X, char *input_X, int radix_Y,
553 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000554{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200555 mbedtls_mpi X, Y, A;
556 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000557
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200558 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
559 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
560 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
561 TEST_ASSERT( mbedtls_mpi_add_abs( &Y, &X, &Y ) == 0 );
562 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000563
Paul Bakkerbd51b262014-07-10 15:26:12 +0200564exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200565 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000566}
Paul Bakker33b43f12013-08-20 11:48:36 +0200567/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000568
Paul Bakker33b43f12013-08-20 11:48:36 +0200569/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200570void mbedtls_mpi_add_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200571 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000572{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200573 mbedtls_mpi X, Z, A;
574 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000575
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200576 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
577 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
578 TEST_ASSERT( mbedtls_mpi_add_int( &Z, &X, input_Y ) == 0 );
579 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000580
Paul Bakkerbd51b262014-07-10 15:26:12 +0200581exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200582 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000583}
Paul Bakker33b43f12013-08-20 11:48:36 +0200584/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000585
Paul Bakker33b43f12013-08-20 11:48:36 +0200586/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200587void mbedtls_mpi_sub_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200588 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000589{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200590 mbedtls_mpi X, Y, Z, A;
591 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000592
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200593 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
594 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
595 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
596 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Z, &X, &Y ) == 0 );
597 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000598
Paul Bakkerbd51b262014-07-10 15:26:12 +0200599exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200600 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000601}
Paul Bakker33b43f12013-08-20 11:48:36 +0200602/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000603
Paul Bakker33b43f12013-08-20 11:48:36 +0200604/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200605void mbedtls_mpi_sub_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200606 int radix_A, char *input_A, int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000607{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200608 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000609 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200610 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000611
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200612 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
613 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
614 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnardfd1f9e72015-10-30 09:23:19 +0100615
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200616 res = mbedtls_mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200617 TEST_ASSERT( res == sub_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000618 if( res == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200619 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000620
Paul Bakkerbd51b262014-07-10 15:26:12 +0200621exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200622 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000623}
Paul Bakker33b43f12013-08-20 11:48:36 +0200624/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000625
Paul Bakker33b43f12013-08-20 11:48:36 +0200626/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200627void mbedtls_mpi_sub_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200628 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000629{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200630 mbedtls_mpi X, Z, A;
631 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000632
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200633 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
634 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
635 TEST_ASSERT( mbedtls_mpi_sub_int( &Z, &X, input_Y ) == 0 );
636 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000637
Paul Bakkerbd51b262014-07-10 15:26:12 +0200638exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200639 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000640}
Paul Bakker33b43f12013-08-20 11:48:36 +0200641/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000642
Paul Bakker33b43f12013-08-20 11:48:36 +0200643/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200644void mbedtls_mpi_mul_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200645 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000646{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200647 mbedtls_mpi X, Y, Z, A;
648 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000649
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200650 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
651 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
652 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
653 TEST_ASSERT( mbedtls_mpi_mul_mpi( &Z, &X, &Y ) == 0 );
654 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000655
Paul Bakkerbd51b262014-07-10 15:26:12 +0200656exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200657 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000658}
Paul Bakker33b43f12013-08-20 11:48:36 +0200659/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000660
Paul Bakker33b43f12013-08-20 11:48:36 +0200661/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200662void mbedtls_mpi_mul_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200663 char *input_A, char *result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +0000664{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200665 mbedtls_mpi X, Z, A;
666 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000667
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200668 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
669 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
670 TEST_ASSERT( mbedtls_mpi_mul_int( &Z, &X, input_Y ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200671 if( strcmp( result_comparison, "==" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200673 else if( strcmp( result_comparison, "!=" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200674 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) != 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200675 else
676 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000677
Paul Bakkerbd51b262014-07-10 15:26:12 +0200678exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200679 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000680}
Paul Bakker33b43f12013-08-20 11:48:36 +0200681/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000682
Paul Bakker33b43f12013-08-20 11:48:36 +0200683/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200684void mbedtls_mpi_div_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200685 int radix_A, char *input_A, int radix_B, char *input_B,
686 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000687{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200688 mbedtls_mpi X, Y, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000689 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200690 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R );
691 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000692
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200693 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
694 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
695 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
696 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
697 res = mbedtls_mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200698 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000699 if( res == 0 )
700 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200701 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
702 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000703 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000704
Paul Bakkerbd51b262014-07-10 15:26:12 +0200705exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200706 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R );
707 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000708}
Paul Bakker33b43f12013-08-20 11:48:36 +0200709/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000710
Paul Bakker33b43f12013-08-20 11:48:36 +0200711/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200712void mbedtls_mpi_div_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200713 char *input_A, int radix_B, char *input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000714{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200715 mbedtls_mpi X, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000716 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200717 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &A );
718 mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000719
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200720 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
721 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
722 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
723 res = mbedtls_mpi_div_int( &Q, &R, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200724 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000725 if( res == 0 )
726 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200727 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
728 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000729 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000730
Paul Bakkerbd51b262014-07-10 15:26:12 +0200731exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200732 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &A );
733 mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000734}
Paul Bakker33b43f12013-08-20 11:48:36 +0200735/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000736
Paul Bakker33b43f12013-08-20 11:48:36 +0200737/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200738void mbedtls_mpi_mod_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200739 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000740{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200741 mbedtls_mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000742 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200743 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000744
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200745 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
746 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
747 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
748 res = mbedtls_mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200749 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000750 if( res == 0 )
751 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200752 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000753 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000754
Paul Bakkerbd51b262014-07-10 15:26:12 +0200755exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200756 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000757}
Paul Bakker33b43f12013-08-20 11:48:36 +0200758/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000759
Paul Bakker33b43f12013-08-20 11:48:36 +0200760/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200761void mbedtls_mpi_mod_int( int radix_X, char *input_X, int input_Y, int input_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200762 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000763{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200764 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000765 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200766 mbedtls_mpi_uint r;
767 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000768
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200769 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
770 res = mbedtls_mpi_mod_int( &r, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200771 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000772 if( res == 0 )
773 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200774 TEST_ASSERT( r == (mbedtls_mpi_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +0000775 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000776
Paul Bakkerbd51b262014-07-10 15:26:12 +0200777exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200778 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000779}
Paul Bakker33b43f12013-08-20 11:48:36 +0200780/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000781
Paul Bakker33b43f12013-08-20 11:48:36 +0200782/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200783void mbedtls_mpi_exp_mod( int radix_A, char *input_A, int radix_E, char *input_E,
Paul Bakker33b43f12013-08-20 11:48:36 +0200784 int radix_N, char *input_N, int radix_RR, char *input_RR,
785 int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000786{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200787 mbedtls_mpi A, E, N, RR, Z, X;
Paul Bakker367dae42009-06-28 21:50:27 +0000788 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200789 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
790 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000791
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200792 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
793 TEST_ASSERT( mbedtls_mpi_read_string( &E, radix_E, input_E ) == 0 );
794 TEST_ASSERT( mbedtls_mpi_read_string( &N, radix_N, input_N ) == 0 );
795 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000796
Paul Bakker33b43f12013-08-20 11:48:36 +0200797 if( strlen( input_RR ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200798 TEST_ASSERT( mbedtls_mpi_read_string( &RR, radix_RR, input_RR ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000799
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200800 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR );
Paul Bakker33b43f12013-08-20 11:48:36 +0200801 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000802 if( res == 0 )
803 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200804 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000805 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000806
Paul Bakkerbd51b262014-07-10 15:26:12 +0200807exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200808 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
809 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000810}
Paul Bakker33b43f12013-08-20 11:48:36 +0200811/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000812
Paul Bakker33b43f12013-08-20 11:48:36 +0200813/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200814void mbedtls_mpi_inv_mod( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200815 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000816{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200817 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000818 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200819 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000820
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200821 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
822 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
823 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
824 res = mbedtls_mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200825 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000826 if( res == 0 )
827 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200828 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000829 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000830
Paul Bakkerbd51b262014-07-10 15:26:12 +0200831exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200832 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000833}
Paul Bakker33b43f12013-08-20 11:48:36 +0200834/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000835
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200836/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
837void mbedtls_mpi_is_prime( int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000838{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200839 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000840 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200841 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000842
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200843 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
844 res = mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200845 TEST_ASSERT( res == div_result );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000846
Paul Bakkerbd51b262014-07-10 15:26:12 +0200847exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200848 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000849}
Paul Bakker33b43f12013-08-20 11:48:36 +0200850/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000851
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200852/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Janos Follath18b08c62018-09-05 17:04:49 +0100853void mbedtls_mpi_is_prime_det( char *input_X, char *witnesses,
854 int chunk_len, int div_result )
855{
856 mbedtls_mpi X;
857 int res;
858 mbedtls_test_mpi_random rand;
859 uint8_t witness_buf[1000];
860 uint8_t input_buf[1000];
861 size_t witness_len;
862 size_t input_len;
863
864 witness_len = unhexify( witness_buf, witnesses );
865 input_len = unhexify( input_buf, input_X );
866
867 mbedtls_mpi_init( &X );
868 rand.data = witness_buf;
869 rand.data_len = witness_len;
870 rand.pos = 0;
871 rand.chunk_len = chunk_len;
872
873 TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_buf, input_len ) == 0 );
874 res = mbedtls_mpi_is_prime( &X, mbedtls_test_mpi_miller_rabin_determinizer,
875 &rand );
876 TEST_ASSERT( res == div_result );
877
878exit:
879 mbedtls_mpi_free( &X );
880}
881/* END_CASE */
882
883/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200884void mbedtls_mpi_gen_prime( int bits, int safe, int ref_ret )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200885{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200886 mbedtls_mpi X;
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200887 int my_ret;
888
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200889 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200890
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200891 my_ret = mbedtls_mpi_gen_prime( &X, bits, safe, rnd_std_rand, NULL );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200892 TEST_ASSERT( my_ret == ref_ret );
893
894 if( ref_ret == 0 )
895 {
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200896 size_t actual_bits = mbedtls_mpi_bitlen( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200897
898 TEST_ASSERT( actual_bits >= (size_t) bits );
899 TEST_ASSERT( actual_bits <= (size_t) bits + 1 );
900
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200901 TEST_ASSERT( mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200902 if( safe )
903 {
Hanno Beckerb70ba9f2018-01-10 10:46:18 +0000904 /* X = ( X - 1 ) / 2 */
905 TEST_ASSERT( mbedtls_mpi_shift_r( &X, 1 ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200906 TEST_ASSERT( mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200907 }
908 }
909
Paul Bakkerbd51b262014-07-10 15:26:12 +0200910exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200911 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200912}
913/* END_CASE */
914
Paul Bakker33b43f12013-08-20 11:48:36 +0200915/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200916void mbedtls_mpi_shift_l( int radix_X, char *input_X, int shift_X, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200917 char *input_A)
Paul Bakker367dae42009-06-28 21:50:27 +0000918{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200919 mbedtls_mpi X, A;
920 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000921
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200922 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
923 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
924 TEST_ASSERT( mbedtls_mpi_shift_l( &X, shift_X ) == 0 );
925 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000926
Paul Bakkerbd51b262014-07-10 15:26:12 +0200927exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200928 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000929}
Paul Bakker33b43f12013-08-20 11:48:36 +0200930/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000931
Paul Bakker33b43f12013-08-20 11:48:36 +0200932/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200933void mbedtls_mpi_shift_r( int radix_X, char *input_X, int shift_X, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200934 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000935{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200936 mbedtls_mpi X, A;
937 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000938
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200939 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
940 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
941 TEST_ASSERT( mbedtls_mpi_shift_r( &X, shift_X ) == 0 );
942 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000943
Paul Bakkerbd51b262014-07-10 15:26:12 +0200944exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200945 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000946}
Paul Bakker33b43f12013-08-20 11:48:36 +0200947/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000948
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200949/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Paul Bakker33b43f12013-08-20 11:48:36 +0200950void mpi_selftest()
Paul Bakkere896fea2009-07-06 06:40:23 +0000951{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200952 TEST_ASSERT( mbedtls_mpi_self_test( 0 ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000953}
Paul Bakker33b43f12013-08-20 11:48:36 +0200954/* END_CASE */