Skip to content

Commit 4aa662b

Browse files
committed
Allow KeysInterface to re-derive previously generated signers
With this change, we'll be able to re-derive signers rather than persist them. There's no point in storing data that can be easily re-derived.
1 parent a4c4301 commit 4aa662b

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

lightning/src/chain/keysinterface.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,12 @@ pub trait KeysInterface {
450450
///
451451
/// This method must return a different value each time it is called.
452452
fn get_channel_signer(&self, inbound: bool, channel_value_satoshis: u64) -> Self::Signer;
453+
/// Re-derives a `Signer` previously generated by [`get_channel_signer`]. A `Signer`'s
454+
/// `channel_keys_id` can be obtained through it's trait method [`BaseSign::channel_keys_id`].
455+
///
456+
/// [`get_channel_signer`]: KeysInterface::get_channel_signer
457+
/// [`BaseSign::channel_keys_id`]: BaseSign::channel_keys_id
458+
fn derive_channel_signer(&self, channel_value_satoshis: u64, channel_keys_id: [u8; 32]) -> Self::Signer;
453459
/// Gets a unique, cryptographically-secure, random 32 byte value. This is used for encrypting
454460
/// onion packets and for temporary channel IDs. There is no requirement that these be
455461
/// persisted anywhere, though they must be unique across restarts.
@@ -1217,6 +1223,10 @@ impl KeysInterface for KeysManager {
12171223
self.derive_channel_keys(channel_value_satoshis, &id)
12181224
}
12191225

1226+
fn derive_channel_signer(&self, channel_value_satoshis: u64, channel_keys_id: [u8; 32]) -> Self::Signer {
1227+
self.derive_channel_keys(channel_value_satoshis, &channel_keys_id)
1228+
}
1229+
12201230
fn get_secure_random_bytes(&self) -> [u8; 32] {
12211231
let mut sha = self.rand_bytes_unique_start.clone();
12221232

@@ -1311,6 +1321,10 @@ impl KeysInterface for PhantomKeysManager {
13111321
self.inner.get_channel_signer(inbound, channel_value_satoshis)
13121322
}
13131323

1324+
fn derive_channel_signer(&self, channel_value_satoshis: u64, channel_keys_id: [u8; 32]) -> Self::Signer {
1325+
self.inner.derive_channel_keys(channel_value_satoshis, &channel_keys_id)
1326+
}
1327+
13141328
fn get_secure_random_bytes(&self) -> [u8; 32] {
13151329
self.inner.get_secure_random_bytes()
13161330
}

lightning/src/ln/channel.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6835,6 +6835,9 @@ mod tests {
68356835
fn get_channel_signer(&self, _inbound: bool, _channel_value_satoshis: u64) -> InMemorySigner {
68366836
self.signer.clone()
68376837
}
6838+
fn derive_channel_signer(&self, _channel_value_satoshis: u64, _channel_keys_id: [u8; 32]) -> Self::Signer {
6839+
self.signer.clone()
6840+
}
68386841
fn get_secure_random_bytes(&self) -> [u8; 32] { [0; 32] }
68396842
fn read_chan_signer(&self, _data: &[u8]) -> Result<Self::Signer, DecodeError> { panic!(); }
68406843
fn sign_invoice(&self, _hrp_bytes: &[u8], _invoice_data: &[u5], _recipient: Recipient) -> Result<RecoverableSignature, ()> { panic!(); }

lightning/src/util/test_utils.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ impl keysinterface::KeysInterface for OnlyReadsKeysInterface {
8181
fn get_destination_script(&self) -> Script { unreachable!(); }
8282
fn get_shutdown_scriptpubkey(&self) -> ShutdownScript { unreachable!(); }
8383
fn get_channel_signer(&self, _inbound: bool, _channel_value_satoshis: u64) -> EnforcingSigner { unreachable!(); }
84+
fn derive_channel_signer(&self, _channel_value_satoshis: u64, _channel_keys_id: [u8; 32]) -> Self::Signer { unreachable!(); }
8485
fn get_secure_random_bytes(&self) -> [u8; 32] { [0; 32] }
8586

8687
fn read_chan_signer(&self, mut reader: &[u8]) -> Result<Self::Signer, msgs::DecodeError> {
@@ -635,6 +636,12 @@ impl keysinterface::KeysInterface for TestKeysInterface {
635636
EnforcingSigner::new_with_revoked(keys, state, self.disable_revocation_policy_check)
636637
}
637638

639+
fn derive_channel_signer(&self, channel_value_satoshis: u64, channel_keys_id: [u8; 32]) -> EnforcingSigner {
640+
let keys = self.backing.derive_channel_keys(channel_value_satoshis, &channel_keys_id);
641+
let state = self.make_enforcement_state_cell(keys.commitment_seed);
642+
EnforcingSigner::new_with_revoked(keys, state, self.disable_revocation_policy_check)
643+
}
644+
638645
fn get_secure_random_bytes(&self) -> [u8; 32] {
639646
let override_random_bytes = self.override_random_bytes.lock().unwrap();
640647
if let Some(bytes) = &*override_random_bytes {

0 commit comments

Comments
 (0)