diff --git a/Cargo.lock b/Cargo.lock index 1c3673913..2bb12b0f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -36,12 +36,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "base16ct" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b59d472eab27ade8d770dcb11da7201c11234bef9f82ce7aa517be028d462b" - [[package]] name = "base16ct" version = "1.0.0" @@ -208,7 +202,7 @@ dependencies = [ name = "elliptic-curve" version = "0.14.0-rc.18" dependencies = [ - "base16ct 1.0.0", + "base16ct", "crypto-bigint", "digest", "getrandom", @@ -466,15 +460,15 @@ dependencies = [ [[package]] name = "sec1" -version = "0.8.0-rc.10" +version = "0.8.0-rc.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dff52f6118bc9f0ac974a54a639d499ac26a6cad7a6e39bc0990c19625e793b" +checksum = "2568531a8ace88b848310caa98fb2115b151ef924d54aa523e659c21b9d32d71" dependencies = [ - "base16ct 0.3.0", + "base16ct", + "ctutils", "der", "hybrid-array", "serdect", - "subtle", "zeroize", ] @@ -513,7 +507,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9af4a3e75ebd5599b30d4de5768e00b5095d518a79fefc3ecbaf77e665d1ec06" dependencies = [ - "base16ct 1.0.0", + "base16ct", "serde", ] diff --git a/elliptic-curve/Cargo.toml b/elliptic-curve/Cargo.toml index 64e3aac1d..f39cedb71 100644 --- a/elliptic-curve/Cargo.toml +++ b/elliptic-curve/Cargo.toml @@ -39,7 +39,7 @@ hex-literal = { version = "1", optional = true } once_cell = { version = "1.21", optional = true, default-features = false } pem-rfc7468 = { version = "1.0.0-rc.2", optional = true, features = ["alloc"] } pkcs8 = { version = "0.11.0-rc.8", optional = true, default-features = false } -sec1 = { version = "0.8.0-rc.10", optional = true, features = ["subtle", "zeroize"] } +sec1 = { version = "0.8.0-rc.11", optional = true, features = ["ctutils", "zeroize"] } serdect = { version = "0.4", optional = true, default-features = false, features = ["alloc"] } [dev-dependencies] diff --git a/elliptic-curve/src/dev.rs b/elliptic-curve/src/dev.rs index da08e746c..1a0e815a4 100644 --- a/elliptic-curve/src/dev.rs +++ b/elliptic-curve/src/dev.rs @@ -7,6 +7,7 @@ use crate::{ BatchNormalize, Curve, CurveArithmetic, CurveGroup, FieldBytesEncoding, PrimeCurve, array::typenum::U32, bigint::{Limb, Odd, U256}, + ctutils, error::{Error, Result}, ops::{Invert, LinearCombination, Reduce, ShrAssign}, point::{AffineCoordinates, NonIdentity}, @@ -516,14 +517,14 @@ impl From> for AffinePoint { } impl FromEncodedPoint for AffinePoint { - fn from_encoded_point(encoded_point: &EncodedPoint) -> CtOption { + fn from_encoded_point(encoded_point: &EncodedPoint) -> ctutils::CtOption { let point = if encoded_point.is_identity() { Self::Identity } else { Self::Other(*encoded_point) }; - CtOption::new(point, Choice::from(1)) + ctutils::CtOption::new(point, ctutils::Choice::TRUE) } } @@ -642,7 +643,7 @@ impl From for AffinePoint { } impl FromEncodedPoint for ProjectivePoint { - fn from_encoded_point(_point: &EncodedPoint) -> CtOption { + fn from_encoded_point(_point: &EncodedPoint) -> ctutils::CtOption { unimplemented!(); } } @@ -690,12 +691,14 @@ impl group::GroupEncoding for AffinePoint { fn from_bytes(bytes: &Self::Repr) -> CtOption { EncodedPoint::from_bytes(bytes) - .map(|point| CtOption::new(point, Choice::from(1))) + .map(|point| ctutils::CtOption::new(point, ctutils::Choice::TRUE)) .unwrap_or_else(|_| { - let is_identity = bytes.ct_eq(&Self::Repr::default()); - CtOption::new(EncodedPoint::identity(), is_identity) + let is_identity = + ctutils::CtEq::ct_eq(bytes.as_slice(), Self::Repr::default().as_slice()); + ctutils::CtOption::new(EncodedPoint::identity(), is_identity) }) .and_then(|point| Self::from_encoded_point(&point)) + .into() } fn from_bytes_unchecked(bytes: &Self::Repr) -> CtOption { diff --git a/elliptic-curve/src/lib.rs b/elliptic-curve/src/lib.rs index ca49a9ea3..f06ca8e5d 100644 --- a/elliptic-curve/src/lib.rs +++ b/elliptic-curve/src/lib.rs @@ -114,6 +114,7 @@ pub use crate::{ pub use array; pub use array::typenum::consts; pub use bigint; +pub use bigint::ctutils; pub use rand_core; pub use subtle; pub use zeroize; diff --git a/elliptic-curve/src/public_key.rs b/elliptic-curve/src/public_key.rs index f0e4a1637..2e3906a7e 100644 --- a/elliptic-curve/src/public_key.rs +++ b/elliptic-curve/src/public_key.rs @@ -20,11 +20,11 @@ use { use { crate::{ FieldBytesSize, + ctutils::{Choice, CtOption}, point::PointCompression, sec1::{CompressedPoint, EncodedPoint, FromEncodedPoint, ModulusSize, ToEncodedPoint}, }, core::cmp::Ordering, - subtle::{Choice, CtOption}, }; #[cfg(feature = "serde")] @@ -181,7 +181,7 @@ where fn from_encoded_point(encoded_point: &EncodedPoint) -> CtOption { AffinePoint::::from_encoded_point(encoded_point).and_then(|point| { // Defeating the point of `subtle`, but the use case is specifically a public key - let is_identity = Choice::from(u8::from(encoded_point.is_identity())); + let is_identity = Choice::from_u8_lsb(u8::from(encoded_point.is_identity())); CtOption::new(PublicKey { point }, !is_identity) }) } diff --git a/elliptic-curve/src/sec1.rs b/elliptic-curve/src/sec1.rs index 4f2481c5d..c9088f065 100644 --- a/elliptic-curve/src/sec1.rs +++ b/elliptic-curve/src/sec1.rs @@ -4,9 +4,8 @@ pub use sec1::point::{Coordinates, ModulusSize, Tag}; -use crate::{Curve, FieldBytesSize, Result, SecretKey}; +use crate::{Curve, FieldBytesSize, Result, SecretKey, ctutils::CtOption}; use array::Array; -use subtle::CtOption; #[cfg(feature = "arithmetic")] use crate::{AffinePoint, CurveArithmetic, Error};