curve25519-dalek-source/curve25519-dalek/src/backend/serial
Michael Rosenberg 415892acf1
SECURITY: fix timing variability in backend/serial/u64/scalar.rs (#659)
Timing variability of any kind is problematic when working with
potentially secret values such as elliptic curve scalars, and such
issues can potentially leak private keys and other secrets. Such a
problem was recently discovered in `curve25519-dalek`.

The `Scalar52::sub` function contained usage of a mask value inside of a
loop where LLVM saw an opportunity to insert a branch instruction
(`jns` on x86) to conditionally bypass this code section when the mask
value is set to zero, as can be seen in godbolt:

https://godbolt.org/z/PczYj7Pda

A similar problem was recently discovered in the Kyber reference
implementation:

https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/hqbtIGFKIpU/m/cnE3pbueBgAJ

As discussed on that thread, one portable solution, which is also used
in this PR, is to introduce a volatile read as an optimization barrier,
which prevents the compiler from optimizing it away.

The fix can be validated in godbolt here:

https://godbolt.org/z/x8d46Yfah

The problem was discovered and the solution independently verified by
Alexander Wagner <alexander.wagner@aisec.fraunhofer.de> and
Lea Themint <lea.thiemt@tum.de> using their DATA tool:

https://github.com/Fraunhofer-AISEC/DATA

Co-authored-by: Tony Arcieri <bascule@gmail.com>
2024-06-18 19:49:31 +02:00
..
curve_models Address new nightly clippy unnecessary qualifications (#639) 2024-03-07 16:58:20 -07:00
fiat_u32 Address new nightly clippy unnecessary qualifications (#639) 2024-03-07 16:58:20 -07:00
fiat_u64 Address new nightly clippy unnecessary qualifications (#639) 2024-03-07 16:58:20 -07:00
scalar_mul Fix new nightly redundant import lint warns (#638) 2024-02-29 18:56:52 -07:00
u32 Address new nightly clippy unnecessary qualifications (#639) 2024-03-07 16:58:20 -07:00
u64 SECURITY: fix timing variability in backend/serial/u64/scalar.rs (#659) 2024-06-18 19:49:31 +02:00
mod.rs curve: add doc(hidden) to serial backend modules (#568) 2023-08-28 02:38:11 -04:00