From af7d44b4d2a098317dea61c7692757f5b827713f Mon Sep 17 00:00:00 2001 From: Tom Cosgrove Date: Wed, 24 Aug 2022 14:05:26 +0100 Subject: [PATCH] Tidy up, remove MPI_CORE(), apply the naming convention, and use the new mbedtls_mpi_core_add() Signed-off-by: Tom Cosgrove --- library/bignum.c | 31 ++++++++++++++----------------- library/bignum_core.c | 23 +++++++++++++---------- library/bignum_core.h | 29 ++++++++++++++--------------- 3 files changed, 41 insertions(+), 42 deletions(-) diff --git a/library/bignum.c b/library/bignum.c index 58cd2f7329..f30df2bc59 100644 --- a/library/bignum.c +++ b/library/bignum.c @@ -867,8 +867,7 @@ int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z ) int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; - size_t i, j; - mbedtls_mpi_uint *o, *p, c, tmp; + size_t j; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); @@ -882,7 +881,7 @@ int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, A ) ); /* - * X should always be positive as a result of unsigned additions. + * X must always be positive as a result of unsigned additions. */ X->s = 1; @@ -892,27 +891,25 @@ int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) ); - o = B->p; p = X->p; c = 0; + /* j is the number of non-zero limbs of B. Add those to X. */ - /* - * tmp is used because it might happen that p == o - */ - for( i = 0; i < j; i++, o++, p++ ) - { - tmp= *o; - *p += c; c = ( *p < c ); - *p += tmp; c += ( *p < tmp ); - } + mbedtls_mpi_uint *p = X->p; + + mbedtls_mpi_uint c = mbedtls_mpi_core_add( p, p, B->p, j); + + p += j; + + /* Now propagate any carry */ while( c != 0 ) { - if( i >= X->n ) + if( j >= X->n ) { - MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + 1 ) ); - p = X->p + i; + MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j + 1 ) ); + p = X->p + j; } - *p += c; c = ( *p < c ); i++; p++; + *p += c; c = ( *p < c ); j++; p++; } cleanup: diff --git a/library/bignum_core.c b/library/bignum_core.c index 3f4e6510aa..6862316c46 100644 --- a/library/bignum_core.c +++ b/library/bignum_core.c @@ -358,19 +358,22 @@ void mbedtls_mpi_core_shift_r( mbedtls_mpi_uint *X, size_t limbs, } } -mbedtls_mpi_uint MPI_CORE(add)( mbedtls_mpi_uint *d, - const mbedtls_mpi_uint *l, - const mbedtls_mpi_uint *r, - size_t n ) +mbedtls_mpi_uint mbedtls_mpi_core_add( mbedtls_mpi_uint *X, + const mbedtls_mpi_uint *A, + const mbedtls_mpi_uint *B, + size_t limbs ) { - mbedtls_mpi_uint c = 0, t; - for( size_t i = 0; i < n; i++ ) + mbedtls_mpi_uint c = 0; + + for( size_t i = 0; i < limbs; i++ ) { - t = c; - t += l[i]; c = ( t < l[i] ); - t += r[i]; c += ( t < r[i] ); - d[i] = t; + mbedtls_mpi_uint t = c + A[i]; + c = ( t < A[i] ); + t += B[i]; + c += ( t < B[i] ); + X[i] = t; } + return( c ); } diff --git a/library/bignum_core.h b/library/bignum_core.h index 0d7b89f20a..8cc985ef33 100644 --- a/library/bignum_core.h +++ b/library/bignum_core.h @@ -277,28 +277,27 @@ int mbedtls_mpi_core_write_be( const mbedtls_mpi_uint *A, void mbedtls_mpi_core_shift_r( mbedtls_mpi_uint *X, size_t limbs, size_t count ); -#define MPI_CORE(func) mbedtls_mpi_core_ ## func ## _minimal - /** - * \brief Add two known-size large unsigned integers, returning the carry. + * \brief Add two fixed-size large unsigned integers, returning the carry. * - * Calculate l + r where l and r have the same size. - * This function operates modulo (2^ciL)^n and returns the carry + * Calculates `A + B` where `A` and `B` have the same size. + * + * This function operates modulo 2^(biL*limbs) and returns the carry * (1 if there was a wraparound, and 0 otherwise). * - * d may be aliased to l or r. + * \p X may be aliased to \p A or \p B. * - * \param[out] d The result of the addition. - * \param[in] l The left operand. - * \param[in] r The right operand. - * \param n Number of limbs of \p d, \p l and \p r. + * \param[out] X The result of the addition. + * \param[in] A Little-endian presentation of the left operand. + * \param[in] B Little-endian presentation of the right operand. + * \param limbs Number of limbs of \p X, \p A and \p B. * - * \return 1 if `l + r >= (2^{ciL})^n`, 0 otherwise. + * \return 1 if `A + B >= 2^(biL*limbs)`, 0 otherwise. */ -mbedtls_mpi_uint MPI_CORE(add)( mbedtls_mpi_uint *d, - const mbedtls_mpi_uint *l, - const mbedtls_mpi_uint *r, - size_t n ); +mbedtls_mpi_uint mbedtls_mpi_core_add( mbedtls_mpi_uint *X, + const mbedtls_mpi_uint *A, + const mbedtls_mpi_uint *B, + size_t limbs ); /** * \brief Conditional addition of two fixed-size large unsigned integers,