Skip to content

Commit 08e8796

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 9bc3c63 commit 08e8796

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
@@ -28,18 +28,12 @@ const KEY_ROTATION_INDEX: u32 = 1000;
2828
/// Returned after a successful handshake to encrypt and decrypt communication with peer nodes.
2929
/// It should not normally be manually instantiated.
3030
/// Automatically handles key rotation.
31-
/// For decryption, it is recommended to call `decrypt_message_stream` for automatic buffering.
3231
pub struct Conduit {
33-
pub(super) encryptor: Encryptor,
34-
35-
#[cfg(feature = "fuzztarget")]
32+
pub encryptor: Encryptor,
3633
pub decryptor: Decryptor,
37-
#[cfg(not(feature = "fuzztarget"))]
38-
pub(super) decryptor: Decryptor,
39-
4034
}
4135

42-
pub(super) struct Encryptor {
36+
pub struct Encryptor {
4337
sending_key: SymmetricKey,
4438
sending_chaining_key: SymmetricKey,
4539
sending_nonce: u32,
@@ -83,15 +77,6 @@ impl Conduit {
8377
}
8478
}
8579

86-
/// Encrypt data to be sent to peer
87-
pub fn encrypt(&mut self, buffer: &[u8]) -> Vec<u8> {
88-
self.encryptor.encrypt(buffer)
89-
}
90-
91-
pub(super) fn read(&mut self, data: &[u8]) -> Result<(), String>{
92-
self.decryptor.read(data)
93-
}
94-
9580
fn increment_nonce(nonce: &mut u32, chaining_key: &mut SymmetricKey, key: &mut SymmetricKey) {
9681
*nonce += 1;
9782
if *nonce == KEY_ROTATION_INDEX {
@@ -108,7 +93,7 @@ impl Conduit {
10893
}
10994

11095
impl Encryptor {
111-
pub(super) fn encrypt(&mut self, buffer: &[u8]) -> Vec<u8> {
96+
pub fn encrypt(&mut self, buffer: &[u8]) -> Vec<u8> {
11297
if buffer.len() > LN_MAX_MSG_LEN {
11398
panic!("Attempted to encrypt message longer than 65535 bytes!");
11499
}
@@ -259,7 +244,7 @@ mod tests {
259244
let (mut connected_peer, mut remote_peer) = setup_peers();
260245

261246
let message: Vec<u8> = vec![];
262-
let encrypted_message = connected_peer.encrypt(&message);
247+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
263248
assert_eq!(encrypted_message.len(), 2 + 16 + 16);
264249

265250
remote_peer.decryptor.read(&encrypted_message[..]).unwrap();
@@ -275,7 +260,7 @@ mod tests {
275260
let (mut connected_peer, mut remote_peer) = setup_peers();
276261

277262
let message: Vec<u8> = vec![1];
278-
let encrypted_message = connected_peer.encrypt(&message);
263+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
279264

280265
remote_peer.decryptor.read(&encrypted_message[..1]).unwrap();
281266
assert!(remote_peer.decryptor.next().is_none());
@@ -292,7 +277,7 @@ mod tests {
292277
let (mut connected_peer, mut remote_peer) = setup_peers();
293278

294279
let message: Vec<u8> = vec![1];
295-
let encrypted_message = connected_peer.encrypt(&message);
280+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
296281

297282
remote_peer.decryptor.read(&encrypted_message[..20]).unwrap();
298283
assert!(remote_peer.decryptor.next().is_none());
@@ -308,11 +293,11 @@ mod tests {
308293
let (mut connected_peer, _remote_peer) = setup_peers();
309294
let message = hex::decode("68656c6c6f").unwrap();
310295

311-
let encrypted_message = connected_peer.encrypt(&message);
296+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
312297
assert_eq!(encrypted_message, hex::decode("cf2b30ddf0cf3f80e7c35a6e6730b59fe802473180f396d88a8fb0db8cbcf25d2f214cf9ea1d95").unwrap());
313298

314299
// the second time the same message is encrypted, the ciphertext should be different
315-
let encrypted_message = connected_peer.encrypt(&message);
300+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
316301
assert_eq!(encrypted_message, hex::decode("72887022101f0b6753e0c7de21657d35a4cb2a1f5cde2650528bbc8f837d0f0d7ad833b1a256a1").unwrap());
317302
}
318303

@@ -325,7 +310,7 @@ mod tests {
325310
let mut encrypted_messages: Vec<Vec<u8>> = Vec::new();
326311

327312
for _ in 0..1002 {
328-
let encrypted_message = connected_peer.encrypt(&message);
313+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
329314
encrypted_messages.push(encrypted_message);
330315
}
331316

@@ -343,7 +328,7 @@ mod tests {
343328
let mut encrypted_messages: Vec<Vec<u8>> = Vec::new();
344329

345330
for _ in 0..1002 {
346-
let encrypted_message = connected_peer.encrypt(&message);
331+
let encrypted_message = connected_peer.encryptor.encrypt(&message);
347332
encrypted_messages.push(encrypted_message);
348333
}
349334

@@ -352,15 +337,15 @@ mod tests {
352337
let mut current_encrypted_message = encrypted_messages.remove(0);
353338
let next_encrypted_message = encrypted_messages.remove(0);
354339
current_encrypted_message.extend_from_slice(&next_encrypted_message);
355-
remote_peer.read(&current_encrypted_message[..]).unwrap();
340+
remote_peer.decryptor.read(&current_encrypted_message[..]).unwrap();
356341

357342
let decrypted_message = remote_peer.decryptor.next().unwrap();
358343
assert_eq!(decrypted_message, message);
359344
}
360345

361346
for _ in 0..501 {
362347
// decrypt messages directly from buffer without adding to it
363-
remote_peer.read(&[]).unwrap();
348+
remote_peer.decryptor.read(&[]).unwrap();
364349
let decrypted_message = remote_peer.decryptor.next().unwrap();
365350
assert_eq!(decrypted_message, message);
366351
}
@@ -370,10 +355,10 @@ mod tests {
370355
#[test]
371356
fn decryption_failure_errors() {
372357
let (mut connected_peer, mut remote_peer) = setup_peers();
373-
let encrypted = remote_peer.encrypt(&[1]);
358+
let encrypted = remote_peer.encryptor.encrypt(&[1]);
374359

375360
connected_peer.decryptor.receiving_key = [0; 32];
376-
assert_eq!(connected_peer.read(&encrypted), Err("invalid hmac".to_string()));
361+
assert_eq!(connected_peer.decryptor.read(&encrypted), Err("invalid hmac".to_string()));
377362
}
378363

379364
// Test next()::None
@@ -388,8 +373,8 @@ mod tests {
388373
#[test]
389374
fn decryptor_iterator_one_item_valid() {
390375
let (mut connected_peer, mut remote_peer) = setup_peers();
391-
let encrypted = remote_peer.encrypt(&[1]);
392-
connected_peer.read(&encrypted).unwrap();
376+
let encrypted = remote_peer.encryptor.encrypt(&[1]);
377+
connected_peer.decryptor.read(&encrypted).unwrap();
393378

394379
assert_eq!(connected_peer.decryptor.next(), Some(vec![1]));
395380
assert_eq!(connected_peer.decryptor.next(), None);
@@ -406,7 +391,7 @@ mod tests {
406391
fn max_message_len_encryption() {
407392
let (mut connected_peer, _) = setup_peers();
408393
let msg = [4u8; LN_MAX_MSG_LEN + 1];
409-
let _should_panic = connected_peer.encrypt(&msg);
394+
let _should_panic = connected_peer.encryptor.encrypt(&msg);
410395
}
411396

412397
#[test]
@@ -416,6 +401,6 @@ mod tests {
416401

417402
// MSG should not exceed LN_MAX_MSG_LEN + 16
418403
let msg = [4u8; LN_MAX_MSG_LEN + 17];
419-
connected_peer.read(&msg).unwrap();
404+
connected_peer.decryptor.read(&msg).unwrap();
420405
}
421406
}

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

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

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

405405
Ok((
406406
None,

lightning/src/ln/peers/transport.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ impl<PeerHandshakeImpl: IPeerHandshake> ITransport for Transport<PeerHandshakeIm
101101
}
102102
}
103103
Some(ref mut conduit) => {
104-
conduit.read(input)?;
104+
conduit.decryptor.read(input)?;
105105
Ok(false)
106106
}
107107
}
@@ -170,7 +170,7 @@ impl<PeerHandshakeImpl: IPeerHandshake> MessageQueuer for Transport<PeerHandshak
170170

171171
let mut buffer = VecWriter(Vec::new());
172172
wire::write(message, &mut buffer).unwrap();
173-
output_buffer.push_back(conduit.encrypt(&buffer.0));
173+
output_buffer.push_back(conduit.encryptor.encrypt(&buffer.0));
174174
}
175175
}
176176
}

0 commit comments

Comments
 (0)