Skip to content

Commit b7e1a0a

Browse files
committed
Support signing BOLT 12 messages in NodeSigner
BOLT 12 messages need to be signed in the following scenarios: - constructing an InvoiceRequest after scanning an Offer, - constructing an Invoice after scanning a Refund, and - constructing an Invoice when handling an InvoiceRequest. Extend the NodeSigner trait to support signing BOLT 12 messages such that it can be used in these contexts. The method could be used then in OnionMessenger and an OffersMessageHandler.
1 parent bb4e7dc commit b7e1a0a

File tree

5 files changed

+64
-1
lines changed

5 files changed

+64
-1
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ use lightning::ln::channel::FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE;
4444
use lightning::ln::msgs::{self, CommitmentUpdate, ChannelMessageHandler, DecodeError, UpdateAddHTLC, Init};
4545
use lightning::ln::script::ShutdownScript;
4646
use lightning::ln::functional_test_utils::*;
47+
use lightning::offers::merkle::TaggedHash;
4748
use lightning::util::enforcing_trait_impls::{EnforcingSigner, EnforcementState};
4849
use lightning::util::errors::APIError;
4950
use lightning::util::logger::Logger;
@@ -57,6 +58,7 @@ use crate::utils::test_persister::TestPersister;
5758
use bitcoin::secp256k1::{Message, PublicKey, SecretKey, Scalar, Secp256k1};
5859
use bitcoin::secp256k1::ecdh::SharedSecret;
5960
use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
61+
use bitcoin::secp256k1::schnorr;
6062

6163
use std::mem;
6264
use std::cmp::{self, Ordering};
@@ -211,6 +213,12 @@ impl NodeSigner for KeyProvider {
211213
unreachable!()
212214
}
213215

216+
fn sign_bolt12_message(
217+
&self, _message: &TaggedHash, _metadata: &[u8]
218+
) -> Result<schnorr::Signature, ()> {
219+
unreachable!()
220+
}
221+
214222
fn sign_gossip_message(&self, msg: lightning::ln::msgs::UnsignedGossipMessage) -> Result<Signature, ()> {
215223
let msg_hash = Message::from_slice(&Sha256dHash::hash(&msg.encode()[..])[..]).map_err(|_| ())?;
216224
let secp_ctx = Secp256k1::signing_only();

fuzz/src/full_stack.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,Ig
4040
use lightning::ln::msgs::{self, DecodeError};
4141
use lightning::ln::script::ShutdownScript;
4242
use lightning::ln::functional_test_utils::*;
43+
use lightning::offers::merkle::TaggedHash;
4344
use lightning::routing::gossip::{P2PGossipSync, NetworkGraph};
4445
use lightning::routing::utxo::UtxoLookup;
4546
use lightning::routing::router::{InFlightHtlcs, PaymentParameters, Route, RouteParameters, Router};
@@ -55,6 +56,7 @@ use crate::utils::test_persister::TestPersister;
5556
use bitcoin::secp256k1::{Message, PublicKey, SecretKey, Scalar, Secp256k1};
5657
use bitcoin::secp256k1::ecdh::SharedSecret;
5758
use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
59+
use bitcoin::secp256k1::schnorr;
5860

5961
use std::cell::RefCell;
6062
use hashbrown::{HashMap, hash_map};
@@ -316,6 +318,12 @@ impl NodeSigner for KeyProvider {
316318
unreachable!()
317319
}
318320

321+
fn sign_bolt12_message(
322+
&self, _message: &TaggedHash, _metadata: &[u8]
323+
) -> Result<schnorr::Signature, ()> {
324+
unreachable!()
325+
}
326+
319327
fn sign_gossip_message(&self, msg: lightning::ln::msgs::UnsignedGossipMessage) -> Result<Signature, ()> {
320328
let msg_hash = Message::from_slice(&Sha256dHash::hash(&msg.encode()[..])[..]).map_err(|_| ())?;
321329
let secp_ctx = Secp256k1::signing_only();

fuzz/src/onion_message.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ use bitcoin::blockdata::script::Script;
44
use bitcoin::secp256k1::{PublicKey, Scalar, Secp256k1, SecretKey};
55
use bitcoin::secp256k1::ecdh::SharedSecret;
66
use bitcoin::secp256k1::ecdsa::RecoverableSignature;
7+
use bitcoin::secp256k1::schnorr;
78

89
use lightning::sign::{Recipient, KeyMaterial, EntropySource, NodeSigner, SignerProvider};
910
use lightning::ln::msgs::{self, DecodeError, OnionMessageHandler};
1011
use lightning::ln::script::ShutdownScript;
12+
use lightning::offers::merkle::TaggedHash;
1113
use lightning::util::enforcing_trait_impls::EnforcingSigner;
1214
use lightning::util::logger::Logger;
1315
use lightning::util::ser::{Readable, Writeable, Writer};
@@ -153,6 +155,12 @@ impl NodeSigner for KeyProvider {
153155
unreachable!()
154156
}
155157

158+
fn sign_bolt12_message(
159+
&self, _message: &TaggedHash, _metadata: &[u8]
160+
) -> Result<schnorr::Signature, ()> {
161+
unreachable!()
162+
}
163+
156164
fn sign_gossip_message(&self, _msg: lightning::ln::msgs::UnsignedGossipMessage) -> Result<bitcoin::secp256k1::ecdsa::Signature, ()> {
157165
unreachable!()
158166
}

lightning/src/sign/mod.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ use bitcoin::hashes::sha256::Hash as Sha256;
2626
use bitcoin::hashes::sha256d::Hash as Sha256dHash;
2727
use bitcoin::hash_types::WPubkeyHash;
2828

29-
use bitcoin::secp256k1::{PublicKey, Scalar, Secp256k1, SecretKey, Signing};
29+
use bitcoin::secp256k1::{KeyPair, PublicKey, Scalar, Secp256k1, SecretKey, Signing};
3030
use bitcoin::secp256k1::ecdh::SharedSecret;
3131
use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
32+
use bitcoin::secp256k1::schnorr;
3233
use bitcoin::{PackedLockTime, secp256k1, Sequence, Witness};
3334

3435
use crate::util::transaction_utils;
@@ -42,6 +43,7 @@ use crate::ln::{chan_utils, PaymentPreimage};
4243
use crate::ln::chan_utils::{HTLCOutputInCommitment, make_funding_redeemscript, ChannelPublicKeys, HolderCommitmentTransaction, ChannelTransactionParameters, CommitmentTransaction, ClosingTransaction};
4344
use crate::ln::msgs::{UnsignedChannelAnnouncement, UnsignedGossipMessage};
4445
use crate::ln::script::ShutdownScript;
46+
use crate::offers::merkle::TaggedHash;
4547

4648
use crate::prelude::*;
4749
use core::convert::TryInto;
@@ -620,6 +622,15 @@ pub trait NodeSigner {
620622
/// Errors if the [`Recipient`] variant is not supported by the implementation.
621623
fn sign_invoice(&self, hrp_bytes: &[u8], invoice_data: &[u5], recipient: Recipient) -> Result<RecoverableSignature, ()>;
622624

625+
/// Signs a BOLT 12 message.
626+
///
627+
/// See [`SignFunction`] for details.
628+
///
629+
/// [`SignFunction`]: crate::offers::merkle::SignFunction
630+
fn sign_bolt12_message(
631+
&self, message: &TaggedHash, metadata: &[u8]
632+
) -> Result<schnorr::Signature, ()>;
633+
623634
/// Sign a gossip message.
624635
///
625636
/// Note that if this fails, LDK may panic and the message will not be broadcast to the network
@@ -1453,6 +1464,14 @@ impl NodeSigner for KeysManager {
14531464
Ok(self.secp_ctx.sign_ecdsa_recoverable(&hash_to_message!(&Sha256::hash(&preimage)), secret))
14541465
}
14551466

1467+
fn sign_bolt12_message(
1468+
&self, message: &TaggedHash, _metadata: &[u8]
1469+
) -> Result<schnorr::Signature, ()> {
1470+
let keys = KeyPair::from_secret_key(&self.secp_ctx, &self.node_secret);
1471+
let aux_rand = self.get_secure_random_bytes();
1472+
Ok(self.secp_ctx.sign_schnorr_with_aux_rand(&message.to_digest(), &keys, &aux_rand))
1473+
}
1474+
14561475
fn sign_gossip_message(&self, msg: UnsignedGossipMessage) -> Result<Signature, ()> {
14571476
let msg_hash = hash_to_message!(&Sha256dHash::hash(&msg.encode()[..])[..]);
14581477
Ok(self.secp_ctx.sign_ecdsa(&msg_hash, &self.node_secret))
@@ -1561,6 +1580,12 @@ impl NodeSigner for PhantomKeysManager {
15611580
Ok(self.inner.secp_ctx.sign_ecdsa_recoverable(&hash_to_message!(&Sha256::hash(&preimage)), secret))
15621581
}
15631582

1583+
fn sign_bolt12_message(
1584+
&self, message: &TaggedHash, metadata: &[u8]
1585+
) -> Result<schnorr::Signature, ()> {
1586+
self.inner.sign_bolt12_message(message, metadata)
1587+
}
1588+
15641589
fn sign_gossip_message(&self, msg: UnsignedGossipMessage) -> Result<Signature, ()> {
15651590
self.inner.sign_gossip_message(msg)
15661591
}

lightning/src/util/test_utils.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use crate::ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
2323
use crate::ln::{msgs, wire};
2424
use crate::ln::msgs::LightningError;
2525
use crate::ln::script::ShutdownScript;
26+
use crate::offers::merkle::TaggedHash;
2627
use crate::routing::gossip::{EffectiveCapacity, NetworkGraph, NodeId};
2728
use crate::routing::utxo::{UtxoLookup, UtxoLookupError, UtxoResult};
2829
use crate::routing::router::{find_route, InFlightHtlcs, Path, Route, RouteParameters, Router, ScorerAccountingForInFlightHtlcs};
@@ -44,6 +45,7 @@ use bitcoin::hash_types::{BlockHash, Txid};
4445
use bitcoin::secp256k1::{PublicKey, Scalar, Secp256k1, SecretKey};
4546
use bitcoin::secp256k1::ecdh::SharedSecret;
4647
use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
48+
use bitcoin::secp256k1::schnorr;
4749

4850
use regex;
4951

@@ -795,6 +797,12 @@ impl NodeSigner for TestNodeSigner {
795797
unreachable!()
796798
}
797799

800+
fn sign_bolt12_message(
801+
&self, _message: &TaggedHash, _metadata: &[u8]
802+
) -> Result<schnorr::Signature, ()> {
803+
unreachable!()
804+
}
805+
798806
fn sign_gossip_message(&self, _msg: msgs::UnsignedGossipMessage) -> Result<Signature, ()> {
799807
unreachable!()
800808
}
@@ -835,6 +843,12 @@ impl NodeSigner for TestKeysInterface {
835843
self.backing.sign_invoice(hrp_bytes, invoice_data, recipient)
836844
}
837845

846+
fn sign_bolt12_message(
847+
&self, message: &TaggedHash, metadata: &[u8]
848+
) -> Result<schnorr::Signature, ()> {
849+
self.backing.sign_bolt12_message(message, metadata)
850+
}
851+
838852
fn sign_gossip_message(&self, msg: msgs::UnsignedGossipMessage) -> Result<Signature, ()> {
839853
self.backing.sign_gossip_message(msg)
840854
}

0 commit comments

Comments
 (0)