Skip to content

elliptic-curve: add ops::MulVartime trait and bound Scalar#2379

Merged
tarcieri merged 1 commit into
masterfrom
elliptic-curve/mul-vartime-trait
Apr 9, 2026
Merged

elliptic-curve: add ops::MulVartime trait and bound Scalar#2379
tarcieri merged 1 commit into
masterfrom
elliptic-curve/mul-vartime-trait

Conversation

@tarcieri

@tarcieri tarcieri commented Apr 9, 2026

Copy link
Copy Markdown
Member

Adds a variable-time equivalent of the Mul trait with a corresponding mul_vartime method. This provides a place to plug in wNAF which is otherwise always available (and can fall back on constant-time operations if the alloc feature isn't enabled).

The trait has been added to the bounds for CurveArithmetic::Scalar, with requirements to support variable-time multiplication for affine and projective points.

Adds a variable-time equivalent of the `Mul` trait with a corresponding
`mul_vartime` method. This provides a place to plug in wNAF which is
otherwise always available (and can fall back on constant-time
operations if the `alloc` feature isn't enabled).
@tarcieri tarcieri merged commit d4c0d46 into master Apr 9, 2026
15 checks passed
@tarcieri tarcieri deleted the elliptic-curve/mul-vartime-trait branch April 9, 2026 14:49
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request Apr 10, 2026
Companion PR to RustCrypto/traits#2379

This adds initial impls of the `MulVartime` trait which are required by
the bounds added in the PR above.

These don't yet use variable-time implementations as noted in the TODOs,
however the idea is we can opportunistically plug in wNAF when the
`alloc` feature is enabled. However, actually implementing that has been
saved for a follow-up.

This also adds an impl of the new `PointWithBasepointTable` to `k256`,
which makes the table accessible in a generic context.
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request Apr 10, 2026
Companion PR to RustCrypto/traits#2379

This adds initial impls of the `MulVartime` trait which are required by
the bounds added in the PR above.

These don't yet use variable-time implementations as noted in the TODOs,
however the idea is we can opportunistically plug in wNAF when the
`alloc` feature is enabled. However, actually implementing that has been
saved for a follow-up.

This also adds an impl of the new `PointWithBasepointTable` to `k256`,
which makes the table accessible in a generic context.
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request Apr 10, 2026
Companion PR to RustCrypto/traits#2379

This adds initial impls of the `MulVartime` trait which are required by
the bounds added in the PR above.

These don't yet use variable-time implementations as noted in the TODOs,
however the idea is we can opportunistically plug in wNAF when the
`alloc` feature is enabled. However, actually implementing that has been
saved for a follow-up.

This also adds an impl of the new `PointWithBasepointTable` to `k256`,
which makes the table accessible in a generic context.
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request Apr 10, 2026
Companion PR to RustCrypto/traits#2379

This adds initial impls of the `MulVartime` trait which are required by
the bounds added in the PR above.

These don't yet use variable-time implementations as noted in the TODOs,
however the idea is we can opportunistically plug in wNAF when the
`alloc` feature is enabled. However, actually implementing that has been
saved for a follow-up.

This also adds an impl of the new `PointWithBasepointTable` to `k256`,
which makes the table accessible in a generic context.
@tarcieri tarcieri mentioned this pull request Jun 23, 2026
tarcieri added a commit that referenced this pull request Jun 23, 2026
## Added
- Implement `PartialEq + Eq` for `NonIdentity` and `NonZeroScalar` (#1834)
- Implement `Zeroize` for `NonIdentity` (#1832)
- `NonIdentity::mul_by_generator()` (#1833)
- Implement `Mul<&NonZeroScalar>` for `NonIdentity` (#1852)
- Implement `Mul<NonIdentity>` for `NonZeroScalar` (#1855)
- Expose `AffineCoordinates::y` (#1891)
- Scalar macros originall from `primeorder` (#1894)
- Implement `BatchNormalize` for `NonIdentity` (#1896)
- Re-export `group::Curve` as `CurveGroup` (#1902)
- `NonIdentity`/`NonZeroScalar` casting methods (#1903)
- `AffineCoordinates::from_coordinates` (#1996)
- `getrandom` feature (#2085)
- `ctutils` traits to `arithmetic` bounds (#2166)
- `Retrieve` bound for `C::Scalar` (#2169)
- `crypto_common::Generate` support (#2173, #2208)
- Implement `crypto_common::TryKeyInit` for `SecretKey<C>` (#2174)
- `dev::bench_projective!` macro (#2177)
- Provide `Sec1Point::from/to_sec1_bytes` (#2221)
- Implement `From<SecretKey<C>>` for `PublicKey<C>` (#2247)
- `SecretKey::diffie_hellman` (#2248)
- `LinearCombination::lincomb_vartime` method (#2286)
- `ops::MulVartime` trait and bound `Scalar` (#2379)
- `ops::MulByGeneratorVartime` trait ([#2381])
- `SecretKey::from_pem` (#2387)
- `SecretKey::from_der` (#2408)
- `hazmat` module with `FieldArithmetic` trait (#2458)
- `Double::double_in_place` (#2464)

## Changed
- Migrate from `generic-array` to `hybrid-array` (#1462)
- Rename `LinearCombinationExt` => `LinearCombination`; replacing old
  trait (#1501)
- Edition changed to 2024 and MSRV bumped to 1.85 (#1759)
- Make `SecretKey::new` fallible (#1804)
- Replace `ops::Invert` trait with `crypto_bigint::Invert` (#1839)
- Rename `SecretKey::new` => `::from_scalar` (#1893)
- Replace `Reduce` trait with `crypto_bigint::Reduce` (#1949)
- Bump `serdect` dependency to v0.4 (#1978)
- Use `crypto_bigint::Odd` to represent `Curve::ORDER` (#2006)
- Bound `Curve::Uint` on `Unsigned` (#2007)
- Rename `ScalarPrimitive` => `ScalarValue` (#2008)
- Accept mixed-case hex-encoded strings in `FromStr` impl for
  `ScalarValue` (#2037)
- Deprecate `SecretKey::random` (#2086)
- Move `MockCurve` to `dev::mock_curve` (#2176)
- Bump `rand_core` to v0.10 (#2250)
- Rename `EncodedPoint` => `Sec1Point` (#2264)
- Bump `crypto-bigint` to v0.7 (#2330)
- Bump `digest` to v0.11 (#2331)
- Bump `sec1` to v0.8 (#2339)
- Bump `hkdf` dependency to v0.13 (#2349)
- Use `*Vartime` as a suffix in names (#2378)
- Bump `pkcs8` to v0.11 (#2397)
- Bump `ff` and `group` to v0.14 (#2430, #2431)
- Simplify `BatchInvert` trait (#2455)
- Replace `FieldBytesEncoding` trait with `C::FIELD_ENDIANNESS` (#2457)
- Move `Double` to `ops` module (#2465)

## Removed
- `hazmat` feature (#1599)
- `hash2curve` and `oprf` modules: moved to same-name crates (#1929)
- PKCS#8 blanket impls for SEC1 private key traits (#1930)
- `ShrAssign` bound on `Scalar`s (#1938)
- JWK support: migrated to `jose-jwk` crate (#1963)
- `weierstrass` module (#2005)
- `bits` feature (#2417)

## Fixed
- Include curve OID in SEC1 private keys (#1707, #1933)
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