Re: [PATCH v2] crypto: ecc - Fix carry overflow in vli multiplication

From: David Laight

Date: Wed May 13 2026 - 17:08:39 EST


On Wed, 13 May 2026 20:39:48 +0800
Qingfang Deng <qingfang.deng@xxxxxxxxx> wrote:

> On Wed, 13 May 2026 at 13:57:40 +0300, Anastasia Tishchenko wrote:
> > diff --git a/crypto/ecc.c b/crypto/ecc.c
> > index 43b0def3a225..6eb4d97a5f0d 100644
> > --- a/crypto/ecc.c
> > +++ b/crypto/ecc.c
> > @@ -393,14 +393,26 @@ static uint128_t mul_64_64(u64 left, u64 right)
> > return result;
> > }
> >
> > -static uint128_t add_128_128(uint128_t a, uint128_t b)
> > +/* Calculate addition with overflow checking. Returns true on wrap-around,
> > + * false otherwise.
> > + */
> > +static bool check_add_128_128_overflow(uint128_t *result, uint128_t a,
> > + uint128_t b)
> > {
> > - uint128_t result;
> > + bool carry;
> >
> > - result.m_low = a.m_low + b.m_low;
> > - result.m_high = a.m_high + b.m_high + (result.m_low < a.m_low);
> > + result->m_low = a.m_low + b.m_low;
> > + carry = (result->m_low < a.m_low);
> >
> > - return result;
> > + result->m_high = a.m_high + b.m_high + carry;
>
> If CONFIG_ARCH_SUPPORTS_INT128 is defined, you can convert them to
> "unsigned __int128" as done in mul_64_64(), and use check_add_overflow()
> to get the carry.

Can you guarantee the compiler generates 'constant time' code for
any of this?
If you care then relying on compiler support for anything that might
generate a conditional jump isn't a good idea.

Just writing 'bitwise' arithmetic doesn't mean the compiler won't
use branches.
Even if you don't get one today, someone else might get one tomorrow.
IIRC even on x86 'x += (a < b)' can generate a branch rather than the
obvious 'cmp a, b; adc $0, x', or the longer cmov or setc sequences.

You pretty much have to use asm for anything that isn't trivial arithmetic.

-- David

>
> > +
> > + /* Using constant-time bitwise arithmetic to prevent timing
> > + * side-channels.
> > + */
> > + carry = (result->m_high < a.m_high) |
> > + ((result->m_high == a.m_high) & carry);
> > +
> > + return carry;
> > }
> >
>
> Regards,
> Qingfang
>