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 lightning::sign::{ChannelSigner, KeysManager};
638    use test_log::test;
639
640    #[test]
641    fn shared_secret_test() {
642        let server_key = SecretKey::from_slice(&[0x22u8; 32]).unwrap();
643        let server_pubkey = PublicKey::from_secret_key(&Secp256k1::new(), &server_key);
644        let manager = MyKeysManager::new(
645            KeyDerivationStyle::Ldk,
646            &[0x11u8; 32],
647            Network::Testnet,
648            FixedStartingTimeFactory::new(1, 1).borrow(),
649        );
650        let client_pubkey = manager.get_persistence_pubkey();
651        let shared_secret = SharedSecret::new(&client_pubkey, &server_key);
652        let shared_secret2 = manager.get_persistence_shared_secret(&server_pubkey);
653        assert_eq!(shared_secret.secret_bytes(), shared_secret2);
654    }
655
656    #[test]
657    fn compare_ldk_keys_manager_test() -> Result<(), ()> {
658        let seed = [0x11u8; 32];
659        let ldk = KeysManager::new(&seed, 1, 1);
660        let my = MyKeysManager::new(
661            KeyDerivationStyle::Ldk,
662            &seed,
663            Network::Testnet,
664            FixedStartingTimeFactory::new(1, 1).borrow(),
665        );
666        assert_eq!(
667            ldk.get_node_id(Recipient::Node).unwrap(),
668            my.get_node_id(Recipient::Node).unwrap()
669        );
670        let key_derive = derive::key_derive(KeyDerivationStyle::Ldk, Testnet);
671        let channel_id = ChannelId::new(&[33u8; 32]);
672        // Get a somewhat random keys_id
673        let keys_id = key_derive.keys_id(channel_id, &my.channel_seed_base);
674        let ldk_chan = ldk.derive_channel_keys(1000, &keys_id);
675        let my_chan = my.derive_channel_keys(1000, &keys_id);
676        let secp_ctx = Secp256k1::new();
677        assert_eq!(ldk_chan.funding_key, my_chan.funding_key);
678        assert_eq!(ldk_chan.revocation_base_key, my_chan.revocation_base_key);
679        assert_eq!(ldk_chan.htlc_base_key, my_chan.htlc_base_key);
680        assert_eq!(ldk_chan.payment_key, my_chan.payment_key);
681        assert_eq!(ldk_chan.delayed_payment_base_key, my_chan.delayed_payment_base_key);
682        assert_eq!(ldk_chan.funding_key, my_chan.funding_key);
683        assert_eq!(
684            ldk_chan.get_per_commitment_point(123, &secp_ctx),
685            my_chan.get_per_commitment_point(123, &secp_ctx)
686        );
687        // a bit redundant, because we checked them all above
688        assert!(ldk_chan.pubkeys() == my_chan.pubkeys());
689        Ok(())
690    }
691
692    #[test]
693    fn keys_test_native() -> Result<(), ()> {
694        let manager = MyKeysManager::new(
695            KeyDerivationStyle::Native,
696            &[0u8; 32],
697            Network::Testnet,
698            FixedStartingTimeFactory::new(0, 0).borrow(),
699        );
700        assert_eq!(
701            hex_encode(&manager.channel_seed_base),
702            "ab7f29780659755f14afb82342dc19db7d817ace8c312e759a244648dfc25e53"
703        );
704        let keys = make_test_keys(manager);
705        assert_eq!(
706            hex_encode(&keys.funding_key[..]),
707            "bf36bee09cc5dd64c8f19e10b258efb1f606722e9ff6fe3267b63e2dbe33dcfc"
708        );
709        assert_eq!(
710            hex_encode(&keys.revocation_base_key[..]),
711            "203612ab8275bab7916b8bf895d45b9dbb639b43d904b34d6449214e9855d345"
712        );
713        assert_eq!(
714            hex_encode(&keys.htlc_base_key[..]),
715            "517c009452b4baa9df42d6c8cddc966e017d49606524ce7728681b593a5659c1"
716        );
717        assert_eq!(
718            hex_encode(&keys.payment_key[..]),
719            "54ce3b75dcc2731604f3db55ecd1520d797a154cc757d6d98c3ffd1e90a9a25a"
720        );
721        assert_eq!(
722            hex_encode(&keys.delayed_payment_base_key[..]),
723            "9f5c122778b12ad35f555437d88b76b726ae4e472897af33e22616fb0d0b0a44"
724        );
725        Ok(())
726    }
727
728    fn make_test_keys(manager: MyKeysManager) -> InMemorySigner {
729        let channel_id = ChannelId::new(&hex_decode(TEST_CHANNEL_ID[0]).unwrap());
730        manager.get_channel_keys_with_id(channel_id, 0)
731    }
732
733    #[test]
734    fn keys_test_lnd() -> Result<(), ()> {
735        let manager = MyKeysManager::new(
736            KeyDerivationStyle::Lnd,
737            &[0u8; 32],
738            Network::Testnet,
739            FixedStartingTimeFactory::new(0, 0).borrow(),
740        );
741        assert_eq!(
742            hex_encode(&manager.channel_seed_base),
743            "ab7f29780659755f14afb82342dc19db7d817ace8c312e759a244648dfc25e53"
744        );
745        let mut channel_id = [0u8; 32];
746        channel_id[0] = 1u8;
747        let keys = make_test_keys(manager);
748        assert_eq!(
749            hex_encode(&keys.funding_key[..]),
750            "0b2f20d28e705daea86a93e6d5646e2f8989956d73c61752e7cf6c4421071e99"
751        );
752        assert_eq!(
753            hex_encode(&keys.revocation_base_key[..]),
754            "920c0b18c7d0979dc7119efb1ca520cf6899c92a3236d146968b521a901eac63"
755        );
756        assert_eq!(
757            hex_encode(&keys.htlc_base_key[..]),
758            "60deb71963b8574f3c8bf5df2d7b851f9c31a866a1c14bd00dae1263a5f27c55"
759        );
760        assert_eq!(
761            hex_encode(&keys.payment_key[..]),
762            "064e32a51f3ed0a41936bd788a80dc91b7521a85da00f02196eddbd32c3d5631"
763        );
764        assert_eq!(
765            hex_encode(&keys.delayed_payment_base_key[..]),
766            "47a6c0532b9e593e84d91451104dc6fe10ba4aa30cd7c95ed039916d3e908b10"
767        );
768        Ok(())
769    }
770
771    #[test]
772    fn per_commit_test() -> Result<(), ()> {
773        let manager = MyKeysManager::new(
774            KeyDerivationStyle::Native,
775            &[0u8; 32],
776            Network::Testnet,
777            FixedStartingTimeFactory::new(0, 0).borrow(),
778        );
779        let mut channel_id = [0u8; 32];
780        channel_id[0] = 1u8;
781        let keys = make_test_keys(manager);
782        assert_eq!(
783            hex_encode(&keys.commitment_seed),
784            "9fc48da6bc75058283b860d5989ffb802b6395ca28c4c3bb9d1da02df6bb0cb3"
785        );
786
787        let secp_ctx = Secp256k1::signing_only();
788        let per_commit_point = MyKeysManager::per_commitment_point(
789            &secp_ctx,
790            &keys.release_commitment_secret(INITIAL_COMMITMENT_NUMBER - 3).unwrap(),
791        );
792        assert_eq!(
793            hex_encode(&per_commit_point.serialize().to_vec()),
794            "03b5497ca60ff3165908c521ea145e742c25dedd14f5602f3f502d1296c39618a5"
795        );
796        Ok(())
797    }
798}