Skip to content

Commit 2c5bd1c

Browse files
committed
Implement EntropySource for InMemorySigner
This allows the `InMemorySigner` to produce its own randomness, which we plan to use when generating signatures in future work. We can no longer derive `Clone` due to the `AtomicCounter`, so we opt to implement it manually.
1 parent 8d50c91 commit 2c5bd1c

File tree

6 files changed

+55
-10
lines changed

6 files changed

+55
-10
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ impl SignerProvider for KeyProvider {
240240
[id, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, self.node_secret[31]],
241241
channel_value_satoshis,
242242
channel_keys_id,
243+
channel_keys_id,
243244
);
244245
let revoked_commitment = self.make_enforcement_state_cell(keys.commitment_seed);
245246
EnforcingSigner::new_with_revoked(keys, revoked_commitment, false)
@@ -248,7 +249,7 @@ impl SignerProvider for KeyProvider {
248249
fn read_chan_signer(&self, buffer: &[u8]) -> Result<Self::Signer, DecodeError> {
249250
let mut reader = std::io::Cursor::new(buffer);
250251

251-
let inner: InMemorySigner = Readable::read(&mut reader)?;
252+
let inner: InMemorySigner = ReadableArgs::read(&mut reader, self)?;
252253
let state = self.make_enforcement_state_cell(inner.commitment_seed);
253254

254255
Ok(EnforcingSigner {

fuzz/src/full_stack.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ use lightning::util::config::UserConfig;
4848
use lightning::util::errors::APIError;
4949
use lightning::util::enforcing_trait_impls::{EnforcingSigner, EnforcementState};
5050
use lightning::util::logger::Logger;
51-
use lightning::util::ser::{Readable, Writeable};
51+
use lightning::util::ser::{Readable, ReadableArgs, Writeable};
5252

5353
use crate::utils::test_logger;
5454
use crate::utils::test_persister::TestPersister;
@@ -347,6 +347,7 @@ impl SignerProvider for KeyProvider {
347347
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, ctr],
348348
channel_value_satoshis,
349349
channel_keys_id,
350+
channel_keys_id,
350351
)
351352
} else {
352353
InMemorySigner::new(
@@ -359,12 +360,13 @@ impl SignerProvider for KeyProvider {
359360
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, ctr],
360361
channel_value_satoshis,
361362
channel_keys_id,
363+
channel_keys_id,
362364
)
363365
}, state, false)
364366
}
365367

366368
fn read_chan_signer(&self, mut data: &[u8]) -> Result<EnforcingSigner, DecodeError> {
367-
let inner: InMemorySigner = Readable::read(&mut data)?;
369+
let inner: InMemorySigner = ReadableArgs::read(&mut data, self)?;
368370
let state = Arc::new(Mutex::new(EnforcementState::new()));
369371

370372
Ok(EnforcingSigner::new_with_revoked(

lightning/src/chain/channelmonitor.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4235,6 +4235,7 @@ mod tests {
42354235
[41; 32],
42364236
0,
42374237
[0; 32],
4238+
[0; 32],
42384239
);
42394240

42404241
let counterparty_pubkeys = ChannelPublicKeys {

lightning/src/chain/keysinterface.rs

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use bitcoin::{PackedLockTime, secp256k1, Sequence, Witness};
3333

3434
use crate::util::transaction_utils;
3535
use crate::util::crypto::{hkdf_extract_expand_twice, sign};
36-
use crate::util::ser::{Writeable, Writer, Readable};
36+
use crate::util::ser::{Writeable, Writer, Readable, ReadableArgs};
3737
use crate::chain::transaction::OutPoint;
3838
#[cfg(anchors)]
3939
use crate::events::bump_transaction::HTLCDescriptor;
@@ -45,6 +45,7 @@ use crate::ln::script::ShutdownScript;
4545

4646
use crate::prelude::*;
4747
use core::convert::TryInto;
48+
use core::ops::Deref;
4849
use core::sync::atomic::{AtomicUsize, Ordering};
4950
use crate::io::{self, Error};
5051
use crate::ln::msgs::{DecodeError, MAX_VALUE_MSAT};
@@ -553,7 +554,6 @@ pub trait SignerProvider {
553554
fn get_shutdown_scriptpubkey(&self) -> ShutdownScript;
554555
}
555556

556-
#[derive(Clone)]
557557
/// A simple implementation of [`WriteableEcdsaChannelSigner`] that just keeps the private keys in memory.
558558
///
559559
/// This implementation performs no policy checks and is insufficient by itself as
@@ -580,6 +580,30 @@ pub struct InMemorySigner {
580580
channel_value_satoshis: u64,
581581
/// Key derivation parameters.
582582
channel_keys_id: [u8; 32],
583+
/// Seed from which all randomness produced is derived from.
584+
rand_bytes_unique_start: [u8; 32],
585+
/// Tracks the number of times we've produced randomness to ensure we don't return the same
586+
/// bytes twice.
587+
rand_bytes_index: AtomicCounter,
588+
}
589+
590+
impl Clone for InMemorySigner {
591+
fn clone(&self) -> Self {
592+
Self {
593+
funding_key: self.funding_key.clone(),
594+
revocation_base_key: self.revocation_base_key.clone(),
595+
payment_key: self.payment_key.clone(),
596+
delayed_payment_base_key: self.delayed_payment_base_key.clone(),
597+
htlc_base_key: self.htlc_base_key.clone(),
598+
commitment_seed: self.commitment_seed.clone(),
599+
holder_channel_pubkeys: self.holder_channel_pubkeys.clone(),
600+
channel_parameters: self.channel_parameters.clone(),
601+
channel_value_satoshis: self.channel_value_satoshis,
602+
channel_keys_id: self.channel_keys_id,
603+
rand_bytes_unique_start: self.get_secure_random_bytes(),
604+
rand_bytes_index: AtomicCounter::new(),
605+
}
606+
}
583607
}
584608

585609
impl InMemorySigner {
@@ -594,6 +618,7 @@ impl InMemorySigner {
594618
commitment_seed: [u8; 32],
595619
channel_value_satoshis: u64,
596620
channel_keys_id: [u8; 32],
621+
rand_bytes_unique_start: [u8; 32],
597622
) -> InMemorySigner {
598623
let holder_channel_pubkeys =
599624
InMemorySigner::make_holder_keys(secp_ctx, &funding_key, &revocation_base_key,
@@ -610,6 +635,8 @@ impl InMemorySigner {
610635
holder_channel_pubkeys,
611636
channel_parameters: None,
612637
channel_keys_id,
638+
rand_bytes_unique_start,
639+
rand_bytes_index: AtomicCounter::new(),
613640
}
614641
}
615642

@@ -736,6 +763,15 @@ impl InMemorySigner {
736763
}
737764
}
738765

766+
impl EntropySource for InMemorySigner {
767+
fn get_secure_random_bytes(&self) -> [u8; 32] {
768+
let index = self.rand_bytes_index.get_increment();
769+
let mut nonce = [0u8; 16];
770+
nonce[..8].copy_from_slice(&index.to_be_bytes());
771+
ChaCha20::get_single_block(&self.rand_bytes_unique_start, &nonce)
772+
}
773+
}
774+
739775
impl ChannelSigner for InMemorySigner {
740776
fn get_per_commitment_point(&self, idx: u64, secp_ctx: &Secp256k1<secp256k1::All>) -> PublicKey {
741777
let commitment_secret = SecretKey::from_slice(&chan_utils::build_commitment_secret(&self.commitment_seed, idx)).unwrap();
@@ -922,8 +958,8 @@ impl Writeable for InMemorySigner {
922958
}
923959
}
924960

925-
impl Readable for InMemorySigner {
926-
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
961+
impl<ES: Deref> ReadableArgs<ES> for InMemorySigner where ES::Target: EntropySource {
962+
fn read<R: io::Read>(reader: &mut R, entropy_source: ES) -> Result<Self, DecodeError> {
927963
let _ver = read_ver_prefix!(reader, SERIALIZATION_VERSION);
928964

929965
let funding_key = Readable::read(reader)?;
@@ -953,6 +989,8 @@ impl Readable for InMemorySigner {
953989
holder_channel_pubkeys,
954990
channel_parameters: counterparty_channel_data,
955991
channel_keys_id: keys_id,
992+
rand_bytes_unique_start: entropy_source.get_secure_random_bytes(),
993+
rand_bytes_index: AtomicCounter::new(),
956994
})
957995
}
958996
}
@@ -1107,6 +1145,7 @@ impl KeysManager {
11071145
let payment_key = key_step!(b"payment key", revocation_base_key);
11081146
let delayed_payment_base_key = key_step!(b"delayed payment base key", payment_key);
11091147
let htlc_base_key = key_step!(b"HTLC base key", delayed_payment_base_key);
1148+
let prng_seed = self.get_secure_random_bytes();
11101149

11111150
InMemorySigner::new(
11121151
&self.secp_ctx,
@@ -1118,6 +1157,7 @@ impl KeysManager {
11181157
commitment_seed,
11191158
channel_value_satoshis,
11201159
params.clone(),
1160+
prng_seed,
11211161
)
11221162
}
11231163

@@ -1323,7 +1363,7 @@ impl SignerProvider for KeysManager {
13231363
}
13241364

13251365
fn read_chan_signer(&self, reader: &[u8]) -> Result<Self::Signer, DecodeError> {
1326-
InMemorySigner::read(&mut io::Cursor::new(reader))
1366+
InMemorySigner::read(&mut io::Cursor::new(reader), self)
13271367
}
13281368

13291369
fn get_destination_script(&self) -> Script {

lightning/src/ln/channel.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7549,6 +7549,7 @@ mod tests {
75497549
[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff],
75507550
10_000_000,
75517551
[0; 32],
7552+
[0; 32],
75527553
);
75537554

75547555
assert_eq!(signer.pubkeys().funding_pubkey.serialize()[..],

lightning/src/util/test_utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ impl SignerProvider for OnlyReadsKeysInterface {
161161
fn derive_channel_signer(&self, _channel_value_satoshis: u64, _channel_keys_id: [u8; 32]) -> Self::Signer { unreachable!(); }
162162

163163
fn read_chan_signer(&self, mut reader: &[u8]) -> Result<Self::Signer, msgs::DecodeError> {
164-
let inner: InMemorySigner = Readable::read(&mut reader)?;
164+
let inner: InMemorySigner = ReadableArgs::read(&mut reader, self)?;
165165
let state = Arc::new(Mutex::new(EnforcementState::new()));
166166

167167
Ok(EnforcingSigner::new_with_revoked(
@@ -783,7 +783,7 @@ impl SignerProvider for TestKeysInterface {
783783
fn read_chan_signer(&self, buffer: &[u8]) -> Result<Self::Signer, msgs::DecodeError> {
784784
let mut reader = io::Cursor::new(buffer);
785785

786-
let inner: InMemorySigner = Readable::read(&mut reader)?;
786+
let inner: InMemorySigner = ReadableArgs::read(&mut reader, self)?;
787787
let state = self.make_enforcement_state_cell(inner.commitment_seed);
788788

789789
Ok(EnforcingSigner::new_with_revoked(

0 commit comments

Comments
 (0)