blob: c41ca69375ae83a623c823556973e5d496fc1e97 [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 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200192void mbedtls_mpi_set_bit( int radix_X, char *input_X, int pos, int val, int radix_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200193 char *output_Y )
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 );
200 TEST_ASSERT( mbedtls_mpi_set_bit( &X, pos, val ) == 0 );
201 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000202
Paul Bakkerbd51b262014-07-10 15:26:12 +0200203exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200204 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000205}
Paul Bakker33b43f12013-08-20 11:48:36 +0200206/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000207
Paul Bakker33b43f12013-08-20 11:48:36 +0200208/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200209void mbedtls_mpi_lsb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000210{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200211 mbedtls_mpi X;
212 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000213
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200214 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
215 TEST_ASSERT( mbedtls_mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000216
Paul Bakkerbd51b262014-07-10 15:26:12 +0200217exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200218 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000219}
Paul Bakker33b43f12013-08-20 11:48:36 +0200220/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000221
Paul Bakker33b43f12013-08-20 11:48:36 +0200222/* BEGIN_CASE */
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200223void mbedtls_mpi_bitlen( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000224{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200225 mbedtls_mpi X;
226 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000227
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200228 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200229 TEST_ASSERT( mbedtls_mpi_bitlen( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000230
Paul Bakkerbd51b262014-07-10 15:26:12 +0200231exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200232 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000233}
Paul Bakker33b43f12013-08-20 11:48:36 +0200234/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000235
Paul Bakker33b43f12013-08-20 11:48:36 +0200236/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200237void mbedtls_mpi_gcd( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200238 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000239{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200240 mbedtls_mpi A, X, Y, Z;
241 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000242
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200243 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
244 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
245 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
246 TEST_ASSERT( mbedtls_mpi_gcd( &Z, &X, &Y ) == 0 );
247 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000248
Paul Bakkerbd51b262014-07-10 15:26:12 +0200249exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200250 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000251}
Paul Bakker33b43f12013-08-20 11:48:36 +0200252/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000253
Paul Bakker33b43f12013-08-20 11:48:36 +0200254/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200255void mbedtls_mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000256{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200257 mbedtls_mpi X;
258 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000259
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200260 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0);
261 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000262
Paul Bakkerbd51b262014-07-10 15:26:12 +0200263exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200264 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000265}
Paul Bakker33b43f12013-08-20 11:48:36 +0200266/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000267
Paul Bakker33b43f12013-08-20 11:48:36 +0200268/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200269void mbedtls_mpi_cmp_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200270 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000271{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200272 mbedtls_mpi X, Y;
273 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000274
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200275 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
276 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
277 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000278
Paul Bakkerbd51b262014-07-10 15:26:12 +0200279exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200280 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000281}
Paul Bakker33b43f12013-08-20 11:48:36 +0200282/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000283
Paul Bakker33b43f12013-08-20 11:48:36 +0200284/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200285void mbedtls_mpi_cmp_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200286 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000287{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200288 mbedtls_mpi X, Y;
289 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000290
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200291 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
292 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
293 TEST_ASSERT( mbedtls_mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000294
Paul Bakkerbd51b262014-07-10 15:26:12 +0200295exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200296 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000297}
Paul Bakker33b43f12013-08-20 11:48:36 +0200298/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000299
Paul Bakker33b43f12013-08-20 11:48:36 +0200300/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200301void mbedtls_mpi_copy( int input_X, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000302{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200303 mbedtls_mpi X, Y, A;
304 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000305
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200306 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
307 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_A ) == 0 );
308 TEST_ASSERT( mbedtls_mpi_lset( &A, input_A ) == 0 );
309 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
310 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
311 TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 );
312 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
313 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) != 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000314
Paul Bakkerbd51b262014-07-10 15:26:12 +0200315exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200316 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000317}
Paul Bakker33b43f12013-08-20 11:48:36 +0200318/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000319
Paul Bakker33b43f12013-08-20 11:48:36 +0200320/* BEGIN_CASE */
321void mpi_copy_self( int input_X )
Paul Bakkere896fea2009-07-06 06:40:23 +0000322{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200323 mbedtls_mpi X;
324 mbedtls_mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000325
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200326 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
327 TEST_ASSERT( mbedtls_mpi_copy( &X, &X ) == 0 );
328 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000329
Paul Bakkerbd51b262014-07-10 15:26:12 +0200330exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200331 mbedtls_mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000332}
Paul Bakker33b43f12013-08-20 11:48:36 +0200333/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000334
Paul Bakker33b43f12013-08-20 11:48:36 +0200335/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200336void mbedtls_mpi_shrink( int before, int used, int min, int after )
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100337{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200338 mbedtls_mpi X;
339 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100340
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200341 TEST_ASSERT( mbedtls_mpi_grow( &X, before ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100342 TEST_ASSERT( used <= before );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200343 memset( X.p, 0x2a, used * sizeof( mbedtls_mpi_uint ) );
344 TEST_ASSERT( mbedtls_mpi_shrink( &X, min ) == 0 );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100345 TEST_ASSERT( X.n == (size_t) after );
346
Paul Bakkerbd51b262014-07-10 15:26:12 +0200347exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200348 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100349}
350/* END_CASE */
351
352/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200353void mbedtls_mpi_safe_cond_assign( int x_sign, char *x_str,
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100354 int y_sign, char *y_str )
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100355{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200356 mbedtls_mpi X, Y, XX;
357 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100358
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200359 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100360 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200361 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100362 Y.s = y_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200363 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100364
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200365 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 0 ) == 0 );
366 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100367
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200368 TEST_ASSERT( mbedtls_mpi_safe_cond_assign( &X, &Y, 1 ) == 0 );
369 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100370
Paul Bakkerbd51b262014-07-10 15:26:12 +0200371exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200372 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &XX );
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100373}
374/* END_CASE */
375
376/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200377void mbedtls_mpi_safe_cond_swap( int x_sign, char *x_str,
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100378 int y_sign, char *y_str )
379{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200380 mbedtls_mpi X, Y, XX, YY;
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100381
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200382 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
383 mbedtls_mpi_init( &XX ); mbedtls_mpi_init( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100384
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200385 TEST_ASSERT( mbedtls_mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100386 X.s = x_sign;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200387 TEST_ASSERT( mbedtls_mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100388 Y.s = y_sign;
389
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200390 TEST_ASSERT( mbedtls_mpi_copy( &XX, &X ) == 0 );
391 TEST_ASSERT( mbedtls_mpi_copy( &YY, &Y ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100392
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200393 TEST_ASSERT( mbedtls_mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
394 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &XX ) == 0 );
395 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &YY ) == 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, 1 ) == 0 );
398 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &XX ) == 0 );
399 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &YY ) == 0 );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100400
Paul Bakkerbd51b262014-07-10 15:26:12 +0200401exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200402 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
403 mbedtls_mpi_free( &XX ); mbedtls_mpi_free( &YY );
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100404}
405/* END_CASE */
406
407/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200408void mbedtls_mpi_swap( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000409{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200410 mbedtls_mpi X, Y, A;
411 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200413 TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
414 TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 );
415 TEST_ASSERT( mbedtls_mpi_lset( &A, input_X ) == 0 );
416 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
417 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
418 mbedtls_mpi_swap( &X, &Y );
419 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
420 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000421
Paul Bakkerbd51b262014-07-10 15:26:12 +0200422exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200423 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000424}
Paul Bakker33b43f12013-08-20 11:48:36 +0200425/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000426
Paul Bakker33b43f12013-08-20 11:48:36 +0200427/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200428void mbedtls_mpi_add_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200429 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000430{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200431 mbedtls_mpi X, Y, Z, A;
432 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000433
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200434 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
435 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
436 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
437 TEST_ASSERT( mbedtls_mpi_add_mpi( &Z, &X, &Y ) == 0 );
438 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000439
Paul Bakkerbd51b262014-07-10 15:26:12 +0200440exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200441 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000442}
Paul Bakker33b43f12013-08-20 11:48:36 +0200443/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000444
Paul Bakker33b43f12013-08-20 11:48:36 +0200445/* BEGIN_CASE */
Janos Follath044a86b2015-10-25 10:58:03 +0100446void mbedtls_mpi_add_mpi_inplace( int radix_X, char *input_X, int radix_A, char *input_A )
447{
448 mbedtls_mpi X, A;
449 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
450
Janos Follath044a86b2015-10-25 10:58:03 +0100451 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Janos Follath6cbacec2015-10-25 12:29:13 +0100452
453 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
454 TEST_ASSERT( mbedtls_mpi_sub_abs( &X, &X, &X ) == 0 );
455 TEST_ASSERT( mbedtls_mpi_cmp_int( &X, 0 ) == 0 );
456
457 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
458 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &X ) == 0 );
459 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
460
461 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Janos Follath044a86b2015-10-25 10:58:03 +0100462 TEST_ASSERT( mbedtls_mpi_add_mpi( &X, &X, &X ) == 0 );
463 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
464
465exit:
466 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
467}
468/* END_CASE */
469
470
471/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200472void mbedtls_mpi_add_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200473 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000474{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200475 mbedtls_mpi X, Y, Z, A;
476 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000477
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200478 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
479 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
480 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
481 TEST_ASSERT( mbedtls_mpi_add_abs( &Z, &X, &Y ) == 0 );
482 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000483
Paul Bakkerbd51b262014-07-10 15:26:12 +0200484exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200485 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000486}
Paul Bakker33b43f12013-08-20 11:48:36 +0200487/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000488
Paul Bakker33b43f12013-08-20 11:48:36 +0200489/* BEGIN_CASE */
490void mpi_add_abs_add_first( int radix_X, char *input_X, int radix_Y,
491 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000492{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200493 mbedtls_mpi X, Y, A;
494 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000495
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200496 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
497 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
498 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
499 TEST_ASSERT( mbedtls_mpi_add_abs( &X, &X, &Y ) == 0 );
500 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000501
Paul Bakkerbd51b262014-07-10 15:26:12 +0200502exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200503 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000504}
Paul Bakker33b43f12013-08-20 11:48:36 +0200505/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000506
Paul Bakker33b43f12013-08-20 11:48:36 +0200507/* BEGIN_CASE */
508void mpi_add_abs_add_second( int radix_X, char *input_X, int radix_Y,
509 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000510{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200511 mbedtls_mpi X, Y, A;
512 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000513
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200514 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
515 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
516 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
517 TEST_ASSERT( mbedtls_mpi_add_abs( &Y, &X, &Y ) == 0 );
518 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000519
Paul Bakkerbd51b262014-07-10 15:26:12 +0200520exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200521 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000522}
Paul Bakker33b43f12013-08-20 11:48:36 +0200523/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000524
Paul Bakker33b43f12013-08-20 11:48:36 +0200525/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200526void mbedtls_mpi_add_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200527 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000528{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200529 mbedtls_mpi X, Z, A;
530 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000531
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200532 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
533 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
534 TEST_ASSERT( mbedtls_mpi_add_int( &Z, &X, input_Y ) == 0 );
535 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000536
Paul Bakkerbd51b262014-07-10 15:26:12 +0200537exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200538 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000539}
Paul Bakker33b43f12013-08-20 11:48:36 +0200540/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000541
Paul Bakker33b43f12013-08-20 11:48:36 +0200542/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200543void mbedtls_mpi_sub_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200544 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000545{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200546 mbedtls_mpi X, Y, Z, A;
547 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000548
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200549 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
550 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
551 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
552 TEST_ASSERT( mbedtls_mpi_sub_mpi( &Z, &X, &Y ) == 0 );
553 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000554
Paul Bakkerbd51b262014-07-10 15:26:12 +0200555exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200556 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000557}
Paul Bakker33b43f12013-08-20 11:48:36 +0200558/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000559
Paul Bakker33b43f12013-08-20 11:48:36 +0200560/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200561void mbedtls_mpi_sub_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200562 int radix_A, char *input_A, int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000563{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200564 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000565 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200566 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000567
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200568 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
569 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
570 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
Manuel Pégourié-Gonnarde670f902015-10-30 09:23:19 +0100571
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200572 res = mbedtls_mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200573 TEST_ASSERT( res == sub_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000574 if( res == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200575 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000576
Paul Bakkerbd51b262014-07-10 15:26:12 +0200577exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200578 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000579}
Paul Bakker33b43f12013-08-20 11:48:36 +0200580/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000581
Paul Bakker33b43f12013-08-20 11:48:36 +0200582/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200583void mbedtls_mpi_sub_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200584 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000585{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200586 mbedtls_mpi X, Z, A;
587 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000588
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200589 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
590 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
591 TEST_ASSERT( mbedtls_mpi_sub_int( &Z, &X, input_Y ) == 0 );
592 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000593
Paul Bakkerbd51b262014-07-10 15:26:12 +0200594exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200595 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000596}
Paul Bakker33b43f12013-08-20 11:48:36 +0200597/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000598
Paul Bakker33b43f12013-08-20 11:48:36 +0200599/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200600void mbedtls_mpi_mul_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200601 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000602{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200603 mbedtls_mpi X, Y, Z, A;
604 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000605
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200606 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
607 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
608 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
609 TEST_ASSERT( mbedtls_mpi_mul_mpi( &Z, &X, &Y ) == 0 );
610 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000611
Paul Bakkerbd51b262014-07-10 15:26:12 +0200612exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200613 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000614}
Paul Bakker33b43f12013-08-20 11:48:36 +0200615/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000616
Paul Bakker33b43f12013-08-20 11:48:36 +0200617/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200618void mbedtls_mpi_mul_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200619 char *input_A, char *result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +0000620{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200621 mbedtls_mpi X, Z, A;
622 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000623
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200624 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
625 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
626 TEST_ASSERT( mbedtls_mpi_mul_int( &Z, &X, input_Y ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200627 if( strcmp( result_comparison, "==" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200628 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200629 else if( strcmp( result_comparison, "!=" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200630 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) != 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200631 else
632 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000633
Paul Bakkerbd51b262014-07-10 15:26:12 +0200634exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200635 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000636}
Paul Bakker33b43f12013-08-20 11:48:36 +0200637/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000638
Paul Bakker33b43f12013-08-20 11:48:36 +0200639/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200640void mbedtls_mpi_div_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200641 int radix_A, char *input_A, int radix_B, char *input_B,
642 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000643{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200644 mbedtls_mpi X, Y, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000645 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200646 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R );
647 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000648
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200649 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
650 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
651 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
652 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
653 res = mbedtls_mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200654 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000655 if( res == 0 )
656 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200657 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
658 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000659 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000660
Paul Bakkerbd51b262014-07-10 15:26:12 +0200661exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200662 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R );
663 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000664}
Paul Bakker33b43f12013-08-20 11:48:36 +0200665/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000666
Paul Bakker33b43f12013-08-20 11:48:36 +0200667/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200668void mbedtls_mpi_div_int( int radix_X, char *input_X, int input_Y, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200669 char *input_A, int radix_B, char *input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000670{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200671 mbedtls_mpi X, Q, R, A, B;
Paul Bakker367dae42009-06-28 21:50:27 +0000672 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200673 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &A );
674 mbedtls_mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000675
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200676 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
677 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
678 TEST_ASSERT( mbedtls_mpi_read_string( &B, radix_B, input_B ) == 0 );
679 res = mbedtls_mpi_div_int( &Q, &R, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200680 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000681 if( res == 0 )
682 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200683 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Q, &A ) == 0 );
684 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &R, &B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000685 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000686
Paul Bakkerbd51b262014-07-10 15:26:12 +0200687exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200688 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &A );
689 mbedtls_mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000690}
Paul Bakker33b43f12013-08-20 11:48:36 +0200691/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000692
Paul Bakker33b43f12013-08-20 11:48:36 +0200693/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200694void mbedtls_mpi_mod_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200695 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000696{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200697 mbedtls_mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000698 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200699 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000700
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200701 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
702 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
703 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
704 res = mbedtls_mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200705 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000706 if( res == 0 )
707 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200708 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000709 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000710
Paul Bakkerbd51b262014-07-10 15:26:12 +0200711exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200712 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000713}
Paul Bakker33b43f12013-08-20 11:48:36 +0200714/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000715
Paul Bakker33b43f12013-08-20 11:48:36 +0200716/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200717void mbedtls_mpi_mod_int( int radix_X, char *input_X, int input_Y, int input_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200718 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000719{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200720 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000721 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200722 mbedtls_mpi_uint r;
723 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000724
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200725 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
726 res = mbedtls_mpi_mod_int( &r, &X, input_Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200727 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000728 if( res == 0 )
729 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200730 TEST_ASSERT( r == (mbedtls_mpi_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +0000731 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000732
Paul Bakkerbd51b262014-07-10 15:26:12 +0200733exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200734 mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000735}
Paul Bakker33b43f12013-08-20 11:48:36 +0200736/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000737
Paul Bakker33b43f12013-08-20 11:48:36 +0200738/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200739void mbedtls_mpi_exp_mod( int radix_A, char *input_A, int radix_E, char *input_E,
Paul Bakker33b43f12013-08-20 11:48:36 +0200740 int radix_N, char *input_N, int radix_RR, char *input_RR,
741 int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000742{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200743 mbedtls_mpi A, E, N, RR, Z, X;
Paul Bakker367dae42009-06-28 21:50:27 +0000744 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200745 mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N );
746 mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000747
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200748 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
749 TEST_ASSERT( mbedtls_mpi_read_string( &E, radix_E, input_E ) == 0 );
750 TEST_ASSERT( mbedtls_mpi_read_string( &N, radix_N, input_N ) == 0 );
751 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000752
Paul Bakker33b43f12013-08-20 11:48:36 +0200753 if( strlen( input_RR ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200754 TEST_ASSERT( mbedtls_mpi_read_string( &RR, radix_RR, input_RR ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000755
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200756 res = mbedtls_mpi_exp_mod( &Z, &A, &E, &N, &RR );
Paul Bakker33b43f12013-08-20 11:48:36 +0200757 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000758 if( res == 0 )
759 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200760 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000761 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000762
Paul Bakkerbd51b262014-07-10 15:26:12 +0200763exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200764 mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N );
765 mbedtls_mpi_free( &RR ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000766}
Paul Bakker33b43f12013-08-20 11:48:36 +0200767/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000768
Paul Bakker33b43f12013-08-20 11:48:36 +0200769/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200770void mbedtls_mpi_inv_mod( int radix_X, char *input_X, int radix_Y, char *input_Y,
Paul Bakker33b43f12013-08-20 11:48:36 +0200771 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000772{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200773 mbedtls_mpi X, Y, Z, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000774 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200775 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000776
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200777 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
778 TEST_ASSERT( mbedtls_mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
779 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
780 res = mbedtls_mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200781 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000782 if( res == 0 )
783 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200784 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000785 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000786
Paul Bakkerbd51b262014-07-10 15:26:12 +0200787exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200788 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000789}
Paul Bakker33b43f12013-08-20 11:48:36 +0200790/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000791
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200792/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
793void mbedtls_mpi_is_prime( int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000794{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200795 mbedtls_mpi X;
Paul Bakker367dae42009-06-28 21:50:27 +0000796 int res;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200797 mbedtls_mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000798
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200799 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
800 res = mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200801 TEST_ASSERT( res == div_result );
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 );
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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200808/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
809void mbedtls_mpi_gen_prime( int bits, int safe, int ref_ret )
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200810{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200811 mbedtls_mpi X;
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200812 int my_ret;
813
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200814 mbedtls_mpi_init( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200815
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200816 my_ret = mbedtls_mpi_gen_prime( &X, bits, safe, rnd_std_rand, NULL );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200817 TEST_ASSERT( my_ret == ref_ret );
818
819 if( ref_ret == 0 )
820 {
Manuel Pégourié-Gonnardc0696c22015-06-18 16:47:17 +0200821 size_t actual_bits = mbedtls_mpi_bitlen( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200822
823 TEST_ASSERT( actual_bits >= (size_t) bits );
824 TEST_ASSERT( actual_bits <= (size_t) bits + 1 );
825
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200826 TEST_ASSERT( mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200827 if( safe )
828 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200829 mbedtls_mpi_shift_r( &X, 1 ); /* X = ( X - 1 ) / 2 */
830 TEST_ASSERT( mbedtls_mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200831 }
832 }
833
Paul Bakkerbd51b262014-07-10 15:26:12 +0200834exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200835 mbedtls_mpi_free( &X );
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200836}
837/* END_CASE */
838
Paul Bakker33b43f12013-08-20 11:48:36 +0200839/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200840void mbedtls_mpi_shift_l( int radix_X, char *input_X, int shift_X, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200841 char *input_A)
Paul Bakker367dae42009-06-28 21:50:27 +0000842{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200843 mbedtls_mpi X, A;
844 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000845
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200846 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
847 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
848 TEST_ASSERT( mbedtls_mpi_shift_l( &X, shift_X ) == 0 );
849 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000850
Paul Bakkerbd51b262014-07-10 15:26:12 +0200851exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200852 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000853}
Paul Bakker33b43f12013-08-20 11:48:36 +0200854/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000855
Paul Bakker33b43f12013-08-20 11:48:36 +0200856/* BEGIN_CASE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200857void mbedtls_mpi_shift_r( int radix_X, char *input_X, int shift_X, int radix_A,
Paul Bakker33b43f12013-08-20 11:48:36 +0200858 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000859{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200860 mbedtls_mpi X, A;
861 mbedtls_mpi_init( &X ); mbedtls_mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000862
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200863 TEST_ASSERT( mbedtls_mpi_read_string( &X, radix_X, input_X ) == 0 );
864 TEST_ASSERT( mbedtls_mpi_read_string( &A, radix_A, input_A ) == 0 );
865 TEST_ASSERT( mbedtls_mpi_shift_r( &X, shift_X ) == 0 );
866 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000867
Paul Bakkerbd51b262014-07-10 15:26:12 +0200868exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200869 mbedtls_mpi_free( &X ); mbedtls_mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000870}
Paul Bakker33b43f12013-08-20 11:48:36 +0200871/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000872
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200873/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Paul Bakker33b43f12013-08-20 11:48:36 +0200874void mpi_selftest()
Paul Bakkere896fea2009-07-06 06:40:23 +0000875{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200876 TEST_ASSERT( mbedtls_mpi_self_test( 0 ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000877}
Paul Bakker33b43f12013-08-20 11:48:36 +0200878/* END_CASE */