mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2025-03-21 19:57:40 +00:00
Use bit operations for mpi_safe_cond_swap()
Unrelated to RSA (only used in ECP), but while improving one mbedtls_safe_cond_xxx function, let's improve the other as well. Signed-off-by: Manuel Pégourié-Gonnard <manuel.pegourie-gonnard@arm.com>
This commit is contained in:
parent
c3be399591
commit
464fe6a4d7
|
@ -343,6 +343,8 @@ int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char sw
|
||||||
{
|
{
|
||||||
int ret, s;
|
int ret, s;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
unsigned int sign_mask;
|
||||||
|
mbedtls_mpi_uint limb_mask;
|
||||||
mbedtls_mpi_uint tmp;
|
mbedtls_mpi_uint tmp;
|
||||||
MPI_VALIDATE_RET( X != NULL );
|
MPI_VALIDATE_RET( X != NULL );
|
||||||
MPI_VALIDATE_RET( Y != NULL );
|
MPI_VALIDATE_RET( Y != NULL );
|
||||||
|
@ -350,22 +352,36 @@ int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char sw
|
||||||
if( X == Y )
|
if( X == Y )
|
||||||
return( 0 );
|
return( 0 );
|
||||||
|
|
||||||
|
/* MSVC has a warning about unary minus on unsigned integer types,
|
||||||
|
* but this is well-defined and precisely what we want to do here. */
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning( push )
|
||||||
|
#pragma warning( disable : 4146 )
|
||||||
|
#endif
|
||||||
|
|
||||||
/* make sure swap is 0 or 1 in a time-constant manner */
|
/* make sure swap is 0 or 1 in a time-constant manner */
|
||||||
swap = (swap | (unsigned char)-swap) >> 7;
|
swap = (swap | (unsigned char)-swap) >> 7;
|
||||||
|
/* all-bits 1 if swap is 1, all-bits 0 if swap is 0 */
|
||||||
|
sign_mask = -swap;
|
||||||
|
limb_mask = -swap;
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning( pop )
|
||||||
|
#endif
|
||||||
|
|
||||||
MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, Y->n ) );
|
MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, Y->n ) );
|
||||||
MBEDTLS_MPI_CHK( mbedtls_mpi_grow( Y, X->n ) );
|
MBEDTLS_MPI_CHK( mbedtls_mpi_grow( Y, X->n ) );
|
||||||
|
|
||||||
s = X->s;
|
s = X->s;
|
||||||
X->s = X->s * ( 1 - swap ) + Y->s * swap;
|
X->s = ( X->s & ~sign_mask ) | ( Y->s & sign_mask );
|
||||||
Y->s = Y->s * ( 1 - swap ) + s * swap;
|
Y->s = ( Y->s & ~sign_mask ) | ( s & sign_mask );
|
||||||
|
|
||||||
|
|
||||||
for( i = 0; i < X->n; i++ )
|
for( i = 0; i < X->n; i++ )
|
||||||
{
|
{
|
||||||
tmp = X->p[i];
|
tmp = X->p[i];
|
||||||
X->p[i] = X->p[i] * ( 1 - swap ) + Y->p[i] * swap;
|
X->p[i] = ( X->p[i] & ~limb_mask ) | ( Y->p[i] & limb_mask );
|
||||||
Y->p[i] = Y->p[i] * ( 1 - swap ) + tmp * swap;
|
Y->p[i] = ( Y->p[i] & ~limb_mask ) | ( tmp & limb_mask );
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
Loading…
Reference in a new issue