Skip to content

elliptic-curve: change Curve::ORDER to be Odd#2006

Merged
tarcieri merged 1 commit into
masterfrom
elliptic-curve/odd-curve-order
Sep 12, 2025
Merged

elliptic-curve: change Curve::ORDER to be Odd#2006
tarcieri merged 1 commit into
masterfrom
elliptic-curve/odd-curve-order

Conversation

@tarcieri

Copy link
Copy Markdown
Member

Previously it was NonZero.

This associated constant is for the curve's prime order subgroup, which will always be odd.

There are many modular algorithms which require the modulus is odd, and bounding the ORDER on Odd ensures those algorithms will be compatible with the scalar field.

The primefield crate and the params we are computing for every field of every curve are also Odd (i.e. the modulus of MontyParams).

Previously it was `NonZero`.

This associated constant is for the curve's prime order subgroup, which
will always be odd.

There are many modular algorithms which require the modulus is odd, and
bounding the `ORDER` on `Odd` ensures those algorithms will be
compatible with the scalar field.

The `primefield` crate and the params we are computing for every field
of every curve are also `Odd` (i.e. the `modulus` of `MontyParams`).
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request Sep 12, 2025
@tarcieri

Copy link
Copy Markdown
Member Author

Companion PR: RustCrypto/elliptic-curves#1416

@tarcieri tarcieri merged commit 41fed38 into master Sep 12, 2025
14 checks passed
@tarcieri tarcieri deleted the elliptic-curve/odd-curve-order branch September 12, 2025 23:22
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request Sep 12, 2025
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request Sep 12, 2025
@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