blob: e598f8dfcffe50ad215b7bedb495f2857fbc42eb [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"
Paul Bakker33b43f12013-08-20 11:48:36 +02003/* END_HEADER */
Paul Bakker367dae42009-06-28 21:50:27 +00004
Paul Bakker33b43f12013-08-20 11:48:36 +02005/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006 * depends_on:MBEDTLS_BIGNUM_C
Paul Bakker33b43f12013-08-20 11:48:36 +02007 * END_DEPENDENCIES
8 */
Paul Bakker5690efc2011-05-26 13:16:06 +00009
Paul Bakker33b43f12013-08-20 11:48:36 +020010/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +010011void mpi_null( )
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +020012{
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +020013 mbedtls_mpi X, Y, Z;
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +020014
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +020015 mbedtls_mpi_init( &X );
16 mbedtls_mpi_init( &Y );
17 mbedtls_mpi_init( &Z );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +020018
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +020019 TEST_ASSERT( mbedtls_mpi_get_bit( &X, 42 ) == 0 );
20 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +020021 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == 0 );
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +020022 TEST_ASSERT( mbedtls_mpi_size( &X ) == 0 );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +020023
24exit:
Manuel Pégourié-Gonnardda61ed32015-04-30 10:28:51 +020025 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +020026}
27/* END_CASE */
28
29/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +010030void mpi_read_write_string( int radix_X, char * input_X, int radix_A,
31 char * input_A, int output_size, int result_read,
Paul Bakker33b43f12013-08-20 11:48:36 +020032 int result_write )
Paul Bakker367dae42009-06-28 21:50:27 +000033{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020034 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +000035 char str[1000];
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +010036 size_t len;
Paul Bakker367dae42009-06-28 21:50:27 +000037
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020038 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +000039
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020040 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == result_read );
Paul Bakker33b43f12013-08-20 11:48:36 +020041 if( result_read == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +000042 {
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +010043 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, str, output_size, &len ) == result_write );
Paul Bakker33b43f12013-08-20 11:48:36 +020044 if( result_write == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +000045 {
Paul Bakker33b43f12013-08-20 11:48:36 +020046 TEST_ASSERT( strcasecmp( str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +000047 }
48 }
Paul Bakker6c591fa2011-05-05 11:49:20 +000049
Paul Bakkerbd51b262014-07-10 15:26:12 +020050exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020051 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000052}
Paul Bakker33b43f12013-08-20 11:48:36 +020053/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000054
Paul Bakker33b43f12013-08-20 11:48:36 +020055/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +010056void mbedtls_mpi_read_binary( data_t * buf, int radix_A, char * input_A )
Paul Bakkere896fea2009-07-06 06:40:23 +000057{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020058 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +000059 unsigned char str[1000];
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +010060 size_t len;
Paul Bakkere896fea2009-07-06 06:40:23 +000061
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020062 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000063
Paul Bakkere896fea2009-07-06 06:40:23 +000064
Azim Khand30ca132017-06-09 04:32:58 +010065 TEST_ASSERT( mbedtls_mpi_read_binary( &X, buf->x, buf->len ) == 0 );
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +010066 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, (char *) str, sizeof( str ), &len ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +020067 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +000068
Paul Bakkerbd51b262014-07-10 15:26:12 +020069exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020070 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000071}
Paul Bakker33b43f12013-08-20 11:48:36 +020072/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000073
Paul Bakker33b43f12013-08-20 11:48:36 +020074/* BEGIN_CASE */
Azim Khand30ca132017-06-09 04:32:58 +010075void mbedtls_mpi_write_binary( int radix_X, char * input_X,
Azim Khan5fcca462018-06-29 11:05:32 +010076 data_t * input_A, int output_size,
Azim Khanf1aaec92017-05-30 14:23:15 +010077 int result )
Paul Bakkere896fea2009-07-06 06:40:23 +000078{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020079 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +000080 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000081 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +000082
83 memset( buf, 0x00, 1000 );
Paul Bakkere896fea2009-07-06 06:40:23 +000084
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020085 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000086
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020087 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +010088
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020089 buflen = mbedtls_mpi_size( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +020090 if( buflen > (size_t) output_size )
91 buflen = (size_t) output_size;
Paul Bakkere896fea2009-07-06 06:40:23 +000092
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020093 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == result );
Paul Bakker33b43f12013-08-20 11:48:36 +020094 if( result == 0)
Paul Bakkerba48cb22009-07-12 11:01:32 +000095 {
Paul Bakkere896fea2009-07-06 06:40:23 +000096
Azim Khand30ca132017-06-09 04:32:58 +010097 TEST_ASSERT( hexcmp( buf, input_A->x, buflen, input_A->len ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +000098 }
Paul Bakker6c591fa2011-05-05 11:49:20 +000099
Paul Bakkerbd51b262014-07-10 15:26:12 +0200100exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200101 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000102}
Paul Bakker33b43f12013-08-20 11:48:36 +0200103/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000104
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200105/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Azim Khand30ca132017-06-09 04:32:58 +0100106void mbedtls_mpi_read_file( int radix_X, char * input_file,
Azim Khan5fcca462018-06-29 11:05:32 +0100107 data_t * input_A, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000108{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200109 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000110 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000111 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +0000112 FILE *file;
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000113 int ret;
Paul Bakkere896fea2009-07-06 06:40:23 +0000114
115 memset( buf, 0x00, 1000 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000116
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200117 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000118
Paul Bakker33b43f12013-08-20 11:48:36 +0200119 file = fopen( input_file, "r" );
Paul Bakker8a0c0a92014-04-17 16:08:20 +0200120 TEST_ASSERT( file != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200121 ret = mbedtls_mpi_read_file( &X, radix_X, file );
Paul Bakkere896fea2009-07-06 06:40:23 +0000122 fclose(file);
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000123 TEST_ASSERT( ret == result );
Paul Bakkere896fea2009-07-06 06:40:23 +0000124
Paul Bakker33b43f12013-08-20 11:48:36 +0200125 if( result == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000126 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200127 buflen = mbedtls_mpi_size( &X );
128 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000129
Paul Bakkere896fea2009-07-06 06:40:23 +0000130
Azim Khand30ca132017-06-09 04:32:58 +0100131 TEST_ASSERT( hexcmp( buf, input_A->x, buflen, input_A->len ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000132 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000133
Paul Bakkerbd51b262014-07-10 15:26:12 +0200134exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200135 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000136}
Paul Bakker33b43f12013-08-20 11:48:36 +0200137/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000138
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200139/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Azim Khanf1aaec92017-05-30 14:23:15 +0100140void mbedtls_mpi_write_file( int radix_X, char * input_X, int output_radix,
141 char * output_file )
Paul Bakkere896fea2009-07-06 06:40:23 +0000142{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200143 mbedtls_mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000144 FILE *file_out, *file_in;
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200145 int ret;
Paul Bakker69998dd2009-07-11 19:15:20 +0000146
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200147 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000148
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200149 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000150
Paul Bakker33b43f12013-08-20 11:48:36 +0200151 file_out = fopen( output_file, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000152 TEST_ASSERT( file_out != NULL );
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200153 ret = mbedtls_mpi_write_file( NULL, &X, output_radix, file_out );
Paul Bakkere896fea2009-07-06 06:40:23 +0000154 fclose(file_out);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200155 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000156
Paul Bakker33b43f12013-08-20 11:48:36 +0200157 file_in = fopen( output_file, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000158 TEST_ASSERT( file_in != NULL );
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200159 ret = mbedtls_mpi_read_file( &Y, output_radix, file_in );
Paul Bakkere896fea2009-07-06 06:40:23 +0000160 fclose(file_in);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200161 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000162
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200163 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000164
Paul Bakkerbd51b262014-07-10 15:26:12 +0200165exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200166 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000167}
Paul Bakker33b43f12013-08-20 11:48:36 +0200168/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000169
Paul Bakker33b43f12013-08-20 11:48:36 +0200170/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100171void mbedtls_mpi_get_bit( int radix_X, char * input_X, int pos, int val )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000172{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200173 mbedtls_mpi X;
174 mbedtls_mpi_init( &X );
175 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
176 TEST_ASSERT( mbedtls_mpi_get_bit( &X, pos ) == val );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000177
Paul Bakkerbd51b262014-07-10 15:26:12 +0200178exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200179 mbedtls_mpi_free( &X );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000180}
Paul Bakker33b43f12013-08-20 11:48:36 +0200181/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000182
Paul Bakker33b43f12013-08-20 11:48:36 +0200183/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100184void mbedtls_mpi_set_bit( int radix_X, char * input_X, int pos, int val,
185 int radix_Y, char * output_Y, int result )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000186{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200187 mbedtls_mpi X, Y;
188 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000189
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200190 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
191 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, output_Y ) == 0 );
Paul Bakkerec5ceb62016-07-14 12:47:07 +0100192 TEST_ASSERT( mbedtls_mpi_set_bit( &X, pos, val ) == result );
193
194 if( result == 0 )
195 {
196 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
197 }
Paul Bakker2f5947e2011-05-18 15:47:11 +0000198
Paul Bakkerbd51b262014-07-10 15:26:12 +0200199exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200200 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000201}
Paul Bakker33b43f12013-08-20 11:48:36 +0200202/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000203
Paul Bakker33b43f12013-08-20 11:48:36 +0200204/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100205void mbedtls_mpi_lsb( int radix_X, char * input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000206{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200207 mbedtls_mpi X;
208 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000209
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200210 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
211 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000212
Paul Bakkerbd51b262014-07-10 15:26:12 +0200213exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200214 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000215}
Paul Bakker33b43f12013-08-20 11:48:36 +0200216/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000217
Paul Bakker33b43f12013-08-20 11:48:36 +0200218/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100219void mbedtls_mpi_bitlen( int radix_X, char * input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000220{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200221 mbedtls_mpi X;
222 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000223
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200224 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200225 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000226
Paul Bakkerbd51b262014-07-10 15:26:12 +0200227exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200228 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000229}
Paul Bakker33b43f12013-08-20 11:48:36 +0200230/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000231
Paul Bakker33b43f12013-08-20 11:48:36 +0200232/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100233void mbedtls_mpi_gcd( int radix_X, char * input_X, int radix_Y,
234 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000235{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200236 mbedtls_mpi A, X, Y, Z;
237 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000238
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200239 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
240 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
241 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
242 TEST_ASSERT( mbedtls_mpi_gcd( &Z, &X, &Y ) == 0 );
243 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000244
Paul Bakkerbd51b262014-07-10 15:26:12 +0200245exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200246 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000247}
Paul Bakker33b43f12013-08-20 11:48:36 +0200248/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000249
Paul Bakker33b43f12013-08-20 11:48:36 +0200250/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200251void mbedtls_mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000252{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200253 mbedtls_mpi X;
254 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000255
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200256 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0);
257 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000258
Paul Bakkerbd51b262014-07-10 15:26:12 +0200259exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200260 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000261}
Paul Bakker33b43f12013-08-20 11:48:36 +0200262/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000263
Paul Bakker33b43f12013-08-20 11:48:36 +0200264/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100265void mbedtls_mpi_cmp_mpi( int radix_X, char * input_X, int radix_Y,
266 char * input_Y, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000267{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200268 mbedtls_mpi X, Y;
269 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000270
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200271 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
272 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
273 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == input_A );
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 ); mbedtls_mpi_free( &Y );
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 */
Azim Khanf1aaec92017-05-30 14:23:15 +0100281void mbedtls_mpi_cmp_abs( int radix_X, char * input_X, int radix_Y,
282 char * input_Y, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000283{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200284 mbedtls_mpi X, Y;
285 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
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_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000290
Paul Bakkerbd51b262014-07-10 15:26:12 +0200291exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200292 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000293}
Paul Bakker33b43f12013-08-20 11:48:36 +0200294/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000295
Paul Bakker33b43f12013-08-20 11:48:36 +0200296/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200297void mbedtls_mpi_copy( int input_X, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000298{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200299 mbedtls_mpi X, Y, A;
300 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000301
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200302 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
303 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_A ) == 0 );
304 TEST_ASSERT( mbedtls_mpi_lset( &A, input_A ) == 0 );
305 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
306 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
307 TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 );
308 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
309 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) != 0 );
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 ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
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 */
317void mpi_copy_self( int input_X )
Paul Bakkere896fea2009-07-06 06:40:23 +0000318{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200319 mbedtls_mpi X;
320 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000321
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200322 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
323 TEST_ASSERT( mbedtls_mpi_copy( &X, &X ) == 0 );
324 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000325
Paul Bakkerbd51b262014-07-10 15:26:12 +0200326exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000328}
Paul Bakker33b43f12013-08-20 11:48:36 +0200329/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000330
Paul Bakker33b43f12013-08-20 11:48:36 +0200331/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200332void mbedtls_mpi_shrink( int before, int used, int min, int after )
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100333{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200334 mbedtls_mpi X;
335 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100336
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200337 TEST_ASSERT( mbedtls_mpi_grow( &X, before ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100338 TEST_ASSERT( used <= before );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200339 memset( X.p, 0x2a, used * sizeof( mbedtls_mpi_uint ) );
340 TEST_ASSERT( mbedtls_mpi_shrink( &X, min ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100341 TEST_ASSERT( X.n == (size_t) after );
342
Paul Bakkerbd51b262014-07-10 15:26:12 +0200343exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200344 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100345}
346/* END_CASE */
347
348/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100349void mbedtls_mpi_safe_cond_assign( int x_sign, char * x_str, int y_sign,
350 char * y_str )
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100351{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200352 mbedtls_mpi X, Y, XX;
353 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100354
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200355 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100356 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200357 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100358 Y.s = y_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200359 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100360
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200361 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 0 ) == 0 );
362 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100363
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200364 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 1 ) == 0 );
365 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100366
Paul Bakkerbd51b262014-07-10 15:26:12 +0200367exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200368 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100369}
370/* END_CASE */
371
372/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100373void mbedtls_mpi_safe_cond_swap( int x_sign, char * x_str, int y_sign,
374 char * y_str )
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100375{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200376 mbedtls_mpi X, Y, XX, YY;
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100377
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200378 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
379 mbedtls_mpi_init( &XX ); mbedtls_mpi_init( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100380
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200381 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100382 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200383 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100384 Y.s = y_sign;
385
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200386 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
387 TEST_ASSERT( mbedtls_mpi_copy( &YY, &Y ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100388
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
390 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
391 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100392
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200393 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 1 ) == 0 );
394 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &XX ) == 0 );
395 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100396
Paul Bakkerbd51b262014-07-10 15:26:12 +0200397exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200398 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
399 mbedtls_mpi_free( &XX ); mbedtls_mpi_free( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100400}
401/* END_CASE */
402
403/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100404void mbedtls_mpi_swap( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000405{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200406 mbedtls_mpi X, Y, A;
407 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000408
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
410 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 );
411 TEST_ASSERT( mbedtls_mpi_lset( &A, input_X ) == 0 );
412 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
413 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
414 mbedtls_mpi_swap( &X, &Y );
415 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
416 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000417
Paul Bakkerbd51b262014-07-10 15:26:12 +0200418exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200419 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000420}
Paul Bakker33b43f12013-08-20 11:48:36 +0200421/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000422
Paul Bakker33b43f12013-08-20 11:48:36 +0200423/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100424void mbedtls_mpi_add_mpi( int radix_X, char * input_X, int radix_Y,
425 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000426{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200427 mbedtls_mpi X, Y, Z, A;
428 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000429
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200430 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
431 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
432 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
433 TEST_ASSERT( mbedtls_mpi_add_mpi( &Z, &X, &Y ) == 0 );
434 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000435
Paul Bakkerbd51b262014-07-10 15:26:12 +0200436exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200437 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000438}
Paul Bakker33b43f12013-08-20 11:48:36 +0200439/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000440
Paul Bakker33b43f12013-08-20 11:48:36 +0200441/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100442void mbedtls_mpi_add_mpi_inplace( int radix_X, char * input_X, int radix_A,
443 char * input_A )
Janos Follath044a86b2015-10-25 10:58:03 +0100444{
445 mbedtls_mpi X, A;
446 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
447
Janos Follath044a86b2015-10-25 10:58:03 +0100448 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +0100449
450 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
451 TEST_ASSERT( mbedtls_mpi_sub_abs( &X, &X, &X ) == 0 );
452 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, 0 ) == 0 );
453
454 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
455 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &X ) == 0 );
456 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
457
458 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Janos Follath044a86b2015-10-25 10:58:03 +0100459 TEST_ASSERT( mbedtls_mpi_add_mpi( &X, &X, &X ) == 0 );
460 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
461
462exit:
463 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
464}
465/* END_CASE */
466
467
468/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100469void mbedtls_mpi_add_abs( int radix_X, char * input_X, int radix_Y,
470 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000471{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200472 mbedtls_mpi X, Y, Z, A;
473 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000474
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200475 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
476 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
477 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
478 TEST_ASSERT( mbedtls_mpi_add_abs( &Z, &X, &Y ) == 0 );
479 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000480
Paul Bakkerbd51b262014-07-10 15:26:12 +0200481exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200482 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000483}
Paul Bakker33b43f12013-08-20 11:48:36 +0200484/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000485
Paul Bakker33b43f12013-08-20 11:48:36 +0200486/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100487void mpi_add_abs_add_first( int radix_X, char * input_X, int radix_Y,
488 char * input_Y, int radix_A, char * input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000489{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200490 mbedtls_mpi X, Y, A;
491 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000492
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200493 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
494 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
495 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
496 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &Y ) == 0 );
497 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000498
Paul Bakkerbd51b262014-07-10 15:26:12 +0200499exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200500 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000501}
Paul Bakker33b43f12013-08-20 11:48:36 +0200502/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000503
Paul Bakker33b43f12013-08-20 11:48:36 +0200504/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100505void mpi_add_abs_add_second( int radix_X, char * input_X, int radix_Y,
506 char * input_Y, int radix_A, char * input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000507{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200508 mbedtls_mpi X, Y, A;
509 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000510
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200511 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
512 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
513 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
514 TEST_ASSERT( mbedtls_mpi_add_abs( &Y, &X, &Y ) == 0 );
515 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000516
Paul Bakkerbd51b262014-07-10 15:26:12 +0200517exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200518 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000519}
Paul Bakker33b43f12013-08-20 11:48:36 +0200520/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000521
Paul Bakker33b43f12013-08-20 11:48:36 +0200522/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100523void mbedtls_mpi_add_int( int radix_X, char * input_X, int input_Y,
524 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000525{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200526 mbedtls_mpi X, Z, A;
527 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000528
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200529 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
530 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
531 TEST_ASSERT( mbedtls_mpi_add_int( &Z, &X, input_Y ) == 0 );
532 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000533
Paul Bakkerbd51b262014-07-10 15:26:12 +0200534exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200535 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000536}
Paul Bakker33b43f12013-08-20 11:48:36 +0200537/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000538
Paul Bakker33b43f12013-08-20 11:48:36 +0200539/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100540void mbedtls_mpi_sub_mpi( int radix_X, char * input_X, int radix_Y,
541 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000542{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200543 mbedtls_mpi X, Y, Z, A;
544 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000545
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200546 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
547 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
548 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
549 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Z, &X, &Y ) == 0 );
550 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000551
Paul Bakkerbd51b262014-07-10 15:26:12 +0200552exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200553 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000554}
Paul Bakker33b43f12013-08-20 11:48:36 +0200555/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000556
Paul Bakker33b43f12013-08-20 11:48:36 +0200557/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100558void mbedtls_mpi_sub_abs( int radix_X, char * input_X, int radix_Y,
559 char * input_Y, int radix_A, char * input_A,
560 int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000561{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200562 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000563 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200564 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000565
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200566 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
567 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
568 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +0100569
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200570 res = mbedtls_mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200571 TEST_ASSERT( res == sub_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000572 if( res == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200573 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000574
Paul Bakkerbd51b262014-07-10 15:26:12 +0200575exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200576 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000577}
Paul Bakker33b43f12013-08-20 11:48:36 +0200578/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000579
Paul Bakker33b43f12013-08-20 11:48:36 +0200580/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100581void mbedtls_mpi_sub_int( int radix_X, char * input_X, int input_Y,
582 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000583{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200584 mbedtls_mpi X, Z, A;
585 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000586
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200587 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
588 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
589 TEST_ASSERT( mbedtls_mpi_sub_int( &Z, &X, input_Y ) == 0 );
590 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000591
Paul Bakkerbd51b262014-07-10 15:26:12 +0200592exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200593 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000594}
Paul Bakker33b43f12013-08-20 11:48:36 +0200595/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000596
Paul Bakker33b43f12013-08-20 11:48:36 +0200597/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100598void mbedtls_mpi_mul_mpi( int radix_X, char * input_X, int radix_Y,
599 char * input_Y, int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000600{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200601 mbedtls_mpi X, Y, Z, A;
602 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000603
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200604 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
605 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
606 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
607 TEST_ASSERT( mbedtls_mpi_mul_mpi( &Z, &X, &Y ) == 0 );
608 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000609
Paul Bakkerbd51b262014-07-10 15:26:12 +0200610exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200611 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000612}
Paul Bakker33b43f12013-08-20 11:48:36 +0200613/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000614
Paul Bakker33b43f12013-08-20 11:48:36 +0200615/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100616void mbedtls_mpi_mul_int( int radix_X, char * input_X, int input_Y,
617 int radix_A, char * input_A,
618 char * result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +0000619{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200620 mbedtls_mpi X, Z, A;
621 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000622
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200623 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
624 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
625 TEST_ASSERT( mbedtls_mpi_mul_int( &Z, &X, input_Y ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200626 if( strcmp( result_comparison, "==" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200627 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200628 else if( strcmp( result_comparison, "!=" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200629 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) != 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200630 else
631 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000632
Paul Bakkerbd51b262014-07-10 15:26:12 +0200633exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200634 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000635}
Paul Bakker33b43f12013-08-20 11:48:36 +0200636/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000637
Paul Bakker33b43f12013-08-20 11:48:36 +0200638/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100639void mbedtls_mpi_div_mpi( int radix_X, char * input_X, int radix_Y,
640 char * input_Y, int radix_A, char * input_A,
641 int radix_B, char * input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000642{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200643 mbedtls_mpi X, Y, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000644 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200645 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R );
646 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000647
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200648 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
649 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
650 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
651 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
652 res = mbedtls_mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200653 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000654 if( res == 0 )
655 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200656 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
657 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000658 }
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( &Q ); mbedtls_mpi_free( &R );
662 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000663}
Paul Bakker33b43f12013-08-20 11:48:36 +0200664/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000665
Paul Bakker33b43f12013-08-20 11:48:36 +0200666/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100667void mbedtls_mpi_div_int( int radix_X, char * input_X, int input_Y,
668 int radix_A, char * input_A, int radix_B,
669 char * input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000670{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200671 mbedtls_mpi X, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000672 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200673 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &A );
674 mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000675
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200676 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
677 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
678 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
679 res = mbedtls_mpi_div_int( &Q, &R, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200680 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000681 if( res == 0 )
682 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200683 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
684 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000685 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000686
Paul Bakkerbd51b262014-07-10 15:26:12 +0200687exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200688 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &A );
689 mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000690}
Paul Bakker33b43f12013-08-20 11:48:36 +0200691/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000692
Paul Bakker33b43f12013-08-20 11:48:36 +0200693/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100694void mbedtls_mpi_mod_mpi( int radix_X, char * input_X, int radix_Y,
695 char * input_Y, int radix_A, char * input_A,
696 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000697{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200698 mbedtls_mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000699 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200700 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000701
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200702 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
703 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
704 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
705 res = mbedtls_mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200706 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000707 if( res == 0 )
708 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200709 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000710 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000711
Paul Bakkerbd51b262014-07-10 15:26:12 +0200712exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200713 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000714}
Paul Bakker33b43f12013-08-20 11:48:36 +0200715/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000716
Paul Bakker33b43f12013-08-20 11:48:36 +0200717/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100718void mbedtls_mpi_mod_int( int radix_X, char * input_X, int input_Y,
719 int input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000720{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200721 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000722 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200723 mbedtls_mpi_uint r;
724 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000725
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200726 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
727 res = mbedtls_mpi_mod_int( &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( r == (mbedtls_mpi_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +0000732 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000733
Paul Bakkerbd51b262014-07-10 15:26:12 +0200734exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200735 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000736}
Paul Bakker33b43f12013-08-20 11:48:36 +0200737/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000738
Paul Bakker33b43f12013-08-20 11:48:36 +0200739/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100740void mbedtls_mpi_exp_mod( int radix_A, char * input_A, int radix_E,
741 char * input_E, int radix_N, char * input_N,
742 int radix_RR, char * input_RR, int radix_X,
743 char * input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000744{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200745 mbedtls_mpi A, E, N, RR, Z, X;
Paul Bakker367dae42009-06-28 21:50:27 +0000746 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200747 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
748 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000749
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200750 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
751 TEST_ASSERT( mbedtls_mpi_read_string( &E, radix_E, input_E ) == 0 );
752 TEST_ASSERT( mbedtls_mpi_read_string( &N, radix_N, input_N ) == 0 );
753 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000754
Paul Bakker33b43f12013-08-20 11:48:36 +0200755 if( strlen( input_RR ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200756 TEST_ASSERT( mbedtls_mpi_read_string( &RR, radix_RR, input_RR ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000757
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200758 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR );
Paul Bakker33b43f12013-08-20 11:48:36 +0200759 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000760 if( res == 0 )
761 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200762 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000763 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000764
Paul Bakkerbd51b262014-07-10 15:26:12 +0200765exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200766 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
767 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000768}
Paul Bakker33b43f12013-08-20 11:48:36 +0200769/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000770
Paul Bakker33b43f12013-08-20 11:48:36 +0200771/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100772void mbedtls_mpi_inv_mod( int radix_X, char * input_X, int radix_Y,
773 char * input_Y, int radix_A, char * input_A,
774 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000775{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200776 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000777 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200778 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000779
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200780 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
781 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
782 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
783 res = mbedtls_mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200784 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000785 if( res == 0 )
786 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200787 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000788 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000789
Paul Bakkerbd51b262014-07-10 15:26:12 +0200790exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200791 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000792}
Paul Bakker33b43f12013-08-20 11:48:36 +0200793/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000794
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200795/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Azim Khanf1aaec92017-05-30 14:23:15 +0100796void mbedtls_mpi_is_prime( int radix_X, char * input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000797{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200798 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000799 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200800 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000801
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200802 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
803 res = mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200804 TEST_ASSERT( res == div_result );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000805
Paul Bakkerbd51b262014-07-10 15:26:12 +0200806exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200807 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000808}
Paul Bakker33b43f12013-08-20 11:48:36 +0200809/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000810
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200811/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Janos Follatha3cb7eb2018-08-14 15:31:54 +0100812void mbedtls_mpi_gen_prime( int bits, int flags, int ref_ret )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200813{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200814 mbedtls_mpi X;
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200815 int my_ret;
816
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200817 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200818
Janos Follatha3cb7eb2018-08-14 15:31:54 +0100819 my_ret = mbedtls_mpi_gen_prime( &X, bits, flags, rnd_std_rand, NULL );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200820 TEST_ASSERT( my_ret == ref_ret );
821
822 if( ref_ret == 0 )
823 {
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200824 size_t actual_bits = mbedtls_mpi_bitlen( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200825
826 TEST_ASSERT( actual_bits >= (size_t) bits );
827 TEST_ASSERT( actual_bits <= (size_t) bits + 1 );
828
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200829 TEST_ASSERT( mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
Janos Follatha3cb7eb2018-08-14 15:31:54 +0100830 if( flags & MBEDTLS_MPI_GEN_PRIME_FLAG_DH )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200831 {
Hanno Beckerd4d60572018-01-10 07:12:01 +0000832 /* X = ( X - 1 ) / 2 */
833 TEST_ASSERT( mbedtls_mpi_shift_r( &X, 1 ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200834 TEST_ASSERT( mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200835 }
836 }
837
Paul Bakkerbd51b262014-07-10 15:26:12 +0200838exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200839 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200840}
841/* END_CASE */
842
Paul Bakker33b43f12013-08-20 11:48:36 +0200843/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100844void mbedtls_mpi_shift_l( int radix_X, char * input_X, int shift_X,
845 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000846{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200847 mbedtls_mpi X, A;
848 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000849
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200850 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
851 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
852 TEST_ASSERT( mbedtls_mpi_shift_l( &X, shift_X ) == 0 );
853 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000854
Paul Bakkerbd51b262014-07-10 15:26:12 +0200855exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200856 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000857}
Paul Bakker33b43f12013-08-20 11:48:36 +0200858/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000859
Paul Bakker33b43f12013-08-20 11:48:36 +0200860/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100861void mbedtls_mpi_shift_r( int radix_X, char * input_X, int shift_X,
862 int radix_A, char * input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000863{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200864 mbedtls_mpi X, A;
865 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000866
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200867 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
868 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
869 TEST_ASSERT( mbedtls_mpi_shift_r( &X, shift_X ) == 0 );
870 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000871
Paul Bakkerbd51b262014-07-10 15:26:12 +0200872exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200873 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000874}
Paul Bakker33b43f12013-08-20 11:48:36 +0200875/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000876
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200877/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Azim Khanf1aaec92017-05-30 14:23:15 +0100878void mpi_selftest( )
Paul Bakkere896fea2009-07-06 06:40:23 +0000879{
Andres AG93012e82016-09-09 09:10:28 +0100880 TEST_ASSERT( mbedtls_mpi_self_test( 1 ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000881}
Paul Bakker33b43f12013-08-20 11:48:36 +0200882/* END_CASE */