From 52d68d6f77ee1e5556d5a8870ac55236b0aafac9 Mon Sep 17 00:00:00 2001 From: daxpedda Date: Tue, 6 Jul 2021 13:32:02 +0200 Subject: [PATCH] Constraint `Scalar` with `Copy` --- src/envelope.rs | 8 ++++---- src/group.rs | 8 ++++---- src/keypair.rs | 4 ++-- src/opaque.rs | 4 ++-- src/tests/full_test.rs | 4 ++-- src/tests/voprf_test_vectors.rs | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/envelope.rs b/src/envelope.rs index 410b841..172a17c 100644 --- a/src/envelope.rs +++ b/src/envelope.rs @@ -38,8 +38,8 @@ fn build_inner_envelope_internal( h.expand(&[nonce, STR_PRIVATE_KEY].concat(), &mut keypair_seed) .map_err(|_| InternalPakeError::HkdfError)?; let client_static_keypair = - KeyPair::::from_private_key_slice(CS::Group::scalar_as_bytes( - &CS::Group::hash_to_scalar::(&keypair_seed[..], STR_OPAQUE_HASH_TO_SCALAR)?, + KeyPair::::from_private_key_slice(&CS::Group::scalar_as_bytes( + CS::Group::hash_to_scalar::(&keypair_seed[..], STR_OPAQUE_HASH_TO_SCALAR)?, ))?; Ok(client_static_keypair.public().clone()) @@ -54,8 +54,8 @@ fn recover_keys_internal( h.expand(&[nonce, STR_PRIVATE_KEY].concat(), &mut keypair_seed) .map_err(|_| InternalPakeError::HkdfError)?; let client_static_keypair = - KeyPair::::from_private_key_slice(CS::Group::scalar_as_bytes( - &CS::Group::hash_to_scalar::(&keypair_seed[..], STR_OPAQUE_HASH_TO_SCALAR)?, + KeyPair::::from_private_key_slice(&CS::Group::scalar_as_bytes( + CS::Group::hash_to_scalar::(&keypair_seed[..], STR_OPAQUE_HASH_TO_SCALAR)?, ))?; Ok(client_static_keypair) diff --git a/src/group.rs b/src/group.rs index 7a0af19..6b3c9ec 100644 --- a/src/group.rs +++ b/src/group.rs @@ -28,7 +28,7 @@ use zeroize::Zeroize; /// subgroup is noted additively — as in the draft RFC — in this trait. pub trait Group: Copy + Sized + for<'a> Mul<&'a ::Scalar, Output = Self> { /// The type of base field scalars - type Scalar: Zeroize + Clone; + type Scalar: Zeroize + Copy; /// The byte length necessary to represent scalars type ScalarLen: ArrayLength + 'static; /// Return a scalar from its fixed-length bytes representation @@ -38,7 +38,7 @@ pub trait Group: Copy + Sized + for<'a> Mul<&'a ::Scalar, Output /// picks a scalar at random fn random_nonzero_scalar(rng: &mut R) -> Self::Scalar; /// Serializes a scalar to bytes - fn scalar_as_bytes(scalar: &Self::Scalar) -> &GenericArray; + fn scalar_as_bytes(scalar: Self::Scalar) -> GenericArray; /// The multiplicative inverse of this scalar fn scalar_invert(scalar: &Self::Scalar) -> Self::Scalar; @@ -105,8 +105,8 @@ impl Group for RistrettoPoint { } } } - fn scalar_as_bytes(scalar: &Self::Scalar) -> &GenericArray { - GenericArray::from_slice(scalar.as_bytes()) + fn scalar_as_bytes(scalar: Self::Scalar) -> GenericArray { + scalar.to_bytes().into() } fn scalar_invert(scalar: &Self::Scalar) -> Self::Scalar { scalar.invert() diff --git a/src/keypair.rs b/src/keypair.rs index a79c734..ee4559f 100644 --- a/src/keypair.rs +++ b/src/keypair.rs @@ -78,8 +78,8 @@ impl KeyPair { /// Generating a random key pair given a cryptographic rng pub(crate) fn generate_random(rng: &mut R) -> Self { let sk = G::random_nonzero_scalar(rng); - let sk_bytes = G::scalar_as_bytes(&sk); - let pk = G::base_point().mult_by_slice(sk_bytes); + let sk_bytes = G::scalar_as_bytes(sk); + let pk = G::base_point().mult_by_slice(&sk_bytes); Self { pk: PublicKey::new(Key(pk.to_arr().to_vec())), sk: PrivateKey::new(Key(sk_bytes.to_vec())), diff --git a/src/opaque.rs b/src/opaque.rs index eceeb66..e277ba0 100644 --- a/src/opaque.rs +++ b/src/opaque.rs @@ -115,7 +115,7 @@ impl ClientRegistration { /// Serialization into bytes pub fn serialize(&self) -> Vec { [ - &CS::Group::scalar_as_bytes(&self.token.blind)[..], + &CS::Group::scalar_as_bytes(self.token.blind)[..], &self.token.data, ] .concat() @@ -415,7 +415,7 @@ impl ClientLogin { /// Serialization into bytes pub fn serialize(&self) -> Vec { let output: Vec = [ - &CS::Group::scalar_as_bytes(&self.token.blind)[..], + &CS::Group::scalar_as_bytes(self.token.blind)[..], &serialize(&self.serialized_credential_request, 2), &serialize(&self.ke1_state.to_bytes(), 2), &self.token.data, diff --git a/src/tests/full_test.rs b/src/tests/full_test.rs index 4f86c2b..94cdc59 100644 --- a/src/tests/full_test.rs +++ b/src/tests/full_test.rs @@ -307,13 +307,13 @@ fn generate_parameters() -> TestVectorParameters { .unwrap(); let blinding_factor = CS::Group::random_nonzero_scalar(&mut rng); - let blinding_factor_bytes = CS::Group::scalar_as_bytes(&blinding_factor).clone(); + let blinding_factor_bytes = CS::Group::scalar_as_bytes(blinding_factor).clone(); let mut blinding_factor_registration_rng = CycleRng::new(blinding_factor_bytes.to_vec()); let client_registration_start_result = ClientRegistration::::start(&mut blinding_factor_registration_rng, password).unwrap(); let blinding_factor_bytes_returned = - CS::Group::scalar_as_bytes(&client_registration_start_result.state.token.blind).clone(); + CS::Group::scalar_as_bytes(client_registration_start_result.state.token.blind).clone(); assert_eq!( hex::encode(&blinding_factor_bytes), hex::encode(&blinding_factor_bytes_returned) diff --git a/src/tests/voprf_test_vectors.rs b/src/tests/voprf_test_vectors.rs index dbfe361..1d8a449 100644 --- a/src/tests/voprf_test_vectors.rs +++ b/src/tests/voprf_test_vectors.rs @@ -73,7 +73,7 @@ fn test_blind() -> Result<(), PakeError> { assert_eq!( ¶meters.blind, - &RistrettoPoint::scalar_as_bytes(&token.blind).to_vec() + &RistrettoPoint::scalar_as_bytes(token.blind).to_vec() ); assert_eq!( ¶meters.blinded_element,