Skip to content

Commit 2e6cbcd

Browse files
Merge pull request #308 from tempesta-tech/ak-mpi_div_mpi-opt
Small performance improvement of mbedtls_mpi_div_mpi()
2 parents 004d9a7 + d19a193 commit 2e6cbcd

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

library/bignum.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1632,14 +1632,25 @@ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A,
16321632
int ret;
16331633
size_t i, n, t, k;
16341634
mbedtls_mpi X, Y, Z, T1, T2;
1635+
mbedtls_mpi_uint TP2[3];
16351636
MPI_VALIDATE_RET( A != NULL );
16361637
MPI_VALIDATE_RET( B != NULL );
16371638

16381639
if( mbedtls_mpi_cmp_int( B, 0 ) == 0 )
16391640
return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO );
16401641

16411642
mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
1642-
mbedtls_mpi_init( &T1 ); mbedtls_mpi_init( &T2 );
1643+
mbedtls_mpi_init( &T1 );
1644+
/*
1645+
* Avoid dynamic memory allocations for constant-size T2.
1646+
*
1647+
* T2 is used for comparison only and the 3 limbs are assigned explicitly,
1648+
* so nobody increase the size of the MPI and we're safe to use an on-stack
1649+
* buffer.
1650+
*/
1651+
T2.s = 1;
1652+
T2.n = sizeof( TP2 ) / sizeof( *TP2 );
1653+
T2.p = TP2;
16431654

16441655
if( mbedtls_mpi_cmp_abs( A, B ) < 0 )
16451656
{
@@ -1655,7 +1666,6 @@ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A,
16551666
MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &Z, A->n + 2 ) );
16561667
MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Z, 0 ) );
16571668
MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T1, 2 ) );
1658-
MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T2, 3 ) );
16591669

16601670
k = mbedtls_mpi_bitlen( &Y ) % biL;
16611671
if( k < biL - 1 )
@@ -1687,6 +1697,10 @@ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A,
16871697
Y.p[t], NULL);
16881698
}
16891699

1700+
T2.p[0] = ( i < 2 ) ? 0 : X.p[i - 2];
1701+
T2.p[1] = ( i < 1 ) ? 0 : X.p[i - 1];
1702+
T2.p[2] = X.p[i];
1703+
16901704
Z.p[i - t - 1]++;
16911705
do
16921706
{
@@ -1696,11 +1710,6 @@ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A,
16961710
T1.p[0] = ( t < 1 ) ? 0 : Y.p[t - 1];
16971711
T1.p[1] = Y.p[t];
16981712
MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &T1, Z.p[i - t - 1] ) );
1699-
1700-
MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T2, 0 ) );
1701-
T2.p[0] = ( i < 2 ) ? 0 : X.p[i - 2];
1702-
T2.p[1] = ( i < 1 ) ? 0 : X.p[i - 1];
1703-
T2.p[2] = X.p[i];
17041713
}
17051714
while( mbedtls_mpi_cmp_mpi( &T1, &T2 ) > 0 );
17061715

@@ -1736,7 +1745,8 @@ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A,
17361745
cleanup:
17371746

17381747
mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
1739-
mbedtls_mpi_free( &T1 ); mbedtls_mpi_free( &T2 );
1748+
mbedtls_mpi_free( &T1 );
1749+
mbedtls_platform_zeroize( TP2, sizeof( TP2 ) );
17401750

17411751
return( ret );
17421752
}

0 commit comments

Comments
 (0)