From: Yuntai Kyong Date: Mon, 26 Nov 2018 11:10:01 +0000 (+0900) Subject: Add a method to get session secret for onion packet to KeysInterface X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=948696ee0774351ecc621b5679b0dddf4215e241;p=rust-lightning Add a method to get session secret for onion packet to KeysInterface --- diff --git a/src/chain/keysinterface.rs b/src/chain/keysinterface.rs index 8e71625df..164e831b7 100644 --- a/src/chain/keysinterface.rs +++ b/src/chain/keysinterface.rs @@ -79,6 +79,8 @@ pub trait KeysInterface: Send + Sync { /// Get a new set of ChannelKeys for per-channel secrets. These MUST be unique even if you /// restarted with some stale data! fn get_channel_keys(&self, inbound: bool) -> ChannelKeys; + /// Get a secret for construting an onion packet + fn get_session_key(&self) -> SecretKey; } /// Set of lightning keys needed to operate a channel as described in BOLT 3 @@ -158,6 +160,8 @@ pub struct KeysManager { shutdown_pubkey: PublicKey, channel_master_key: ExtendedPrivKey, channel_child_index: AtomicUsize, + session_master_key: ExtendedPrivKey, + session_child_index: AtomicUsize, logger: Arc, } @@ -184,6 +188,7 @@ impl KeysManager { Err(_) => panic!("Your RNG is busted"), }; let channel_master_key = master_key.ckd_priv(&secp_ctx, ChildNumber::from_hardened_idx(3)).expect("Your RNG is busted"); + let session_master_key = master_key.ckd_priv(&secp_ctx, ChildNumber::from_hardened_idx(4)).expect("Your RNG is busted"); KeysManager { secp_ctx, node_secret, @@ -191,6 +196,8 @@ impl KeysManager { shutdown_pubkey, channel_master_key, channel_child_index: AtomicUsize::new(0), + session_master_key, + session_child_index: AtomicUsize::new(0), logger, } @@ -235,4 +242,9 @@ impl KeysInterface for KeysManager { sha.result(&mut seed); ChannelKeys::new_from_seed(&seed) } + + fn get_session_key(&self) -> SecretKey { + let child_ix = self.session_child_index.fetch_add(1, Ordering::AcqRel); + self.session_master_key.ckd_priv(&self.secp_ctx, ChildNumber::from_hardened_idx(child_ix as u32)).expect("Your RNG is busted").secret_key + } } diff --git a/src/ln/channel.rs b/src/ln/channel.rs index e0fdcaf90..4fcebe25d 100644 --- a/src/ln/channel.rs +++ b/src/ln/channel.rs @@ -3902,6 +3902,7 @@ mod tests { } fn get_channel_keys(&self, _inbound: bool) -> ChannelKeys { self.chan_keys.clone() } + fn get_session_key(&self) -> SecretKey { panic!(); } } #[test] diff --git a/src/ln/channelmanager.rs b/src/ln/channelmanager.rs index 6933198c6..ac4fa819f 100644 --- a/src/ln/channelmanager.rs +++ b/src/ln/channelmanager.rs @@ -1199,11 +1199,7 @@ impl ChannelManager { } } - let session_priv = SecretKey::from_slice(&self.secp_ctx, &{ - let mut session_key = [0; 32]; - rng::fill_bytes(&mut session_key); - session_key - }).expect("RNG is bad!"); + let session_priv = self.keys_manager.get_session_key(); let cur_height = self.latest_block_height.load(Ordering::Acquire) as u32 + 1;