Skip to content

Commit 75352c6

Browse files
keysinterface: adapt get_node_secret for phantom payments
We want LDK to be able to retrieve the phantom secret key when we see that a payment is destined for a phantom node.
1 parent 5b4d556 commit 75352c6

File tree

7 files changed

+44
-32
lines changed

7 files changed

+44
-32
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,8 @@ struct KeyProvider {
161161
impl KeysInterface for KeyProvider {
162162
type Signer = EnforcingSigner;
163163

164-
fn get_node_secret(&self) -> SecretKey {
165-
SecretKey::from_slice(&[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, 1, self.node_id]).unwrap()
164+
fn get_node_secret(&self, _recipient: Recipient) -> Result<SecretKey, ()> {
165+
Ok(SecretKey::from_slice(&[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, 1, self.node_id]).unwrap())
166166
}
167167

168168
fn get_inbound_payment_key_material(&self) -> KeyMaterial {
@@ -188,7 +188,7 @@ impl KeysInterface for KeyProvider {
188188
let id = self.rand_bytes_id.fetch_add(1, atomic::Ordering::Relaxed);
189189
let keys = InMemorySigner::new(
190190
&secp_ctx,
191-
self.get_node_secret(),
191+
self.get_node_secret(Recipient::Node).unwrap(),
192192
SecretKey::from_slice(&[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, 4, self.node_id]).unwrap(),
193193
SecretKey::from_slice(&[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, 5, self.node_id]).unwrap(),
194194
SecretKey::from_slice(&[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, self.node_id]).unwrap(),
@@ -212,7 +212,7 @@ impl KeysInterface for KeyProvider {
212212
fn read_chan_signer(&self, buffer: &[u8]) -> Result<Self::Signer, DecodeError> {
213213
let mut reader = std::io::Cursor::new(buffer);
214214

215-
let inner: InMemorySigner = ReadableArgs::read(&mut reader, self.get_node_secret())?;
215+
let inner: InMemorySigner = ReadableArgs::read(&mut reader, self.get_node_secret(Recipient::Node).unwrap())?;
216216
let state = self.make_enforcement_state_cell(inner.commitment_seed);
217217

218218
Ok(EnforcingSigner {

fuzz/src/full_stack.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,8 @@ struct KeyProvider {
265265
impl KeysInterface for KeyProvider {
266266
type Signer = EnforcingSigner;
267267

268-
fn get_node_secret(&self) -> SecretKey {
269-
self.node_secret.clone()
268+
fn get_node_secret(&self, _recipient: Recipient) -> Result<SecretKey, ()> {
269+
Ok(self.node_secret.clone())
270270
}
271271

272272
fn get_inbound_payment_key_material(&self) -> KeyMaterial {
@@ -390,7 +390,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
390390
best_block: BestBlock::from_genesis(network),
391391
};
392392
let channelmanager = Arc::new(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, params));
393-
let our_id = PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret());
393+
let our_id = PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret(Recipient::Node).unwrap());
394394
let network_graph = Arc::new(NetworkGraph::new(genesis_block(network).block_hash()));
395395
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(Arc::clone(&network_graph), None, Arc::clone(&logger)));
396396
let scorer = FixedPenaltyScorer::with_penalty(0);

lightning-background-processor/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ mod tests {
343343
use bitcoin::network::constants::Network;
344344
use lightning::chain::{BestBlock, Confirm, chainmonitor};
345345
use lightning::chain::channelmonitor::ANTI_REORG_DELAY;
346-
use lightning::chain::keysinterface::{InMemorySigner, KeysInterface, KeysManager};
346+
use lightning::chain::keysinterface::{InMemorySigner, Recipient, KeysInterface, KeysManager};
347347
use lightning::chain::transaction::OutPoint;
348348
use lightning::get_event_msg;
349349
use lightning::ln::channelmanager::{BREAKDOWN_TIMEOUT, ChainParameters, ChannelManager, SimpleArcChannelManager};
@@ -426,7 +426,7 @@ mod tests {
426426
let network_graph = Arc::new(NetworkGraph::new(genesis_block.header.block_hash()));
427427
let net_graph_msg_handler = Some(Arc::new(NetGraphMsgHandler::new(network_graph.clone(), Some(chain_source.clone()), logger.clone())));
428428
let msg_handler = MessageHandler { chan_handler: Arc::new(test_utils::TestChannelMessageHandler::new()), route_handler: Arc::new(test_utils::TestRoutingMessageHandler::new() )};
429-
let peer_manager = Arc::new(PeerManager::new(msg_handler, keys_manager.get_node_secret(), &seed, logger.clone(), IgnoringMessageHandler{}));
429+
let peer_manager = Arc::new(PeerManager::new(msg_handler, keys_manager.get_node_secret(Recipient::Node).unwrap(), &seed, logger.clone(), IgnoringMessageHandler{}));
430430
let node = Node { node: manager, net_graph_msg_handler, peer_manager, chain_monitor, persister, tx_broadcaster, network_graph, logger, best_block };
431431
nodes.push(node);
432432
}

lightning/src/chain/keysinterface.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -397,10 +397,11 @@ pub trait KeysInterface {
397397
/// A type which implements Sign which will be returned by get_channel_signer.
398398
type Signer : Sign;
399399

400-
/// Get node secret key (aka node_id or network_key).
400+
/// Get node secret key (aka node_id or network_key) based on the provided [`Recipient`].
401401
///
402-
/// This method must return the same value each time it is called.
403-
fn get_node_secret(&self) -> SecretKey;
402+
/// This method must return the same value each time it is called with a given `Recipient`
403+
/// parameter.
404+
fn get_node_secret(&self, recipient: Recipient) -> Result<SecretKey, ()>;
404405
/// Get a script pubkey which we send funds to when claiming on-chain contestable outputs.
405406
///
406407
/// This method should return a different value each time it is called, to avoid linking
@@ -1122,8 +1123,11 @@ impl KeysManager {
11221123
impl KeysInterface for KeysManager {
11231124
type Signer = InMemorySigner;
11241125

1125-
fn get_node_secret(&self) -> SecretKey {
1126-
self.node_secret.clone()
1126+
fn get_node_secret(&self, recipient: Recipient) -> Result<SecretKey, ()> {
1127+
match recipient {
1128+
Recipient::Node => Ok(self.node_secret.clone()),
1129+
Recipient::PhantomNode => Err(())
1130+
}
11271131
}
11281132

11291133
fn get_inbound_payment_key_material(&self) -> KeyMaterial {
@@ -1160,13 +1164,13 @@ impl KeysInterface for KeysManager {
11601164
}
11611165

11621166
fn read_chan_signer(&self, reader: &[u8]) -> Result<Self::Signer, DecodeError> {
1163-
InMemorySigner::read(&mut io::Cursor::new(reader), self.get_node_secret())
1167+
InMemorySigner::read(&mut io::Cursor::new(reader), self.node_secret.clone())
11641168
}
11651169

11661170
fn sign_invoice(&self, hrp_bytes: &[u8], invoice_data: &[u5], recipient: Recipient) -> Result<RecoverableSignature, ()> {
11671171
let preimage = construct_invoice_preimage(&hrp_bytes, &invoice_data);
11681172
let secret = match recipient {
1169-
Recipient::Node => self.get_node_secret(),
1173+
Recipient::Node => self.get_node_secret(Recipient::Node)?,
11701174
Recipient::PhantomNode => return Err(()),
11711175
};
11721176
Ok(self.secp_ctx.sign_recoverable(&hash_to_message!(&Sha256::hash(&preimage)), &secret))
@@ -1203,8 +1207,11 @@ pub struct PhantomKeysManager {
12031207
impl KeysInterface for PhantomKeysManager {
12041208
type Signer = InMemorySigner;
12051209

1206-
fn get_node_secret(&self) -> SecretKey {
1207-
self.inner.get_node_secret()
1210+
fn get_node_secret(&self, recipient: Recipient) -> Result<SecretKey, ()> {
1211+
match recipient {
1212+
Recipient::Node => self.inner.get_node_secret(Recipient::Node),
1213+
Recipient::PhantomNode => Ok(self.phantom_secret.clone()),
1214+
}
12081215
}
12091216

12101217
fn get_inbound_payment_key_material(&self) -> KeyMaterial {
@@ -1233,10 +1240,7 @@ impl KeysInterface for PhantomKeysManager {
12331240

12341241
fn sign_invoice(&self, hrp_bytes: &[u8], invoice_data: &[u5], recipient: Recipient) -> Result<RecoverableSignature, ()> {
12351242
let preimage = construct_invoice_preimage(&hrp_bytes, &invoice_data);
1236-
let secret = match recipient {
1237-
Recipient::Node => self.get_node_secret(),
1238-
Recipient::PhantomNode => self.phantom_secret.clone(),
1239-
};
1243+
let secret = self.get_node_secret(recipient)?;
12401244
Ok(self.inner.secp_ctx.sign_recoverable(&hash_to_message!(&Sha256::hash(&preimage)), &secret))
12411245
}
12421246
}

lightning/src/ln/channel.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6164,7 +6164,7 @@ mod tests {
61646164
impl KeysInterface for Keys {
61656165
type Signer = InMemorySigner;
61666166

6167-
fn get_node_secret(&self) -> SecretKey { panic!(); }
6167+
fn get_node_secret(&self, _recipient: Recipient) -> Result<SecretKey, ()> { panic!(); }
61686168
fn get_inbound_payment_key_material(&self) -> KeyMaterial { panic!(); }
61696169
fn get_destination_script(&self) -> Script {
61706170
let secp_ctx = Secp256k1::signing_only();

lightning/src/ln/channelmanager.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ use ln::msgs;
4848
use ln::msgs::NetAddress;
4949
use ln::onion_utils;
5050
use ln::msgs::{ChannelMessageHandler, DecodeError, LightningError, MAX_VALUE_MSAT, OptionalField};
51-
use chain::keysinterface::{Sign, KeysInterface, KeysManager, InMemorySigner};
51+
use chain::keysinterface::{Sign, KeysInterface, KeysManager, InMemorySigner, Recipient};
5252
use util::config::UserConfig;
5353
use util::events::{EventHandler, EventsProvider, MessageSendEvent, MessageSendEventsProvider, ClosureReason};
5454
use util::{byte_utils, events};
@@ -1679,8 +1679,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
16791679
pending_inbound_payments: Mutex::new(HashMap::new()),
16801680
pending_outbound_payments: Mutex::new(HashMap::new()),
16811681

1682-
our_network_key: keys_manager.get_node_secret(),
1683-
our_network_pubkey: PublicKey::from_secret_key(&secp_ctx, &keys_manager.get_node_secret()),
1682+
our_network_key: keys_manager.get_node_secret(Recipient::Node).unwrap(),
1683+
our_network_pubkey: PublicKey::from_secret_key(&secp_ctx, &keys_manager.get_node_secret(Recipient::Node).unwrap()),
16841684
secp_ctx,
16851685

16861686
inbound_payment_key: expanded_inbound_key,
@@ -6534,7 +6534,11 @@ impl<'a, Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
65346534
pending_events_read.append(&mut channel_closures);
65356535
}
65366536

6537-
let our_network_pubkey = PublicKey::from_secret_key(&secp_ctx, &args.keys_manager.get_node_secret());
6537+
let our_network_key = match args.keys_manager.get_node_secret(Recipient::Node) {
6538+
Ok(key) => key,
6539+
Err(()) => return Err(DecodeError::InvalidValue)
6540+
};
6541+
let our_network_pubkey = PublicKey::from_secret_key(&secp_ctx, &our_network_key);
65386542
if let Some(network_pubkey) = received_network_pubkey {
65396543
if network_pubkey != our_network_pubkey {
65406544
log_error!(args.logger, "Key that was generated does not match the existing key.");
@@ -6563,7 +6567,7 @@ impl<'a, Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
65636567
pending_inbound_payments: Mutex::new(pending_inbound_payments),
65646568
pending_outbound_payments: Mutex::new(pending_outbound_payments.unwrap()),
65656569

6566-
our_network_key: args.keys_manager.get_node_secret(),
6570+
our_network_key,
65676571
our_network_pubkey,
65686572
secp_ctx,
65696573

lightning/src/util/test_utils.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ pub struct OnlyReadsKeysInterface {}
7070
impl keysinterface::KeysInterface for OnlyReadsKeysInterface {
7171
type Signer = EnforcingSigner;
7272

73-
fn get_node_secret(&self) -> SecretKey { unreachable!(); }
73+
fn get_node_secret(&self, _recipient: Recipient) -> Result<SecretKey, ()> { unreachable!(); }
7474
fn get_inbound_payment_key_material(&self) -> KeyMaterial { unreachable!(); }
7575
fn get_destination_script(&self) -> Script { unreachable!(); }
7676
fn get_shutdown_scriptpubkey(&self) -> ShutdownScript { unreachable!(); }
@@ -481,8 +481,12 @@ pub struct TestKeysInterface {
481481
impl keysinterface::KeysInterface for TestKeysInterface {
482482
type Signer = EnforcingSigner;
483483

484-
fn get_node_secret(&self) -> SecretKey { self.backing.get_node_secret() }
485-
fn get_inbound_payment_key_material(&self) -> keysinterface::KeyMaterial { self.backing.get_inbound_payment_key_material() }
484+
fn get_node_secret(&self, recipient: Recipient) -> Result<SecretKey, ()> {
485+
self.backing.get_node_secret(recipient)
486+
}
487+
fn get_inbound_payment_key_material(&self) -> keysinterface::KeyMaterial {
488+
self.backing.get_inbound_payment_key_material()
489+
}
486490
fn get_destination_script(&self) -> Script { self.backing.get_destination_script() }
487491

488492
fn get_shutdown_scriptpubkey(&self) -> ShutdownScript {
@@ -519,7 +523,7 @@ impl keysinterface::KeysInterface for TestKeysInterface {
519523
fn read_chan_signer(&self, buffer: &[u8]) -> Result<Self::Signer, msgs::DecodeError> {
520524
let mut reader = io::Cursor::new(buffer);
521525

522-
let inner: InMemorySigner = ReadableArgs::read(&mut reader, self.get_node_secret())?;
526+
let inner: InMemorySigner = ReadableArgs::read(&mut reader, self.get_node_secret(Recipient::Node).unwrap())?;
523527
let state = self.make_enforcement_state_cell(inner.commitment_seed);
524528

525529
Ok(EnforcingSigner::new_with_revoked(

0 commit comments

Comments
 (0)