diff --git a/Cargo.lock b/Cargo.lock index 992afe27a..89fa62f7e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1451,11 +1451,11 @@ name = "sec1" version = "0.8.0-rc.10" dependencies = [ "base16ct 1.0.0", + "ctutils", "der", "hex-literal", "hybrid-array", "serdect", - "subtle", "tempfile", "zeroize", ] diff --git a/sec1/Cargo.toml b/sec1/Cargo.toml index ad61b3112..155d030be 100644 --- a/sec1/Cargo.toml +++ b/sec1/Cargo.toml @@ -18,10 +18,10 @@ rust-version = "1.85" [dependencies] base16ct = { version = "1", optional = true, default-features = false } +ctutils = { version = "0.3", optional = true, default-features = false } der = { version = "0.8.0-rc.10", optional = true, features = ["oid"] } hybrid-array = { version = "0.4", optional = true, default-features = false } serdect = { version = "0.4", optional = true, default-features = false, features = ["alloc"] } -subtle = { version = "2", optional = true, default-features = false } zeroize = { version = "1", optional = true, default-features = false } [dev-dependencies] @@ -37,6 +37,7 @@ der = ["dep:der", "zeroize"] pem = ["alloc", "der/pem"] point = ["dep:base16ct", "dep:hybrid-array"] serde = ["dep:serdect"] +subtle = [] # TODO(tarcieri): remove this when elliptic-curve is updated zeroize = ["dep:zeroize", "der?/zeroize"] [package.metadata.docs.rs] diff --git a/sec1/src/point.rs b/sec1/src/point.rs index 4a2ff43e8..28f4f7ccd 100644 --- a/sec1/src/point.rs +++ b/sec1/src/point.rs @@ -19,12 +19,12 @@ use hybrid_array::{Array, ArraySize, typenum::U1}; #[cfg(feature = "alloc")] use alloc::boxed::Box; +#[cfg(feature = "ctutils")] +use ctutils::{Choice, CtSelect}; + #[cfg(feature = "serde")] use serdect::serde::{Deserialize, Serialize, de, ser}; -#[cfg(feature = "subtle")] -use subtle::{Choice, ConditionallySelectable}; - #[cfg(feature = "zeroize")] use zeroize::Zeroize; @@ -254,23 +254,6 @@ where } } -#[cfg(feature = "subtle")] -impl ConditionallySelectable for EncodedPoint -where - Size: ModulusSize, - ::ArrayType: Copy, -{ - fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self { - let mut bytes = Array::default(); - - for (i, byte) in bytes.iter_mut().enumerate() { - *byte = u8::conditional_select(&a.bytes[i], &b.bytes[i], choice); - } - - Self { bytes } - } -} - impl Copy for EncodedPoint where Size: ModulusSize, @@ -392,6 +375,23 @@ where } } +// TODO(tarcieri): add `ctutils` support to `hybrid-array` +#[cfg(feature = "ctutils")] +impl CtSelect for EncodedPoint +where + Size: ModulusSize, +{ + fn ct_select(&self, other: &Self, choice: Choice) -> Self { + let mut bytes = Array::default(); + + for (i, byte) in bytes.iter_mut().enumerate() { + *byte = self.bytes[i].ct_select(&other.bytes[i], choice); + } + + Self { bytes } + } +} + #[cfg(feature = "serde")] impl Serialize for EncodedPoint where @@ -565,8 +565,8 @@ mod tests { #[cfg(feature = "alloc")] use alloc::string::ToString; - #[cfg(feature = "subtle")] - use subtle::ConditionallySelectable; + #[cfg(feature = "ctutils")] + use ctutils::CtSelect; type EncodedPoint = super::EncodedPoint; @@ -731,16 +731,16 @@ mod tests { assert_eq!(compressed_point.as_bytes(), &COMPRESSED_BYTES[..]); } - #[cfg(feature = "subtle")] + #[cfg(feature = "ctutils")] #[test] - fn conditional_select() { + fn ct_select() { let a = EncodedPoint::from_bytes(&COMPRESSED_BYTES[..]).unwrap(); let b = EncodedPoint::from_bytes(&UNCOMPRESSED_BYTES[..]).unwrap(); - let a_selected = EncodedPoint::conditional_select(&a, &b, 0.into()); + let a_selected = EncodedPoint::ct_select(&a, &b, 0.into()); assert_eq!(a, a_selected); - let b_selected = EncodedPoint::conditional_select(&a, &b, 1.into()); + let b_selected = EncodedPoint::ct_select(&a, &b, 1.into()); assert_eq!(b, b_selected); }