Don't use multiplication by condition in even a semi-constant time function
Signed-off-by: Tom Cosgrove <tom.cosgrove@arm.com>
diff --git a/library/bignum_core.c b/library/bignum_core.c
index 2e18389..1ca69dc 100644
--- a/library/bignum_core.c
+++ b/library/bignum_core.c
@@ -300,9 +300,23 @@
{
mbedtls_mpi_uint c = 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
+
+ /* all-bits 1 if cond is 1, all-bits 0 if cond is 0 */
+ const mbedtls_mpi_uint mask = -(mbedtls_mpi_uint)cond;
+
+#if defined(_MSC_VER)
+#pragma warning( pop )
+#endif
+
for( size_t i = 0; i < limbs; i++ )
{
- mbedtls_mpi_uint add = cond * B[i];
+ mbedtls_mpi_uint add = mask & B[i];
mbedtls_mpi_uint t = c + A[i];
c = ( t < A[i] );
t += add;