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 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 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 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}