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
37pub 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 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 pub fn get_onion_reply_secret(&self) -> [u8; 32] {
179 return hkdf_sha256(&self.seed, "onion reply secret".as_bytes(), &[]);
180 }
181
182 pub fn get_bolt12_pubkey(&self) -> PublicKey {
184 PublicKey::from_secret_key(&self.secp_ctx, &self.bolt12_secret)
185 }
186
187 pub fn get_persistence_pubkey(&self) -> PublicKey {
189 PublicKey::from_secret_key(&self.secp_ctx, &self.persistence_secret)
190 }
191
192 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 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 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 sha.input(merkleroot);
256 Sha256::from_engine(sha)
257 }
258
259 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 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 pub fn derive_secret(&self, info: &[u8]) -> SecretKey {
290 let derived_secrets_base = hkdf_sha256(&self.seed, "derived secrets".as_bytes(), &[]);
292 let derived_secret = hkdf_sha256(&derived_secrets_base, info, &[]);
293 SecretKey::from_slice(&derived_secret).unwrap()
295 }
296
297 pub fn get_account_extended_key(&self) -> &Xpriv {
299 &self.account_extended_key
300 }
301
302 pub fn per_commitment_point<X: Signing>(
304 secp_ctx: &Secp256k1<X>,
305 commitment_secret: &[u8; 32],
306 ) -> PublicKey {
307 PublicKey::from_secret_key(secp_ctx, &SecretKey::from_slice(commitment_secret).unwrap())
309 }
310
311 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 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 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 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 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 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 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 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 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 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}