mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2025-05-12 03:22:10 +00:00
Move mbedtls_cf_mpi_uint_lt function to the constant-time module
Signed-off-by: Gabor Mezei <gabor.mezei@arm.com>
This commit is contained in:
parent
17da4f2a4e
commit
097d4f555e
|
@ -1247,41 +1247,6 @@ int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y )
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Decide if an integer is less than the other, without branches.
|
|
||||||
*
|
|
||||||
* \param x First integer.
|
|
||||||
* \param y Second integer.
|
|
||||||
*
|
|
||||||
* \return 1 if \p x is less than \p y, 0 otherwise
|
|
||||||
*/
|
|
||||||
static unsigned mbedtls_cf_mpi_uint_lt( const mbedtls_mpi_uint x,
|
|
||||||
const mbedtls_mpi_uint y )
|
|
||||||
{
|
|
||||||
mbedtls_mpi_uint ret;
|
|
||||||
mbedtls_mpi_uint cond;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check if the most significant bits (MSB) of the operands are different.
|
|
||||||
*/
|
|
||||||
cond = ( x ^ y );
|
|
||||||
/*
|
|
||||||
* If the MSB are the same then the difference x-y will be negative (and
|
|
||||||
* have its MSB set to 1 during conversion to unsigned) if and only if x<y.
|
|
||||||
*/
|
|
||||||
ret = ( x - y ) & ~cond;
|
|
||||||
/*
|
|
||||||
* If the MSB are different, then the operand with the MSB of 1 is the
|
|
||||||
* bigger. (That is if y has MSB of 1, then x<y is true and it is false if
|
|
||||||
* the MSB of y is 0.)
|
|
||||||
*/
|
|
||||||
ret |= y & cond;
|
|
||||||
|
|
||||||
|
|
||||||
ret = ret >> ( sizeof( mbedtls_mpi_uint ) * 8 - 1 );
|
|
||||||
|
|
||||||
return (unsigned) ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compare signed values in constant time
|
* Compare signed values in constant time
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -20,6 +20,11 @@
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "constant_time.h"
|
#include "constant_time.h"
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_BIGNUM_C)
|
||||||
|
#include "mbedtls/bignum.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* constant-time buffer comparison */
|
/* constant-time buffer comparison */
|
||||||
int mbedtls_ssl_safer_memcmp( const void *a, const void *b, size_t n )
|
int mbedtls_ssl_safer_memcmp( const void *a, const void *b, size_t n )
|
||||||
{
|
{
|
||||||
|
@ -229,3 +234,42 @@ unsigned mbedtls_cf_size_gt( size_t size, size_t max )
|
||||||
/* Return the sign bit (1 for negative) of (max - size). */
|
/* Return the sign bit (1 for negative) of (max - size). */
|
||||||
return( ( max - size ) >> ( sizeof( size_t ) * 8 - 1 ) );
|
return( ( max - size ) >> ( sizeof( size_t ) * 8 - 1 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_BIGNUM_C)
|
||||||
|
|
||||||
|
/** Decide if an integer is less than the other, without branches.
|
||||||
|
*
|
||||||
|
* \param x First integer.
|
||||||
|
* \param y Second integer.
|
||||||
|
*
|
||||||
|
* \return 1 if \p x is less than \p y, 0 otherwise
|
||||||
|
*/
|
||||||
|
unsigned mbedtls_cf_mpi_uint_lt( const mbedtls_mpi_uint x,
|
||||||
|
const mbedtls_mpi_uint y )
|
||||||
|
{
|
||||||
|
mbedtls_mpi_uint ret;
|
||||||
|
mbedtls_mpi_uint cond;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if the most significant bits (MSB) of the operands are different.
|
||||||
|
*/
|
||||||
|
cond = ( x ^ y );
|
||||||
|
/*
|
||||||
|
* If the MSB are the same then the difference x-y will be negative (and
|
||||||
|
* have its MSB set to 1 during conversion to unsigned) if and only if x<y.
|
||||||
|
*/
|
||||||
|
ret = ( x - y ) & ~cond;
|
||||||
|
/*
|
||||||
|
* If the MSB are different, then the operand with the MSB of 1 is the
|
||||||
|
* bigger. (That is if y has MSB of 1, then x<y is true and it is false if
|
||||||
|
* the MSB of y is 0.)
|
||||||
|
*/
|
||||||
|
ret |= y & cond;
|
||||||
|
|
||||||
|
|
||||||
|
ret = ret >> ( sizeof( mbedtls_mpi_uint ) * 8 - 1 );
|
||||||
|
|
||||||
|
return (unsigned) ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* MBEDTLS_BIGNUM_C */
|
||||||
|
|
|
@ -19,6 +19,10 @@
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_BIGNUM_C)
|
||||||
|
#include "mbedtls/bignum.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
int mbedtls_ssl_safer_memcmp( const void *a, const void *b, size_t n );
|
int mbedtls_ssl_safer_memcmp( const void *a, const void *b, size_t n );
|
||||||
|
@ -41,3 +45,10 @@ size_t mbedtls_cf_size_mask_ge( size_t x, size_t y );
|
||||||
size_t mbedtls_cf_size_bool_eq( size_t x, size_t y );
|
size_t mbedtls_cf_size_bool_eq( size_t x, size_t y );
|
||||||
|
|
||||||
unsigned mbedtls_cf_size_gt( size_t size, size_t max );
|
unsigned mbedtls_cf_size_gt( size_t size, size_t max );
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_BIGNUM_C)
|
||||||
|
|
||||||
|
unsigned mbedtls_cf_mpi_uint_lt( const mbedtls_mpi_uint x,
|
||||||
|
const mbedtls_mpi_uint y );
|
||||||
|
|
||||||
|
#endif /* MBEDTLS_BIGNUM_C */
|
||||||
|
|
Loading…
Reference in a new issue