1#![allow(missing_docs)]
2
3use bitcoin::bip32::DerivationPath;
4use bitcoin::hashes::Hash;
5use bitcoin::io::Error as IOError;
6use bitcoin::secp256k1::ecdh::SharedSecret;
7use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
8use bitcoin::secp256k1::{All, PublicKey, Scalar, Secp256k1, SecretKey};
9use bitcoin::{ScriptBuf, Transaction, TxOut, Txid, WPubkeyHash};
10use lightning::ln::chan_utils;
11use lightning::ln::chan_utils::{
12 ChannelPublicKeys, ChannelTransactionParameters, ClosingTransaction, CommitmentTransaction,
13 HTLCOutputInCommitment, HolderCommitmentTransaction,
14};
15use lightning::ln::channel_keys::{DelayedPaymentKey, RevocationKey};
16use lightning::ln::msgs::{UnsignedChannelAnnouncement, UnsignedGossipMessage};
17use lightning::ln::script::ShutdownScript;
18use lightning::types::features::ChannelTypeFeatures;
19use lightning::types::payment::PaymentPreimage;
20
21use super::crypto_utils;
22use crate::channel::{ChannelBase, ChannelId, ChannelSetup, CommitmentType};
23use crate::invoice::Invoice;
24use crate::node::Node;
25use crate::prelude::*;
26use crate::signer::multi_signer::MultiSigner;
27use crate::tx::tx::{CommitmentInfo2, HTLCInfo2};
28use crate::util::crypto_utils::derive_public_key;
29use crate::util::status::Status;
30use crate::util::INITIAL_COMMITMENT_NUMBER;
31use crate::Arc;
32use lightning::ln::inbound_payment::ExpandedKey;
33use lightning::sign::ecdsa::EcdsaChannelSigner;
34use lightning::sign::HTLCDescriptor;
35use lightning::sign::{
36 ChannelSigner, EntropySource, NodeSigner, PeerStorageKey, ReceiveAuthKey, Recipient,
37 SignerProvider, SpendableOutputDescriptor,
38};
39use lightning::util::ser::{Writeable, Writer};
40use lightning_invoice::RawBolt11Invoice;
41use log::{debug, error, info};
42use vls_common::to_derivation_path;
43
44pub struct LoopbackSignerKeysInterface {
46 pub node_id: PublicKey,
47 pub signer: Arc<MultiSigner>,
48}
49
50impl LoopbackSignerKeysInterface {
51 pub fn get_node(&self) -> Arc<Node> {
52 self.signer.get_node(&self.node_id).expect("our node is missing")
53 }
54
55 pub fn add_invoice(&self, invoice: Invoice) {
56 self.get_node().add_invoice(invoice).expect("could not add invoice");
57 }
58
59 pub fn spend_spendable_outputs(
60 &self,
61 descriptors: &[&SpendableOutputDescriptor],
62 outputs: Vec<TxOut>,
63 change_destination_script: ScriptBuf,
64 feerate_sat_per_1000_weight: u32,
65 ) -> Result<Transaction, ()> {
66 self.get_node().spend_spendable_outputs(
67 descriptors,
68 outputs,
69 change_destination_script,
70 feerate_sat_per_1000_weight,
71 )
72 }
73
74 fn get_node_secret(&self, recipient: Recipient) -> Result<SecretKey, ()> {
75 match recipient {
76 Recipient::Node => Ok(self.get_node().get_node_secret()),
77 Recipient::PhantomNode => Err(()),
78 }
79 }
80}
81
82struct LoopbackSetupState {
88 done: bool,
89 deferred_validate: Option<(HolderCommitmentTransaction, Vec<PaymentPreimage>)>,
90}
91
92#[derive(Clone)]
93pub struct LoopbackChannelSigner {
94 pub node_id: PublicKey,
95 pub channel_id: ChannelId,
96 pub signer: Arc<MultiSigner>,
97 pub pubkeys: ChannelPublicKeys,
98 pub channel_value_sat: u64,
99 setup_state: Arc<Mutex<LoopbackSetupState>>,
100}
101
102impl LoopbackChannelSigner {
103 fn new(
104 node_id: &PublicKey,
105 channel_id: &ChannelId,
106 signer: Arc<MultiSigner>,
107 channel_value_sat: u64,
108 ) -> LoopbackChannelSigner {
109 info!("new channel {:?} {:?}", node_id, channel_id);
110 let pubkeys = signer
111 .with_channel_base(&node_id, &channel_id, |base| Ok(base.get_channel_basepoints()))
112 .map_err(|s| {
113 error!("bad status {:?} on channel {}", s, channel_id);
114 ()
115 })
116 .expect("must be able to get basepoints");
117 LoopbackChannelSigner {
118 node_id: *node_id,
119 channel_id: channel_id.clone(),
120 signer: signer.clone(),
121 pubkeys,
122 channel_value_sat,
123 setup_state: Arc::new(Mutex::new(LoopbackSetupState {
124 done: false,
125 deferred_validate: None,
126 })),
127 }
128 }
129
130 fn ensure_setup(&self, parameters: &ChannelTransactionParameters) -> Result<(), ()> {
134 let mut state = self.setup_state.lock().unwrap();
135 if state.done {
136 return Ok(());
137 }
138
139 let already_setup = self
141 .signer
142 .with_channel_base(&self.node_id, &self.channel_id, |base| Ok(base.is_ready()))
143 .unwrap_or(false);
144 if !already_setup {
145 let funding_outpoint = parameters.funding_outpoint.ok_or(())?.into_bitcoin_outpoint();
146 let counterparty_parameters = parameters.counterparty_parameters.as_ref().ok_or(())?;
147 let features = ¶meters.channel_type_features;
149 let commitment_type = if features.supports_anchors_zero_fee_htlc_tx() {
150 CommitmentType::AnchorsZeroFeeHtlc
151 } else if features.supports_anchors_nonzero_fee_htlc_tx() {
152 CommitmentType::Anchors
153 } else {
154 CommitmentType::StaticRemoteKey
155 };
156 let setup = ChannelSetup {
157 is_outbound: parameters.is_outbound_from_holder,
158 channel_value_sat: parameters.channel_value_satoshis,
161 push_value_msat: 0, funding_outpoint,
163 holder_selected_contest_delay: parameters.holder_selected_contest_delay,
164 holder_shutdown_script: None, counterparty_points: counterparty_parameters.pubkeys.clone(),
166 counterparty_selected_contest_delay: counterparty_parameters.selected_contest_delay,
167 counterparty_shutdown_script: None, commitment_type,
169 };
170 let node = self.signer.get_node(&self.node_id).map_err(|_| ())?;
171 node.setup_channel(self.channel_id.clone(), None, setup, &DerivationPath::master())
172 .map_err(|s| self.bad_status(s))?;
173 }
174 if let Some((holder_tx, preimages)) = state.deferred_validate.clone() {
178 self.do_validate_holder_commitment(&holder_tx, preimages)?;
179 state.deferred_validate = None;
180 }
181 state.done = true;
182 Ok(())
183 }
184
185 fn do_validate_holder_commitment(
186 &self,
187 holder_tx: &HolderCommitmentTransaction,
188 outbound_htlc_preimages: Vec<PaymentPreimage>,
189 ) -> Result<(), ()> {
190 let commitment_number = INITIAL_COMMITMENT_NUMBER - holder_tx.commitment_number();
191 self.signer
192 .with_channel(&self.node_id, &self.channel_id, |chan| {
193 chan.htlcs_fulfilled(outbound_htlc_preimages);
194 let (offered_htlcs, received_htlcs) =
195 LoopbackChannelSigner::convert_to_htlc_info2(holder_tx.nondust_htlcs());
196 chan.validate_holder_commitment_tx_phase2(
197 commitment_number,
198 holder_tx.negotiated_feerate_per_kw(),
199 holder_tx.to_broadcaster_value_sat(),
200 holder_tx.to_countersignatory_value_sat(),
201 offered_htlcs,
202 received_htlcs,
203 &holder_tx.counterparty_sig,
204 &holder_tx.counterparty_htlc_sigs,
205 )?;
206 chan.revoke_previous_holder_commitment(commitment_number)?;
207 Ok(())
208 })
209 .map_err(|s| self.bad_status(s))?;
210 Ok(())
211 }
212
213 fn get_channel_setup(&self) -> Result<ChannelSetup, ()> {
214 self.signer
215 .with_channel(&self.node_id, &self.channel_id, |chan| Ok(chan.setup.clone()))
216 .map_err(|s| self.bad_status(s))
217 }
218
219 fn bad_status(&self, s: Status) {
220 error!("bad status {:?} on channel {}", s, self.channel_id);
221 }
222
223 fn convert_to_htlc_info2(htlcs: &[HTLCOutputInCommitment]) -> (Vec<HTLCInfo2>, Vec<HTLCInfo2>) {
224 let mut offered_htlcs = Vec::new();
225 let mut received_htlcs = Vec::new();
226 for htlc in htlcs {
227 let htlc_info = HTLCInfo2 {
228 value_sat: htlc.amount_msat / 1000,
229 payment_hash: htlc.payment_hash,
230 cltv_expiry: htlc.cltv_expiry,
231 };
232 if htlc.offered {
233 offered_htlcs.push(htlc_info);
234 } else {
235 received_htlcs.push(htlc_info);
236 }
237 }
238 (offered_htlcs, received_htlcs)
239 }
240
241 fn dest_wallet_path() -> DerivationPath {
242 to_derivation_path(&[1u32])
243 }
244
245 fn features(&self) -> ChannelTypeFeatures {
246 let setup = self.get_channel_setup().expect("not ready");
247 setup.features()
248 }
249}
250
251impl Writeable for LoopbackChannelSigner {
252 fn write<W: Writer>(&self, writer: &mut W) -> Result<(), IOError> {
253 self.channel_id.inner().write(writer)?;
254 self.channel_value_sat.write(writer)?;
255 Ok(())
256 }
257}
258
259impl ChannelSigner for LoopbackChannelSigner {
260 fn validate_counterparty_revocation(&self, idx: u64, secret: &SecretKey) -> Result<(), ()> {
261 let forward_idx = INITIAL_COMMITMENT_NUMBER - idx;
262 self.signer
263 .with_channel(&self.node_id, &self.channel_id, |chan| {
264 chan.validate_counterparty_revocation(forward_idx, secret)
265 })
266 .map_err(|s| self.bad_status(s))?;
267
268 Ok(())
269 }
270
271 fn get_per_commitment_point(
272 &self,
273 idx: u64,
274 _secp_ctx: &Secp256k1<All>,
275 ) -> Result<PublicKey, ()> {
276 self.signer
279 .with_channel_base(&self.node_id, &self.channel_id, |base| {
280 Ok(base.get_per_commitment_point(INITIAL_COMMITMENT_NUMBER - idx).unwrap())
281 })
282 .map_err(|s| self.bad_status(s))
283 }
284
285 fn release_commitment_secret(&self, commitment_number: u64) -> Result<[u8; 32], ()> {
286 let secret = self.signer.with_channel(&self.node_id, &self.channel_id, |chan| {
289 let secret = chan
290 .get_per_commitment_secret(INITIAL_COMMITMENT_NUMBER - commitment_number)
291 .unwrap();
292 Ok(*secret.as_ref())
293 });
294 Ok(secret.expect("missing channel"))
295 }
296
297 fn validate_holder_commitment(
298 &self,
299 holder_tx: &HolderCommitmentTransaction,
300 outbound_htlc_preimages: Vec<PaymentPreimage>,
301 ) -> Result<(), ()> {
302 {
305 let mut state = self.setup_state.lock().unwrap();
306 if !state.done {
307 if state.deferred_validate.is_some() {
312 debug_assert!(false, "validate_holder_commitment called twice before setup");
313 error!("validate_holder_commitment called twice before setup");
314 return Err(());
315 }
316 state.deferred_validate = Some((holder_tx.clone(), outbound_htlc_preimages));
317 return Ok(());
318 }
319 }
320 self.do_validate_holder_commitment(holder_tx, outbound_htlc_preimages)
321 }
322
323 fn pubkeys(&self, _secp_ctx: &Secp256k1<All>) -> ChannelPublicKeys {
324 self.pubkeys.clone()
325 }
326
327 fn new_funding_pubkey(
328 &self,
329 _splice_parent_funding_txid: Txid,
330 _secp_ctx: &Secp256k1<All>,
331 ) -> PublicKey {
332 todo!("new_funding_pubkey for splicing - #538")
333 }
334
335 fn channel_keys_id(&self) -> [u8; 32] {
336 self.signer
339 .with_channel_base(&self.node_id, &self.channel_id, |base| {
340 Ok(base.get_channel_keys_id())
341 })
342 .expect("missing channel")
343 }
344}
345
346impl EcdsaChannelSigner for LoopbackChannelSigner {
347 fn sign_counterparty_commitment(
349 &self,
350 channel_parameters: &ChannelTransactionParameters,
351 commitment_tx: &CommitmentTransaction,
352 inbound_htlc_preimages: Vec<PaymentPreimage>,
353 outbound_htlc_preimages: Vec<PaymentPreimage>,
354 _secp_ctx: &Secp256k1<All>,
355 ) -> Result<(Signature, Vec<Signature>), ()> {
356 self.ensure_setup(channel_parameters)?;
357 let trusted_tx = commitment_tx.trust();
358 info!(
359 "sign_counterparty_commitment {:?} {:?} txid {}",
360 self.node_id,
361 self.channel_id,
362 trusted_tx.built_transaction().txid,
363 );
364
365 let (offered_htlcs, received_htlcs) =
366 LoopbackChannelSigner::convert_to_htlc_info2(commitment_tx.nondust_htlcs());
367
368 let per_commitment_point = trusted_tx.keys().per_commitment_point;
370
371 let commitment_number = INITIAL_COMMITMENT_NUMBER - commitment_tx.commitment_number();
372 let to_holder_value_sat = commitment_tx.to_countersignatory_value_sat();
373 let to_counterparty_value_sat = commitment_tx.to_broadcaster_value_sat();
374 let feerate_per_kw = commitment_tx.negotiated_feerate_per_kw();
375
376 let (commitment_sig, htlc_sigs) = self
377 .signer
378 .with_channel(&self.node_id, &self.channel_id, |chan| {
379 chan.htlcs_fulfilled(inbound_htlc_preimages);
380 chan.htlcs_fulfilled(outbound_htlc_preimages);
381 chan.sign_counterparty_commitment_tx_phase2(
382 &per_commitment_point,
383 commitment_number,
384 feerate_per_kw,
385 to_holder_value_sat,
386 to_counterparty_value_sat,
387 offered_htlcs,
388 received_htlcs,
389 )
390 })
391 .map_err(|s| self.bad_status(s))?;
392 Ok((commitment_sig, htlc_sigs))
393 }
394
395 fn sign_holder_commitment(
396 &self,
397 channel_parameters: &ChannelTransactionParameters,
398 hct: &HolderCommitmentTransaction,
399 _secp_ctx: &Secp256k1<All>,
400 ) -> Result<Signature, ()> {
401 self.ensure_setup(channel_parameters)?;
402 let commitment_tx = hct.trust();
403
404 debug!("loopback: sign local txid {}", commitment_tx.built_transaction().txid);
405
406 let commitment_number = INITIAL_COMMITMENT_NUMBER - hct.commitment_number();
407 let to_holder_value_sat = hct.to_broadcaster_value_sat();
408 let to_counterparty_value_sat = hct.to_countersignatory_value_sat();
409 let feerate_per_kw = hct.negotiated_feerate_per_kw();
410 let (offered_htlcs, received_htlcs) =
411 LoopbackChannelSigner::convert_to_htlc_info2(hct.nondust_htlcs());
412
413 let sig = self
414 .signer
415 .with_channel(&self.node_id, &self.channel_id, |chan| {
416 let info2 = chan.validator().get_current_holder_commitment_info(
417 &mut chan.enforcement_state,
418 commitment_number,
419 )?;
420
421 let expected = CommitmentInfo2::new(
422 false,
423 to_counterparty_value_sat,
424 to_holder_value_sat,
425 offered_htlcs.clone(),
426 received_htlcs.clone(),
427 feerate_per_kw,
428 );
429
430 if info2 != expected {
432 return Err(Status::invalid_argument(
433 "holder commitment tx does not match previously validated state",
434 ));
435 }
436 chan.sign_holder_commitment_tx_phase2(commitment_number)
437 })
438 .map_err(|s| self.bad_status(s))?;
439
440 Ok(sig)
441 }
442
443 fn unsafe_sign_holder_commitment(
444 &self,
445 channel_parameters: &ChannelTransactionParameters,
446 commitment_tx: &HolderCommitmentTransaction,
447 secp_ctx: &Secp256k1<All>,
448 ) -> Result<Signature, ()> {
449 let node = self.signer.get_node(&self.node_id).map_err(|_| ())?;
453 self.signer
454 .with_channel(&self.node_id, &self.channel_id, |chan| {
455 chan.keys
456 .unsafe_sign_holder_commitment(
457 channel_parameters,
458 commitment_tx,
459 node.get_entropy_source(),
460 secp_ctx,
461 )
462 .map_err(|_| Status::internal("could not unsafe-sign"))
463 })
464 .map_err(|_s| ())
465 }
466
467 fn sign_justice_revoked_output(
468 &self,
469 _channel_parameters: &ChannelTransactionParameters,
470 justice_tx: &Transaction,
471 input: usize,
472 amount: u64,
473 per_commitment_key: &SecretKey,
474 secp_ctx: &Secp256k1<All>,
475 ) -> Result<Signature, ()> {
476 let per_commitment_point = PublicKey::from_secret_key(secp_ctx, per_commitment_key);
477 let setup = self.get_channel_setup()?;
478 let counterparty_pubkeys = setup.counterparty_points;
479
480 let (revocation_key, delayed_payment_key) = get_delayed_payment_keys(
481 secp_ctx,
482 &per_commitment_point,
483 &counterparty_pubkeys,
484 &self.pubkeys,
485 )?;
486 let redeem_script = chan_utils::get_revokeable_redeemscript(
487 &RevocationKey(revocation_key),
488 setup.holder_selected_contest_delay,
489 &DelayedPaymentKey(delayed_payment_key),
490 );
491
492 let wallet_path = LoopbackChannelSigner::dest_wallet_path();
493
494 let sig = self
496 .signer
497 .with_channel(&self.node_id, &self.channel_id, |chan| {
498 chan.sign_justice_sweep(
499 justice_tx,
500 input,
501 per_commitment_key,
502 &redeem_script,
503 amount,
504 &wallet_path,
505 )
506 })
507 .map_err(|s| self.bad_status(s))?;
508
509 Ok(sig)
510 }
511
512 fn sign_justice_revoked_htlc(
513 &self,
514 _channel_parameters: &ChannelTransactionParameters,
515 justice_tx: &Transaction,
516 input: usize,
517 amount: u64,
518 per_commitment_key: &SecretKey,
519 htlc: &HTLCOutputInCommitment,
520 secp_ctx: &Secp256k1<All>,
521 ) -> Result<Signature, ()> {
522 let per_commitment_point = PublicKey::from_secret_key(secp_ctx, per_commitment_key);
523 let wallet_path = LoopbackChannelSigner::dest_wallet_path();
524
525 let sig = self
527 .signer
528 .with_channel(&self.node_id, &self.channel_id, |chan| {
529 let tx_keys = chan.make_counterparty_tx_keys(&per_commitment_point);
530 let redeem_script =
531 chan_utils::get_htlc_redeemscript(&htlc, &self.features(), &tx_keys);
532 chan.sign_justice_sweep(
533 justice_tx,
534 input,
535 per_commitment_key,
536 &redeem_script,
537 amount,
538 &wallet_path,
539 )
540 })
541 .map_err(|s| self.bad_status(s))?;
542
543 Ok(sig)
544 }
545
546 fn sign_holder_htlc_transaction(
547 &self,
548 htlc_tx: &Transaction,
549 _input: usize,
550 htlc_descriptor: &HTLCDescriptor,
551 secp_ctx: &Secp256k1<All>,
552 ) -> Result<Signature, ()> {
553 let signature = self
554 .signer
555 .with_channel(&self.node_id, &self.channel_id, |channel| {
556 let per_commitment_point = &htlc_descriptor.per_commitment_point;
557 let chan_keys = channel.make_holder_tx_keys(per_commitment_point);
558 let witness_script = htlc_descriptor.witness_script(secp_ctx);
559 let redeem_script = chan_utils::get_htlc_redeemscript(
560 &htlc_descriptor.htlc,
561 &self.features(),
562 &chan_keys,
563 );
564 channel.sign_htlc_tx(
566 htlc_tx,
567 per_commitment_point,
568 &redeem_script,
569 htlc_descriptor.htlc.amount_msat / 1000,
570 &witness_script,
571 false,
572 chan_keys.clone(),
573 )
574 })
575 .expect("sign_htlc_tx");
576 Ok(signature.sig)
577 }
578
579 fn sign_counterparty_htlc_transaction(
580 &self,
581 _channel_parameters: &ChannelTransactionParameters,
582 htlc_tx: &Transaction,
583 input: usize,
584 amount: u64,
585 per_commitment_point: &PublicKey,
586 htlc: &HTLCOutputInCommitment,
587 _secp_ctx: &Secp256k1<All>,
588 ) -> Result<Signature, ()> {
589 let wallet_path = LoopbackChannelSigner::dest_wallet_path();
590
591 let sig = self
593 .signer
594 .with_channel(&self.node_id, &self.channel_id, |chan| {
595 let chan_keys = chan.make_counterparty_tx_keys(per_commitment_point);
596 let redeem_script =
597 chan_utils::get_htlc_redeemscript(htlc, &self.features(), &chan_keys);
598 chan.sign_counterparty_htlc_sweep(
599 htlc_tx,
600 input,
601 per_commitment_point,
602 &redeem_script,
603 amount,
604 &wallet_path,
605 )
606 })
607 .map_err(|s| self.bad_status(s))?;
608
609 Ok(sig)
610 }
611
612 fn sign_closing_transaction(
614 &self,
615 channel_parameters: &ChannelTransactionParameters,
616 closing_tx: &ClosingTransaction,
617 _secp_ctx: &Secp256k1<All>,
618 ) -> Result<Signature, ()> {
619 self.ensure_setup(channel_parameters)?;
620 info!("sign_closing_transaction {:?} {:?}", self.node_id, self.channel_id);
621
622 self.signer
624 .with_channel(&self.node_id, &self.channel_id, |chan| {
625 let holder_wallet_path_hint = to_derivation_path(&[2u32]);
627
628 chan.sign_mutual_close_tx_phase2(
629 closing_tx.to_holder_value_sat(),
630 closing_tx.to_counterparty_value_sat(),
631 &Some(closing_tx.to_holder_script().into()),
632 &Some(closing_tx.to_counterparty_script().into()),
633 &holder_wallet_path_hint,
634 )
635 })
636 .map_err(|_| ())
637 }
638
639 fn sign_holder_keyed_anchor_input(
640 &self,
641 _channel_parameters: &ChannelTransactionParameters,
642 _anchor_tx: &Transaction,
643 _input: usize,
644 _secp_ctx: &Secp256k1<All>,
645 ) -> Result<Signature, ()> {
646 todo!("LDK 0.2 - keyed anchor spending for EcdsaChannelSigner")
647 }
648
649 fn sign_channel_announcement_with_funding_key(
650 &self,
651 channel_parameters: &ChannelTransactionParameters,
652 msg: &UnsignedChannelAnnouncement,
653 _secp_ctx: &Secp256k1<All>,
654 ) -> Result<Signature, ()> {
655 self.ensure_setup(channel_parameters)?;
656 info!("sign_channel_announcement {:?} {:?}", self.node_id, self.channel_id);
657
658 self.signer
659 .with_channel(&self.node_id, &self.channel_id, |chan| {
660 Ok(chan.sign_channel_announcement_with_funding_key(&msg.encode()))
661 })
662 .map_err(|s| self.bad_status(s))
663 }
664
665 fn sign_splice_shared_input(
666 &self,
667 _channel_parameters: &ChannelTransactionParameters,
668 _tx: &Transaction,
669 _input_index: usize,
670 _secp_ctx: &Secp256k1<All>,
671 ) -> Signature {
672 todo!("sign_splice_shared_input - #538")
673 }
674}
675
676impl SignerProvider for LoopbackSignerKeysInterface {
677 type EcdsaSigner = LoopbackChannelSigner;
678
679 fn get_destination_script(&self, _channel_keys_id: [u8; 32]) -> Result<ScriptBuf, ()> {
681 let wallet_path = LoopbackChannelSigner::dest_wallet_path();
682 let pubkey = self.get_node().get_wallet_pubkey(&wallet_path).expect("pubkey");
683 Ok(ScriptBuf::new_p2wpkh(&WPubkeyHash::hash(&pubkey.0.serialize())))
684 }
685
686 fn get_shutdown_scriptpubkey(&self) -> Result<ShutdownScript, ()> {
687 Ok(self.get_node().get_ldk_shutdown_scriptpubkey())
689 }
690
691 fn generate_channel_keys_id(&self, _inbound: bool, _user_channel_id: u128) -> [u8; 32] {
692 let node = self.signer.get_node(&self.node_id).unwrap();
693 let (channel_id, _) = node.new_channel_with_random_id(&node).unwrap();
694 channel_id.ldk_channel_keys_id()
695 }
696
697 fn derive_channel_signer(&self, channel_keys_id: [u8; 32]) -> Self::EcdsaSigner {
698 let channel_id = ChannelId::new(&channel_keys_id);
699 LoopbackChannelSigner::new(
700 &self.node_id,
701 &channel_id,
702 Arc::clone(&self.signer),
703 0, )
705 }
706}
707
708impl EntropySource for LoopbackSignerKeysInterface {
709 fn get_secure_random_bytes(&self) -> [u8; 32] {
710 self.get_node().get_secure_random_bytes()
711 }
712}
713
714impl NodeSigner for LoopbackSignerKeysInterface {
715 fn get_node_id(&self, recipient: Recipient) -> Result<PublicKey, ()> {
716 let node_secret = self.get_node_secret(recipient)?;
717
718 Ok(PublicKey::from_secret_key(&Secp256k1::signing_only(), &node_secret))
719 }
720
721 fn sign_gossip_message(&self, msg: UnsignedGossipMessage) -> Result<Signature, ()> {
722 let node = self.get_node();
723 let sig = node.sign_gossip_message(&msg).expect("sign_gossip_message");
724 Ok(sig)
725 }
726
727 fn ecdh(
728 &self,
729 recipient: Recipient,
730 other_key: &PublicKey,
731 tweak: Option<&Scalar>,
732 ) -> Result<SharedSecret, ()> {
733 let mut node_secret = self.get_node_secret(recipient)?;
734 if let Some(tweak) = tweak {
735 node_secret = node_secret.mul_tweak(tweak).map_err(|_| ())?;
736 }
737 Ok(SharedSecret::new(other_key, &node_secret))
738 }
739
740 fn sign_invoice(
741 &self,
742 invoice: &RawBolt11Invoice,
743 recipient: Recipient,
744 ) -> Result<RecoverableSignature, ()> {
745 match recipient {
746 Recipient::Node => {}
747 Recipient::PhantomNode => return Err(()),
748 };
749 self.get_node().sign_bolt11_invoice(invoice.clone()).map_err(|_| ())
750 }
751
752 fn sign_bolt12_invoice(
753 &self,
754 invoice: &lightning::offers::invoice::UnsignedBolt12Invoice,
755 ) -> Result<bitcoin::secp256k1::schnorr::Signature, ()> {
756 self.get_node().sign_bolt12_invoice(invoice).map_err(|_| ())
757 }
758
759 fn get_expanded_key(&self) -> ExpandedKey {
760 self.get_node().get_inbound_payment_key_material()
761 }
762
763 fn get_peer_storage_key(&self) -> PeerStorageKey {
764 self.get_node().keys_manager.get_peer_storage_key()
765 }
766
767 fn get_receive_auth_key(&self) -> ReceiveAuthKey {
768 self.get_node().keys_manager.get_receive_auth_key()
769 }
770
771 fn sign_message(&self, msg: &[u8]) -> Result<String, ()> {
772 self.get_node().keys_manager.sign_message(msg)
773 }
774}
775
776fn get_delayed_payment_keys(
777 secp_ctx: &Secp256k1<All>,
778 per_commitment_point: &PublicKey,
779 a_pubkeys: &ChannelPublicKeys,
780 b_pubkeys: &ChannelPublicKeys,
781) -> Result<(PublicKey, PublicKey), ()> {
782 let revocation_key = crypto_utils::derive_public_revocation_key(
783 secp_ctx,
784 &per_commitment_point,
785 &b_pubkeys.revocation_basepoint,
786 )?;
787 let delayed_payment_key =
788 derive_public_key(secp_ctx, &per_commitment_point, &a_pubkeys.delayed_payment_basepoint.0)
789 .map_err(|_| ())?;
790 Ok((revocation_key.0, delayed_payment_key))
791}
792
793#[cfg(test)]
794mod tests {
795 use std::sync::Arc;
796
797 use bitcoin::{hex::FromHex, key::Secp256k1};
798 use lightning::ln::chan_utils::ChannelTransactionParameters;
799 use lightning::sign::{ecdsa::EcdsaChannelSigner, SignerProvider};
800
801 use crate::channel::{Channel, ChannelBase};
802 use crate::persist::DummySeedPersister;
803 use crate::signer::multi_signer::MultiSigner;
804 use crate::util::loopback::{LoopbackChannelSigner, LoopbackSignerKeysInterface};
805 use crate::util::test_utils::key::make_test_pubkey;
806 use crate::util::test_utils::{
807 init_channel, make_services, make_test_channel_setup, make_test_counterparty_keys,
808 setup_validated_holder_commitment,
809 };
810 use crate::util::test_utils::{
811 make_holder_commitment_tx, TestChannelContext, TestNodeContext, TEST_NODE_CONFIG, TEST_SEED,
812 };
813
814 fn setup_loopback_signer() -> (
815 LoopbackChannelSigner,
816 TestNodeContext,
817 TestChannelContext,
818 crate::util::test_utils::TestCommitmentTxContext,
819 ChannelTransactionParameters,
820 ) {
821 let setup = make_test_channel_setup();
822 let signer = Arc::new(MultiSigner::new(make_services()));
823 let seed = Vec::from_hex(TEST_SEED[1]).expect("test seed");
824 let node_id = signer
825 .new_node_with_seed(TEST_NODE_CONFIG, &seed, Arc::new(DummySeedPersister {}))
826 .expect("new node");
827
828 let node = signer.get_node(&node_id).expect("get node");
829 let channel_id = init_channel(setup.clone(), node.clone());
830 let secp_ctx = Secp256k1::signing_only();
831 let counterparty_keys = make_test_counterparty_keys(
832 &TestNodeContext { node: node.clone(), secp_ctx: secp_ctx.clone() },
833 &channel_id,
834 );
835
836 node.with_channel(&channel_id, |chan| {
837 let commit_num = 23;
838 let point = make_test_pubkey(25);
839 chan.enforcement_state.set_next_holder_commit_num_for_testing(commit_num);
840 chan.enforcement_state
841 .set_next_counterparty_commit_num_for_testing(commit_num + 1, point);
842 chan.enforcement_state.set_next_counterparty_revoke_num_for_testing(commit_num);
843 Ok(())
844 })
845 .expect("set commitment state");
846
847 let node_ctx = TestNodeContext { node: node.clone(), secp_ctx };
848 let chan_ctx =
849 TestChannelContext { channel_id: channel_id.clone(), setup, counterparty_keys };
850
851 let commit_tx_ctx =
852 setup_validated_holder_commitment(&node_ctx, &chan_ctx, 23, |_ctx| {}, |_keys| {})
853 .expect("validated commitment");
854
855 let lsp = LoopbackSignerKeysInterface { node_id, signer };
856 let loopback_signer = lsp.derive_channel_signer(channel_id.ldk_channel_keys_id());
857
858 let channel_parameters = node
859 .with_channel(&channel_id, |chan| Ok(chan.make_channel_parameters()))
860 .expect("channel parameters");
861
862 (loopback_signer, node_ctx, chan_ctx, commit_tx_ctx, channel_parameters)
863 }
864
865 #[test]
866 fn sign_holder_commitment_success() {
867 let (loopback_signer, node_ctx, chan_ctx, mut commit_tx_ctx, channel_parameters) =
868 setup_loopback_signer();
869 let hct = make_holder_commitment_tx(&node_ctx, &chan_ctx, &mut commit_tx_ctx);
870 let secp_ctx = Secp256k1::new();
871
872 let result = loopback_signer.sign_holder_commitment(&channel_parameters, &hct, &secp_ctx);
873 assert!(result.is_ok());
874 }
875
876 #[test]
877 fn sign_holder_commitment_rejects_mismatch() {
878 let (loopback_signer, node_ctx, chan_ctx, mut commit_tx_ctx, channel_parameters) =
879 setup_loopback_signer();
880
881 let mismatched_commitment_tx = node_ctx
882 .node
883 .with_channel(&chan_ctx.channel_id, |chan| {
884 let per_commitment_point =
885 chan.get_per_commitment_point(commit_tx_ctx.commit_num)?;
886 let htlcs = Channel::htlcs_info2_to_oic(
887 &commit_tx_ctx.offered_htlcs,
888 &commit_tx_ctx.received_htlcs,
889 );
890
891 Ok(chan.make_holder_commitment_tx(
892 commit_tx_ctx.commit_num,
893 &per_commitment_point,
894 commit_tx_ctx.feerate_per_kw + 1,
895 commit_tx_ctx.to_broadcaster,
896 commit_tx_ctx.to_countersignatory,
897 htlcs,
898 ))
899 })
900 .expect("mismatched commitment tx");
901
902 commit_tx_ctx.tx = Some(mismatched_commitment_tx);
903 let hct = make_holder_commitment_tx(&node_ctx, &chan_ctx, &mut commit_tx_ctx);
904 let secp_ctx = Secp256k1::new();
905
906 let result = loopback_signer.sign_holder_commitment(&channel_parameters, &hct, &secp_ctx);
907 assert!(result.is_err());
908 }
909}