- Fixed a bug in mpi_gcd() that prevented correct funtioning when both input numbers are even.
This commit is contained in:
parent
785a9eeece
commit
4e0d7ca233
2 changed files with 54 additions and 6 deletions
|
@ -1,5 +1,13 @@
|
||||||
PolarSSL ChangeLog
|
PolarSSL ChangeLog
|
||||||
|
|
||||||
|
= Version 0.10.2 released on 2009-XXXX
|
||||||
|
* Fixed a bug in mpi_gcd() so that it also works when both
|
||||||
|
input numbers are even and added testcases to check
|
||||||
|
(found by Pierre Habouzit)
|
||||||
|
|
||||||
|
= Version 0.10.1 released on 2009-01-25
|
||||||
|
* Added BSD License
|
||||||
|
|
||||||
= Version 0.10.0 released on 2009-01-12
|
= Version 0.10.0 released on 2009-01-12
|
||||||
* Migrated XySSL to PolarSSL
|
* Migrated XySSL to PolarSSL
|
||||||
* Added XTEA symmetric cipher
|
* Added XTEA symmetric cipher
|
||||||
|
|
|
@ -1478,21 +1478,29 @@ cleanup:
|
||||||
*/
|
*/
|
||||||
int mpi_gcd( mpi *G, mpi *A, mpi *B )
|
int mpi_gcd( mpi *G, mpi *A, mpi *B )
|
||||||
{
|
{
|
||||||
int ret;
|
int ret, lz, lzt;
|
||||||
mpi TG, TA, TB;
|
mpi TG, TA, TB;
|
||||||
|
|
||||||
mpi_init( &TG, &TA, &TB, NULL );
|
mpi_init( &TG, &TA, &TB, NULL );
|
||||||
|
|
||||||
MPI_CHK( mpi_lset( &TG, 1 ) );
|
|
||||||
MPI_CHK( mpi_copy( &TA, A ) );
|
MPI_CHK( mpi_copy( &TA, A ) );
|
||||||
MPI_CHK( mpi_copy( &TB, B ) );
|
MPI_CHK( mpi_copy( &TB, B ) );
|
||||||
|
|
||||||
|
lz = mpi_lsb( &TA );
|
||||||
|
lzt = mpi_lsb( &TB );
|
||||||
|
|
||||||
|
if ( lzt < lz )
|
||||||
|
lz = lzt;
|
||||||
|
|
||||||
|
MPI_CHK( mpi_shift_r( &TA, lz ) );
|
||||||
|
MPI_CHK( mpi_shift_r( &TB, lz ) );
|
||||||
|
|
||||||
TA.s = TB.s = 1;
|
TA.s = TB.s = 1;
|
||||||
|
|
||||||
while( mpi_cmp_int( &TA, 0 ) != 0 )
|
while( mpi_cmp_int( &TA, 0 ) != 0 )
|
||||||
{
|
{
|
||||||
while( ( TA.p[0] & 1 ) == 0 ) MPI_CHK( mpi_shift_r( &TA, 1 ) );
|
MPI_CHK( mpi_shift_r( &TA, mpi_lsb( &TA ) ) );
|
||||||
while( ( TB.p[0] & 1 ) == 0 ) MPI_CHK( mpi_shift_r( &TB, 1 ) );
|
MPI_CHK( mpi_shift_r( &TB, mpi_lsb( &TB ) ) );
|
||||||
|
|
||||||
if( mpi_cmp_mpi( &TA, &TB ) >= 0 )
|
if( mpi_cmp_mpi( &TA, &TB ) >= 0 )
|
||||||
{
|
{
|
||||||
|
@ -1506,7 +1514,8 @@ int mpi_gcd( mpi *G, mpi *A, mpi *B )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MPI_CHK( mpi_mul_mpi( G, &TG, &TB ) );
|
MPI_CHK( mpi_shift_l( &TB, lz ) );
|
||||||
|
MPI_CHK( mpi_copy( G, &TB ) );
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
||||||
|
@ -1820,12 +1829,21 @@ cleanup:
|
||||||
|
|
||||||
#if defined(POLARSSL_SELF_TEST)
|
#if defined(POLARSSL_SELF_TEST)
|
||||||
|
|
||||||
|
#define GCD_PAIR_COUNT 3
|
||||||
|
|
||||||
|
static const int gcd_pairs[GCD_PAIR_COUNT][3] =
|
||||||
|
{
|
||||||
|
{ 693, 609, 21 },
|
||||||
|
{ 1764, 868, 28 },
|
||||||
|
{ 768454923, 542167814, 1 }
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Checkup routine
|
* Checkup routine
|
||||||
*/
|
*/
|
||||||
int mpi_self_test( int verbose )
|
int mpi_self_test( int verbose )
|
||||||
{
|
{
|
||||||
int ret;
|
int ret, i;
|
||||||
mpi A, E, N, X, Y, U, V;
|
mpi A, E, N, X, Y, U, V;
|
||||||
|
|
||||||
mpi_init( &A, &E, &N, &X, &Y, &U, &V, NULL );
|
mpi_init( &A, &E, &N, &X, &Y, &U, &V, NULL );
|
||||||
|
@ -1939,6 +1957,28 @@ int mpi_self_test( int verbose )
|
||||||
if( verbose != 0 )
|
if( verbose != 0 )
|
||||||
printf( "passed\n" );
|
printf( "passed\n" );
|
||||||
|
|
||||||
|
if( verbose != 0 )
|
||||||
|
printf( " MPI test #5 (simple gcd): " );
|
||||||
|
|
||||||
|
for ( i = 0; i < GCD_PAIR_COUNT; i++)
|
||||||
|
{
|
||||||
|
MPI_CHK( mpi_lset( &X, gcd_pairs[i][0] ) );
|
||||||
|
MPI_CHK( mpi_lset( &Y, gcd_pairs[i][1] ) );
|
||||||
|
|
||||||
|
MPI_CHK( mpi_gcd( &A, &X, &Y ) );
|
||||||
|
|
||||||
|
if( mpi_cmp_int( &A, gcd_pairs[i][2] ) != 0 )
|
||||||
|
{
|
||||||
|
if( verbose != 0 )
|
||||||
|
printf( "failed at %d\n", i );
|
||||||
|
|
||||||
|
return( 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( verbose != 0 )
|
||||||
|
printf( "passed\n" );
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
||||||
if( ret != 0 && verbose != 0 )
|
if( ret != 0 && verbose != 0 )
|
||||||
|
|
Loading…
Reference in a new issue