Skip to content

Add WnafBase::multiscalar_mul#14

Merged
tarcieri merged 1 commit intomainfrom
multiscalar-mul
May 7, 2026
Merged

Add WnafBase::multiscalar_mul#14
tarcieri merged 1 commit intomainfrom
multiscalar-mul

Conversation

@tarcieri
Copy link
Copy Markdown
Member

@tarcieri tarcieri commented May 7, 2026

Computes a sum-of-products aA + bB + ... in variable time with w-NAF multi-exponentiation using the interleaved window method, also known as Straus' method.

The key insight is that when computing this sum by means of additions and doublings, the doublings can be shared by performing the additions within an inner loop.

The API and implementation are inspired in part by curve25519-dalek, namely the VartimeMultiscalarMul trait and corresponding implementation in straus.rs.

This results in ~28% speedup on p256 for a 3 scalar/point input:

ProjectivePoint operations/point-scalar lincomb (variable-time)
    time:   [149.13 µs 149.80 µs 150.84 µs]
    change: [−27.999% −27.645% −27.267%] (p = 0.00 < 0.05)

Computes a sum-of-products `aA + bB + ...` in variable time with w-NAF
multi-exponentiation using the interleaved window method, also known
as Straus' method.

The key insight is that when computing this sum by means of additions
and doublings, the doublings can be shared by performing the additions
within an inner loop.

The API and implementation are inspired in part by `curve25519-dalek`,
namely the `VartimeMultiscalarMul` trait and corresponding
implementation in `straus.rs`.

This results in ~28% speedup on `p256` for a 3 scalar/point input:

    ProjectivePoint operations/point-scalar lincomb (variable-time)
        time:   [149.13 µs 149.80 µs 150.84 µs]
        change: [−27.999% −27.645% −27.267%] (p = 0.00 < 0.05)
@tarcieri tarcieri merged commit d5ef277 into main May 7, 2026
8 checks passed
@tarcieri tarcieri deleted the multiscalar-mul branch May 7, 2026 01:26
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request May 7, 2026
Companion PR to RustCrypto/group#14, which adds
`WnafBase::multiscalar_mul` using Straus' method.

When the `alloc` feature is enabled, this is used to compute
`LinearCombination::lincomb_vartime`.

Also includes updated tests and benchmarks for `p256` to ensure
`lincomb_vartime` computes the same results as using the `Add` and `Mul`
traits, and show the relative performance improvement, which is a
~28% speedup on `p256` for a 3 scalar/point input:

    ProjectivePoint operations/point-scalar lincomb (variable-time)
	time:   [149.13 µs 149.80 µs 150.84 µs]
	change: [−27.999% −27.645% −27.267%] (p = 0.00 < 0.05)
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request May 7, 2026
Companion PR to RustCrypto/group#14, which adds
`WnafBase::multiscalar_mul` using Straus' method.

When the `alloc` feature is enabled, this is used to compute
`LinearCombination::lincomb_vartime`.

Also includes updated tests and benchmarks for `p256` to ensure
`lincomb_vartime` computes the same results as using the `Add` and `Mul`
traits, and show the relative performance improvement, which is a
~28% speedup on `p256` for a 3 scalar/point input:

    ProjectivePoint operations/point-scalar lincomb (variable-time)
	time:   [149.13 µs 149.80 µs 150.84 µs]
	change: [−27.999% −27.645% −27.267%] (p = 0.00 < 0.05)
tarcieri added a commit to RustCrypto/traits that referenced this pull request May 7, 2026
Uses `WnafBase::multiscalar_mul` added in RustCrypto/group#14 to provide
a variable-time linear combination operation which can use the
precomputed wNAF for a basepoint.

This has been tested in `p256` where it provides a 25% speedup for ECDSA
verification.
tarcieri added a commit to RustCrypto/traits that referenced this pull request May 7, 2026
Uses `WnafBase::multiscalar_mul` added in RustCrypto/group#14 to provide
a variable-time linear combination operation which can use the
precomputed wNAF for a basepoint.

This has been tested in `p256` where it provides a 25% speedup for ECDSA
verification.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant