Skip to content

Commit 92eac9b

Browse files
committed
make ephemeral private key explicit for handshake (todo: remove it from the state machine)
1 parent b71b7ea commit 92eac9b

File tree

4 files changed

+21
-49
lines changed

4 files changed

+21
-49
lines changed

lightning/src/ln/peer_handler.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -277,8 +277,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
277277
/// Panics if descriptor is duplicative with some other descriptor which has not yet has a
278278
/// disconnect_event.
279279
pub fn new_outbound_connection(&self, their_node_id: PublicKey, descriptor: Descriptor) -> Result<Vec<u8>, PeerHandleError> {
280-
let mut handshake = PeerHandshake::new(&self.our_node_secret, None);
281-
let act_one = handshake.initiate(&self.get_ephemeral_key(), &their_node_id).unwrap();
280+
let mut handshake = PeerHandshake::new(&self.our_node_secret, &self.get_ephemeral_key());
281+
let act_one = handshake.initiate(&their_node_id).unwrap();
282282
let res = Act::One(act_one).serialize();
283283

284284
let mut peers = self.peers.lock().unwrap();
@@ -313,7 +313,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
313313
/// Panics if descriptor is duplicative with some other descriptor which has not yet has a
314314
/// disconnect_event.
315315
pub fn new_inbound_connection(&self, descriptor: Descriptor) -> Result<(), PeerHandleError> {
316-
let handshake = PeerHandshake::new(&self.our_node_secret, None);
316+
let handshake = PeerHandshake::new(&self.our_node_secret, &self.get_ephemeral_key());
317317

318318
let mut peers = self.peers.lock().unwrap();
319319
if peers.peers.insert(descriptor, Peer {

lightning/src/ln/peers/conduit.rs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,8 @@ impl Conduit {
3131
}
3232

3333
pub(super) fn read(&mut self, data: &[u8]) {
34-
let mut read_buffer = if let Some(buffer) = self.read_buffer.take() {
35-
buffer
36-
} else {
37-
Vec::new()
38-
};
39-
34+
let mut read_buffer = self.read_buffer.get_or_insert(Vec::new());
4035
read_buffer.extend_from_slice(data);
41-
self.read_buffer = Some(read_buffer);
4236
}
4337

4438
/// Add newly received data from the peer node to the buffer and decrypt all possible messages
@@ -71,8 +65,6 @@ impl Conduit {
7165
}
7266
}
7367

74-
self.read_buffer = Some(read_buffer);
75-
7668
messages
7769
}
7870

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

Lines changed: 13 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,18 @@ mod tests;
1717
pub struct PeerHandshake {
1818
state: Option<HandshakeState>,
1919
private_key: SecretKey,
20+
ephemeral_private_key: SecretKey,
2021

21-
preset_ephemeral_private_key: Option<SecretKey>,
2222
read_buffer: Vec<u8>,
2323
}
2424

2525
impl PeerHandshake {
26-
pub fn new(private_key: &SecretKey, ephemeral_private_key: Option<&SecretKey>) -> Self {
27-
let preset_ephemeral_private_key = if let Some(key) = ephemeral_private_key {
28-
// deref and clone
29-
Some((*key).clone())
30-
} else {
31-
None
32-
};
26+
pub fn new(private_key: &SecretKey, ephemeral_private_key: &SecretKey) -> Self {
3327

3428
let handshake = PeerHandshake {
3529
state: Some(HandshakeState::Blank),
3630
private_key: (*private_key).clone(),
37-
preset_ephemeral_private_key,
31+
ephemeral_private_key: (*ephemeral_private_key).clone(),
3832
read_buffer: Vec::new(),
3933
};
4034
handshake
@@ -80,9 +74,7 @@ impl PeerHandshake {
8074
match &self.state {
8175
Some(HandshakeState::Blank) => {
8276
let remote_public_key = remote_public_key.ok_or("Call make_initiator() first")?;
83-
let ephemeral_private_key = self.obtain_ephemeral_private_key();
84-
85-
let act_one = self.initiate(&ephemeral_private_key, &remote_public_key)?;
77+
let act_one = self.initiate(&remote_public_key)?;
8678
response = act_one.0.to_vec();
8779
}
8880
Some(HandshakeState::AwaitingActOne(_)) => {
@@ -95,9 +87,7 @@ impl PeerHandshake {
9587
act_one_buffer.copy_from_slice(&self.read_buffer[..act_length]);
9688
self.read_buffer.drain(..act_length);
9789

98-
let ephemeral_private_key = self.obtain_ephemeral_private_key();
99-
100-
let act_two = self.process_act_one(ActOne(act_one_buffer), &ephemeral_private_key)?;
90+
let act_two = self.process_act_one(ActOne(act_one_buffer))?;
10191
response = act_two.0.to_vec();
10292
}
10393
Some(HandshakeState::AwaitingActTwo(_)) => {
@@ -147,7 +137,7 @@ impl PeerHandshake {
147137
Ok((response, connected_peer, remote_pubkey))
148138
}
149139

150-
pub fn initiate(&mut self, ephemeral_private_key: &SecretKey, remote_public_key: &PublicKey) -> Result<ActOne, String> {
140+
pub fn initiate(&mut self, remote_public_key: &PublicKey) -> Result<ActOne, String> {
151141
if let Some(HandshakeState::Blank) = &self.state {} else {
152142
return Err("incorrect state".to_string());
153143
}
@@ -156,7 +146,7 @@ impl PeerHandshake {
156146

157147
// serialize act one
158148
let (act_one, chaining_key, temporary_key) = self.calculate_act_message(
159-
ephemeral_private_key,
149+
&self.ephemeral_private_key,
160150
remote_public_key,
161151
chaining_key,
162152
&mut hash,
@@ -166,13 +156,13 @@ impl PeerHandshake {
166156
hash,
167157
chaining_key,
168158
temporary_key,
169-
ephemeral_private_key: (*ephemeral_private_key).clone(),
159+
ephemeral_private_key: (*&self.ephemeral_private_key).clone(),
170160
}));
171161

172162
Ok(ActOne(act_one))
173163
}
174164

175-
pub(crate) fn process_act_one(&mut self, act: ActOne, ephemeral_private_key: &SecretKey) -> Result<ActTwo, String> {
165+
pub(crate) fn process_act_one(&mut self, act: ActOne) -> Result<ActTwo, String> {
176166
let state = self.state.take();
177167
let act_one_expectation = match state {
178168
Some(HandshakeState::AwaitingActOne(act_state)) => act_state,
@@ -200,8 +190,10 @@ impl PeerHandshake {
200190
&mut hash,
201191
)?;
202192

193+
let ephemeral_private_key = (*&self.ephemeral_private_key).clone();
194+
203195
let (act_two, chaining_key, temporary_key) = self.calculate_act_message(
204-
ephemeral_private_key,
196+
&ephemeral_private_key,
205197
&remote_ephemeral_public_key,
206198
chaining_key,
207199
&mut hash,
@@ -211,7 +203,7 @@ impl PeerHandshake {
211203
hash,
212204
chaining_key,
213205
temporary_key,
214-
ephemeral_private_key: (*ephemeral_private_key).clone(),
206+
ephemeral_private_key,
215207
remote_ephemeral_public_key,
216208
}));
217209

@@ -315,18 +307,6 @@ impl PeerHandshake {
315307
Ok((remote_pubkey, connected_peer))
316308
}
317309

318-
fn obtain_ephemeral_private_key(&mut self) -> SecretKey {
319-
if let Some(key) = self.preset_ephemeral_private_key.take() {
320-
key
321-
} else {
322-
// generate a random ephemeral private key right here
323-
let mut rng = thread_rng();
324-
let mut ephemeral_bytes = [0; 32];
325-
rng.fill_bytes(&mut ephemeral_bytes);
326-
SecretKey::from_slice(&ephemeral_bytes).expect("You broke elliptic curve cryptography")
327-
}
328-
}
329-
330310
fn calculate_act_message(&self, local_private_key: &SecretKey, remote_public_key: &PublicKey, chaining_key: [u8; 32], hash: &mut HandshakeHash) -> ([u8; 50], [u8; 32], [u8; 32]) {
331311
let local_public_key = Self::private_key_to_public_key(local_private_key);
332312

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ fn test_exchange() {
1414
let local_ephemeral_private_key = SecretKey::from_slice(&[0x_12_u8; 32]).unwrap();
1515
let remote_ephemeral_private_key = SecretKey::from_slice(&[0x_22_u8; 32]).unwrap();
1616

17-
let mut local_handshake = PeerHandshake::new(&local_private_key, Some(&local_ephemeral_private_key));
18-
let mut remote_handshake = PeerHandshake::new(&remote_private_key, Some(&remote_ephemeral_private_key));
17+
let mut local_handshake = PeerHandshake::new(&local_private_key, &local_ephemeral_private_key);
18+
let mut remote_handshake = PeerHandshake::new(&remote_private_key, &remote_ephemeral_private_key);
1919

2020
let remote_public_key = PublicKey::from_secret_key(&curve, &remote_private_key);
2121

22-
let act_1_message = local_handshake.initiate(&local_ephemeral_private_key, &remote_public_key);
23-
let act_2_message = remote_handshake.process_act_one(act_1_message.unwrap(), &remote_ephemeral_private_key);
22+
let act_1_message = local_handshake.initiate(&remote_public_key);
23+
let act_2_message = remote_handshake.process_act_one(act_1_message.unwrap());
2424
let act_3_message = local_handshake.process_act_two(act_2_message.unwrap());
2525
remote_handshake.process_act_three(act_3_message.unwrap().0).unwrap();
2626
}

0 commit comments

Comments
 (0)