Skip to content

Commit 7db31d5

Browse files
committed
refactor: Make Conduit a simple wrapper
The public interface was in a half-state with some callers referencing the Decryptor directly for message iteration and others using the public interface for the encryption path. This patch moves everything to using the Encryptor and Decryptor directly. This is motivated by feedback from 494, that recommended the objects are split up but still have common functions for the key rotation.
1 parent 4d29caa commit 7db31d5

File tree

4 files changed

+23
-38
lines changed

4 files changed

+23
-38
lines changed

fuzz/src/peer_crypt.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ fn do_conduit_tests(generator: &mut FuzzGen, initiator_conduit: &mut Conduit, re
137137

138138
// randomly choose sender of message
139139
let receiver_unencrypted_msg = if generator.generate_bool()? {
140-
let encrypted_msg = initiator_conduit.encrypt(sender_unencrypted_msg);
140+
let encrypted_msg = initiator_conduit.encryptor.encrypt(sender_unencrypted_msg);
141141
if let Ok(_) = responder_conduit.decryptor.read(&encrypted_msg) {
142142
if let Some(msg) = responder_conduit.decryptor.next() {
143143
msg
@@ -150,7 +150,7 @@ fn do_conduit_tests(generator: &mut FuzzGen, initiator_conduit: &mut Conduit, re
150150
return Ok(());
151151
}
152152
} else {
153-
let encrypted_msg = responder_conduit.encrypt(sender_unencrypted_msg);
153+
let encrypted_msg = responder_conduit.encryptor.encrypt(sender_unencrypted_msg);
154154
if let Ok(_) = initiator_conduit.decryptor.read(&encrypted_msg) {
155155
if let Some(msg) = initiator_conduit.decryptor.next() {
156156
msg

lightning/src/ln/peers/conduit.rs

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,12 @@ const KEY_ROTATION_INDEX: u32 = 1000;
1919
/// Returned after a successful handshake to encrypt and decrypt communication with peer nodes.
2020
/// It should not normally be manually instantiated.
2121
/// Automatically handles key rotation.
22-
/// For decryption, it is recommended to call `decrypt_message_stream` for automatic buffering.
2322
pub struct Conduit {
24-
pub(super) encryptor: Encryptor,
25-
26-
#[cfg(feature = "fuzztarget")]
23+
pub encryptor: Encryptor,
2724
pub decryptor: Decryptor,
28-
#[cfg(not(feature = "fuzztarget"))]
29-
pub(super) decryptor: Decryptor,
30-
3125
}
3226

33-
pub(super) struct Encryptor {
27+
pub struct Encryptor {
3428
sending_key: SymmetricKey,
3529
sending_chaining_key: SymmetricKey,
3630
sending_nonce: u32,
@@ -74,15 +68,6 @@ impl Conduit {
7468
}
7569
}
7670

77-
/// Encrypt data to be sent to peer
78-
pub fn encrypt(&mut self, buffer: &[u8]) -> Vec<u8> {
79-
self.encryptor.encrypt(buffer)
80-
}
81-
82-
pub(super) fn read(&mut self, data: &[u8]) -> Result<(), String>{
83-
self.decryptor.read(data)
84-
}
85-
8671
fn increment_nonce(nonce: &mut u32, chaining_key: &mut SymmetricKey, key: &mut SymmetricKey) {
8772
*nonce += 1;
8873
if *nonce == KEY_ROTATION_INDEX {
@@ -99,7 +84,7 @@ impl Conduit {
9984
}
10085

10186
impl Encryptor {
102-
pub(super) fn encrypt(&mut self, buffer: &[u8]) -> Vec<u8> {
87+
pub fn encrypt(&mut self, buffer: &[u8]) -> Vec<u8> {
10388
if buffer.len() > LN_MAX_MSG_LEN {
10489
panic!("Attempted to encrypt message longer than 65535 bytes!");
10590
}
@@ -250,7 +235,7 @@ mod tests {
250235
let (mut connected_peer, mut remote_peer) = setup_peers();
251236

252237
let message: Vec<u8> = vec![];
253-
let encrypted_message = connected_peer.encrypt(&message);
238+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
254239
assert_eq!(encrypted_message.len(), 2 + 16 + 16);
255240

256241
remote_peer.decryptor.read(&encrypted_message[..]).unwrap();
@@ -266,7 +251,7 @@ mod tests {
266251
let (mut connected_peer, mut remote_peer) = setup_peers();
267252

268253
let message: Vec<u8> = vec![1];
269-
let encrypted_message = connected_peer.encrypt(&message);
254+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
270255

271256
remote_peer.decryptor.read(&encrypted_message[..1]).unwrap();
272257
assert!(remote_peer.decryptor.next().is_none());
@@ -283,7 +268,7 @@ mod tests {
283268
let (mut connected_peer, mut remote_peer) = setup_peers();
284269

285270
let message: Vec<u8> = vec![1];
286-
let encrypted_message = connected_peer.encrypt(&message);
271+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
287272

288273
remote_peer.decryptor.read(&encrypted_message[..20]).unwrap();
289274
assert!(remote_peer.decryptor.next().is_none());
@@ -299,11 +284,11 @@ mod tests {
299284
let (mut connected_peer, _remote_peer) = setup_peers();
300285
let message = hex::decode("68656c6c6f").unwrap();
301286

302-
let encrypted_message = connected_peer.encrypt(&message);
287+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
303288
assert_eq!(encrypted_message, hex::decode("cf2b30ddf0cf3f80e7c35a6e6730b59fe802473180f396d88a8fb0db8cbcf25d2f214cf9ea1d95").unwrap());
304289

305290
// the second time the same message is encrypted, the ciphertext should be different
306-
let encrypted_message = connected_peer.encrypt(&message);
291+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
307292
assert_eq!(encrypted_message, hex::decode("72887022101f0b6753e0c7de21657d35a4cb2a1f5cde2650528bbc8f837d0f0d7ad833b1a256a1").unwrap());
308293
}
309294

@@ -316,7 +301,7 @@ mod tests {
316301
let mut encrypted_messages: Vec<Vec<u8>> = Vec::new();
317302

318303
for _ in 0..1002 {
319-
let encrypted_message = connected_peer.encrypt(&message);
304+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
320305
encrypted_messages.push(encrypted_message);
321306
}
322307

@@ -334,7 +319,7 @@ mod tests {
334319
let mut encrypted_messages: Vec<Vec<u8>> = Vec::new();
335320

336321
for _ in 0..1002 {
337-
let encrypted_message = connected_peer.encrypt(&message);
322+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
338323
encrypted_messages.push(encrypted_message);
339324
}
340325

@@ -343,15 +328,15 @@ mod tests {
343328
let mut current_encrypted_message = encrypted_messages.remove(0);
344329
let next_encrypted_message = encrypted_messages.remove(0);
345330
current_encrypted_message.extend_from_slice(&next_encrypted_message);
346-
remote_peer.read(&current_encrypted_message[..]).unwrap();
331+
remote_peer.decryptor.read(&current_encrypted_message[..]).unwrap();
347332

348333
let decrypted_message = remote_peer.decryptor.next().unwrap();
349334
assert_eq!(decrypted_message, message);
350335
}
351336

352337
for _ in 0..501 {
353338
// decrypt messages directly from buffer without adding to it
354-
remote_peer.read(&[]).unwrap();
339+
remote_peer.decryptor.read(&[]).unwrap();
355340
let decrypted_message = remote_peer.decryptor.next().unwrap();
356341
assert_eq!(decrypted_message, message);
357342
}
@@ -361,10 +346,10 @@ mod tests {
361346
#[test]
362347
fn decryption_failure_errors() {
363348
let (mut connected_peer, mut remote_peer) = setup_peers();
364-
let encrypted = remote_peer.encrypt(&[1]);
349+
let encrypted = remote_peer.encryptor.encrypt(&[1]);
365350

366351
connected_peer.decryptor.receiving_key = [0; 32];
367-
assert_eq!(connected_peer.read(&encrypted), Err("invalid hmac".to_string()));
352+
assert_eq!(connected_peer.decryptor.read(&encrypted), Err("invalid hmac".to_string()));
368353
}
369354

370355
// Test next()::None
@@ -379,8 +364,8 @@ mod tests {
379364
#[test]
380365
fn decryptor_iterator_one_item_valid() {
381366
let (mut connected_peer, mut remote_peer) = setup_peers();
382-
let encrypted = remote_peer.encrypt(&[1]);
383-
connected_peer.read(&encrypted).unwrap();
367+
let encrypted = remote_peer.encryptor.encrypt(&[1]);
368+
connected_peer.decryptor.read(&encrypted).unwrap();
384369

385370
assert_eq!(connected_peer.decryptor.next(), Some(vec![1]));
386371
assert_eq!(connected_peer.decryptor.next(), None);
@@ -397,7 +382,7 @@ mod tests {
397382
fn max_message_len_encryption() {
398383
let (mut connected_peer, _) = setup_peers();
399384
let msg = [4u8; LN_MAX_MSG_LEN + 1];
400-
let _should_panic = connected_peer.encrypt(&msg);
385+
let _should_panic = connected_peer.encryptor.encrypt(&msg);
401386
}
402387

403388
#[test]
@@ -407,6 +392,6 @@ mod tests {
407392

408393
// MSG should not exceed LN_MAX_MSG_LEN + 16
409394
let msg = [4u8; LN_MAX_MSG_LEN + 17];
410-
connected_peer.read(&msg).unwrap();
395+
connected_peer.decryptor.read(&msg).unwrap();
411396
}
412397
}

lightning/src/ln/peers/handshake/states.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ impl IHandshakeState for ResponderAwaitingActThreeState {
391391

392392
// Any remaining data in the read buffer would be encrypted, so transfer ownership
393393
// to the Conduit for future use.
394-
conduit.read(&input[bytes_read..])?;
394+
conduit.decryptor.read(&input[bytes_read..])?;
395395

396396
Ok((
397397
None,

lightning/src/ln/peers/transport.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ impl<PeerHandshakeImpl: IPeerHandshake> ITransport for Transport<PeerHandshakeIm
9191
}
9292
}
9393
Some(ref mut conduit) => {
94-
conduit.read(input)?;
94+
conduit.decryptor.read(input)?;
9595
Ok(false) // newly connected
9696
}
9797
}
@@ -160,7 +160,7 @@ impl<PeerHandshakeImpl: IPeerHandshake> MessageQueuer for Transport<PeerHandshak
160160

161161
let mut buffer = VecWriter(Vec::new());
162162
wire::write(message, &mut buffer).unwrap();
163-
output_buffer.push_back(conduit.encrypt(&buffer.0));
163+
output_buffer.push_back(conduit.encryptor.encrypt(&buffer.0));
164164
}
165165
}
166166
}

0 commit comments

Comments
 (0)