diff --git a/curve25519/solana-ed25519/src/backend/vector/scalar_mul/vartime_triple_base.rs b/curve25519/solana-ed25519/src/backend/vector/scalar_mul/vartime_triple_base.rs index 4508051..7dcc5d1 100644 --- a/curve25519/solana-ed25519/src/backend/vector/scalar_mul/vartime_triple_base.rs +++ b/curve25519/solana-ed25519/src/backend/vector/scalar_mul/vartime_triple_base.rs @@ -78,8 +78,8 @@ pub mod spec { b_lo_bytes[..16].copy_from_slice(&b_bytes[..16]); b_hi_bytes[..16].copy_from_slice(&b_bytes[16..]); - let b_lo = Scalar::from_canonical_bytes(b_lo_bytes).unwrap(); - let b_hi = Scalar::from_canonical_bytes(b_hi_bytes).unwrap(); + let b_lo = Scalar::from_canonical_bytes_unchecked(b_lo_bytes); + let b_hi = Scalar::from_canonical_bytes_unchecked(b_hi_bytes); // Compute NAF representations (all scalars are now ~128 bits) let a1_naf = a1.non_adjacent_form(5); diff --git a/curve25519/solana-ed25519/src/scalar.rs b/curve25519/solana-ed25519/src/scalar.rs index 56d4b3c..8be511e 100644 --- a/curve25519/solana-ed25519/src/scalar.rs +++ b/curve25519/solana-ed25519/src/scalar.rs @@ -232,6 +232,13 @@ impl Scalar { CtOption::new(candidate, high_bit_unset & candidate.is_canonical()) } + /// Construct a `Scalar` from bytes that are known to be canonical. + #[inline] + #[cfg(target_arch = "x86_64")] + pub(crate) const fn from_canonical_bytes_unchecked(bytes: [u8; 32]) -> Scalar { + Scalar { bytes } + } + /// Construct a `Scalar` from the low 255 bits of a 256-bit integer. This breaks the invariant /// that scalars are always reduced. Scalar-scalar arithmetic, i.e., addition, subtraction, /// multiplication, **does not work** on scalars produced from this function. You may only use