Skip to content

Commit 26a7192

Browse files
authored
Merge pull request #260 from yuntai/201811-sessionkey
Add a method to get session secret for onion packet to KeysInterface
2 parents 5e9e199 + 7e59e1e commit 26a7192

File tree

5 files changed

+32
-7
lines changed

5 files changed

+32
-7
lines changed

fuzz/fuzz_targets/full_stack_target.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use lightning::ln::channelmanager::{ChannelManager, PaymentFailReason};
2121
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor};
2222
use lightning::ln::router::Router;
2323
use lightning::util::events::{EventsProvider,Event};
24-
use lightning::util::reset_rng_state;
24+
use lightning::util::{reset_rng_state, fill_bytes};
2525
use lightning::util::logger::Logger;
2626
use lightning::util::sha2::Sha256;
2727
use lightning::util::config::UserConfig;
@@ -265,6 +265,12 @@ impl KeysInterface for KeyProvider {
265265
}
266266
}
267267
}
268+
269+
fn get_session_key(&self) -> SecretKey {
270+
let mut session_key = [0; 32];
271+
fill_bytes(&mut session_key);
272+
SecretKey::from_slice(&Secp256k1::without_caps(), &session_key).unwrap()
273+
}
268274
}
269275

270276
#[inline]

src/chain/keysinterface.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ pub trait KeysInterface: Send + Sync {
7979
/// Get a new set of ChannelKeys for per-channel secrets. These MUST be unique even if you
8080
/// restarted with some stale data!
8181
fn get_channel_keys(&self, inbound: bool) -> ChannelKeys;
82+
/// Get a secret for construting an onion packet
83+
fn get_session_key(&self) -> SecretKey;
8284
}
8385

8486
/// Set of lightning keys needed to operate a channel as described in BOLT 3
@@ -158,6 +160,8 @@ pub struct KeysManager {
158160
shutdown_pubkey: PublicKey,
159161
channel_master_key: ExtendedPrivKey,
160162
channel_child_index: AtomicUsize,
163+
session_master_key: ExtendedPrivKey,
164+
session_child_index: AtomicUsize,
161165

162166
logger: Arc<Logger>,
163167
}
@@ -184,13 +188,16 @@ impl KeysManager {
184188
Err(_) => panic!("Your RNG is busted"),
185189
};
186190
let channel_master_key = master_key.ckd_priv(&secp_ctx, ChildNumber::from_hardened_idx(3)).expect("Your RNG is busted");
191+
let session_master_key = master_key.ckd_priv(&secp_ctx, ChildNumber::from_hardened_idx(4)).expect("Your RNG is busted");
187192
KeysManager {
188193
secp_ctx,
189194
node_secret,
190195
destination_script,
191196
shutdown_pubkey,
192197
channel_master_key,
193198
channel_child_index: AtomicUsize::new(0),
199+
session_master_key,
200+
session_child_index: AtomicUsize::new(0),
194201

195202
logger,
196203
}
@@ -235,4 +242,19 @@ impl KeysInterface for KeysManager {
235242
sha.result(&mut seed);
236243
ChannelKeys::new_from_seed(&seed)
237244
}
245+
246+
fn get_session_key(&self) -> SecretKey {
247+
let mut sha = Sha256::new();
248+
let mut res = [0u8; 32];
249+
250+
let now = SystemTime::now().duration_since(UNIX_EPOCH).expect("Time went backwards");
251+
sha.input(&byte_utils::be32_to_array(now.subsec_nanos()));
252+
sha.input(&byte_utils::be64_to_array(now.as_secs()));
253+
254+
let child_ix = self.session_child_index.fetch_add(1, Ordering::AcqRel);
255+
let child_privkey = self.session_master_key.ckd_priv(&self.secp_ctx, ChildNumber::from_hardened_idx(child_ix as u32)).expect("Your RNG is busted");
256+
sha.input(&child_privkey.secret_key[..]);
257+
sha.result(&mut res);
258+
SecretKey::from_slice(&self.secp_ctx, &res).expect("Your RNG is busted")
259+
}
238260
}

src/ln/channel.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3901,6 +3901,7 @@ mod tests {
39013901
}
39023902

39033903
fn get_channel_keys(&self, _inbound: bool) -> ChannelKeys { self.chan_keys.clone() }
3904+
fn get_session_key(&self) -> SecretKey { panic!(); }
39043905
}
39053906

39063907
#[test]

src/ln/channelmanager.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,11 +1205,7 @@ impl ChannelManager {
12051205
}
12061206
}
12071207

1208-
let session_priv = SecretKey::from_slice(&self.secp_ctx, &{
1209-
let mut session_key = [0; 32];
1210-
rng::fill_bytes(&mut session_key);
1211-
session_key
1212-
}).expect("RNG is bad!");
1208+
let session_priv = self.keys_manager.get_session_key();
12131209

12141210
let cur_height = self.latest_block_height.load(Ordering::Acquire) as u32 + 1;
12151211

src/util/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub mod sha2;
2525
pub(crate) mod sha2;
2626

2727
#[cfg(feature = "fuzztarget")]
28-
pub use self::rng::reset_rng_state;
28+
pub use self::rng::{reset_rng_state, fill_bytes};
2929

3030
#[cfg(test)]
3131
pub(crate) mod test_utils;

0 commit comments

Comments
 (0)