diff --git a/common/nymnoise/src/lib.rs b/common/nymnoise/src/lib.rs index 52ade35dea..8a19e14f0e 100644 --- a/common/nymnoise/src/lib.rs +++ b/common/nymnoise/src/lib.rs @@ -70,13 +70,15 @@ mod psk_gen { let responder: PSQResponder = PSQResponder::init(&kem_private_key, &kem_public_key); - responder.compute_responder_message( + let res = responder.compute_responder_message( &VerificationKey::from_bytes(initiator_verification_key.to_bytes()), initiator_message, context, psq_ttl, psk_handle, - ) + )?; + + Ok(res) } pub(crate) fn psq_initiate_x25519( @@ -87,7 +89,9 @@ mod psk_gen { ) -> Result, NoiseError> { let pub_key = PublicKey::decode(libcrux_kem::Algorithm::X25519, responder_pub_key.as_ref())?; - Ok(initiator.compute_initiator_message(&mut rand::rng(), &pub_key, context, psq_ttl)?) + let message = + initiator.compute_initiator_message(&mut rand::rng(), &pub_key, context, psq_ttl)?; + Ok(message) } } diff --git a/common/nymnoise/src/stream/mod.rs b/common/nymnoise/src/stream/mod.rs index 0a5083ee3d..21fd84f4da 100644 --- a/common/nymnoise/src/stream/mod.rs +++ b/common/nymnoise/src/stream/mod.rs @@ -13,7 +13,7 @@ use bytes::{Bytes, BytesMut}; use futures::{Sink, SinkExt, Stream, StreamExt}; use nym_crypto::asymmetric::{ed25519, x25519}; use nym_noise_keys::NoiseVersion; -use nympsq::psq::{PSQInitiator, CONTEXT_LEN, PSK_HANDLE_LEN}; +use nympsq::psq::{PSQInitiator, PSK_HANDLE_LEN}; use snow::{Builder, HandshakeState, TransportState}; use std::{cmp::min, io, pin::Pin, task::ready, task::Poll, time::Duration}; use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; @@ -53,7 +53,6 @@ impl NoiseStreamBuilder { where C: AsyncRead + AsyncWrite + Unpin, { - println!("initiator handshake start"); let mut handshake = Builder::new(pattern.as_noise_params()) .local_private_key(local_private_key.as_ref()) .remote_public_key(remote_pub_key.as_ref()) @@ -76,20 +75,11 @@ impl NoiseStreamBuilder { NOISE_PSQ_DEFAULT_CONTEXT, Duration::from_secs(NOISE_PSQ_DEFAULT_DURATION_SECS), )?; - handshake.set_psk( pattern.psk_position() as usize, &psq_initiator.get_psk().unwrap(), )?; payload - // self.perform_handshake_debug( - // handshake, - // payload, - // version, - // pattern, - // Some(&mut psq_initiator), - // ) - // .await } _ => panic!("no keypair in v2"), }, @@ -161,12 +151,12 @@ impl NoiseStreamBuilder { let mut handshake = Builder::new(pattern.as_noise_params()) .local_private_key(local_private_key.as_ref()) - .psk(pattern.psk_position(), &[]) .build_responder()?; // update handshake state with initial frame let mut buf = BytesMut::zeroed(HANDSHAKE_MAX_LEN); - handshake.read_message(&initial_frame.data, &mut buf)?; + let len = handshake.read_message(&initial_frame.data, &mut buf)?; + buf.truncate(len); let payload: Vec = match initial_frame.version() { NoiseVersion::V1 => { @@ -184,11 +174,12 @@ impl NoiseStreamBuilder { &local_public_key, &verif_key, &mut buf, - &[0; CONTEXT_LEN], + NOISE_PSQ_DEFAULT_CONTEXT, Duration::from_secs(NOISE_PSQ_DEFAULT_DURATION_SECS), &[1; PSK_HANDLE_LEN], )?; handshake.set_psk(pattern.psk_position() as usize, psk.as_slice())?; + message } // error could be replaced by something else @@ -312,55 +303,6 @@ impl NoiseStreamBuilder { dec_buffer: Default::default(), }) } - - // async fn perform_handshake_debug( - // mut self, - // mut handshake_state: HandshakeState, - // payload: impl AsRef<[u8]>, - // version: NoiseVersion, - // pattern: NoisePattern, - // psq_initiator: Option<&mut PSQInitiator>, - // ) -> Result, NoiseError> - // where - // C: AsyncRead + AsyncWrite + Unpin, - // { - // let mut psq_complete = false; - - // while !handshake_state.is_handshake_finished() { - // if handshake_state.is_my_turn() { - // self.send_handshake_msg(&mut handshake_state, &payload, version, pattern) - // .await?; - // } else { - // // let payload = - // self.recv_handshake_msg(&mut handshake_state, version, pattern) - // .await?; - - // if !psq_complete - // && handshake_state.is_initiator() - // && version == NoiseVersion::V2 - // && psq_initiator.is_some() - // { - // // handshake_state.set_psk( - // // pattern.psk_position() as usize, - // // &psq_initiator.as_ref().unwrap().finalize(&payload)?, - // // ); - // let expected_psk = psq_initiator.as_ref().unwrap().get_psk().unwrap(); - // let psk = &psq_initiator.as_ref().unwrap().finalize(&payload)?; - // assert_eq!(psk, &expected_psk); - // psq_complete = true; - // } - // } - // } - - // let transport = handshake_state.into_transport_mode()?; - // Ok(NoiseStream { - // inner_stream: self.inner_stream, - // negotiated_pattern: pattern, - // negotiated_version: version, - // transport, - // dec_buffer: Default::default(), - // }) - // } } /// Wrapper around a TcpStream @@ -657,8 +599,6 @@ mod tests { let pattern = NoisePattern::default(); - println!("here"); - let stream_initiator = NoiseStreamBuilder::new(initiator_stream) .perform_initiator_handshake_inner( pattern, @@ -679,11 +619,11 @@ mod tests { let initiator_fut = tokio::spawn( - async move { timeout(Duration::from_secs(10000), stream_initiator).await }, + async move { timeout(Duration::from_millis(200), stream_initiator).await }, ); let responder_fut = tokio::spawn( - async move { timeout(Duration::from_secs(10000), stream_responder).await }, + async move { timeout(Duration::from_millis(200), stream_responder).await }, ); let (initiator, responder) = join!(initiator_fut, responder_fut); @@ -693,7 +633,7 @@ mod tests { let msg = b"hello there"; // if noise was successful we should be able to write a proper message across - timeout(Duration::from_secs(200), initiator.write_all(msg)).await??; + timeout(Duration::from_millis(200), initiator.write_all(msg)).await??; initiator.inner_stream.flush().await?; diff --git a/common/nympsq/src/psq.rs b/common/nympsq/src/psq.rs index 3fd5134f09..bd1a95007b 100644 --- a/common/nympsq/src/psq.rs +++ b/common/nympsq/src/psq.rs @@ -1,7 +1,7 @@ // Copyright 2025 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use std::{marker::PhantomData, time::Duration}; +use std::{io::Cursor, marker::PhantomData, time::Duration}; use libcrux_ed25519::VerificationKey; use libcrux_psq::{ @@ -66,9 +66,7 @@ impl<'a, T: PSQ> PSQInitiator { )?; self.state = Some(state); - let message_bytes = message.tls_serialize_detached()?; - - Ok(message_bytes) + Ok(message.tls_serialize_detached()?) } // The initator generates the PSK themselves while computing the first message. @@ -84,7 +82,7 @@ impl<'a, T: PSQ> PSQInitiator { pub fn get_psk(&self) -> Option<[u8; 32]> { match &self.state { - Some(initiator_state) => Some(initiator_state.derive_unregistered_psk().unwrap()), + Some(initiator_state) => Some(initiator_state.unregistered_psk()), None => None, } } @@ -137,9 +135,10 @@ where psk_ttl: Duration, psk_handle: &[u8; PSK_HANDLE_LEN], ) -> Result<([u8; PSK_LENGTH], Vec), PSQError> { - let deserialized_initiator_message = - InitiatorMsg::tls_deserialize_exact(initiator_message)?; + let mut cursor = Cursor::new(initiator_message); + let deserialized_initiator_message = InitiatorMsg::tls_deserialize(&mut cursor)?; + // the problem is here the deserialized message is the same on the initiator's side let (registered_psk, responder_msg) = Responder::send::( psk_handle, psk_ttl,