lightning_signer/signer/
my_keys_manager.rs

1use crate::prelude::*;
2use crate::util::crypto_utils::{hkdf_sha256, sighash_from_heartbeat};
3use core::sync::atomic::{AtomicU32, AtomicUsize, Ordering};
4
5use bitcoin::bip32::{ChildNumber, Xpriv, Xpub};
6use bitcoin::blockdata::opcodes;
7use bitcoin::blockdata::script::Builder;
8use bitcoin::hashes::hash160::Hash as Hash160;
9use bitcoin::hashes::sha256::Hash as Sha256;
10use bitcoin::hashes::sha256::HashEngine as Sha256State;
11use bitcoin::hashes::sha256d::Hash as Sha256dHash;
12use bitcoin::hashes::{Hash, HashEngine};
13use bitcoin::key::Keypair;
14use bitcoin::secp256k1::ecdh::SharedSecret;
15use bitcoin::secp256k1::{All, Message, PublicKey, Scalar, Secp256k1, SecretKey, Signing};
16use bitcoin::Network;
17use bitcoin::WPubkeyHash;
18use bitcoin::{secp256k1, ScriptBuf, Transaction, TxOut, Witness};
19use lightning::ln::msgs::{DecodeError, UnsignedGossipMessage};
20use lightning::ln::script::ShutdownScript;
21use lightning::sign::{
22    EntropySource, InMemorySigner, NodeSigner, Recipient, SignerProvider, SpendableOutputDescriptor,
23};
24use lightning::util::ser::Writeable;
25
26use super::derive::{self, KeyDerivationStyle};
27use crate::channel::ChannelId;
28use crate::signer::StartingTimeFactory;
29use crate::util::byte_utils;
30use crate::util::transaction_utils::create_spending_transaction;
31use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
32use bitcoin::secp256k1::schnorr;
33use bitcoin::sighash::{self, EcdsaSighashType};
34use lightning::ln::inbound_payment::ExpandedKey;
35use lightning_invoice::RawBolt11Invoice;
36
37/// An implementation of [`NodeSigner`]
38pub struct MyKeysManager {
39    secp_ctx: Secp256k1<secp256k1::All>,
40    seed: Vec<u8>,
41    key_derivation_style: KeyDerivationStyle,
42    network: Network,
43    master_key: Xpriv,
44    node_secret: SecretKey,
45    bolt12_secret: SecretKey,
46    persistence_secret: SecretKey,
47    inbound_payment_key: ExpandedKey,
48    channel_seed_base: [u8; 32],
49    account_extended_key: Xpriv,
50    destination_script: ScriptBuf,
51    ldk_shutdown_pubkey: PublicKey,
52    #[allow(dead_code)]
53    channel_master_key: Xpriv,
54    channel_id_master_key: Xpriv,
55    channel_id_child_index: AtomicUsize,
56
57    rand_bytes_master_key: Xpriv,
58    rand_bytes_child_index: AtomicUsize,
59    rand_bytes_unique_start: Sha256State,
60
61    lnd_basepoint_index: AtomicU32,
62
63    unique_start: Sha256State,
64}
65
66impl MyKeysManager {
67    /// Construct
68    ///
69    /// NOTE - it's ok to reconstruct MyKeysManager with a different starting time when restoring
70    /// from persisted data.  It is not important to persist the starting_time entropy ...
71    pub fn new(
72        key_derivation_style: KeyDerivationStyle,
73        seed: &[u8],
74        network: Network,
75        starting_time_factory: &dyn StartingTimeFactory,
76    ) -> MyKeysManager {
77        let secp_ctx = Secp256k1::new();
78        let key_derive = derive::key_derive(key_derivation_style, network);
79        let master_key = key_derive.master_key(seed);
80        let (_, node_secret) = key_derive.node_keys(seed, &secp_ctx);
81        let channel_master_key = master_key
82            .derive_priv(&secp_ctx, &[ChildNumber::from_hardened_idx(3).unwrap()])
83            .expect("Your RNG is busted");
84        let channel_id_master_key = master_key
85            .derive_priv(&secp_ctx, &[ChildNumber::from_hardened_idx(5).unwrap()])
86            .expect("Your RNG is busted");
87
88        let (starting_time_secs, starting_time_nanos) = starting_time_factory.starting_time();
89        let mut unique_start = Sha256::engine();
90        unique_start.input(&byte_utils::be64_to_array(starting_time_secs));
91        unique_start.input(&byte_utils::be32_to_array(starting_time_nanos));
92        unique_start.input(seed);
93
94        let channel_seed_base = key_derive.channels_seed(seed);
95        let account_extended_key =
96            key_derivation_style.get_account_extended_key(&secp_ctx, network, seed);
97
98        let ldk_shutdown_key = account_extended_key
99            .derive_priv(&secp_ctx, &[ChildNumber::from_normal_idx(2).unwrap()])
100            .expect("Your RNG is busted")
101            .to_priv()
102            .inner;
103        let ldk_shutdown_pubkey = PublicKey::from_secret_key(&secp_ctx, &ldk_shutdown_key);
104
105        let destination_key = account_extended_key
106            .derive_priv(&secp_ctx, &[ChildNumber::from_normal_idx(1).unwrap()])
107            .expect("Your RNG is busted");
108
109        let destination_script = {
110            let pubkey_hash160 = Hash160::hash(
111                &Xpub::from_priv(&secp_ctx, &destination_key).public_key.serialize()[..],
112            );
113            Builder::new()
114                .push_opcode(opcodes::all::OP_PUSHBYTES_0)
115                .push_slice(&pubkey_hash160.to_byte_array())
116                .into_script()
117        };
118
119        let rand_bytes_master_key = master_key
120            .derive_priv(&secp_ctx, &[ChildNumber::from_hardened_idx(4).unwrap()])
121            .expect("Your RNG is busted");
122        let inbound_payment_key: SecretKey = master_key
123            .derive_priv(&secp_ctx, &[ChildNumber::from_hardened_idx(5).unwrap()])
124            .expect("Your RNG is busted")
125            .private_key;
126        let mut inbound_pmt_key_bytes = [0; 32];
127        inbound_pmt_key_bytes.copy_from_slice(&inbound_payment_key[..]);
128
129        let mut rand_bytes_unique_start = Sha256::engine();
130        rand_bytes_unique_start.input(&byte_utils::be64_to_array(starting_time_secs));
131        rand_bytes_unique_start.input(&byte_utils::be32_to_array(starting_time_nanos));
132        rand_bytes_unique_start.input(seed);
133
134        let bolt12_secret = master_key
135            .derive_priv(&secp_ctx, &[ChildNumber::from_hardened_idx(9735).unwrap()])
136            .expect("Your RNG is busted")
137            .private_key;
138
139        let persistence_secret = master_key
140            .derive_priv(&secp_ctx, &[ChildNumber::from_hardened_idx(9736).unwrap()])
141            .expect("Your RNG is busted")
142            .private_key;
143
144        let mut res = MyKeysManager {
145            secp_ctx,
146            seed: seed.to_vec(),
147            key_derivation_style,
148            network,
149            master_key,
150            node_secret,
151            bolt12_secret,
152            persistence_secret,
153            inbound_payment_key: ExpandedKey::new(inbound_pmt_key_bytes),
154            channel_seed_base,
155            account_extended_key,
156            destination_script,
157            ldk_shutdown_pubkey,
158            channel_master_key,
159            channel_id_master_key,
160            channel_id_child_index: AtomicUsize::new(0),
161            rand_bytes_master_key,
162            rand_bytes_child_index: AtomicUsize::new(0),
163            rand_bytes_unique_start,
164            lnd_basepoint_index: AtomicU32::new(0),
165            unique_start,
166        };
167
168        let secp_seed = res.get_secure_random_bytes();
169        res.secp_ctx.seeded_randomize(&secp_seed);
170        res
171    }
172
173    pub(crate) fn get_node_secret(&self) -> SecretKey {
174        self.node_secret
175    }
176
177    /// onion reply secret
178    pub fn get_onion_reply_secret(&self) -> [u8; 32] {
179        return hkdf_sha256(&self.seed, "onion reply secret".as_bytes(), &[]);
180    }
181
182    /// BOLT 12 x-only pubkey
183    pub fn get_bolt12_pubkey(&self) -> PublicKey {
184        PublicKey::from_secret_key(&self.secp_ctx, &self.bolt12_secret)
185    }
186
187    /// Persistence pubkey
188    pub fn get_persistence_pubkey(&self) -> PublicKey {
189        PublicKey::from_secret_key(&self.secp_ctx, &self.persistence_secret)
190    }
191
192    /// Persistence shared secret
193    pub fn get_persistence_shared_secret(&self, server_pubkey: &PublicKey) -> [u8; 32] {
194        SharedSecret::new(server_pubkey, &self.persistence_secret).secret_bytes()
195    }
196
197    /// Persistence auth token
198    pub fn get_persistence_auth_token(&self, server_pubkey: &PublicKey) -> [u8; 32] {
199        Sha256::hash(&self.get_persistence_shared_secret(server_pubkey)).to_byte_array()
200    }
201
202    /// Computes a keypair for BOLT12 signing with optional message-based tweaking
203    ///
204    /// Based on the BOLT12 specification and c-lightning implementation:
205    /// 1. Without tweak message: Uses the node_secret directly
206    /// 2. With tweak message only: Takes the bolt12_secret and tweaks it with the message
207    /// 3. With tweak message and info: Derives a base secret using HKDF-SHA256 from info
208    ///    then computes the tweak from the tweakmessage
209    fn get_bolt12_keypair(
210        &self,
211        opt_info: Option<&[u8]>,
212        opt_tweak_message: Option<&[u8]>,
213    ) -> Result<Keypair, ()> {
214        match (opt_tweak_message, opt_info) {
215            (None, _) => Ok(Keypair::from_secret_key(&self.secp_ctx, &self.node_secret)),
216            (Some(tweak_message), None) => {
217                let pubkey_ser =
218                    PublicKey::from_secret_key(&self.secp_ctx, &self.bolt12_secret).serialize();
219                let mut sha = Sha256::engine();
220                sha.input(&pubkey_ser);
221                sha.input(tweak_message);
222                let tweak = Scalar::from_be_bytes(*Sha256::from_engine(sha).as_ref())
223                    .expect("your RNG is busted");
224                let tweaked_secret = self.bolt12_secret.add_tweak(&tweak).map_err(|_| ())?;
225                Ok(Keypair::from_secret_key(&self.secp_ctx, &tweaked_secret))
226            }
227            (Some(tweak_message), Some(info)) => {
228                let base_secret = self.derive_secret(info);
229                let mut sha = Sha256::engine();
230                sha.input(base_secret.as_ref());
231                sha.input(tweak_message);
232                let tweak = Scalar::from_be_bytes(*Sha256::from_engine(sha).as_ref())
233                    .expect("valid tweak value");
234                let tweaked_secret = self.node_secret.add_tweak(&tweak).map_err(|_| ())?;
235                Ok(Keypair::from_secret_key(&self.secp_ctx, &tweaked_secret))
236            }
237        }
238    }
239
240    fn bolt12_message_hash(
241        &self,
242        messagename: &[u8],
243        fieldname: &[u8],
244        merkleroot: &[u8; 32],
245    ) -> Sha256 {
246        let mut sha = Sha256::engine();
247        sha.input("lightning".as_bytes());
248        sha.input(messagename);
249        sha.input(fieldname);
250        let tag_hash = Sha256::from_engine(sha).to_byte_array();
251        let mut sha = Sha256::engine();
252        sha.input(&tag_hash);
253        sha.input(&tag_hash);
254        // BIP340 done, compute hash of message
255        sha.input(merkleroot);
256        Sha256::from_engine(sha)
257    }
258
259    /// BOLT 12 sign
260    pub fn sign_bolt12(
261        &self,
262        messagename: &[u8],
263        fieldname: &[u8],
264        merkleroot: &[u8; 32],
265        publictweak_opt: Option<&[u8]>,
266    ) -> Result<schnorr::Signature, ()> {
267        let sig_hash = self.bolt12_message_hash(messagename, fieldname, merkleroot);
268        let kp = self.get_bolt12_keypair(None, publictweak_opt)?;
269        let msg = Message::from_digest(sig_hash.to_byte_array());
270        Ok(self.secp_ctx.sign_schnorr_no_aux_rand(&msg, &kp))
271    }
272
273    /// Bolt 12 (modern) sign
274    pub fn sign_bolt12_2(
275        &self,
276        messagename: &[u8],
277        fieldname: &[u8],
278        merkleroot: &[u8; 32],
279        info: &[u8],
280        publictweak_opt: Option<&[u8]>,
281    ) -> Result<schnorr::Signature, ()> {
282        let sig_hash = self.bolt12_message_hash(messagename, fieldname, merkleroot);
283        let kp = self.get_bolt12_keypair(Some(info), publictweak_opt)?;
284        let msg = Message::from_digest(sig_hash.to_byte_array());
285        Ok(self.secp_ctx.sign_schnorr_no_aux_rand(&msg, &kp))
286    }
287
288    /// Derive pseudorandom secret from a derived key
289    pub fn derive_secret(&self, info: &[u8]) -> SecretKey {
290        // The derived_secrets_base could be precomputed at node startup time.
291        let derived_secrets_base = hkdf_sha256(&self.seed, "derived secrets".as_bytes(), &[]);
292        let derived_secret = hkdf_sha256(&derived_secrets_base, info, &[]);
293        // infallible, 32 bytes
294        SecretKey::from_slice(&derived_secret).unwrap()
295    }
296
297    /// Get the layer-1 xpub
298    pub fn get_account_extended_key(&self) -> &Xpriv {
299        &self.account_extended_key
300    }
301
302    /// Convert a commitment secret to a commitment point
303    pub fn per_commitment_point<X: Signing>(
304        secp_ctx: &Secp256k1<X>,
305        commitment_secret: &[u8; 32],
306    ) -> PublicKey {
307        // infallible, 32 bytes
308        PublicKey::from_secret_key(secp_ctx, &SecretKey::from_slice(commitment_secret).unwrap())
309    }
310
311    // Re-derive existing channel keys
312    fn derive_channel_keys(&self, channel_value_sat: u64, keys_id: &[u8; 32]) -> InMemorySigner {
313        self.get_channel_keys_with_keys_id(keys_id.clone(), channel_value_sat)
314    }
315
316    pub(crate) fn get_channel_keys_with_id(
317        &self,
318        channel_id: ChannelId,
319        channel_value_sat: u64,
320    ) -> InMemorySigner {
321        let key_derive = derive::key_derive(self.key_derivation_style, self.network);
322        // aka channel_seed
323        let keys_id = key_derive.keys_id(channel_id, &self.channel_seed_base);
324
325        self.get_channel_keys_with_keys_id(keys_id, channel_value_sat)
326    }
327
328    pub(crate) fn get_channel_keys_with_keys_id(
329        &self,
330        keys_id: [u8; 32],
331        channel_value_sat: u64,
332    ) -> InMemorySigner {
333        let key_derive = derive::key_derive(self.key_derivation_style, self.network);
334        let secp_ctx = Secp256k1::new();
335
336        // TODO lnd specific code
337        let basepoint_index = self.lnd_basepoint_index.fetch_add(1, Ordering::AcqRel);
338        let (
339            funding_key,
340            revocation_base_key,
341            htlc_base_key,
342            payment_key,
343            delayed_payment_base_key,
344            commitment_seed,
345        ) = key_derive.channel_keys(
346            &self.seed,
347            &keys_id,
348            basepoint_index,
349            &self.master_key,
350            &secp_ctx,
351        );
352
353        InMemorySigner::new(
354            &secp_ctx,
355            funding_key,
356            revocation_base_key,
357            payment_key,
358            delayed_payment_base_key,
359            htlc_base_key,
360            commitment_seed,
361            channel_value_sat,
362            keys_id,
363            self.get_secure_random_bytes(),
364        )
365    }
366
367    pub(crate) fn get_channel_id(&self) -> ChannelId {
368        let mut sha = self.unique_start.clone();
369
370        let child_ix = self.increment_channel_id_child_index();
371        let child_privkey = self
372            .channel_id_master_key
373            .derive_priv(
374                &self.secp_ctx,
375                &[ChildNumber::from_hardened_idx(child_ix as u32).expect("key space exhausted")],
376            )
377            .expect("Your RNG is busted");
378        sha.input(child_privkey.private_key.as_ref());
379
380        let random_bytes = Sha256::from_engine(sha).to_byte_array();
381
382        ChannelId::new(&random_bytes)
383    }
384
385    pub(crate) fn increment_channel_id_child_index(&self) -> usize {
386        self.channel_id_child_index.fetch_add(1, Ordering::AcqRel)
387    }
388
389    /// Creates a Transaction which spends the given descriptors to the given outputs, plus an
390    /// output to the given change destination (if sufficient change value remains). The
391    /// transaction will have a feerate, at least, of the given value.
392    ///
393    /// Returns `Err(())` if the output value is greater than the input value minus required fee or
394    /// if a descriptor was duplicated.
395    ///
396    /// We do not enforce that outputs meet the dust limit or that any output scripts are standard.
397    ///
398    /// May panic if the `SpendableOutputDescriptor`s were not generated by Channels which used
399    /// this KeysManager or one of the `InMemorySigner` created by this KeysManager.
400    // this function is covered by the integration tests in vls-core-test crate
401    pub fn spend_spendable_outputs(
402        &self,
403        descriptors: &[&SpendableOutputDescriptor],
404        outputs: Vec<TxOut>,
405        change_destination_script: ScriptBuf,
406        feerate_sat_per_1000_weight: u32,
407        secp_ctx: &Secp256k1<All>,
408    ) -> Result<Transaction, ()> {
409        let mut spend_tx = create_spending_transaction(
410            descriptors,
411            outputs,
412            change_destination_script,
413            feerate_sat_per_1000_weight,
414        )
415        .map_err(|_| ())?;
416        // Signing the tx
417        let mut keys_cache: Map<[u8; 32], InMemorySigner> = Map::new();
418        let mut input_idx = 0;
419        for outp in descriptors {
420            match outp {
421                SpendableOutputDescriptor::StaticPaymentOutput(descriptor) => {
422                    if !keys_cache.contains_key(&descriptor.channel_keys_id) {
423                        let signer = self.derive_channel_keys(
424                            descriptor.channel_value_satoshis,
425                            &descriptor.channel_keys_id,
426                        );
427                        keys_cache.insert(descriptor.channel_keys_id, signer);
428                    }
429                    spend_tx.input[input_idx].witness = Witness::from_slice(
430                        &keys_cache
431                            .get(&descriptor.channel_keys_id)
432                            .unwrap()
433                            .sign_counterparty_payment_input(
434                                &spend_tx,
435                                input_idx,
436                                &descriptor,
437                                &secp_ctx,
438                            )
439                            .expect("descriptor not accepted by sign_counterparty_payment_input")
440                            .to_vec(),
441                    );
442                }
443                SpendableOutputDescriptor::DelayedPaymentOutput(descriptor) => {
444                    if !keys_cache.contains_key(&descriptor.channel_keys_id) {
445                        let signer = self.derive_channel_keys(
446                            descriptor.channel_value_satoshis,
447                            &descriptor.channel_keys_id,
448                        );
449                        keys_cache.insert(descriptor.channel_keys_id, signer);
450                    }
451                    spend_tx.input[input_idx].witness = keys_cache
452                        .get(&descriptor.channel_keys_id)
453                        .unwrap()
454                        .sign_dynamic_p2wsh_input(&spend_tx, input_idx, &descriptor, &secp_ctx)
455                        .expect("descriptor not accepted by sign_dynamic_p2wsh_input");
456                }
457                SpendableOutputDescriptor::StaticOutput { ref output, .. } => {
458                    let derivation_idx =
459                        if output.script_pubkey == self.destination_script { 1 } else { 2 };
460                    let account_extended_key = self.key_derivation_style.get_account_extended_key(
461                        &secp_ctx,
462                        self.network,
463                        &self.seed,
464                    );
465                    let secret_key = account_extended_key
466                        .derive_priv(
467                            &secp_ctx,
468                            &[ChildNumber::from_normal_idx(derivation_idx)
469                                .expect("key space exhausted")],
470                        )
471                        .expect("Your RNG is busted");
472                    let pubkey =
473                        bitcoin::PublicKey::new(Xpub::from_priv(&secp_ctx, &secret_key).public_key);
474                    if derivation_idx == 2 {
475                        assert_eq!(pubkey.inner, self.ldk_shutdown_pubkey);
476                    }
477                    let witness_script =
478                        bitcoin::Address::p2pkh(&pubkey, Network::Testnet).script_pubkey();
479                    // unwrap is safe because we formatted the tx ourselves
480                    let sighash = Message::from(
481                        sighash::SighashCache::new(&spend_tx)
482                            .p2wsh_signature_hash(
483                                input_idx,
484                                &witness_script,
485                                output.value,
486                                EcdsaSighashType::All,
487                            )
488                            .unwrap(),
489                    );
490                    let sig = secp_ctx.sign_ecdsa(&sighash, &secret_key.private_key);
491                    let mut sig_ser = sig.serialize_der().to_vec();
492                    sig_ser.push(EcdsaSighashType::All as u8);
493                    spend_tx.input[input_idx].witness.push(sig_ser);
494                    spend_tx.input[input_idx].witness.push(pubkey.inner.serialize().to_vec());
495                }
496            }
497            input_idx += 1;
498        }
499        Ok(spend_tx)
500    }
501
502    /// Sign a heartbeat object
503    pub fn sign_heartbeat(&self, ser_heartbeat: &[u8]) -> schnorr::Signature {
504        let kp = Keypair::from_secret_key(&self.secp_ctx, &self.account_extended_key.private_key);
505        let msg = sighash_from_heartbeat(ser_heartbeat);
506        self.secp_ctx.sign_schnorr_no_aux_rand(&msg, &kp)
507    }
508}
509
510impl EntropySource for MyKeysManager {
511    fn get_secure_random_bytes(&self) -> [u8; 32] {
512        let mut sha = self.rand_bytes_unique_start.clone();
513
514        let child_ix = self.rand_bytes_child_index.fetch_add(1, Ordering::AcqRel);
515        let child_privkey = self
516            .rand_bytes_master_key
517            .derive_priv(
518                &self.secp_ctx,
519                &[ChildNumber::from_hardened_idx(child_ix as u32).expect("key space exhausted")],
520            )
521            .expect("Your RNG is busted");
522        sha.input(child_privkey.private_key.as_ref());
523
524        sha.input(b"Unique Secure Random Bytes Salt");
525        Sha256::from_engine(sha).to_byte_array()
526    }
527}
528
529impl SignerProvider for MyKeysManager {
530    type EcdsaSigner = InMemorySigner;
531
532    fn get_destination_script(&self, _channel_keys_id: [u8; 32]) -> Result<ScriptBuf, ()> {
533        // The destination script is chosen by the local node (must be
534        // in wallet or allowlisted).
535        unimplemented!()
536    }
537
538    fn get_shutdown_scriptpubkey(&self) -> Result<ShutdownScript, ()> {
539        Ok(ShutdownScript::new_p2wpkh(&WPubkeyHash::hash(&self.ldk_shutdown_pubkey.serialize())))
540    }
541
542    fn generate_channel_keys_id(
543        &self,
544        _inbound: bool,
545        _channel_value_satoshis: u64,
546        _user_channel_id: u128,
547    ) -> [u8; 32] {
548        unimplemented!()
549    }
550
551    fn derive_channel_signer(
552        &self,
553        _channel_value_satoshis: u64,
554        _channel_keys_id: [u8; 32],
555    ) -> Self::EcdsaSigner {
556        unimplemented!()
557    }
558
559    fn read_chan_signer(&self, _reader: &[u8]) -> Result<Self::EcdsaSigner, DecodeError> {
560        unimplemented!()
561    }
562}
563
564impl NodeSigner for MyKeysManager {
565    fn get_node_id(&self, recipient: Recipient) -> Result<PublicKey, ()> {
566        match recipient {
567            Recipient::Node => (),
568            Recipient::PhantomNode => return Err(()),
569        };
570        let node_secret = self.get_node_secret();
571        let node_id = PublicKey::from_secret_key(&self.secp_ctx, &node_secret);
572        Ok(node_id)
573    }
574
575    fn sign_gossip_message(&self, msg: UnsignedGossipMessage) -> Result<Signature, ()> {
576        let msg_hash = Sha256dHash::hash(&msg.encode()[..]);
577        let encmsg = secp256k1::Message::from_digest(msg_hash.to_byte_array());
578        let sig = self.secp_ctx.sign_ecdsa(&encmsg, &self.get_node_secret());
579        Ok(sig)
580    }
581
582    fn ecdh(
583        &self,
584        recipient: Recipient,
585        other_key: &PublicKey,
586        tweak: Option<&Scalar>,
587    ) -> Result<SharedSecret, ()> {
588        match recipient {
589            Recipient::Node => (),
590            Recipient::PhantomNode => return Err(()),
591        };
592        let mut node_secret = self.get_node_secret();
593        if let Some(tweak) = tweak {
594            node_secret = node_secret.mul_tweak(tweak).map_err(|_| ())?;
595        }
596        Ok(SharedSecret::new(other_key, &node_secret))
597    }
598
599    fn sign_invoice(
600        &self,
601        invoice: &RawBolt11Invoice,
602        recipient: Recipient,
603    ) -> Result<RecoverableSignature, ()> {
604        match recipient {
605            Recipient::Node => (),
606            Recipient::PhantomNode => return Err(()),
607        };
608        let invoice_preimage = invoice.signable_hash();
609        Ok(self.secp_ctx.sign_ecdsa_recoverable(
610            &Message::from_digest(Sha256::hash(&invoice_preimage).to_byte_array()),
611            &self.get_node_secret(),
612        ))
613    }
614
615    fn get_inbound_payment_key(&self) -> ExpandedKey {
616        self.inbound_payment_key
617    }
618
619    fn sign_bolt12_invoice(
620        &self,
621        _: &lightning::offers::invoice::UnsignedBolt12Invoice,
622    ) -> Result<schnorr::Signature, ()> {
623        todo!("issue 459")
624    }
625}
626
627#[cfg(test)]
628mod tests {
629    use crate::util::INITIAL_COMMITMENT_NUMBER;
630    use bitcoin::Network::Testnet;
631    use core::borrow::Borrow;
632
633    use super::*;
634    use crate::util::test_utils::{
635        hex_decode, hex_encode, FixedStartingTimeFactory, TEST_CHANNEL_ID,
636    };
637    use bitcoin::secp256k1::Message;
638    use bitcoin::Amount;
639    use lightning::chain::transaction::OutPoint;
640    use lightning::sign::SpendableOutputDescriptor::StaticOutput;
641    use lightning::sign::{ChannelSigner, KeysManager};
642    use test_log::test;
643
644    #[test]
645    fn shared_secret_test() {
646        let server_key = SecretKey::from_slice(&[0x22u8; 32]).unwrap();
647        let server_pubkey = PublicKey::from_secret_key(&Secp256k1::new(), &server_key);
648        let manager = MyKeysManager::new(
649            KeyDerivationStyle::Ldk,
650            &[0x11u8; 32],
651            Network::Testnet,
652            FixedStartingTimeFactory::new(1, 1).borrow(),
653        );
654        let client_pubkey = manager.get_persistence_pubkey();
655        let shared_secret2 = manager.get_persistence_shared_secret(&server_pubkey);
656
657        assert_eq!(
658            client_pubkey.to_string(),
659            "0200b2cd9b0c63b292cfc22a44b6085809c715d889041df3dee1ae4bb752d75d41"
660        );
661        assert_eq!(
662            hex::encode(shared_secret2),
663            "9c2d2c9d7605a1efe8ff0b81d0b01a2859de2861d89f01e2a617faa3e05c704b"
664        );
665    }
666
667    #[test]
668    fn compare_ldk_keys_manager_test() {
669        let seed = [0x11u8; 32];
670        let ldk = KeysManager::new(&seed, 1, 1);
671        let my = MyKeysManager::new(
672            KeyDerivationStyle::Ldk,
673            &seed,
674            Network::Testnet,
675            FixedStartingTimeFactory::new(1, 1).borrow(),
676        );
677        assert_eq!(
678            ldk.get_node_id(Recipient::Node).unwrap(),
679            my.get_node_id(Recipient::Node).unwrap()
680        );
681        let key_derive = derive::key_derive(KeyDerivationStyle::Ldk, Testnet);
682        let channel_id = ChannelId::new(&[33u8; 32]);
683        // Get a somewhat random keys_id
684        let keys_id = key_derive.keys_id(channel_id, &my.channel_seed_base);
685        let ldk_chan = ldk.derive_channel_keys(1000, &keys_id);
686        let my_chan = my.derive_channel_keys(1000, &keys_id);
687        let secp_ctx = Secp256k1::new();
688        assert_eq!(ldk_chan.funding_key, my_chan.funding_key);
689        assert_eq!(ldk_chan.revocation_base_key, my_chan.revocation_base_key);
690        assert_eq!(ldk_chan.htlc_base_key, my_chan.htlc_base_key);
691        assert_eq!(ldk_chan.payment_key, my_chan.payment_key);
692        assert_eq!(ldk_chan.delayed_payment_base_key, my_chan.delayed_payment_base_key);
693        assert_eq!(ldk_chan.funding_key, my_chan.funding_key);
694        assert_eq!(
695            ldk_chan.get_per_commitment_point(123, &secp_ctx),
696            my_chan.get_per_commitment_point(123, &secp_ctx)
697        );
698        // a bit redundant, because we checked them all above
699        assert!(ldk_chan.pubkeys() == my_chan.pubkeys());
700    }
701
702    #[test]
703    fn keys_test_native() {
704        let manager = MyKeysManager::new(
705            KeyDerivationStyle::Native,
706            &[0u8; 32],
707            Network::Testnet,
708            FixedStartingTimeFactory::new(0, 0).borrow(),
709        );
710        assert_eq!(
711            hex_encode(&manager.channel_seed_base),
712            "ab7f29780659755f14afb82342dc19db7d817ace8c312e759a244648dfc25e53"
713        );
714        let keys = make_test_keys(manager);
715        assert_eq!(
716            hex_encode(&keys.funding_key[..]),
717            "bf36bee09cc5dd64c8f19e10b258efb1f606722e9ff6fe3267b63e2dbe33dcfc"
718        );
719        assert_eq!(
720            hex_encode(&keys.revocation_base_key[..]),
721            "203612ab8275bab7916b8bf895d45b9dbb639b43d904b34d6449214e9855d345"
722        );
723        assert_eq!(
724            hex_encode(&keys.htlc_base_key[..]),
725            "517c009452b4baa9df42d6c8cddc966e017d49606524ce7728681b593a5659c1"
726        );
727        assert_eq!(
728            hex_encode(&keys.payment_key[..]),
729            "54ce3b75dcc2731604f3db55ecd1520d797a154cc757d6d98c3ffd1e90a9a25a"
730        );
731        assert_eq!(
732            hex_encode(&keys.delayed_payment_base_key[..]),
733            "9f5c122778b12ad35f555437d88b76b726ae4e472897af33e22616fb0d0b0a44"
734        );
735    }
736
737    fn make_test_keys(manager: MyKeysManager) -> InMemorySigner {
738        let channel_id = ChannelId::new(&hex_decode(TEST_CHANNEL_ID[0]).unwrap());
739        manager.get_channel_keys_with_id(channel_id, 0)
740    }
741
742    #[test]
743    fn keys_test_lnd() {
744        let manager = MyKeysManager::new(
745            KeyDerivationStyle::Lnd,
746            &[0u8; 32],
747            Network::Testnet,
748            FixedStartingTimeFactory::new(0, 0).borrow(),
749        );
750        assert_eq!(
751            hex_encode(&manager.channel_seed_base),
752            "ab7f29780659755f14afb82342dc19db7d817ace8c312e759a244648dfc25e53"
753        );
754        let mut channel_id = [0u8; 32];
755        channel_id[0] = 1u8;
756        let keys = make_test_keys(manager);
757        assert_eq!(
758            hex_encode(&keys.funding_key[..]),
759            "0b2f20d28e705daea86a93e6d5646e2f8989956d73c61752e7cf6c4421071e99"
760        );
761        assert_eq!(
762            hex_encode(&keys.revocation_base_key[..]),
763            "920c0b18c7d0979dc7119efb1ca520cf6899c92a3236d146968b521a901eac63"
764        );
765        assert_eq!(
766            hex_encode(&keys.htlc_base_key[..]),
767            "60deb71963b8574f3c8bf5df2d7b851f9c31a866a1c14bd00dae1263a5f27c55"
768        );
769        assert_eq!(
770            hex_encode(&keys.payment_key[..]),
771            "064e32a51f3ed0a41936bd788a80dc91b7521a85da00f02196eddbd32c3d5631"
772        );
773        assert_eq!(
774            hex_encode(&keys.delayed_payment_base_key[..]),
775            "47a6c0532b9e593e84d91451104dc6fe10ba4aa30cd7c95ed039916d3e908b10"
776        );
777    }
778
779    #[test]
780    fn per_commit_test() {
781        let manager = MyKeysManager::new(
782            KeyDerivationStyle::Native,
783            &[0u8; 32],
784            Network::Testnet,
785            FixedStartingTimeFactory::new(0, 0).borrow(),
786        );
787        let mut channel_id = [0u8; 32];
788        channel_id[0] = 1u8;
789        let keys = make_test_keys(manager);
790        assert_eq!(
791            hex_encode(&keys.commitment_seed),
792            "9fc48da6bc75058283b860d5989ffb802b6395ca28c4c3bb9d1da02df6bb0cb3"
793        );
794
795        let secp_ctx = Secp256k1::signing_only();
796        let per_commit_point = MyKeysManager::per_commitment_point(
797            &secp_ctx,
798            &keys.release_commitment_secret(INITIAL_COMMITMENT_NUMBER - 3).unwrap(),
799        );
800        assert_eq!(
801            hex_encode(&per_commit_point.serialize().to_vec()),
802            "03b5497ca60ff3165908c521ea145e742c25dedd14f5602f3f502d1296c39618a5"
803        );
804    }
805
806    #[test]
807    fn test_get_bolt12_keypair_no_tweak() {
808        let seed = [0x11u8; 32];
809        let manager = MyKeysManager::new(
810            KeyDerivationStyle::Ldk,
811            &seed,
812            Network::Testnet,
813            FixedStartingTimeFactory::new(1, 1).borrow(),
814        );
815
816        let keypair = manager.get_bolt12_keypair(None, None).unwrap();
817        assert_eq!(
818            keypair.public_key().to_string(),
819            "0328c0ca4140f514b1f1405c385676297752c11703cd92dfe859822cf8a1898902"
820        );
821    }
822
823    #[test]
824    fn test_get_bolt12_keypair_with_tweak_no_info() {
825        let seed = [0x11u8; 32];
826        let manager = MyKeysManager::new(
827            KeyDerivationStyle::Ldk,
828            &seed,
829            Network::Testnet,
830            FixedStartingTimeFactory::new(1, 1).borrow(),
831        );
832
833        let tweak_message = b"test_tweak";
834        let keypair = manager.get_bolt12_keypair(None, Some(tweak_message)).unwrap();
835
836        assert_eq!(
837            keypair.public_key().to_string(),
838            "02bca94aa77e296be4f9506857f01de0652e19d5a14f035cd88c67471a08c67bec"
839        );
840    }
841
842    #[test]
843    fn test_get_bolt12_keypair_with_tweak_and_info() {
844        let seed = [0x11u8; 32];
845        let manager = MyKeysManager::new(
846            KeyDerivationStyle::Ldk,
847            &seed,
848            Network::Testnet,
849            FixedStartingTimeFactory::new(1, 1).borrow(),
850        );
851
852        let info = b"test_info";
853        let tweak_message = b"test_tweak";
854        let keypair = manager.get_bolt12_keypair(Some(info), Some(tweak_message)).unwrap();
855
856        assert_eq!(
857            keypair.public_key().to_string(),
858            "03b1c6b776c5144c6aa790005b05e48027480877cc232224001662bde75d9112e8"
859        );
860    }
861
862    #[test]
863    fn test_sign_bolt12_2() {
864        let seed = [0x11u8; 32];
865        let manager = MyKeysManager::new(
866            KeyDerivationStyle::Ldk,
867            &seed,
868            Network::Testnet,
869            FixedStartingTimeFactory::new(1, 1).borrow(),
870        );
871        let secp_ctx = Secp256k1::new();
872
873        let messagename = b"invoice";
874        let fieldname = b"signature";
875        let merkleroot = &[0x22u8; 32];
876        let info = b"test_info";
877        let tweak_message = b"test_tweak";
878
879        let signature = manager
880            .sign_bolt12_2(messagename, fieldname, merkleroot, info, Some(tweak_message))
881            .unwrap();
882
883        let sig_hash = manager.bolt12_message_hash(messagename, fieldname, merkleroot);
884        let keypair = manager.get_bolt12_keypair(Some(info), Some(tweak_message)).unwrap();
885        let msg = Message::from_digest(sig_hash.to_byte_array());
886        assert!(secp_ctx.verify_schnorr(&signature, &msg, &keypair.x_only_public_key().0).is_ok());
887
888        let signature_no_tweak =
889            manager.sign_bolt12_2(messagename, fieldname, merkleroot, info, None).unwrap();
890        let keypair_no_tweak = manager.get_bolt12_keypair(Some(info), None).unwrap();
891        assert!(secp_ctx
892            .verify_schnorr(&signature_no_tweak, &msg, &keypair_no_tweak.x_only_public_key().0)
893            .is_ok());
894    }
895
896    #[test]
897    fn test_derive_secret() {
898        let seed = [0x11u8; 32];
899        let manager = MyKeysManager::new(
900            KeyDerivationStyle::Ldk,
901            &seed,
902            Network::Testnet,
903            FixedStartingTimeFactory::new(1, 1).borrow(),
904        );
905
906        let info1 = b"info1";
907        let secret1 = manager.derive_secret(info1);
908
909        assert_eq!(
910            hex::encode(secret1.secret_bytes()),
911            "f616e36571ed5696cff2b96d54e0c48b0c1e373364d540fd0274e05b6880a0b9"
912        );
913    }
914
915    #[test]
916    fn test_spend_spendable_outputs_static_output() {
917        let seed = [0x11u8; 32];
918        let manager = MyKeysManager::new(
919            KeyDerivationStyle::Ldk,
920            &seed,
921            Network::Testnet,
922            FixedStartingTimeFactory::new(1, 1).borrow(),
923        );
924        let secp_ctx = Secp256k1::new();
925
926        let output = TxOut {
927            value: Amount::from_sat(50_000),
928            script_pubkey: manager.destination_script.clone(),
929        };
930        let descriptor = StaticOutput {
931            outpoint: OutPoint { txid: bitcoin::Txid::all_zeros(), index: 0 },
932            output: output.clone(),
933            channel_keys_id: None,
934        };
935
936        let output_tx = TxOut {
937            value: Amount::from_sat(49_000),
938            script_pubkey: ScriptBuf::new_p2wpkh(&WPubkeyHash::hash(&[0u8; 32])),
939        };
940        let change_script = manager.destination_script.clone();
941        let descriptors = vec![&descriptor as &SpendableOutputDescriptor];
942        let result = manager.spend_spendable_outputs(
943            &descriptors,
944            vec![output_tx],
945            change_script,
946            1000,
947            &secp_ctx,
948        );
949
950        assert!(result.is_ok());
951        let tx = result.unwrap();
952        assert_eq!(tx.input.len(), 1);
953        assert_eq!(tx.input[0].witness.len(), 2);
954
955        let witness = &tx.input[0].witness;
956        let sig = &witness[0][..witness[0].len() - 1];
957        let pubkey = PublicKey::from_slice(&witness[1]).unwrap();
958        let witness_script =
959            bitcoin::Address::p2pkh(&bitcoin::PublicKey::new(pubkey), Network::Testnet)
960                .script_pubkey();
961        let sighash = sighash::SighashCache::new(&tx)
962            .p2wsh_signature_hash(0, &witness_script, output.value, EcdsaSighashType::All)
963            .unwrap();
964        let msg = Message::from(sighash);
965        let sig = secp256k1::ecdsa::Signature::from_der(sig).unwrap();
966        assert!(secp_ctx.verify_ecdsa(&msg, &sig, &pubkey).is_ok());
967    }
968
969    #[test]
970    fn test_spend_spendable_outputs_insufficient_funds() {
971        let seed = [0x11u8; 32];
972        let manager = MyKeysManager::new(
973            KeyDerivationStyle::Ldk,
974            &seed,
975            Network::Testnet,
976            FixedStartingTimeFactory::new(1, 1).borrow(),
977        );
978        let secp_ctx = Secp256k1::new();
979
980        let output = TxOut {
981            value: Amount::from_sat(50_000),
982            script_pubkey: manager.destination_script.clone(),
983        };
984        let descriptor = StaticOutput {
985            outpoint: OutPoint { txid: bitcoin::Txid::all_zeros(), index: 1 },
986            output: output.clone(),
987            channel_keys_id: None,
988        };
989
990        let output_tx = TxOut {
991            value: Amount::from_sat(60_000),
992            script_pubkey: ScriptBuf::new_p2wpkh(&WPubkeyHash::hash(&[0u8; 32])),
993        };
994        let change_script = manager.destination_script.clone();
995        let descriptors = vec![&descriptor as &SpendableOutputDescriptor];
996        let result = manager.spend_spendable_outputs(
997            &descriptors,
998            vec![output_tx],
999            change_script,
1000            1000,
1001            &secp_ctx,
1002        );
1003
1004        assert!(result.is_err());
1005    }
1006
1007    #[test]
1008    fn test_spend_spendable_outputs_duplicate_descriptors() {
1009        let seed = [0x11u8; 32];
1010        let manager = MyKeysManager::new(
1011            KeyDerivationStyle::Ldk,
1012            &seed,
1013            Network::Testnet,
1014            FixedStartingTimeFactory::new(1, 1).borrow(),
1015        );
1016        let secp_ctx = Secp256k1::new();
1017
1018        let output = TxOut {
1019            value: Amount::from_sat(50_000),
1020            script_pubkey: manager.destination_script.clone(),
1021        };
1022        let descriptor = StaticOutput {
1023            outpoint: OutPoint { txid: bitcoin::Txid::all_zeros(), index: 0 },
1024            output: output.clone(),
1025            channel_keys_id: None,
1026        };
1027
1028        let descriptors = vec![
1029            &descriptor as &SpendableOutputDescriptor,
1030            &descriptor as &SpendableOutputDescriptor,
1031        ];
1032        let output_tx = TxOut {
1033            value: Amount::from_sat(49_000),
1034            script_pubkey: ScriptBuf::new_p2wpkh(&WPubkeyHash::hash(&[0u8; 32])),
1035        };
1036        let change_script = manager.destination_script.clone();
1037        let result = manager.spend_spendable_outputs(
1038            &descriptors,
1039            vec![output_tx],
1040            change_script,
1041            1000,
1042            &secp_ctx,
1043        );
1044
1045        assert!(result.is_err());
1046    }
1047}