blob: b94c8898010ec9efcaad6beb96573e20e751a292 [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 */
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +020011void mpi_null( )
12{
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 */
Paul Bakker33b43f12013-08-20 11:48:36 +020030void mpi_read_write_string( int radix_X, char *input_X, int radix_A,
31 char *input_A, int output_size, int result_read,
32 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 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020056void mbedtls_mpi_read_binary( char *input_X, 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];
60 unsigned char buf[1000];
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +010061 size_t len;
Paul Bakkerf4a3f302011-04-24 15:53:29 +000062 size_t input_len;
Paul Bakkere896fea2009-07-06 06:40:23 +000063
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020064 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000065
Paul Bakker33b43f12013-08-20 11:48:36 +020066 input_len = unhexify( buf, input_X );
Paul Bakkere896fea2009-07-06 06:40:23 +000067
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020068 TEST_ASSERT( mbedtls_mpi_read_binary( &X, buf, input_len ) == 0 );
Manuel Pégourié-Gonnardf79b4252015-06-02 15:41:48 +010069 TEST_ASSERT( mbedtls_mpi_write_string( &X, radix_A, (char *) str, sizeof( str ), &len ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +020070 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +000071
Paul Bakkerbd51b262014-07-10 15:26:12 +020072exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020073 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000074}
Paul Bakker33b43f12013-08-20 11:48:36 +020075/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000076
Paul Bakker33b43f12013-08-20 11:48:36 +020077/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020078void mbedtls_mpi_write_binary( int radix_X, char *input_X, char *input_A,
Paul Bakker33b43f12013-08-20 11:48:36 +020079 int output_size, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +000080{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020081 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +000082 unsigned char str[1000];
83 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000084 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +000085
86 memset( buf, 0x00, 1000 );
87 memset( str, 0x00, 1000 );
88
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020089 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000090
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020091 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +010092
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020093 buflen = mbedtls_mpi_size( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +020094 if( buflen > (size_t) output_size )
95 buflen = (size_t) output_size;
Paul Bakkere896fea2009-07-06 06:40:23 +000096
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020097 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == result );
Paul Bakker33b43f12013-08-20 11:48:36 +020098 if( result == 0)
Paul Bakkerba48cb22009-07-12 11:01:32 +000099 {
100 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +0000101
Paul Bakker33b43f12013-08-20 11:48:36 +0200102 TEST_ASSERT( strcasecmp( (char *) str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000103 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000104
Paul Bakkerbd51b262014-07-10 15:26:12 +0200105exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200106 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000107}
Paul Bakker33b43f12013-08-20 11:48:36 +0200108/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000109
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200110/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
111void mbedtls_mpi_read_file( int radix_X, char *input_file, char *input_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200112 int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000113{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200114 mbedtls_mpi X;
Paul Bakkere896fea2009-07-06 06:40:23 +0000115 unsigned char str[1000];
116 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000117 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +0000118 FILE *file;
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000119 int ret;
Paul Bakkere896fea2009-07-06 06:40:23 +0000120
121 memset( buf, 0x00, 1000 );
122 memset( str, 0x00, 1000 );
123
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200124 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000125
Paul Bakker33b43f12013-08-20 11:48:36 +0200126 file = fopen( input_file, "r" );
Paul Bakker8a0c0a92014-04-17 16:08:20 +0200127 TEST_ASSERT( file != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200128 ret = mbedtls_mpi_read_file( &X, radix_X, file );
Paul Bakkere896fea2009-07-06 06:40:23 +0000129 fclose(file);
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000130 TEST_ASSERT( ret == result );
Paul Bakkere896fea2009-07-06 06:40:23 +0000131
Paul Bakker33b43f12013-08-20 11:48:36 +0200132 if( result == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000133 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200134 buflen = mbedtls_mpi_size( &X );
135 TEST_ASSERT( mbedtls_mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000136
Paul Bakkerba48cb22009-07-12 11:01:32 +0000137 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +0000138
Paul Bakker33b43f12013-08-20 11:48:36 +0200139 TEST_ASSERT( strcasecmp( (char *) str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000140 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000141
Paul Bakkerbd51b262014-07-10 15:26:12 +0200142exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200143 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000144}
Paul Bakker33b43f12013-08-20 11:48:36 +0200145/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000146
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200147/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
148void mbedtls_mpi_write_file( int radix_X, char *input_X, int output_radix,
Paul Bakker33b43f12013-08-20 11:48:36 +0200149 char *output_file )
Paul Bakkere896fea2009-07-06 06:40:23 +0000150{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200151 mbedtls_mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000152 FILE *file_out, *file_in;
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200153 int ret;
Paul Bakker69998dd2009-07-11 19:15:20 +0000154
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200155 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000156
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200157 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000158
Paul Bakker33b43f12013-08-20 11:48:36 +0200159 file_out = fopen( output_file, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000160 TEST_ASSERT( file_out != NULL );
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200161 ret = mbedtls_mpi_write_file( NULL, &X, output_radix, file_out );
Paul Bakkere896fea2009-07-06 06:40:23 +0000162 fclose(file_out);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200163 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000164
Paul Bakker33b43f12013-08-20 11:48:36 +0200165 file_in = fopen( output_file, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000166 TEST_ASSERT( file_in != NULL );
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200167 ret = mbedtls_mpi_read_file( &Y, output_radix, file_in );
Paul Bakkere896fea2009-07-06 06:40:23 +0000168 fclose(file_in);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200169 TEST_ASSERT( ret == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000170
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200171 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000172
Paul Bakkerbd51b262014-07-10 15:26:12 +0200173exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200174 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000175}
Paul Bakker33b43f12013-08-20 11:48:36 +0200176/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000177
Paul Bakker33b43f12013-08-20 11:48:36 +0200178/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200179void mbedtls_mpi_get_bit( int radix_X, char *input_X, int pos, int val )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000180{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200181 mbedtls_mpi X;
182 mbedtls_mpi_init( &X );
183 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
184 TEST_ASSERT( mbedtls_mpi_get_bit( &X, pos ) == val );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000185
Paul Bakkerbd51b262014-07-10 15:26:12 +0200186exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200187 mbedtls_mpi_free( &X );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000188}
Paul Bakker33b43f12013-08-20 11:48:36 +0200189/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000190
Paul Bakker33b43f12013-08-20 11:48:36 +0200191/* BEGIN_CASE */
Paul Bakkerec5ceb62016-07-14 12:47:07 +0100192void mbedtls_mpi_set_bit( int radix_X, char *input_X, int pos, int val,
193 int radix_Y, char *output_Y, int result )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000194{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200195 mbedtls_mpi X, Y;
196 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000197
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200198 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
199 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, output_Y ) == 0 );
Paul Bakkerec5ceb62016-07-14 12:47:07 +0100200 TEST_ASSERT( mbedtls_mpi_set_bit( &X, pos, val ) == result );
201
202 if( result == 0 )
203 {
204 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
205 }
Paul Bakker2f5947e2011-05-18 15:47:11 +0000206
Paul Bakkerbd51b262014-07-10 15:26:12 +0200207exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200208 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000209}
Paul Bakker33b43f12013-08-20 11:48:36 +0200210/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000211
Paul Bakker33b43f12013-08-20 11:48:36 +0200212/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200213void mbedtls_mpi_lsb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000214{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200215 mbedtls_mpi X;
216 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000217
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200218 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
219 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000220
Paul Bakkerbd51b262014-07-10 15:26:12 +0200221exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200222 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000223}
Paul Bakker33b43f12013-08-20 11:48:36 +0200224/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000225
Paul Bakker33b43f12013-08-20 11:48:36 +0200226/* BEGIN_CASE */
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200227void mbedtls_mpi_bitlen( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000228{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200229 mbedtls_mpi X;
230 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000231
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200232 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200233 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000234
Paul Bakkerbd51b262014-07-10 15:26:12 +0200235exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200236 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000237}
Paul Bakker33b43f12013-08-20 11:48:36 +0200238/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000239
Paul Bakker33b43f12013-08-20 11:48:36 +0200240/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200241void mbedtls_mpi_gcd( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200242 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000243{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200244 mbedtls_mpi A, X, Y, Z;
245 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000246
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200247 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
248 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
249 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
250 TEST_ASSERT( mbedtls_mpi_gcd( &Z, &X, &Y ) == 0 );
251 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000252
Paul Bakkerbd51b262014-07-10 15:26:12 +0200253exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200254 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000255}
Paul Bakker33b43f12013-08-20 11:48:36 +0200256/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000257
Paul Bakker33b43f12013-08-20 11:48:36 +0200258/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200259void mbedtls_mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000260{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200261 mbedtls_mpi X;
262 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000263
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200264 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0);
265 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000266
Paul Bakkerbd51b262014-07-10 15:26:12 +0200267exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200268 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000269}
Paul Bakker33b43f12013-08-20 11:48:36 +0200270/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000271
Paul Bakker33b43f12013-08-20 11:48:36 +0200272/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200273void mbedtls_mpi_cmp_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200274 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000275{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200276 mbedtls_mpi X, Y;
277 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000278
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200279 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
280 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
281 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000282
Paul Bakkerbd51b262014-07-10 15:26:12 +0200283exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200284 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000285}
Paul Bakker33b43f12013-08-20 11:48:36 +0200286/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000287
Paul Bakker33b43f12013-08-20 11:48:36 +0200288/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200289void mbedtls_mpi_cmp_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200290 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000291{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200292 mbedtls_mpi X, Y;
293 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000294
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200295 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
296 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
297 TEST_ASSERT( mbedtls_mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000298
Paul Bakkerbd51b262014-07-10 15:26:12 +0200299exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200300 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000301}
Paul Bakker33b43f12013-08-20 11:48:36 +0200302/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000303
Paul Bakker33b43f12013-08-20 11:48:36 +0200304/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200305void mbedtls_mpi_copy( int input_X, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000306{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200307 mbedtls_mpi X, Y, A;
308 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000309
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200310 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
311 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_A ) == 0 );
312 TEST_ASSERT( mbedtls_mpi_lset( &A, input_A ) == 0 );
313 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
314 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
315 TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 );
316 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
317 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) != 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000318
Paul Bakkerbd51b262014-07-10 15:26:12 +0200319exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200320 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000321}
Paul Bakker33b43f12013-08-20 11:48:36 +0200322/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000323
Paul Bakker33b43f12013-08-20 11:48:36 +0200324/* BEGIN_CASE */
325void mpi_copy_self( int input_X )
Paul Bakkere896fea2009-07-06 06:40:23 +0000326{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327 mbedtls_mpi X;
328 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000329
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200330 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
331 TEST_ASSERT( mbedtls_mpi_copy( &X, &X ) == 0 );
332 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000333
Paul Bakkerbd51b262014-07-10 15:26:12 +0200334exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200335 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000336}
Paul Bakker33b43f12013-08-20 11:48:36 +0200337/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000338
Paul Bakker33b43f12013-08-20 11:48:36 +0200339/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200340void mbedtls_mpi_shrink( int before, int used, int min, int after )
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100341{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200342 mbedtls_mpi X;
343 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100344
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200345 TEST_ASSERT( mbedtls_mpi_grow( &X, before ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100346 TEST_ASSERT( used <= before );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200347 memset( X.p, 0x2a, used * sizeof( mbedtls_mpi_uint ) );
348 TEST_ASSERT( mbedtls_mpi_shrink( &X, min ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100349 TEST_ASSERT( X.n == (size_t) after );
350
Paul Bakkerbd51b262014-07-10 15:26:12 +0200351exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200352 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100353}
354/* END_CASE */
355
356/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200357void mbedtls_mpi_safe_cond_assign( int x_sign, char *x_str,
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100358 int y_sign, char *y_str )
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100359{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200360 mbedtls_mpi X, Y, XX;
361 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +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é-Gonnard3e3d2b82013-11-21 21:12:26 +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é-Gonnard3e3d2b82013-11-21 21:12:26 +0100366 Y.s = y_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200367 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100368
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200369 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 0 ) == 0 );
370 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100371
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200372 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 1 ) == 0 );
373 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100374
Paul Bakkerbd51b262014-07-10 15:26:12 +0200375exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200376 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100377}
378/* END_CASE */
379
380/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200381void mbedtls_mpi_safe_cond_swap( int x_sign, char *x_str,
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100382 int y_sign, char *y_str )
383{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200384 mbedtls_mpi X, Y, XX, YY;
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100385
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200386 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
387 mbedtls_mpi_init( &XX ); mbedtls_mpi_init( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100388
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100390 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200391 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100392 Y.s = y_sign;
393
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200394 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
395 TEST_ASSERT( mbedtls_mpi_copy( &YY, &Y ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100396
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200397 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
398 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
399 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100400
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200401 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 1 ) == 0 );
402 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &XX ) == 0 );
403 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100404
Paul Bakkerbd51b262014-07-10 15:26:12 +0200405exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200406 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
407 mbedtls_mpi_free( &XX ); mbedtls_mpi_free( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100408}
409/* END_CASE */
410
411/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200412void mbedtls_mpi_swap( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000413{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200414 mbedtls_mpi X, Y, A;
415 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000416
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200417 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
418 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 );
419 TEST_ASSERT( mbedtls_mpi_lset( &A, input_X ) == 0 );
420 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
421 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
422 mbedtls_mpi_swap( &X, &Y );
423 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
424 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000425
Paul Bakkerbd51b262014-07-10 15:26:12 +0200426exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200427 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000428}
Paul Bakker33b43f12013-08-20 11:48:36 +0200429/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000430
Paul Bakker33b43f12013-08-20 11:48:36 +0200431/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200432void mbedtls_mpi_add_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200433 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000434{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200435 mbedtls_mpi X, Y, Z, A;
436 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000437
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200438 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
439 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
440 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
441 TEST_ASSERT( mbedtls_mpi_add_mpi( &Z, &X, &Y ) == 0 );
442 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000443
Paul Bakkerbd51b262014-07-10 15:26:12 +0200444exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000446}
Paul Bakker33b43f12013-08-20 11:48:36 +0200447/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000448
Paul Bakker33b43f12013-08-20 11:48:36 +0200449/* BEGIN_CASE */
Janos Follath044a86b2015-10-25 10:58:03 +0100450void mbedtls_mpi_add_mpi_inplace( int radix_X, char *input_X, int radix_A, char *input_A )
451{
452 mbedtls_mpi X, A;
453 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
454
Janos Follath044a86b2015-10-25 10:58:03 +0100455 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +0100456
457 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
458 TEST_ASSERT( mbedtls_mpi_sub_abs( &X, &X, &X ) == 0 );
459 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, 0 ) == 0 );
460
461 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
462 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &X ) == 0 );
463 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
464
465 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Janos Follath044a86b2015-10-25 10:58:03 +0100466 TEST_ASSERT( mbedtls_mpi_add_mpi( &X, &X, &X ) == 0 );
467 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
468
469exit:
470 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
471}
472/* END_CASE */
473
474
475/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200476void mbedtls_mpi_add_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200477 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000478{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200479 mbedtls_mpi X, Y, Z, A;
480 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000481
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200482 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
483 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
484 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
485 TEST_ASSERT( mbedtls_mpi_add_abs( &Z, &X, &Y ) == 0 );
486 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000487
Paul Bakkerbd51b262014-07-10 15:26:12 +0200488exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200489 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000490}
Paul Bakker33b43f12013-08-20 11:48:36 +0200491/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000492
Paul Bakker33b43f12013-08-20 11:48:36 +0200493/* BEGIN_CASE */
494void mpi_add_abs_add_first( int radix_X, char *input_X, int radix_Y,
495 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000496{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200497 mbedtls_mpi X, Y, A;
498 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000499
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200500 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
501 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
502 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
503 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &Y ) == 0 );
504 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000505
Paul Bakkerbd51b262014-07-10 15:26:12 +0200506exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200507 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000508}
Paul Bakker33b43f12013-08-20 11:48:36 +0200509/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000510
Paul Bakker33b43f12013-08-20 11:48:36 +0200511/* BEGIN_CASE */
512void mpi_add_abs_add_second( int radix_X, char *input_X, int radix_Y,
513 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000514{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200515 mbedtls_mpi X, Y, A;
516 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000517
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200518 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
519 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
520 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
521 TEST_ASSERT( mbedtls_mpi_add_abs( &Y, &X, &Y ) == 0 );
522 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000523
Paul Bakkerbd51b262014-07-10 15:26:12 +0200524exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200525 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000526}
Paul Bakker33b43f12013-08-20 11:48:36 +0200527/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000528
Paul Bakker33b43f12013-08-20 11:48:36 +0200529/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200530void mbedtls_mpi_add_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200531 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000532{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200533 mbedtls_mpi X, Z, A;
534 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000535
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200536 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
537 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
538 TEST_ASSERT( mbedtls_mpi_add_int( &Z, &X, input_Y ) == 0 );
539 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000540
Paul Bakkerbd51b262014-07-10 15:26:12 +0200541exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200542 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000543}
Paul Bakker33b43f12013-08-20 11:48:36 +0200544/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000545
Paul Bakker33b43f12013-08-20 11:48:36 +0200546/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200547void mbedtls_mpi_sub_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200548 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000549{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200550 mbedtls_mpi X, Y, Z, A;
551 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000552
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200553 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
554 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
555 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
556 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Z, &X, &Y ) == 0 );
557 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000558
Paul Bakkerbd51b262014-07-10 15:26:12 +0200559exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200560 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000561}
Paul Bakker33b43f12013-08-20 11:48:36 +0200562/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000563
Paul Bakker33b43f12013-08-20 11:48:36 +0200564/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200565void mbedtls_mpi_sub_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200566 int radix_A, char *input_A, int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000567{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200568 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000569 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200570 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000571
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200572 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
573 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
574 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +0100575
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200576 res = mbedtls_mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200577 TEST_ASSERT( res == sub_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000578 if( res == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200579 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000580
Paul Bakkerbd51b262014-07-10 15:26:12 +0200581exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200582 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000583}
Paul Bakker33b43f12013-08-20 11:48:36 +0200584/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000585
Paul Bakker33b43f12013-08-20 11:48:36 +0200586/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200587void mbedtls_mpi_sub_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200588 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000589{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200590 mbedtls_mpi X, Z, A;
591 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000592
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200593 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
594 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
595 TEST_ASSERT( mbedtls_mpi_sub_int( &Z, &X, input_Y ) == 0 );
596 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000597
Paul Bakkerbd51b262014-07-10 15:26:12 +0200598exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200599 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000600}
Paul Bakker33b43f12013-08-20 11:48:36 +0200601/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000602
Paul Bakker33b43f12013-08-20 11:48:36 +0200603/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200604void mbedtls_mpi_mul_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200605 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000606{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200607 mbedtls_mpi X, Y, Z, A;
608 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000609
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200610 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
611 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
612 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
613 TEST_ASSERT( mbedtls_mpi_mul_mpi( &Z, &X, &Y ) == 0 );
614 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000615
Paul Bakkerbd51b262014-07-10 15:26:12 +0200616exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200617 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000618}
Paul Bakker33b43f12013-08-20 11:48:36 +0200619/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000620
Paul Bakker33b43f12013-08-20 11:48:36 +0200621/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200622void mbedtls_mpi_mul_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200623 char *input_A, char *result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +0000624{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200625 mbedtls_mpi X, Z, A;
626 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
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_mul_int( &Z, &X, input_Y ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200631 if( strcmp( result_comparison, "==" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200632 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200633 else if( strcmp( result_comparison, "!=" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200634 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) != 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200635 else
636 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000637
Paul Bakkerbd51b262014-07-10 15:26:12 +0200638exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200639 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000640}
Paul Bakker33b43f12013-08-20 11:48:36 +0200641/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000642
Paul Bakker33b43f12013-08-20 11:48:36 +0200643/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200644void mbedtls_mpi_div_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200645 int radix_A, char *input_A, int radix_B, char *input_B,
646 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000647{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200648 mbedtls_mpi X, Y, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000649 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200650 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R );
651 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &B );
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 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
657 res = mbedtls_mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200658 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000659 if( res == 0 )
660 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200661 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
662 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000663 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000664
Paul Bakkerbd51b262014-07-10 15:26:12 +0200665exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200666 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R );
667 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000668}
Paul Bakker33b43f12013-08-20 11:48:36 +0200669/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000670
Paul Bakker33b43f12013-08-20 11:48:36 +0200671/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672void mbedtls_mpi_div_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200673 char *input_A, int radix_B, char *input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000674{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200675 mbedtls_mpi X, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000676 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200677 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &A );
678 mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000679
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200680 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
681 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
682 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
683 res = mbedtls_mpi_div_int( &Q, &R, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200684 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000685 if( res == 0 )
686 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200687 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
688 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000689 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000690
Paul Bakkerbd51b262014-07-10 15:26:12 +0200691exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200692 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &A );
693 mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000694}
Paul Bakker33b43f12013-08-20 11:48:36 +0200695/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000696
Paul Bakker33b43f12013-08-20 11:48:36 +0200697/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200698void mbedtls_mpi_mod_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200699 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000700{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200701 mbedtls_mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000702 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200703 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000704
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200705 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
706 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
707 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
708 res = mbedtls_mpi_mod_mpi( &X, &X, &Y );
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( &X, &A ) == 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( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000717}
Paul Bakker33b43f12013-08-20 11:48:36 +0200718/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000719
Paul Bakker33b43f12013-08-20 11:48:36 +0200720/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200721void mbedtls_mpi_mod_int( int radix_X, char *input_X, int input_Y, int input_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200722 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000723{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200724 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000725 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200726 mbedtls_mpi_uint r;
727 mbedtls_mpi_init( &X );
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 res = mbedtls_mpi_mod_int( &r, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200731 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000732 if( res == 0 )
733 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200734 TEST_ASSERT( r == (mbedtls_mpi_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +0000735 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000736
Paul Bakkerbd51b262014-07-10 15:26:12 +0200737exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200738 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000739}
Paul Bakker33b43f12013-08-20 11:48:36 +0200740/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000741
Paul Bakker33b43f12013-08-20 11:48:36 +0200742/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200743void mbedtls_mpi_exp_mod( int radix_A, char *input_A, int radix_E, char *input_E,
Paul Bakker33b43f12013-08-20 11:48:36 +0200744 int radix_N, char *input_N, int radix_RR, char *input_RR,
745 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 A, E, N, RR, Z, X;
Paul Bakker367dae42009-06-28 21:50:27 +0000748 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200749 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
750 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000751
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200752 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
753 TEST_ASSERT( mbedtls_mpi_read_string( &E, radix_E, input_E ) == 0 );
754 TEST_ASSERT( mbedtls_mpi_read_string( &N, radix_N, input_N ) == 0 );
755 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000756
Paul Bakker33b43f12013-08-20 11:48:36 +0200757 if( strlen( input_RR ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200758 TEST_ASSERT( mbedtls_mpi_read_string( &RR, radix_RR, input_RR ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000759
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200760 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR );
Paul Bakker33b43f12013-08-20 11:48:36 +0200761 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000762 if( res == 0 )
763 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200764 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000765 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000766
Paul Bakkerbd51b262014-07-10 15:26:12 +0200767exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200768 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
769 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000770}
Paul Bakker33b43f12013-08-20 11:48:36 +0200771/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000772
Paul Bakker33b43f12013-08-20 11:48:36 +0200773/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200774void mbedtls_mpi_inv_mod( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200775 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000776{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200777 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000778 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200779 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000780
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200781 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
782 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
783 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
784 res = mbedtls_mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200785 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000786 if( res == 0 )
787 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200788 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000789 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000790
Paul Bakkerbd51b262014-07-10 15:26:12 +0200791exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200792 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000793}
Paul Bakker33b43f12013-08-20 11:48:36 +0200794/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000795
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200796/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
797void mbedtls_mpi_is_prime( int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000798{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200799 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000800 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200801 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000802
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200803 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
804 res = mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200805 TEST_ASSERT( res == div_result );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000806
Paul Bakkerbd51b262014-07-10 15:26:12 +0200807exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200808 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000809}
Paul Bakker33b43f12013-08-20 11:48:36 +0200810/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000811
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200812/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
813void mbedtls_mpi_gen_prime( int bits, int safe, int ref_ret )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200814{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200815 mbedtls_mpi X;
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200816 int my_ret;
817
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200818 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200819
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200820 my_ret = mbedtls_mpi_gen_prime( &X, bits, safe, rnd_std_rand, NULL );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200821 TEST_ASSERT( my_ret == ref_ret );
822
823 if( ref_ret == 0 )
824 {
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200825 size_t actual_bits = mbedtls_mpi_bitlen( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200826
827 TEST_ASSERT( actual_bits >= (size_t) bits );
828 TEST_ASSERT( actual_bits <= (size_t) bits + 1 );
829
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200830 TEST_ASSERT( mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200831 if( safe )
832 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200833 mbedtls_mpi_shift_r( &X, 1 ); /* X = ( X - 1 ) / 2 */
834 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 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200844void mbedtls_mpi_shift_l( int radix_X, char *input_X, int shift_X, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200845 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 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200861void mbedtls_mpi_shift_r( int radix_X, char *input_X, int shift_X, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200862 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 */
Paul Bakker33b43f12013-08-20 11:48:36 +0200878void 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 */