Skip to content

Commit c6cd7c8

Browse files
committed
Add HandshakeConfig. Clean up hs pattern/name stuff
1 parent 2a3e509 commit c6cd7c8

File tree

1 file changed

+48
-6
lines changed

1 file changed

+48
-6
lines changed

src/crypto/handshake.rs

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use blake2::{
33
digest::{typenum::U32, FixedOutput, Update},
44
Blake2bMac,
55
};
6+
use handshake_patterns::name_from_pattern;
67
use snow::{
78
params::HandshakePattern,
89
resolvers::{DefaultResolver, FallbackResolver},
@@ -16,6 +17,7 @@ const CIPHERKEYLEN: usize = 32;
1617
/// The [`HandshakePattern`]s we support for connections
1718
pub mod handshake_patterns {
1819
use snow::params::HandshakePattern;
20+
use tracing::error;
1921
/// [`HandshakePattern`] used by the hyperdht crate.
2022
pub const DHT: HandshakePattern = HandshakePattern::IK;
2123
/// Noise protocol name used in hyperdht crate.
@@ -24,6 +26,18 @@ pub mod handshake_patterns {
2426
pub const PROTOCOL: HandshakePattern = HandshakePattern::XX;
2527
/// Noise protocol name used in hypercore-protocol crate.
2628
pub const PROTOCOL_NAME: &str = "Noise_XX_Ed25519_ChaChaPoly_BLAKE2b";
29+
30+
/// Get a Noise protocol name from a handshake pattern
31+
pub fn name_from_pattern(pattern: &HandshakePattern) -> Result<&'static str, snow::Error> {
32+
Ok(match *pattern {
33+
DHT => DHT_NAME,
34+
PROTOCOL => PROTOCOL_NAME,
35+
unsupported_pattern => {
36+
error!("Got an unsupported handshake pattern {unsupported_pattern:?}");
37+
return Err(snow::Error::Input);
38+
}
39+
})
40+
}
2741
}
2842

2943
// These the output of, see `hash_namespace` test below for how they are produced
@@ -200,6 +214,38 @@ impl Handshake {
200214
}
201215
}
202216

217+
/// Configuration for creating a handshake with specific parameters
218+
#[derive(Debug, Clone)]
219+
pub struct HandshakeConfig {
220+
/// The noise handshake pattern to use (XX, IK, etc.)
221+
pub pattern: HandshakePattern,
222+
/// Optional prologue data to include in the handshake
223+
pub prologue: Option<Vec<u8>>,
224+
/// Remote public key (required for IK pattern initiator)
225+
// TODO replace with an actual key type
226+
pub remote_public_key: Option<[u8; 32]>,
227+
}
228+
229+
impl HandshakeConfig {
230+
fn new(
231+
pattern: HandshakePattern,
232+
prologue: Option<Vec<u8>>,
233+
remote_public_key: Option<[u8; 32]>,
234+
) -> Self {
235+
Self {
236+
pattern,
237+
prologue,
238+
remote_public_key,
239+
}
240+
}
241+
}
242+
243+
impl Default for HandshakeConfig {
244+
fn default() -> Self {
245+
Self::new(HandshakePattern::XX, None, None)
246+
}
247+
}
248+
203249
fn build_handshake_state(
204250
is_initiator: bool,
205251
) -> std::result::Result<(HandshakeState, Vec<u8>), SnowError> {
@@ -215,14 +261,10 @@ fn build_handshake_state_with_config(
215261
NoiseParams,
216262
};
217263

218-
let pattern_str = match config.pattern {
219-
HandshakePattern::XX => "Noise_XX_Ed25519_ChaChaPoly_BLAKE2b",
220-
HandshakePattern::IK => "Noise_IK_Ed25519_ChaChaPoly_BLAKE2b",
221-
_ => return Err(SnowError::Input),
222-
};
264+
let hs_name = name_from_pattern(&config.pattern)?;
223265

224266
let noise_params = NoiseParams::new(
225-
pattern_str.to_string(),
267+
hs_name.to_string(),
226268
BaseChoice::Noise,
227269
HandshakeChoice {
228270
pattern: config.pattern,

0 commit comments

Comments
 (0)