Tests pass

This commit is contained in:
Georgio Nicolas
2025-08-08 12:50:11 +02:00
parent 84fcf81852
commit 79bf97ceaa
3 changed files with 21 additions and 78 deletions
+7 -3
View File
@@ -70,13 +70,15 @@ mod psk_gen {
let responder: PSQResponder<X25519> = 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<Vec<u8>, 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)
}
}
+8 -68
View File
@@ -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<C> NoiseStreamBuilder<C> {
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<C> NoiseStreamBuilder<C> {
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<C> NoiseStreamBuilder<C> {
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<u8> = match initial_frame.version() {
NoiseVersion::V1 => {
@@ -184,11 +174,12 @@ impl<C> NoiseStreamBuilder<C> {
&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<C> NoiseStreamBuilder<C> {
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<libcrux_psq::impls::X25519>>,
// ) -> Result<NoiseStream<C>, 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?;
+6 -7
View File
@@ -1,7 +1,7 @@
// Copyright 2025 - Nym Technologies SA <contact@nymtech.net>
// 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<T> {
)?;
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<T> {
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<u8>), 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::<Ed25519, T>(
psk_handle,
psk_ttl,