minimize memory usage of mpi_exp_mod

This commit is contained in:
NIIBE Yutaka 2013-12-13 14:11:58 +09:00
parent 43440ac0e6
commit 76207e7e8d
2 changed files with 21 additions and 14 deletions

View File

@ -1,3 +1,10 @@
2013-12-13 Niibe Yutaka <gniibe@fsij.org>
* polarssl/library/bignum.c (mpi_montmul, mpi_montred): Minimize
number of limbs for T.
(mpi_exp_mod): Only allocate N-n * 2 for T.
Only allocate N->n for X, W[i], and RR.
2013-12-13 Niibe Yutaka <gniibe@fsij.org>
* src/usb_ctrl.c (HID_LED_STATUS_CARDCHANGE): Rename from

View File

@ -1358,10 +1358,11 @@ static void mpi_montmul( mpi *A, const mpi *B, const mpi *N, t_uint mm, const mp
d = T->p;
n = N->n;
m = ( B->n < n ) ? B->n : n;
memset( d, 0, (n + 1) * ciL );
memset( d, 0, n * ciL );
for( i = 0; i < n; i++ )
{
d[n] = c;
/*
* T = (T + u0*B + u1*N) / 2^biL
*/
@ -1370,11 +1371,10 @@ static void mpi_montmul( mpi *A, const mpi *B, const mpi *N, t_uint mm, const mp
mpi_mul_hlp( m, B->p, d, u0 );
c = mpi_mul_hlp( n, N->p, d, u1 );
*d++ = u0; d[n] = c;
d++;
}
d[n] = 0;
memcpy( A->p, d, (n + 1) * ciL );
memcpy( A->p, d, n * ciL );
if( ((mpi_cmp_abs( A, N ) >= 0) | c) )
mpi_sub_hlp( n, N->p, A->p );
@ -1393,10 +1393,11 @@ static void mpi_montred( mpi *A, const mpi *N, t_uint mm, const mpi *T )
d = T->p;
n = N->n;
memset( d, 0, (n + 1) * ciL );
memset( d, 0, n * ciL );
for( i = 0; i < n; i++ )
{
d[n] = c;
/*
* T = (T + u0 + u1*N) / 2^biL
*/
@ -1411,11 +1412,10 @@ static void mpi_montred( mpi *A, const mpi *N, t_uint mm, const mpi *T )
}
c = mpi_mul_hlp( n, N->p, d, u1 );
*d++ = u0; d[n] = c;
d++;
}
d[n] = 0;
memcpy( A->p, d, (n + 1) * ciL );
memcpy( A->p, d, n * ciL );
if( ((mpi_cmp_abs( A, N ) >= 0) | c) )
mpi_sub_hlp( n, N->p, A->p );
@ -1458,10 +1458,10 @@ int mpi_exp_mod( mpi *X, const mpi *A, const mpi *E, const mpi *N, mpi *_RR )
if( wsize > POLARSSL_MPI_WINDOW_SIZE )
wsize = POLARSSL_MPI_WINDOW_SIZE;
j = N->n + 1;
j = N->n;
MPI_CHK( mpi_grow( X, j ) );
MPI_CHK( mpi_grow( &W[1], j ) );
MPI_CHK( mpi_grow( &T, j * 2 - 1 ) );
MPI_CHK( mpi_grow( &T, j * 2 ) );
/*
* Compensate for negative A (and correct at the end)
@ -1485,7 +1485,7 @@ int mpi_exp_mod( mpi *X, const mpi *A, const mpi *E, const mpi *N, mpi *_RR )
MPI_CHK( mpi_shift_l( &RR0, N->n * 2 * biL ) );
MPI_CHK( mpi_mod_mpi( &RR0, &RR0, N ) );
MPI_CHK( mpi_copy( &RR, &RR0 ) ); /* Shrink to size of N. */
MPI_CHK( mpi_grow( &RR, N->n + 1 ) );
MPI_CHK( mpi_grow( &RR, N->n ) );
if( _RR != NULL )
memcpy( _RR, &RR, sizeof( mpi ) );
@ -1515,8 +1515,8 @@ int mpi_exp_mod( mpi *X, const mpi *A, const mpi *E, const mpi *N, mpi *_RR )
*/
j = one << (wsize - 1);
MPI_CHK( mpi_grow( &W[j], N->n + 1 ) );
MPI_CHK( mpi_copy( &W[j], &W[1] ) );
MPI_CHK( mpi_grow( &W[j], N->n ) );
MPI_CHK( mpi_copy( &W[j], &W[1] ) );
for( i = 0; i < wsize - 1; i++ )
mpi_montmul( &W[j], &W[j], N, mm, &T );
@ -1526,7 +1526,7 @@ int mpi_exp_mod( mpi *X, const mpi *A, const mpi *E, const mpi *N, mpi *_RR )
*/
for( i = j + 1; i < (one << wsize); i++ )
{
MPI_CHK( mpi_grow( &W[i], N->n + 1 ) );
MPI_CHK( mpi_grow( &W[i], N->n ) );
MPI_CHK( mpi_copy( &W[i], &W[i - 1] ) );
mpi_montmul( &W[i], &W[1], N, mm, &T );