Skip to main content

lightning_signer/util/
loopback.rs

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
44/// Adapt MySigner to NodeSigner
45pub 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
82/// Tracks lazy channel setup. LDK 0.2 removed `ChannelSigner::provide_channel_parameters`
83/// (which used to call `Node::setup_channel`), so we set the channel up lazily on the first
84/// signing op instead — mirroring `SignerClient` on the wire path. On the inbound side LDK
85/// calls `validate_holder_commitment` before any signing op, so we defer it and replay after
86/// setup completes.
87struct 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    /// Set the channel up on the signer from LDK's channel parameters, lazily and once.
131    /// Replaces the removed `provide_channel_parameters` hook. Replays a deferred
132    /// `validate_holder_commitment` (inbound side) once setup completes.
133    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        // Skip if already set up (e.g. by a test harness); `with_channel_base` works on a stub.
140        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            // Match the negotiated channel type, like `SignerClient::do_setup_channel`.
148            let features = &parameters.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                // LDK 0.2 dropped the channel value from `derive_channel_signer`, so take it
159                // from the parameters (like `SignerClient`).
160                channel_value_sat: parameters.channel_value_satoshis,
161                push_value_msat: 0, // TODO
162                funding_outpoint,
163                holder_selected_contest_delay: parameters.holder_selected_contest_delay,
164                holder_shutdown_script: None, // use the signer's shutdown script
165                counterparty_points: counterparty_parameters.pubkeys.clone(),
166                counterparty_selected_contest_delay: counterparty_parameters.selected_contest_delay,
167                counterparty_shutdown_script: None, // TODO
168                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        // Clone rather than `take` so a failed replay leaves the message in place: `done` stays
175        // false and a later signing op retries it, instead of dropping it on the floor. Same
176        // ordering as `SignerClient::ensure_channel_setup`.
177        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        // signer layer expect forward counting commitment number, but
277        // we are passed a backwards counting one
278        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        // signer layer expect forward counting commitment number, but
287        // we are passed a backwards counting one
288        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        // On the inbound side this is called before the channel is set up (setup happens
303        // lazily on the first signing op); defer and replay after `ensure_setup` completes.
304        {
305            let mut state = self.setup_state.lock().unwrap();
306            if !state.done {
307                // Only one validation can be deferred: overwriting would silently drop a holder
308                // commitment the signer never saw. Unreachable in practice (the first signing op
309                // completes setup before a second `commitment_signed`), so fail the call rather
310                // than lose it — LDK closes the channel instead of proceeding unvalidated.
311                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        // Called before the (lazy) setup, so use `with_channel_base`, which works on a stub. Must
337        // be the signer's derived keys id, which `spend_spendable_outputs` re-derives keys from.
338        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    // TODO - Couldn't this return a declared error signature?
348    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        // This doesn't actually require trust
369        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                // Ensure that LDK-provided data matches previously validated state
431                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        // Intentionally bypass VLS policy enforcement — callers like
450        // force-close recovery need to be able to sign older commitments
451        // that the policy layer would otherwise reject.
452        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        // TODO phase 2
495        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        // TODO phase 2
526        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                // FIXME the redmee script is not the witness script
565                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        // TODO phase 2
592        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    // TODO - Couldn't this return a declared error signature?
613    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        // TODO error handling is awkward
623        self.signer
624            .with_channel(&self.node_id, &self.channel_id, |chan| {
625                // matches ldk_shutdown_pubkey derivation in [`MyKeysManager::new`]
626                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    // FIXME: see how to use the channel_keys_id
680    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        // FIXME - this method is deprecated
688        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, // channel_value_sat - unused
704        )
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}