Skip to content

Commit cd84c0e

Browse files
committed
Simplify, clean up
1 parent 1939aa6 commit cd84c0e

File tree

10 files changed

+99
-81
lines changed

10 files changed

+99
-81
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ criterion = "0.5"
246246
csv = "1.3.1"
247247
ctr = "0.9.1"
248248
cupid = "0.6.1"
249+
curve25519-dalek = "4.1.3"
249250
dashmap = "5.5.3"
250251
# We want https://github.com/DefGuard/wireguard-rs/pull/64 , but there's no crates.io release being pushed out anymore
251252
defguard_wireguard_rs = { git = "https://github.com/DefGuard/wireguard-rs.git", rev = "v0.4.7" }

common/nym-lp/src/codec.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright 2025 - Nym Technologies SA <contact@nymtech.net>
22
// SPDX-License-Identifier: Apache-2.0
33

4-
use crate::message::{ClientHelloData, LpMessage, MessageType};
4+
use crate::message::{ClientHelloData, EncryptedDataPayload, HandshakeData, LpMessage, MessageType};
55
use crate::packet::{LpHeader, LpPacket, TRAILER_LEN};
66
use crate::LpError;
77
use bytes::BytesMut;
@@ -43,18 +43,18 @@ pub fn parse_lp_packet(src: &[u8]) -> Result<LpPacket, LpError> {
4343
if message_size != 0 {
4444
return Err(LpError::InvalidPayloadSize {
4545
expected: 0,
46-
actual: message_size,
46+
actual: message_size,
4747
});
4848
}
4949
LpMessage::Busy
5050
}
5151
MessageType::Handshake => {
5252
// No size validation needed here for Handshake, it's variable
53-
LpMessage::Handshake(payload_slice.to_vec())
53+
LpMessage::Handshake(HandshakeData(payload_slice.to_vec()))
5454
}
5555
MessageType::EncryptedData => {
5656
// No size validation needed here for EncryptedData, it's variable
57-
LpMessage::EncryptedData(payload_slice.to_vec())
57+
LpMessage::EncryptedData(EncryptedDataPayload(payload_slice.to_vec()))
5858
}
5959
MessageType::ClientHello => {
6060
// ClientHello has structured data
@@ -105,7 +105,7 @@ mod tests {
105105
// Import standalone functions
106106
use super::{parse_lp_packet, serialize_lp_packet};
107107
// Keep necessary imports
108-
use crate::message::{LpMessage, MessageType};
108+
use crate::message::{EncryptedDataPayload, HandshakeData, LpMessage, MessageType};
109109
use crate::packet::{LpHeader, LpPacket, TRAILER_LEN};
110110
use crate::LpError;
111111
use bytes::BytesMut;
@@ -120,6 +120,7 @@ mod tests {
120120
let packet = LpPacket {
121121
header: LpHeader {
122122
protocol_version: 1,
123+
reserved: 0,
123124
session_id: 42,
124125
counter: 123,
125126
},
@@ -150,10 +151,11 @@ mod tests {
150151
let packet = LpPacket {
151152
header: LpHeader {
152153
protocol_version: 1,
154+
reserved: 0,
153155
session_id: 42,
154156
counter: 123,
155157
},
156-
message: LpMessage::Handshake(payload.clone()),
158+
message: LpMessage::Handshake(HandshakeData(payload.clone())),
157159
trailer: [0; TRAILER_LEN],
158160
};
159161

@@ -171,7 +173,7 @@ mod tests {
171173
// Verify message type and data
172174
match decoded.message {
173175
LpMessage::Handshake(decoded_payload) => {
174-
assert_eq!(decoded_payload, payload);
176+
assert_eq!(decoded_payload, HandshakeData(payload));
175177
}
176178
_ => panic!("Expected Handshake message"),
177179
}
@@ -187,10 +189,11 @@ mod tests {
187189
let packet = LpPacket {
188190
header: LpHeader {
189191
protocol_version: 1,
192+
reserved: 0,
190193
session_id: 42,
191194
counter: 123,
192195
},
193-
message: LpMessage::EncryptedData(payload.clone()),
196+
message: LpMessage::EncryptedData(EncryptedDataPayload(payload.clone())),
194197
trailer: [0; TRAILER_LEN],
195198
};
196199

@@ -208,7 +211,7 @@ mod tests {
208211
// Verify message type and data
209212
match decoded.message {
210213
LpMessage::EncryptedData(decoded_payload) => {
211-
assert_eq!(decoded_payload, payload);
214+
assert_eq!(decoded_payload, EncryptedDataPayload(payload));
212215
}
213216
_ => panic!("Expected EncryptedData message"),
214217
}
@@ -387,18 +390,17 @@ mod tests {
387390

388391
// Create ClientHelloData
389392
let client_key = [42u8; 32];
390-
let protocol_version = 1u8;
391393
let salt = [99u8; 32];
392394
let hello_data = ClientHelloData {
393395
client_lp_public_key: client_key,
394-
protocol_version,
395396
salt,
396397
};
397398

398399
// Create a ClientHello message packet
399400
let packet = LpPacket {
400401
header: LpHeader {
401402
protocol_version: 1,
403+
reserved: 0,
402404
session_id: 42,
403405
counter: 123,
404406
},
@@ -421,7 +423,6 @@ mod tests {
421423
match decoded.message {
422424
LpMessage::ClientHello(decoded_data) => {
423425
assert_eq!(decoded_data.client_lp_public_key, client_key);
424-
assert_eq!(decoded_data.protocol_version, protocol_version);
425426
assert_eq!(decoded_data.salt, salt);
426427
}
427428
_ => panic!("Expected ClientHello message"),
@@ -437,12 +438,13 @@ mod tests {
437438

438439
// Create ClientHelloData with fresh salt
439440
let client_key = [7u8; 32];
440-
let hello_data = ClientHelloData::new_with_fresh_salt(client_key, 1);
441+
let hello_data = ClientHelloData::new_with_fresh_salt(client_key);
441442

442443
// Create a ClientHello message packet
443444
let packet = LpPacket {
444445
header: LpHeader {
445446
protocol_version: 1,
447+
reserved: 0,
446448
session_id: 100,
447449
counter: 200,
448450
},
@@ -460,7 +462,6 @@ mod tests {
460462
match decoded.message {
461463
LpMessage::ClientHello(decoded_data) => {
462464
assert_eq!(decoded_data.client_lp_public_key, client_key);
463-
assert_eq!(decoded_data.protocol_version, 1);
464465
assert_eq!(decoded_data.salt, hello_data.salt);
465466

466467
// Verify timestamp can be extracted
@@ -531,13 +532,13 @@ mod tests {
531532

532533
let hello_data = ClientHelloData {
533534
client_lp_public_key: [version; 32],
534-
protocol_version: version,
535535
salt: [version.wrapping_add(1); 32],
536536
};
537537

538538
let packet = LpPacket {
539539
header: LpHeader {
540540
protocol_version: 1,
541+
reserved: 0,
541542
session_id: version as u32,
542543
counter: version as u64,
543544
},
@@ -550,7 +551,6 @@ mod tests {
550551

551552
match decoded.message {
552553
LpMessage::ClientHello(decoded_data) => {
553-
assert_eq!(decoded_data.protocol_version, version);
554554
assert_eq!(decoded_data.client_lp_public_key, [version; 32]);
555555
}
556556
_ => panic!("Expected ClientHello message for version {}", version),

common/nym-lp/src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ mod tests {
124124
let packet1 = LpPacket {
125125
header: LpHeader {
126126
protocol_version: 1,
127+
reserved: 0,
127128
session_id: 42, // Matches session's sending_index assumption for this test
128129
counter: 0,
129130
},
@@ -152,6 +153,7 @@ mod tests {
152153
let packet2 = LpPacket {
153154
header: LpHeader {
154155
protocol_version: 1,
156+
reserved: 0,
155157
session_id: 42,
156158
counter: 0, // Same counter as before (replay)
157159
},
@@ -181,6 +183,7 @@ mod tests {
181183
let packet3 = LpPacket {
182184
header: LpHeader {
183185
protocol_version: 1,
186+
reserved: 0,
184187
session_id: 42,
185188
counter: 1, // Incremented counter
186189
},
@@ -241,6 +244,7 @@ mod tests {
241244
let packet1 = LpPacket {
242245
header: LpHeader {
243246
protocol_version: 1,
247+
reserved: 0,
244248
session_id: lp_id,
245249
counter: 0,
246250
},
@@ -273,6 +277,7 @@ mod tests {
273277
let packet2 = LpPacket {
274278
header: LpHeader {
275279
protocol_version: 1,
280+
reserved: 0,
276281
session_id: lp_id,
277282
counter: 1,
278283
},
@@ -300,6 +305,7 @@ mod tests {
300305
let packet3 = LpPacket {
301306
header: LpHeader {
302307
protocol_version: 1,
308+
reserved: 0,
303309
session_id: lp_id,
304310
counter: 0, // Replay of first packet
305311
},

common/nym-lp/src/message.rs

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ use serde::{Deserialize, Serialize};
1010
pub struct ClientHelloData {
1111
/// Client's LP x25519 public key (32 bytes)
1212
pub client_lp_public_key: [u8; 32],
13-
/// Protocol version for future compatibility
14-
pub protocol_version: u8,
1513
/// Salt for PSK derivation (32 bytes: 8-byte timestamp + 24-byte nonce)
1614
pub salt: [u8; 32],
1715
}
@@ -24,7 +22,7 @@ impl ClientHelloData {
2422
/// # Arguments
2523
/// * `client_lp_public_key` - Client's x25519 public key
2624
/// * `protocol_version` - Protocol version number
27-
pub fn new_with_fresh_salt(client_lp_public_key: [u8; 32], protocol_version: u8) -> Self {
25+
pub fn new_with_fresh_salt(client_lp_public_key: [u8; 32]) -> Self {
2826
use std::time::{SystemTime, UNIX_EPOCH};
2927

3028
// Generate salt: timestamp + nonce
@@ -43,7 +41,6 @@ impl ClientHelloData {
4341

4442
Self {
4543
client_lp_public_key,
46-
protocol_version,
4744
salt,
4845
}
4946
}
@@ -89,11 +86,17 @@ impl MessageType {
8986
}
9087
}
9188

89+
#[derive(Debug, Clone, PartialEq, Eq)]
90+
pub struct HandshakeData(pub Vec<u8>);
91+
92+
#[derive(Debug, Clone, PartialEq, Eq)]
93+
pub struct EncryptedDataPayload(pub Vec<u8>);
94+
9295
#[derive(Debug, Clone)]
9396
pub enum LpMessage {
9497
Busy,
95-
Handshake(Vec<u8>),
96-
EncryptedData(Vec<u8>),
98+
Handshake(HandshakeData),
99+
EncryptedData(EncryptedDataPayload),
97100
ClientHello(ClientHelloData),
98101
}
99102

@@ -112,26 +115,26 @@ impl LpMessage {
112115
pub fn payload(&self) -> &[u8] {
113116
match self {
114117
LpMessage::Busy => &[],
115-
LpMessage::Handshake(payload) => payload,
116-
LpMessage::EncryptedData(payload) => payload,
117-
LpMessage::ClientHello(_) => &[], // Structured data, serialized in encode_content
118+
LpMessage::Handshake(payload) => payload.0.as_slice(),
119+
LpMessage::EncryptedData(payload) => payload.0.as_slice(),
120+
LpMessage::ClientHello(_) => unimplemented!(), // Structured data, serialized in encode_content
118121
}
119122
}
120123

121124
pub fn is_empty(&self) -> bool {
122125
match self {
123126
LpMessage::Busy => true,
124-
LpMessage::Handshake(payload) => payload.is_empty(),
125-
LpMessage::EncryptedData(payload) => payload.is_empty(),
127+
LpMessage::Handshake(payload) => payload.0.is_empty(),
128+
LpMessage::EncryptedData(payload) => payload.0.is_empty(),
126129
LpMessage::ClientHello(_) => false, // Always has data
127130
}
128131
}
129132

130133
pub fn len(&self) -> usize {
131134
match self {
132135
LpMessage::Busy => 0,
133-
LpMessage::Handshake(payload) => payload.len(),
134-
LpMessage::EncryptedData(payload) => payload.len(),
136+
LpMessage::Handshake(payload) => payload.0.len(),
137+
LpMessage::EncryptedData(payload) => payload.0.len(),
135138
LpMessage::ClientHello(_) => 65, // 32 bytes key + 1 byte version + 32 bytes salt
136139
}
137140
}
@@ -149,10 +152,10 @@ impl LpMessage {
149152
match self {
150153
LpMessage::Busy => { /* No content */ }
151154
LpMessage::Handshake(payload) => {
152-
dst.put_slice(payload);
155+
dst.put_slice(&payload.0);
153156
}
154157
LpMessage::EncryptedData(payload) => {
155-
dst.put_slice(payload);
158+
dst.put_slice(&payload.0);
156159
}
157160
LpMessage::ClientHello(data) => {
158161
// Serialize ClientHelloData using bincode
@@ -172,10 +175,11 @@ mod tests {
172175

173176
#[test]
174177
fn encoding() {
175-
let message = LpMessage::EncryptedData(vec![11u8; 124]);
178+
let message = LpMessage::EncryptedData(EncryptedDataPayload(vec![11u8; 124]));
176179

177180
let resp_header = LpHeader {
178181
protocol_version: 1,
182+
reserved: 0,
179183
session_id: 0,
180184
counter: 0,
181185
};
@@ -195,7 +199,7 @@ mod tests {
195199
// Verify correct data in message
196200
match &packet.message {
197201
LpMessage::EncryptedData(data) => {
198-
assert_eq!(*data, vec![11u8; 124]);
202+
assert_eq!(*data, EncryptedDataPayload(vec![11u8; 124]));
199203
}
200204
_ => panic!("Wrong message type"),
201205
}
@@ -204,8 +208,8 @@ mod tests {
204208
#[test]
205209
fn test_client_hello_salt_generation() {
206210
let client_key = [1u8; 32];
207-
let hello1 = ClientHelloData::new_with_fresh_salt(client_key, 1);
208-
let hello2 = ClientHelloData::new_with_fresh_salt(client_key, 1);
211+
let hello1 = ClientHelloData::new_with_fresh_salt(client_key);
212+
let hello2 = ClientHelloData::new_with_fresh_salt(client_key);
209213

210214
// Different salts should be generated
211215
assert_ne!(hello1.salt, hello2.salt);
@@ -219,7 +223,7 @@ mod tests {
219223
#[test]
220224
fn test_client_hello_timestamp_extraction() {
221225
let client_key = [2u8; 32];
222-
let hello = ClientHelloData::new_with_fresh_salt(client_key, 1);
226+
let hello = ClientHelloData::new_with_fresh_salt(client_key);
223227

224228
let timestamp = hello.extract_timestamp();
225229
let now = std::time::SystemTime::now()
@@ -234,7 +238,7 @@ mod tests {
234238
#[test]
235239
fn test_client_hello_salt_format() {
236240
let client_key = [3u8; 32];
237-
let hello = ClientHelloData::new_with_fresh_salt(client_key, 1);
241+
let hello = ClientHelloData::new_with_fresh_salt(client_key);
238242

239243
// First 8 bytes should be non-zero timestamp
240244
let timestamp_bytes = &hello.salt[..8];

common/nym-lp/src/packet.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ impl LpPacket {
126126
#[derive(Debug, Clone)]
127127
pub struct LpHeader {
128128
pub protocol_version: u8,
129-
129+
pub reserved: u16,
130130
pub session_id: u32,
131131
pub counter: u64,
132132
}
@@ -139,6 +139,7 @@ impl LpHeader {
139139
pub fn new(session_id: u32, counter: u64) -> Self {
140140
Self {
141141
protocol_version: 1,
142+
reserved: 0,
142143
session_id,
143144
counter,
144145
}
@@ -176,6 +177,7 @@ impl LpHeader {
176177

177178
Ok(LpHeader {
178179
protocol_version,
180+
reserved: 0,
179181
session_id,
180182
counter,
181183
})

0 commit comments

Comments
 (0)