Skip to content

Commit a918567

Browse files
committed
Use chacha20 - Mutex approach
1 parent 34fa5af commit a918567

File tree

1 file changed

+12
-19
lines changed

1 file changed

+12
-19
lines changed

lightning/src/chain/keysinterface.rs

+12-19
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ use bitcoin::util::sighash;
2121

2222
use bitcoin::bech32::u5;
2323
use bitcoin::hashes::{Hash, HashEngine};
24-
use bitcoin::hashes::sha256::HashEngine as Sha256State;
2524
use bitcoin::hashes::sha256::Hash as Sha256;
2625
use bitcoin::hashes::sha256d::Hash as Sha256dHash;
2726
use bitcoin::hash_types::WPubkeyHash;
@@ -47,8 +46,10 @@ use crate::ln::script::ShutdownScript;
4746
use crate::prelude::*;
4847
use core::convert::TryInto;
4948
use core::sync::atomic::{AtomicUsize, Ordering};
49+
use crate::sync::Mutex;
5050
use crate::io::{self, Error};
5151
use crate::ln::msgs::{DecodeError, MAX_VALUE_MSAT};
52+
use crate::util::chacha20::ChaCha20;
5253
use crate::util::invoice::construct_invoice_preimage;
5354

5455
/// Used as initial key material, to be expanded into multiple secret keys (but not to be used
@@ -979,9 +980,7 @@ pub struct KeysManager {
979980
channel_master_key: ExtendedPrivKey,
980981
channel_child_index: AtomicUsize,
981982

982-
rand_bytes_master_key: ExtendedPrivKey,
983-
rand_bytes_child_index: AtomicUsize,
984-
rand_bytes_unique_start: Sha256State,
983+
chacha: Mutex<ChaCha20>,
985984

986985
seed: [u8; 32],
987986
starting_time_secs: u64,
@@ -1027,15 +1026,14 @@ impl KeysManager {
10271026
Err(_) => panic!("Your RNG is busted"),
10281027
};
10291028
let channel_master_key = master_key.ckd_priv(&secp_ctx, ChildNumber::from_hardened_idx(3).unwrap()).expect("Your RNG is busted");
1030-
let rand_bytes_master_key = master_key.ckd_priv(&secp_ctx, ChildNumber::from_hardened_idx(4).unwrap()).expect("Your RNG is busted");
10311029
let inbound_payment_key: SecretKey = master_key.ckd_priv(&secp_ctx, ChildNumber::from_hardened_idx(5).unwrap()).expect("Your RNG is busted").private_key;
10321030
let mut inbound_pmt_key_bytes = [0; 32];
10331031
inbound_pmt_key_bytes.copy_from_slice(&inbound_payment_key[..]);
10341032

1035-
let mut rand_bytes_unique_start = Sha256::engine();
1036-
rand_bytes_unique_start.input(&starting_time_secs.to_be_bytes());
1037-
rand_bytes_unique_start.input(&starting_time_nanos.to_be_bytes());
1038-
rand_bytes_unique_start.input(seed);
1033+
let mut nonce = [0u8; 12];
1034+
nonce[..8].copy_from_slice(&starting_time_secs.to_be_bytes());
1035+
nonce[8..12].copy_from_slice(&starting_time_nanos.to_be_bytes());
1036+
let chacha = Mutex::new(ChaCha20::new(seed, &nonce));
10391037

10401038
let mut res = KeysManager {
10411039
secp_ctx,
@@ -1049,9 +1047,7 @@ impl KeysManager {
10491047
channel_master_key,
10501048
channel_child_index: AtomicUsize::new(0),
10511049

1052-
rand_bytes_master_key,
1053-
rand_bytes_child_index: AtomicUsize::new(0),
1054-
rand_bytes_unique_start,
1050+
chacha,
10551051

10561052
seed: *seed,
10571053
starting_time_secs,
@@ -1248,14 +1244,11 @@ impl KeysManager {
12481244

12491245
impl EntropySource for KeysManager {
12501246
fn get_secure_random_bytes(&self) -> [u8; 32] {
1251-
let mut sha = self.rand_bytes_unique_start.clone();
1247+
let mut chacha = self.chacha.lock().unwrap();
12521248

1253-
let child_ix = self.rand_bytes_child_index.fetch_add(1, Ordering::AcqRel);
1254-
let child_privkey = self.rand_bytes_master_key.ckd_priv(&self.secp_ctx, ChildNumber::from_hardened_idx(child_ix as u32).expect("key space exhausted")).expect("Your RNG is busted");
1255-
sha.input(&child_privkey.private_key[..]);
1256-
1257-
sha.input(b"Unique Secure Random Bytes Salt");
1258-
Sha256::from_engine(sha).into_inner()
1249+
let mut random_bytes = [0u8; 32];
1250+
chacha.process_in_place(&mut random_bytes);
1251+
random_bytes
12591252
}
12601253
}
12611254

0 commit comments

Comments
 (0)