Skip to content

elliptic-curve: use ff/group v0.14 releases; vendor wnaf#2431

Merged
tarcieri merged 2 commits into
masterfrom
elliptic-curve/use-upstream-ff-group-vendor-wnaf
Jun 2, 2026
Merged

elliptic-curve: use ff/group v0.14 releases; vendor wnaf#2431
tarcieri merged 2 commits into
masterfrom
elliptic-curve/use-upstream-ff-group-vendor-wnaf

Conversation

@tarcieri

@tarcieri tarcieri commented Jun 2, 2026

Copy link
Copy Markdown
Member

This switches away from rustcrypto-ff and rustcrypto-group to the upstream v0.14.0 crate releases of ff and group.

All of the modifications we need are related to wNAF, so we can implement them by vendoring wnaf.rs from the group crate temporarily until we can get the needed changes upstream.

Namely those changes are:

  • big endian support: this implements it by always assuming the Repr is serialiazed big endian, until we can implement actual endianness declarations in the ff crate
  • multiscalar_mul: this is needed to make the variable-time implementation actually worth it over a constant-time one with precomputed basepoint tables, because it lets us do variable-time wNAF multiscalar multiplications using precomputed basepoint tables.

The other nice-to-have would be a way to customize the multiscalar multiplication implementation per-curve, so it would be possible to take advantage of the endomorphism optimization for secp256k1.

tarcieri added 2 commits June 2, 2026 17:40
This switches away from `rustcrypto-ff` and `rustcrypto-group` to the
upstream v0.14.0 crate releases of `ff` and `group`.

All of the modifications we need are related to wNAF, so we can
implement them by vendoring `wnaf.rs` from the `group` crate temporarily
until we can get the needed changes upstream.

Namely those changes are:
- big endian support: this implements it by always assuming the `Repr`
  is serialiazed big endian, until we can implement actual endianness
  declarations in the `ff` crate
- `multiscalar_mul`: this is needed to make the variable-time
  implementation actually worth it over a constant-time one with
  precomputed basepoint tables, because it lets us do variable-time wNAF
  multiscalar multiplications using precomputed basepoint tables.
@tarcieri tarcieri merged commit 912c498 into master Jun 2, 2026
86 checks passed
@tarcieri tarcieri deleted the elliptic-curve/use-upstream-ff-group-vendor-wnaf branch June 2, 2026 23:51
tarcieri added a commit that referenced this pull request Jun 3, 2026
@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