Skip to content

Commit ca183cf

Browse files
committed
Add a method to get session secret for onion packet to KeysInterface
1 parent 6969fc9 commit ca183cf

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
@@ -3902,6 +3902,7 @@ mod tests {
39023902
}
39033903

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

39073908
#[test]

src/ln/channelmanager.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,11 +1199,7 @@ impl ChannelManager {
11991199
}
12001200
}
12011201

1202-
let session_priv = SecretKey::from_slice(&self.secp_ctx, &{
1203-
let mut session_key = [0; 32];
1204-
rng::fill_bytes(&mut session_key);
1205-
session_key
1206-
}).expect("RNG is bad!");
1202+
let session_priv = self.keys_manager.get_session_key();
12071203

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

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)