blob: bf4f0b3b55d2eedfaa7b929e8299beed4f3d3887 [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 */
11void mpi_read_write_string( int radix_X, char *input_X, int radix_A,
12 char *input_A, int output_size, int result_read,
13 int result_write )
Paul Bakker367dae42009-06-28 21:50:27 +000014{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020015 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +000016 char str[1000];
Paul Bakker33b43f12013-08-20 11:48:36 +020017 size_t len = output_size;
Paul Bakker367dae42009-06-28 21:50:27 +000018
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020019 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +000020
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020021 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == result_read );
Paul Bakker33b43f12013-08-20 11:48:36 +020022 if( result_read == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +000023 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020024 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, str, &len ) == result_write );
Paul Bakker33b43f12013-08-20 11:48:36 +020025 if( result_write == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +000026 {
Paul Bakker33b43f12013-08-20 11:48:36 +020027 TEST_ASSERT( strcasecmp( str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +000028 }
29 }
Paul Bakker6c591fa2011-05-05 11:49:20 +000030
Paul Bakkerbd51b262014-07-10 15:26:12 +020031exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020032 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000033}
Paul Bakker33b43f12013-08-20 11:48:36 +020034/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000035
Paul Bakker33b43f12013-08-20 11:48:36 +020036/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020037void mbedtls_mpi_read_binary( char *input_X, int radix_A, char *input_A )
Paul Bakkere896fea2009-07-06 06:40:23 +000038{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +000040 unsigned char str[1000];
41 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000042 size_t len = 1000;
43 size_t input_len;
Paul Bakkere896fea2009-07-06 06:40:23 +000044
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020045 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000046
Paul Bakker33b43f12013-08-20 11:48:36 +020047 input_len = unhexify( buf, input_X );
Paul Bakkere896fea2009-07-06 06:40:23 +000048
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020049 TEST_ASSERT( mbedtls_mpi_read_binary( &X, buf, input_len ) == 0 );
50 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, (char *) str, &len ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +020051 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +000052
Paul Bakkerbd51b262014-07-10 15:26:12 +020053exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000055}
Paul Bakker33b43f12013-08-20 11:48:36 +020056/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000057
Paul Bakker33b43f12013-08-20 11:48:36 +020058/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020059void mbedtls_mpi_write_binary( int radix_X, char *input_X, char *input_A,
Paul Bakker33b43f12013-08-20 11:48:36 +020060 int output_size, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +000061{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020062 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +000063 unsigned char str[1000];
64 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000065 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +000066
67 memset( buf, 0x00, 1000 );
68 memset( str, 0x00, 1000 );
69
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020070 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000071
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020072 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +000073
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020074 buflen = mbedtls_mpi_size( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +020075 if( buflen > (size_t) output_size )
76 buflen = (size_t) output_size;
Paul Bakkere896fea2009-07-06 06:40:23 +000077
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020078 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == result );
Paul Bakker33b43f12013-08-20 11:48:36 +020079 if( result == 0)
Paul Bakkerba48cb22009-07-12 11:01:32 +000080 {
81 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +000082
Paul Bakker33b43f12013-08-20 11:48:36 +020083 TEST_ASSERT( strcasecmp( (char *) str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +000084 }
Paul Bakker6c591fa2011-05-05 11:49:20 +000085
Paul Bakkerbd51b262014-07-10 15:26:12 +020086exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020087 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000088}
Paul Bakker33b43f12013-08-20 11:48:36 +020089/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000090
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020091/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
92void mbedtls_mpi_read_file( int radix_X, char *input_file, char *input_A,
Paul Bakker33b43f12013-08-20 11:48:36 +020093 int result )
Paul Bakkere896fea2009-07-06 06:40:23 +000094{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020095 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +000096 unsigned char str[1000];
97 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000098 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +000099 FILE *file;
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000100 int ret;
Paul Bakkere896fea2009-07-06 06:40:23 +0000101
102 memset( buf, 0x00, 1000 );
103 memset( str, 0x00, 1000 );
104
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200105 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000106
Paul Bakker33b43f12013-08-20 11:48:36 +0200107 file = fopen( input_file, "r" );
Paul Bakker8a0c0a92014-04-17 16:08:20 +0200108 TEST_ASSERT( file != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200109 ret = mbedtls_mpi_read_file( &X, radix_X, file );
Paul Bakkere896fea2009-07-06 06:40:23 +0000110 fclose(file);
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000111 TEST_ASSERT( ret == result );
Paul Bakkere896fea2009-07-06 06:40:23 +0000112
Paul Bakker33b43f12013-08-20 11:48:36 +0200113 if( result == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000114 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200115 buflen = mbedtls_mpi_size( &X );
116 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000117
Paul Bakkerba48cb22009-07-12 11:01:32 +0000118 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +0000119
Paul Bakker33b43f12013-08-20 11:48:36 +0200120 TEST_ASSERT( strcasecmp( (char *) str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000121 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000122
Paul Bakkerbd51b262014-07-10 15:26:12 +0200123exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200124 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000125}
Paul Bakker33b43f12013-08-20 11:48:36 +0200126/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000127
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200128/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
129void mbedtls_mpi_write_file( int radix_X, char *input_X, int output_radix,
Paul Bakker33b43f12013-08-20 11:48:36 +0200130 char *output_file )
Paul Bakkere896fea2009-07-06 06:40:23 +0000131{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200132 mbedtls_mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000133 FILE *file_out, *file_in;
134
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200135 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000136
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200137 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000138
Paul Bakker33b43f12013-08-20 11:48:36 +0200139 file_out = fopen( output_file, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000140 TEST_ASSERT( file_out != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200141 TEST_ASSERT( mbedtls_mpi_write_file( NULL, &X, output_radix, file_out ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000142 fclose(file_out);
143
Paul Bakker33b43f12013-08-20 11:48:36 +0200144 file_in = fopen( output_file, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000145 TEST_ASSERT( file_in != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200146 TEST_ASSERT( mbedtls_mpi_read_file( &Y, output_radix, file_in ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000147 fclose(file_in);
148
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200149 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000150
Paul Bakkerbd51b262014-07-10 15:26:12 +0200151exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200152 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000153}
Paul Bakker33b43f12013-08-20 11:48:36 +0200154/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000155
Paul Bakker33b43f12013-08-20 11:48:36 +0200156/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200157void mbedtls_mpi_get_bit( int radix_X, char *input_X, int pos, int val )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000158{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200159 mbedtls_mpi X;
160 mbedtls_mpi_init( &X );
161 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
162 TEST_ASSERT( mbedtls_mpi_get_bit( &X, pos ) == val );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000163
Paul Bakkerbd51b262014-07-10 15:26:12 +0200164exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200165 mbedtls_mpi_free( &X );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000166}
Paul Bakker33b43f12013-08-20 11:48:36 +0200167/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000168
Paul Bakker33b43f12013-08-20 11:48:36 +0200169/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200170void mbedtls_mpi_set_bit( int radix_X, char *input_X, int pos, int val, int radix_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200171 char *output_Y )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000172{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200173 mbedtls_mpi X, Y;
174 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000175
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200176 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
177 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, output_Y ) == 0 );
178 TEST_ASSERT( mbedtls_mpi_set_bit( &X, pos, val ) == 0 );
179 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000180
Paul Bakkerbd51b262014-07-10 15:26:12 +0200181exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200182 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000183}
Paul Bakker33b43f12013-08-20 11:48:36 +0200184/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000185
Paul Bakker33b43f12013-08-20 11:48:36 +0200186/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200187void mbedtls_mpi_lsb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000188{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200189 mbedtls_mpi X;
190 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000191
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200192 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
193 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000194
Paul Bakkerbd51b262014-07-10 15:26:12 +0200195exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200196 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000197}
Paul Bakker33b43f12013-08-20 11:48:36 +0200198/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000199
Paul Bakker33b43f12013-08-20 11:48:36 +0200200/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200201void mbedtls_mpi_msb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000202{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200203 mbedtls_mpi X;
204 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000205
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200206 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
207 TEST_ASSERT( mbedtls_mpi_msb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000208
Paul Bakkerbd51b262014-07-10 15:26:12 +0200209exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200210 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000211}
Paul Bakker33b43f12013-08-20 11:48:36 +0200212/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000213
Paul Bakker33b43f12013-08-20 11:48:36 +0200214/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200215void mbedtls_mpi_gcd( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200216 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000217{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200218 mbedtls_mpi A, X, Y, Z;
219 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000220
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200221 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
222 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
223 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
224 TEST_ASSERT( mbedtls_mpi_gcd( &Z, &X, &Y ) == 0 );
225 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
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( &A ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
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 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200233void mbedtls_mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000234{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200235 mbedtls_mpi X;
236 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000237
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200238 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0);
239 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000240
Paul Bakkerbd51b262014-07-10 15:26:12 +0200241exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200242 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000243}
Paul Bakker33b43f12013-08-20 11:48:36 +0200244/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000245
Paul Bakker33b43f12013-08-20 11:48:36 +0200246/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200247void mbedtls_mpi_cmp_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200248 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000249{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200250 mbedtls_mpi X, Y;
251 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000252
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200253 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
254 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
255 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000256
Paul Bakkerbd51b262014-07-10 15:26:12 +0200257exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200258 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000259}
Paul Bakker33b43f12013-08-20 11:48:36 +0200260/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000261
Paul Bakker33b43f12013-08-20 11:48:36 +0200262/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200263void mbedtls_mpi_cmp_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200264 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000265{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200266 mbedtls_mpi X, Y;
267 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000268
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200269 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
270 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
271 TEST_ASSERT( mbedtls_mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000272
Paul Bakkerbd51b262014-07-10 15:26:12 +0200273exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200274 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000275}
Paul Bakker33b43f12013-08-20 11:48:36 +0200276/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000277
Paul Bakker33b43f12013-08-20 11:48:36 +0200278/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200279void mbedtls_mpi_copy( int input_X, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000280{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200281 mbedtls_mpi X, Y, A;
282 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000283
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200284 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
285 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_A ) == 0 );
286 TEST_ASSERT( mbedtls_mpi_lset( &A, input_A ) == 0 );
287 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
288 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
289 TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 );
290 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
291 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &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( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
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 */
299void mpi_copy_self( int input_X )
Paul Bakkere896fea2009-07-06 06:40:23 +0000300{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200301 mbedtls_mpi X;
302 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +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_copy( &X, &X ) == 0 );
306 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000307
Paul Bakkerbd51b262014-07-10 15:26:12 +0200308exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200309 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000310}
Paul Bakker33b43f12013-08-20 11:48:36 +0200311/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000312
Paul Bakker33b43f12013-08-20 11:48:36 +0200313/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200314void mbedtls_mpi_shrink( int before, int used, int min, int after )
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100315{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200316 mbedtls_mpi X;
317 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100318
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200319 TEST_ASSERT( mbedtls_mpi_grow( &X, before ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100320 TEST_ASSERT( used <= before );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200321 memset( X.p, 0x2a, used * sizeof( mbedtls_mpi_uint ) );
322 TEST_ASSERT( mbedtls_mpi_shrink( &X, min ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100323 TEST_ASSERT( X.n == (size_t) after );
324
Paul Bakkerbd51b262014-07-10 15:26:12 +0200325exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200326 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100327}
328/* END_CASE */
329
330/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200331void mbedtls_mpi_safe_cond_assign( int x_sign, char *x_str,
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100332 int y_sign, char *y_str )
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100333{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200334 mbedtls_mpi X, Y, XX;
335 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100336
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200337 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100338 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200339 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100340 Y.s = y_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200341 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100342
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200343 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 0 ) == 0 );
344 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100345
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200346 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 1 ) == 0 );
347 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100348
Paul Bakkerbd51b262014-07-10 15:26:12 +0200349exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200350 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100351}
352/* END_CASE */
353
354/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200355void mbedtls_mpi_safe_cond_swap( int x_sign, char *x_str,
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100356 int y_sign, char *y_str )
357{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200358 mbedtls_mpi X, Y, XX, YY;
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100359
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200360 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
361 mbedtls_mpi_init( &XX ); mbedtls_mpi_init( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100362
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200363 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100364 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200365 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100366 Y.s = y_sign;
367
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200368 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
369 TEST_ASSERT( mbedtls_mpi_copy( &YY, &Y ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100370
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200371 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
372 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
373 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100374
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 1 ) == 0 );
376 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &XX ) == 0 );
377 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100378
Paul Bakkerbd51b262014-07-10 15:26:12 +0200379exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200380 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
381 mbedtls_mpi_free( &XX ); mbedtls_mpi_free( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100382}
383/* END_CASE */
384
385/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200386void mbedtls_mpi_swap( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000387{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200388 mbedtls_mpi X, Y, A;
389 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000390
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200391 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
392 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 );
393 TEST_ASSERT( mbedtls_mpi_lset( &A, input_X ) == 0 );
394 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
395 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
396 mbedtls_mpi_swap( &X, &Y );
397 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
398 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000399
Paul Bakkerbd51b262014-07-10 15:26:12 +0200400exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200401 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000402}
Paul Bakker33b43f12013-08-20 11:48:36 +0200403/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000404
Paul Bakker33b43f12013-08-20 11:48:36 +0200405/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200406void mbedtls_mpi_add_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200407 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000408{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 mbedtls_mpi X, Y, Z, A;
410 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000411
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200412 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
413 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
414 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
415 TEST_ASSERT( mbedtls_mpi_add_mpi( &Z, &X, &Y ) == 0 );
416 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &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( &Z ); 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 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200424void mbedtls_mpi_add_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200425 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_abs( &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 */
442void mpi_add_abs_add_first( int radix_X, char *input_X, int radix_Y,
443 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000444{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445 mbedtls_mpi X, Y, A;
446 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000447
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200448 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
449 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
450 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
451 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &Y ) == 0 );
452 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000453
Paul Bakkerbd51b262014-07-10 15:26:12 +0200454exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200455 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000456}
Paul Bakker33b43f12013-08-20 11:48:36 +0200457/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000458
Paul Bakker33b43f12013-08-20 11:48:36 +0200459/* BEGIN_CASE */
460void mpi_add_abs_add_second( int radix_X, char *input_X, int radix_Y,
461 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000462{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200463 mbedtls_mpi X, Y, A;
464 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000465
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200466 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
467 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
468 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
469 TEST_ASSERT( mbedtls_mpi_add_abs( &Y, &X, &Y ) == 0 );
470 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000471
Paul Bakkerbd51b262014-07-10 15:26:12 +0200472exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200473 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000474}
Paul Bakker33b43f12013-08-20 11:48:36 +0200475/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000476
Paul Bakker33b43f12013-08-20 11:48:36 +0200477/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200478void mbedtls_mpi_add_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200479 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000480{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200481 mbedtls_mpi X, Z, A;
482 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000483
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200484 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
485 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
486 TEST_ASSERT( mbedtls_mpi_add_int( &Z, &X, input_Y ) == 0 );
487 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000488
Paul Bakkerbd51b262014-07-10 15:26:12 +0200489exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200490 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000491}
Paul Bakker33b43f12013-08-20 11:48:36 +0200492/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000493
Paul Bakker33b43f12013-08-20 11:48:36 +0200494/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200495void mbedtls_mpi_sub_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200496 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000497{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200498 mbedtls_mpi X, Y, Z, A;
499 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000500
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200501 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
502 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
503 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
504 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Z, &X, &Y ) == 0 );
505 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000506
Paul Bakkerbd51b262014-07-10 15:26:12 +0200507exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200508 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000509}
Paul Bakker33b43f12013-08-20 11:48:36 +0200510/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000511
Paul Bakker33b43f12013-08-20 11:48:36 +0200512/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200513void mbedtls_mpi_sub_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200514 int radix_A, char *input_A, int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000515{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200516 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000517 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200518 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000519
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200520 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
521 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
522 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000523
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200524 res = mbedtls_mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200525 TEST_ASSERT( res == sub_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000526 if( res == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200527 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000528
Paul Bakkerbd51b262014-07-10 15:26:12 +0200529exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200530 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000531}
Paul Bakker33b43f12013-08-20 11:48:36 +0200532/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000533
Paul Bakker33b43f12013-08-20 11:48:36 +0200534/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200535void mbedtls_mpi_sub_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200536 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000537{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200538 mbedtls_mpi X, Z, A;
539 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000540
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200541 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
542 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
543 TEST_ASSERT( mbedtls_mpi_sub_int( &Z, &X, input_Y ) == 0 );
544 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &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( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000548}
Paul Bakker33b43f12013-08-20 11:48:36 +0200549/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000550
Paul Bakker33b43f12013-08-20 11:48:36 +0200551/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200552void mbedtls_mpi_mul_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200553 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000554{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200555 mbedtls_mpi X, Y, Z, A;
556 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +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_mul_mpi( &Z, &X, &Y ) == 0 );
562 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &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( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000566}
Paul Bakker33b43f12013-08-20 11:48:36 +0200567/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000568
Paul Bakker33b43f12013-08-20 11:48:36 +0200569/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200570void mbedtls_mpi_mul_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200571 char *input_A, char *result_comparison )
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_mul_int( &Z, &X, input_Y ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200579 if( strcmp( result_comparison, "==" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200580 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200581 else if( strcmp( result_comparison, "!=" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200582 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) != 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200583 else
584 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000585
Paul Bakkerbd51b262014-07-10 15:26:12 +0200586exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200587 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000588}
Paul Bakker33b43f12013-08-20 11:48:36 +0200589/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000590
Paul Bakker33b43f12013-08-20 11:48:36 +0200591/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200592void mbedtls_mpi_div_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200593 int radix_A, char *input_A, int radix_B, char *input_B,
594 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000595{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200596 mbedtls_mpi X, Y, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000597 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200598 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R );
599 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000600
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200601 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
602 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
603 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
604 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
605 res = mbedtls_mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200606 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000607 if( res == 0 )
608 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200609 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
610 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000611 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000612
Paul Bakkerbd51b262014-07-10 15:26:12 +0200613exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200614 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R );
615 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000616}
Paul Bakker33b43f12013-08-20 11:48:36 +0200617/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000618
Paul Bakker33b43f12013-08-20 11:48:36 +0200619/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200620void mbedtls_mpi_div_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200621 char *input_A, int radix_B, char *input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000622{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200623 mbedtls_mpi X, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000624 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200625 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &A );
626 mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000627
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200628 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
629 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
630 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
631 res = mbedtls_mpi_div_int( &Q, &R, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200632 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000633 if( res == 0 )
634 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200635 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
636 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000637 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000638
Paul Bakkerbd51b262014-07-10 15:26:12 +0200639exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200640 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &A );
641 mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000642}
Paul Bakker33b43f12013-08-20 11:48:36 +0200643/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000644
Paul Bakker33b43f12013-08-20 11:48:36 +0200645/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200646void mbedtls_mpi_mod_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200647 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000648{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200649 mbedtls_mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000650 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200651 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000652
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200653 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
654 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
655 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
656 res = mbedtls_mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200657 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000658 if( res == 0 )
659 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200660 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000661 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000662
Paul Bakkerbd51b262014-07-10 15:26:12 +0200663exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200664 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000665}
Paul Bakker33b43f12013-08-20 11:48:36 +0200666/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000667
Paul Bakker33b43f12013-08-20 11:48:36 +0200668/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200669void mbedtls_mpi_mod_int( int radix_X, char *input_X, int input_Y, int input_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200670 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000671{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000673 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200674 mbedtls_mpi_uint r;
675 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000676
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200677 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
678 res = mbedtls_mpi_mod_int( &r, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200679 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000680 if( res == 0 )
681 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200682 TEST_ASSERT( r == (mbedtls_mpi_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +0000683 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000684
Paul Bakkerbd51b262014-07-10 15:26:12 +0200685exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200686 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000687}
Paul Bakker33b43f12013-08-20 11:48:36 +0200688/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000689
Paul Bakker33b43f12013-08-20 11:48:36 +0200690/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200691void mbedtls_mpi_exp_mod( int radix_A, char *input_A, int radix_E, char *input_E,
Paul Bakker33b43f12013-08-20 11:48:36 +0200692 int radix_N, char *input_N, int radix_RR, char *input_RR,
693 int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000694{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200695 mbedtls_mpi A, E, N, RR, Z, X;
Paul Bakker367dae42009-06-28 21:50:27 +0000696 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200697 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
698 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000699
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200700 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
701 TEST_ASSERT( mbedtls_mpi_read_string( &E, radix_E, input_E ) == 0 );
702 TEST_ASSERT( mbedtls_mpi_read_string( &N, radix_N, input_N ) == 0 );
703 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000704
Paul Bakker33b43f12013-08-20 11:48:36 +0200705 if( strlen( input_RR ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200706 TEST_ASSERT( mbedtls_mpi_read_string( &RR, radix_RR, input_RR ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000707
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200708 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR );
Paul Bakker33b43f12013-08-20 11:48:36 +0200709 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000710 if( res == 0 )
711 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200712 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000713 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000714
Paul Bakkerbd51b262014-07-10 15:26:12 +0200715exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200716 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
717 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000718}
Paul Bakker33b43f12013-08-20 11:48:36 +0200719/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000720
Paul Bakker33b43f12013-08-20 11:48:36 +0200721/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200722void mbedtls_mpi_inv_mod( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200723 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000724{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200725 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000726 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200727 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000728
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200729 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
730 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
731 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
732 res = mbedtls_mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200733 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000734 if( res == 0 )
735 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200736 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000737 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000738
Paul Bakkerbd51b262014-07-10 15:26:12 +0200739exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200740 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000741}
Paul Bakker33b43f12013-08-20 11:48:36 +0200742/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000743
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200744/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
745void mbedtls_mpi_is_prime( int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000746{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200747 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000748 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200749 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000750
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200751 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
752 res = mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200753 TEST_ASSERT( res == div_result );
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 );
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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200760/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
761void mbedtls_mpi_gen_prime( int bits, int safe, int ref_ret )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200762{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200763 mbedtls_mpi X;
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200764 int my_ret;
765
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200766 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200767
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200768 my_ret = mbedtls_mpi_gen_prime( &X, bits, safe, rnd_std_rand, NULL );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200769 TEST_ASSERT( my_ret == ref_ret );
770
771 if( ref_ret == 0 )
772 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200773 size_t actual_bits = mbedtls_mpi_msb( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200774
775 TEST_ASSERT( actual_bits >= (size_t) bits );
776 TEST_ASSERT( actual_bits <= (size_t) bits + 1 );
777
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200778 TEST_ASSERT( mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200779 if( safe )
780 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200781 mbedtls_mpi_shift_r( &X, 1 ); /* X = ( X - 1 ) / 2 */
782 TEST_ASSERT( mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200783 }
784 }
785
Paul Bakkerbd51b262014-07-10 15:26:12 +0200786exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200787 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200788}
789/* END_CASE */
790
Paul Bakker33b43f12013-08-20 11:48:36 +0200791/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200792void mbedtls_mpi_shift_l( int radix_X, char *input_X, int shift_X, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200793 char *input_A)
Paul Bakker367dae42009-06-28 21:50:27 +0000794{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200795 mbedtls_mpi X, A;
796 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000797
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200798 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
799 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
800 TEST_ASSERT( mbedtls_mpi_shift_l( &X, shift_X ) == 0 );
801 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000802
Paul Bakkerbd51b262014-07-10 15:26:12 +0200803exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200804 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000805}
Paul Bakker33b43f12013-08-20 11:48:36 +0200806/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000807
Paul Bakker33b43f12013-08-20 11:48:36 +0200808/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200809void mbedtls_mpi_shift_r( int radix_X, char *input_X, int shift_X, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200810 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000811{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200812 mbedtls_mpi X, A;
813 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000814
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200815 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
816 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
817 TEST_ASSERT( mbedtls_mpi_shift_r( &X, shift_X ) == 0 );
818 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000819
Paul Bakkerbd51b262014-07-10 15:26:12 +0200820exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200821 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000822}
Paul Bakker33b43f12013-08-20 11:48:36 +0200823/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000824
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200825/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Paul Bakker33b43f12013-08-20 11:48:36 +0200826void mpi_selftest()
Paul Bakkere896fea2009-07-06 06:40:23 +0000827{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200828 TEST_ASSERT( mbedtls_mpi_self_test( 0 ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000829}
Paul Bakker33b43f12013-08-20 11:48:36 +0200830/* END_CASE */