mirror of
				https://github.com/yuzu-emu/mbedtls.git
				synced 2025-11-04 15:05:06 +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