diff --git a/src/ciphersuite.rs b/src/ciphersuite.rs index 63f20dc..996f9ce 100644 --- a/src/ciphersuite.rs +++ b/src/ciphersuite.rs @@ -6,12 +6,8 @@ //! Defines the CipherSuite trait to specify the underlying primitives for OPAQUE use crate::{ - errors::InternalPakeError, - hash::Hash, - key_exchange::traits::KeyExchange, - keypair::{Key, KeyPair}, - map_to_curve::GroupWithMapToCurve, - slow_hash::SlowHash, + errors::InternalPakeError, hash::Hash, key_exchange::traits::KeyExchange, keypair::KeyPair, + map_to_curve::GroupWithMapToCurve, slow_hash::SlowHash, }; use rand_core::{CryptoRng, RngCore}; @@ -32,7 +28,7 @@ pub trait CipherSuite { /// `map_to_curve::GroupWithMapToCurve`. type Group: GroupWithMapToCurve; /// A keypair type composed of public and private components - type KeyFormat: KeyPair + PartialEq; + type KeyFormat: KeyPair + PartialEq; /// A key exchange protocol type KeyExchange: KeyExchange; /// The main hash function use (for HKDF computations and hashing transcripts) diff --git a/src/opaque.rs b/src/opaque.rs index 39b2922..f0fbb16 100644 --- a/src/opaque.rs +++ b/src/opaque.rs @@ -12,7 +12,7 @@ use crate::{ group::Group, hash::Hash, key_exchange::traits::{KeyExchange, ToBytes}, - keypair::{Key, KeyPair, SizedBytes}, + keypair::{KeyPair, SizedBytes}, oprf, oprf::OprfClientBytes, slow_hash::SlowHash, @@ -519,7 +519,7 @@ where let mut output: Vec = CS::Group::scalar_as_bytes(&self.oprf_key).to_vec(); self.client_s_pk .iter() - .for_each(|v| output.extend_from_slice(&v)); + .for_each(|v| output.extend_from_slice(&v.to_arr())); self.envelope .iter() .for_each(|v| output.extend_from_slice(&v.to_bytes())); @@ -794,7 +794,7 @@ impl ClientLogin { l2.ke2_message, &self.ke1_state, server_s_pk.clone(), - Key::from_bytes(&opened_envelope.plaintext)?, + ::Repr::from_bytes(&opened_envelope.plaintext)?, )?; Ok(( @@ -869,7 +869,7 @@ impl ServerLogin { /// ``` pub fn start( password_file: ServerRegistration, - server_s_sk: &Key, + server_s_sk: &::Repr, l1: LoginFirstMessage, rng: &mut R, ) -> Result, ProtocolError> { diff --git a/src/tests/opaque_ke_test.rs b/src/tests/opaque_ke_test.rs index 15f66ba..748cf1b 100644 --- a/src/tests/opaque_ke_test.rs +++ b/src/tests/opaque_ke_test.rs @@ -8,7 +8,7 @@ use crate::{ errors::*, group::Group, key_exchange::tripledh::{TripleDH, NONCE_LEN}, - keypair::{Key, KeyPair, X25519KeyPair}, + keypair::{Key, KeyPair, SizedBytes, X25519KeyPair}, opaque::*, slow_hash::NoOpHash, tests::mock_rng::CycleRng, @@ -220,7 +220,18 @@ fn stringify_test_vectors(p: &TestVectorParameters) -> String { s } -fn generate_parameters() -> TestVectorParameters { +fn generate_parameters() -> TestVectorParameters +where + // Unsightly constraints due to the (required) use of the SizedBytes + // instance for KP in ServerRegistration::start. See also the impl + // Tryfrom<&[u8]> for ServerRegistration (those are the same constraints). + <::Repr as SizedBytes>::Len: + std::ops::Add<<::Repr as SizedBytes>::Len>, + generic_array::typenum::Sum< + <::Repr as SizedBytes>::Len, + <::Repr as SizedBytes>::Len, + >: generic_array::ArrayLength, +{ let mut rng = OsRng; // Inputs @@ -260,7 +271,7 @@ fn generate_parameters() -> TestVectorParameters { let server_registration_state = server_registration.to_bytes().to_vec(); let mut client_s_sk_and_nonce: Vec = Vec::new(); - client_s_sk_and_nonce.extend_from_slice(&client_s_kp.private()); + client_s_sk_and_nonce.extend_from_slice(&client_s_kp.private().to_arr()); client_s_sk_and_nonce.extend_from_slice(&envelope_nonce); let mut finish_registration_rng = CycleRng::new(client_s_sk_and_nonce); @@ -274,7 +285,7 @@ fn generate_parameters() -> TestVectorParameters { let mut client_login_start: Vec = Vec::new(); client_login_start.extend_from_slice(&blinding_factor_raw); - client_login_start.extend_from_slice(&client_e_kp.private()); + client_login_start.extend_from_slice(&client_e_kp.private().to_arr()); client_login_start.extend_from_slice(&client_nonce); let mut client_login_start_rng = CycleRng::new(client_login_start); @@ -283,7 +294,7 @@ fn generate_parameters() -> TestVectorParameters { let l1_bytes = l1.to_bytes().to_vec(); let client_login_state = client_login.to_bytes().to_vec(); - let mut server_e_sk_rng = CycleRng::new(server_e_kp.private().to_vec()); + let mut server_e_sk_rng = CycleRng::new(server_e_kp.private().to_arr().to_vec()); let (l2, server_login) = ServerLogin::::start( password_file, server_s_kp.private(), @@ -294,21 +305,21 @@ fn generate_parameters() -> TestVectorParameters { let l2_bytes = l2.to_bytes().to_vec(); let server_login_state = server_login.to_bytes().to_vec(); - let mut client_e_sk_rng = CycleRng::new(client_e_kp.private().to_vec()); + let mut client_e_sk_rng = CycleRng::new(client_e_kp.private().to_arr().to_vec()); let (l3, client_shared_secret, _export_key_login) = client_login .finish(l2, server_s_kp.public(), &mut client_e_sk_rng) .unwrap(); let l3_bytes = l3.to_bytes().to_vec(); TestVectorParameters { - client_s_pk: client_s_kp.public().to_vec(), - client_s_sk: client_s_kp.private().to_vec(), - client_e_pk: client_e_kp.public().to_vec(), - client_e_sk: client_e_kp.private().to_vec(), - server_s_pk: server_s_kp.public().to_vec(), - server_s_sk: server_s_kp.private().to_vec(), - server_e_pk: server_e_kp.public().to_vec(), - server_e_sk: server_e_kp.private().to_vec(), + client_s_pk: client_s_kp.public().to_arr().to_vec(), + client_s_sk: client_s_kp.private().to_arr().to_vec(), + client_e_pk: client_e_kp.public().to_arr().to_vec(), + client_e_sk: client_e_kp.private().to_arr().to_vec(), + server_s_pk: server_s_kp.public().to_arr().to_vec(), + server_s_sk: server_s_kp.private().to_arr().to_vec(), + server_e_pk: server_e_kp.public().to_arr().to_vec(), + server_e_sk: server_e_kp.private().to_arr().to_vec(), password: password.to_vec(), blinding_factor_raw: blinding_factor_raw.to_vec(), blinding_factor: blinding_factor_bytes.to_vec(),