mpi_lt_mpi_ct: fix condition handling

The code previously only set the done flag if the return value was one.
This led to overriding the correct return value later on.
This commit is contained in:
Janos Follath 2019-11-05 12:24:52 +00:00 committed by Simon Butcher
parent 47b56a159e
commit e9db2aa5b4

View file

@ -1147,26 +1147,25 @@ int mbedtls_mpi_lt_mpi_ct( const mbedtls_mpi *X, const mbedtls_mpi *Y,
for( i = X->n; i > 0; i-- ) for( i = X->n; i > 0; i-- )
{ {
/* /*
* If Y->p[i - 1] < X->p[i - 1] and both X and Y are negative, then * If Y->p[i - 1] < X->p[i - 1] then X < Y is true if and only if both
* X < Y. * X and Y are negative.
* *
* Again even if we can make a decision, we just mark the result and * Again even if we can make a decision, we just mark the result and
* the fact that we are done and continue looping. * the fact that we are done and continue looping.
*/ */
cond = ct_lt_mpi_uint( Y->p[i - 1], X->p[i - 1] ) & X_is_negative; cond = ct_lt_mpi_uint( Y->p[i - 1], X->p[i - 1] );
*ret |= cond & ( 1 - done ); *ret |= cond & ( 1 - done ) & X_is_negative;
done |= cond; done |= cond;
/* /*
* If X->p[i - 1] < Y->p[i - 1] and both X and Y are positive, then * If X->p[i - 1] < Y->p[i - 1] then X < Y is true if and only if both
* X < Y. * X and Y are positive.
* *
* Again even if we can make a decision, we just mark the result and * Again even if we can make a decision, we just mark the result and
* the fact that we are done and continue looping. * the fact that we are done and continue looping.
*/ */
cond = ct_lt_mpi_uint( X->p[i - 1], Y->p[i - 1] ) cond = ct_lt_mpi_uint( X->p[i - 1], Y->p[i - 1] );
& ( 1 - X_is_negative ); *ret |= cond & ( 1 - done ) & ( 1 - X_is_negative );
*ret |= cond & ( 1 - done );
done |= cond; done |= cond;
} }