Skip to content

Commit 17860ac

Browse files
committed
Use chacha20 in get_secure_random_bytes()
1 parent 3266726 commit 17860ac

File tree

1 file changed

+11
-19
lines changed

1 file changed

+11
-19
lines changed

lightning/src/chain/keysinterface.rs

+11-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;
@@ -49,6 +48,7 @@ use core::convert::TryInto;
4948
use core::sync::atomic::{AtomicUsize, Ordering};
5049
use crate::io::{self, Error};
5150
use crate::ln::msgs::{DecodeError, MAX_VALUE_MSAT};
51+
use crate::util::chacha20::ChaCha20;
5252
use crate::util::invoice::construct_invoice_preimage;
5353

5454
/// Used as initial key material, to be expanded into multiple secret keys (but not to be used
@@ -979,9 +979,8 @@ pub struct KeysManager {
979979
channel_master_key: ExtendedPrivKey,
980980
channel_child_index: AtomicUsize,
981981

982-
rand_bytes_master_key: ExtendedPrivKey,
983-
rand_bytes_child_index: AtomicUsize,
984-
rand_bytes_unique_start: Sha256State,
982+
rand_bytes_unique_start: [u8; 32],
983+
rand_bytes_index: AtomicUsize,
985984

986985
seed: [u8; 32],
987986
starting_time_secs: u64,
@@ -1027,15 +1026,13 @@ 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 rand_bytes_unique_start = [0u8; 32];
1034+
rand_bytes_unique_start[..8].copy_from_slice(&starting_time_secs.to_be_bytes());
1035+
rand_bytes_unique_start[8..12].copy_from_slice(&starting_time_nanos.to_be_bytes());
10391036

10401037
let mut res = KeysManager {
10411038
secp_ctx,
@@ -1049,9 +1046,8 @@ impl KeysManager {
10491046
channel_master_key,
10501047
channel_child_index: AtomicUsize::new(0),
10511048

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

10561052
seed: *seed,
10571053
starting_time_secs,
@@ -1248,14 +1244,10 @@ 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();
1252-
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()
1247+
let index = self.rand_bytes_index.fetch_add(1, Ordering::AcqRel);
1248+
let mut nonce = [0u8; 16];
1249+
nonce[..8].copy_from_slice(&index.to_be_bytes());
1250+
ChaCha20::get_single_block(&self.rand_bytes_unique_start, &nonce)
12591251
}
12601252
}
12611253

0 commit comments

Comments
 (0)