Skip to content

Commit 0b196eb

Browse files
Merge pull request #2432 from jkczyz/2023-07-bolt12-node-signer
Support signing BOLT 12 messages in `NodeSigner`
2 parents 4fb5708 + 39012e3 commit 0b196eb

17 files changed

+1110
-362
lines changed

fuzz/src/chanmon_consistency.rs

+15
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ 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::invoice::UnsignedBolt12Invoice;
48+
use lightning::offers::invoice_request::UnsignedInvoiceRequest;
4749
use lightning::util::enforcing_trait_impls::{EnforcingSigner, EnforcementState};
4850
use lightning::util::errors::APIError;
4951
use lightning::util::logger::Logger;
@@ -57,6 +59,7 @@ use crate::utils::test_persister::TestPersister;
5759
use bitcoin::secp256k1::{Message, PublicKey, SecretKey, Scalar, Secp256k1};
5860
use bitcoin::secp256k1::ecdh::SharedSecret;
5961
use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
62+
use bitcoin::secp256k1::schnorr;
6063

6164
use std::mem;
6265
use std::cmp::{self, Ordering};
@@ -211,6 +214,18 @@ impl NodeSigner for KeyProvider {
211214
unreachable!()
212215
}
213216

217+
fn sign_bolt12_invoice_request(
218+
&self, _invoice_request: &UnsignedInvoiceRequest
219+
) -> Result<schnorr::Signature, ()> {
220+
unreachable!()
221+
}
222+
223+
fn sign_bolt12_invoice(
224+
&self, _invoice: &UnsignedBolt12Invoice,
225+
) -> Result<schnorr::Signature, ()> {
226+
unreachable!()
227+
}
228+
214229
fn sign_gossip_message(&self, msg: lightning::ln::msgs::UnsignedGossipMessage) -> Result<Signature, ()> {
215230
let msg_hash = Message::from_slice(&Sha256dHash::hash(&msg.encode()[..])[..]).map_err(|_| ())?;
216231
let secp_ctx = Secp256k1::signing_only();

fuzz/src/full_stack.rs

+15
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ 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::invoice::UnsignedBolt12Invoice;
44+
use lightning::offers::invoice_request::UnsignedInvoiceRequest;
4345
use lightning::routing::gossip::{P2PGossipSync, NetworkGraph};
4446
use lightning::routing::utxo::UtxoLookup;
4547
use lightning::routing::router::{InFlightHtlcs, PaymentParameters, Route, RouteParameters, Router};
@@ -55,6 +57,7 @@ use crate::utils::test_persister::TestPersister;
5557
use bitcoin::secp256k1::{Message, PublicKey, SecretKey, Scalar, Secp256k1};
5658
use bitcoin::secp256k1::ecdh::SharedSecret;
5759
use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
60+
use bitcoin::secp256k1::schnorr;
5861

5962
use std::cell::RefCell;
6063
use hashbrown::{HashMap, hash_map};
@@ -316,6 +319,18 @@ impl NodeSigner for KeyProvider {
316319
unreachable!()
317320
}
318321

322+
fn sign_bolt12_invoice_request(
323+
&self, _invoice_request: &UnsignedInvoiceRequest
324+
) -> Result<schnorr::Signature, ()> {
325+
unreachable!()
326+
}
327+
328+
fn sign_bolt12_invoice(
329+
&self, _invoice: &UnsignedBolt12Invoice,
330+
) -> Result<schnorr::Signature, ()> {
331+
unreachable!()
332+
}
333+
319334
fn sign_gossip_message(&self, msg: lightning::ln::msgs::UnsignedGossipMessage) -> Result<Signature, ()> {
320335
let msg_hash = Message::from_slice(&Sha256dHash::hash(&msg.encode()[..])[..]).map_err(|_| ())?;
321336
let secp_ctx = Secp256k1::signing_only();

fuzz/src/invoice_request_deser.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
3838
if signing_pubkey == odd_pubkey || signing_pubkey == even_pubkey {
3939
unsigned_invoice
4040
.sign::<_, Infallible>(
41-
|digest| Ok(secp_ctx.sign_schnorr_no_aux_rand(digest, &keys))
41+
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(message.as_ref().as_digest(), &keys))
4242
)
4343
.unwrap()
4444
.write(&mut buffer)
4545
.unwrap();
4646
} else {
4747
unsigned_invoice
4848
.sign::<_, Infallible>(
49-
|digest| Ok(secp_ctx.sign_schnorr_no_aux_rand(digest, &keys))
49+
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(message.as_ref().as_digest(), &keys))
5050
)
5151
.unwrap_err();
5252
}
@@ -69,9 +69,9 @@ fn privkey(byte: u8) -> SecretKey {
6969
SecretKey::from_slice(&[byte; 32]).unwrap()
7070
}
7171

72-
fn build_response<'a, T: secp256k1::Signing + secp256k1::Verification>(
73-
invoice_request: &'a InvoiceRequest, secp_ctx: &Secp256k1<T>
74-
) -> Result<UnsignedBolt12Invoice<'a>, Bolt12SemanticError> {
72+
fn build_response<T: secp256k1::Signing + secp256k1::Verification>(
73+
invoice_request: &InvoiceRequest, secp_ctx: &Secp256k1<T>
74+
) -> Result<UnsignedBolt12Invoice, Bolt12SemanticError> {
7575
let entropy_source = Randomness {};
7676
let paths = vec![
7777
BlindedPath::new_for_message(&[pubkey(43), pubkey(44), pubkey(42)], &entropy_source, secp_ctx).unwrap(),

fuzz/src/offer_deser.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
3030
if let Ok(invoice_request) = build_response(&offer, pubkey) {
3131
invoice_request
3232
.sign::<_, Infallible>(
33-
|digest| Ok(secp_ctx.sign_schnorr_no_aux_rand(digest, &keys))
33+
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(message.as_ref().as_digest(), &keys))
3434
)
3535
.unwrap()
3636
.write(&mut buffer)
@@ -39,9 +39,9 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
3939
}
4040
}
4141

42-
fn build_response<'a>(
43-
offer: &'a Offer, pubkey: PublicKey
44-
) -> Result<UnsignedInvoiceRequest<'a>, Bolt12SemanticError> {
42+
fn build_response(
43+
offer: &Offer, pubkey: PublicKey
44+
) -> Result<UnsignedInvoiceRequest, Bolt12SemanticError> {
4545
let mut builder = offer.request_invoice(vec![42; 64], pubkey)?;
4646

4747
builder = match offer.amount() {

fuzz/src/onion_message.rs

+15
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ 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::invoice::UnsignedBolt12Invoice;
13+
use lightning::offers::invoice_request::UnsignedInvoiceRequest;
1114
use lightning::util::enforcing_trait_impls::EnforcingSigner;
1215
use lightning::util::logger::Logger;
1316
use lightning::util::ser::{Readable, Writeable, Writer};
@@ -153,6 +156,18 @@ impl NodeSigner for KeyProvider {
153156
unreachable!()
154157
}
155158

159+
fn sign_bolt12_invoice_request(
160+
&self, _invoice_request: &UnsignedInvoiceRequest
161+
) -> Result<schnorr::Signature, ()> {
162+
unreachable!()
163+
}
164+
165+
fn sign_bolt12_invoice(
166+
&self, _invoice: &UnsignedBolt12Invoice,
167+
) -> Result<schnorr::Signature, ()> {
168+
unreachable!()
169+
}
170+
156171
fn sign_gossip_message(&self, _msg: lightning::ln::msgs::UnsignedGossipMessage) -> Result<bitcoin::secp256k1::ecdsa::Signature, ()> {
157172
unreachable!()
158173
}

fuzz/src/refund_deser.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
3434
if let Ok(invoice) = build_response(&refund, pubkey, &secp_ctx) {
3535
invoice
3636
.sign::<_, Infallible>(
37-
|digest| Ok(secp_ctx.sign_schnorr_no_aux_rand(digest, &keys))
37+
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(message.as_ref().as_digest(), &keys))
3838
)
3939
.unwrap()
4040
.write(&mut buffer)
@@ -58,9 +58,9 @@ fn privkey(byte: u8) -> SecretKey {
5858
SecretKey::from_slice(&[byte; 32]).unwrap()
5959
}
6060

61-
fn build_response<'a, T: secp256k1::Signing + secp256k1::Verification>(
62-
refund: &'a Refund, signing_pubkey: PublicKey, secp_ctx: &Secp256k1<T>
63-
) -> Result<UnsignedBolt12Invoice<'a>, Bolt12SemanticError> {
61+
fn build_response<T: secp256k1::Signing + secp256k1::Verification>(
62+
refund: &Refund, signing_pubkey: PublicKey, secp_ctx: &Secp256k1<T>
63+
) -> Result<UnsignedBolt12Invoice, Bolt12SemanticError> {
6464
let entropy_source = Randomness {};
6565
let paths = vec![
6666
BlindedPath::new_for_message(&[pubkey(43), pubkey(44), pubkey(42)], &entropy_source, secp_ctx).unwrap(),

0 commit comments

Comments
 (0)