Skip to content

Commit 9859434

Browse files
committed
Provide the signer with a full RawBolt11Invoice to sign
Now that the `lightning` crate depends on the `lightning-invoice` crate, there's no reason to have the `sign_invoice` method take raw base32 field elements as we can now give it a real `RawBolt11Invoice`, which we do here. This simplifies the interface and avoids a serialization-deserialization roundtrip when signing invoices in a validating signer. FIxes #3227
1 parent 5f1af64 commit 9859434

File tree

8 files changed

+27
-63
lines changed

8 files changed

+27
-63
lines changed

fuzz/src/chanmon_consistency.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ use lightning::util::logger::Logger;
7171
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
7272
use lightning::util::test_channel_signer::{EnforcementState, TestChannelSigner};
7373

74+
use lightning_invoice::RawBolt11Invoice;
75+
7476
use crate::utils::test_logger::{self, Output};
7577
use crate::utils::test_persister::TestPersister;
7678

@@ -79,7 +81,6 @@ use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
7981
use bitcoin::secp256k1::schnorr;
8082
use bitcoin::secp256k1::{self, Message, PublicKey, Scalar, Secp256k1, SecretKey};
8183

82-
use bech32::u5;
8384
use std::cmp::{self, Ordering};
8485
use std::io::Cursor;
8586
use std::mem;
@@ -332,7 +333,7 @@ impl NodeSigner for KeyProvider {
332333
}
333334

334335
fn sign_invoice(
335-
&self, _hrp_bytes: &[u8], _invoice_data: &[u5], _recipient: Recipient,
336+
&self, _invoice: &RawBolt11Invoice, _recipient: Recipient,
336337
) -> Result<RecoverableSignature, ()> {
337338
unreachable!()
338339
}

fuzz/src/full_stack.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ use lightning::util::logger::Logger;
6868
use lightning::util::ser::{Readable, ReadableArgs, Writeable};
6969
use lightning::util::test_channel_signer::{EnforcementState, TestChannelSigner};
7070

71+
use lightning_invoice::RawBolt11Invoice;
72+
7173
use crate::utils::test_logger;
7274
use crate::utils::test_persister::TestPersister;
7375

@@ -76,7 +78,6 @@ use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
7678
use bitcoin::secp256k1::schnorr;
7779
use bitcoin::secp256k1::{self, Message, PublicKey, Scalar, Secp256k1, SecretKey};
7880

79-
use bech32::u5;
8081
use std::cell::RefCell;
8182
use std::cmp;
8283
use std::convert::TryInto;
@@ -406,7 +407,7 @@ impl NodeSigner for KeyProvider {
406407
}
407408

408409
fn sign_invoice(
409-
&self, _hrp_bytes: &[u8], _invoice_data: &[u5], _recipient: Recipient,
410+
&self, _invoice: &RawBolt11Invoice, _recipient: Recipient,
410411
) -> Result<RecoverableSignature, ()> {
411412
unreachable!()
412413
}

fuzz/src/onion_message.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
// Imports that need to be added manually
2-
use bech32::u5;
32
use bitcoin::script::ScriptBuf;
43
use bitcoin::secp256k1::ecdh::SharedSecret;
54
use bitcoin::secp256k1::ecdsa::RecoverableSignature;
@@ -27,6 +26,8 @@ use lightning::util::logger::Logger;
2726
use lightning::util::ser::{Readable, Writeable, Writer};
2827
use lightning::util::test_channel_signer::TestChannelSigner;
2928

29+
use lightning_invoice::RawBolt11Invoice;
30+
3031
use crate::utils::test_logger;
3132

3233
use std::io::{self, Cursor};
@@ -225,7 +226,7 @@ impl NodeSigner for KeyProvider {
225226
}
226227

227228
fn sign_invoice(
228-
&self, _hrp_bytes: &[u8], _invoice_data: &[u5], _recipient: Recipient,
229+
&self, _invoice: &RawBolt11Invoice, _recipient: Recipient,
229230
) -> Result<RecoverableSignature, ()> {
230231
unreachable!()
231232
}

lightning/src/ln/invoice_utils.rs

+4-9
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use lightning_invoice::{Description, Bolt11InvoiceDescription, Sha256};
55

66
use crate::prelude::*;
77

8-
use bech32::ToBase32;
98
use bitcoin::hashes::Hash;
109
use crate::chain;
1110
use crate::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
@@ -219,10 +218,8 @@ where
219218
Ok(inv) => inv,
220219
Err(e) => return Err(SignOrCreationError::CreationError(e))
221220
};
222-
let hrp_str = raw_invoice.hrp.to_string();
223-
let hrp_bytes = hrp_str.as_bytes();
224-
let data_without_signature = raw_invoice.data.to_base32();
225-
let signed_raw_invoice = raw_invoice.sign(|_| node_signer.sign_invoice(hrp_bytes, &data_without_signature, Recipient::PhantomNode));
221+
let signature = node_signer.sign_invoice(&raw_invoice, Recipient::PhantomNode);
222+
let signed_raw_invoice = raw_invoice.sign(|_| signature);
226223
match signed_raw_invoice {
227224
Ok(inv) => Ok(Bolt11Invoice::from_signed(inv).unwrap()),
228225
Err(e) => Err(SignOrCreationError::SignError(e))
@@ -571,10 +568,8 @@ fn _create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_has
571568
Ok(inv) => inv,
572569
Err(e) => return Err(SignOrCreationError::CreationError(e))
573570
};
574-
let hrp_str = raw_invoice.hrp.to_string();
575-
let hrp_bytes = hrp_str.as_bytes();
576-
let data_without_signature = raw_invoice.data.to_base32();
577-
let signed_raw_invoice = raw_invoice.sign(|_| node_signer.sign_invoice(hrp_bytes, &data_without_signature, Recipient::Node));
571+
let signature = node_signer.sign_invoice(&raw_invoice, Recipient::Node);
572+
let signed_raw_invoice = raw_invoice.sign(|_| signature);
578573
match signed_raw_invoice {
579574
Ok(inv) => Ok(Bolt11Invoice::from_signed(inv).unwrap()),
580575
Err(e) => Err(SignOrCreationError::SignError(e))

lightning/src/sign/mod.rs

+9-15
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ use bitcoin::sighash::EcdsaSighashType;
2424
use bitcoin::transaction::Version;
2525
use bitcoin::transaction::{Transaction, TxIn, TxOut};
2626

27-
use bech32::u5;
2827
use bitcoin::hashes::sha256::Hash as Sha256;
2928
use bitcoin::hashes::sha256d::Hash as Sha256dHash;
3029
use bitcoin::hashes::{Hash, HashEngine};
@@ -37,6 +36,8 @@ use bitcoin::secp256k1::All;
3736
use bitcoin::secp256k1::{Keypair, PublicKey, Scalar, Secp256k1, SecretKey, Signing};
3837
use bitcoin::{secp256k1, Psbt, Sequence, Txid, WPubkeyHash, Witness};
3938

39+
use lightning_invoice::RawBolt11Invoice;
40+
4041
use crate::chain::transaction::OutPoint;
4142
use crate::crypto::utils::{hkdf_extract_expand_twice, sign, sign_with_aux_rand};
4243
use crate::ln::chan_utils;
@@ -69,7 +70,6 @@ use crate::sign::ecdsa::EcdsaChannelSigner;
6970
#[cfg(taproot)]
7071
use crate::sign::taproot::TaprootChannelSigner;
7172
use crate::util::atomic_counter::AtomicCounter;
72-
use crate::util::invoice::construct_invoice_preimage;
7373
use core::convert::TryInto;
7474
use core::ops::Deref;
7575
use core::sync::atomic::{AtomicUsize, Ordering};
@@ -867,7 +867,7 @@ pub trait NodeSigner {
867867
///
868868
/// Errors if the [`Recipient`] variant is not supported by the implementation.
869869
fn sign_invoice(
870-
&self, hrp_bytes: &[u8], invoice_data: &[u5], recipient: Recipient,
870+
&self, invoice: &RawBolt11Invoice, recipient: Recipient,
871871
) -> Result<RecoverableSignature, ()>;
872872

873873
/// Signs the [`TaggedHash`] of a BOLT 12 invoice request.
@@ -2174,17 +2174,14 @@ impl NodeSigner for KeysManager {
21742174
}
21752175

21762176
fn sign_invoice(
2177-
&self, hrp_bytes: &[u8], invoice_data: &[u5], recipient: Recipient,
2177+
&self, invoice: &RawBolt11Invoice, recipient: Recipient,
21782178
) -> Result<RecoverableSignature, ()> {
2179-
let preimage = construct_invoice_preimage(&hrp_bytes, &invoice_data);
2179+
let hash = invoice.signable_hash();
21802180
let secret = match recipient {
21812181
Recipient::Node => Ok(&self.node_secret),
21822182
Recipient::PhantomNode => Err(()),
21832183
}?;
2184-
Ok(self.secp_ctx.sign_ecdsa_recoverable(
2185-
&hash_to_message!(&Sha256::hash(&preimage).to_byte_array()),
2186-
secret,
2187-
))
2184+
Ok(self.secp_ctx.sign_ecdsa_recoverable(&hash_to_message!(&hash), secret))
21882185
}
21892186

21902187
fn sign_bolt12_invoice_request(
@@ -2352,17 +2349,14 @@ impl NodeSigner for PhantomKeysManager {
23522349
}
23532350

23542351
fn sign_invoice(
2355-
&self, hrp_bytes: &[u8], invoice_data: &[u5], recipient: Recipient,
2352+
&self, invoice: &RawBolt11Invoice, recipient: Recipient,
23562353
) -> Result<RecoverableSignature, ()> {
2357-
let preimage = construct_invoice_preimage(&hrp_bytes, &invoice_data);
2354+
let hash = invoice.signable_hash();
23582355
let secret = match recipient {
23592356
Recipient::Node => &self.inner.node_secret,
23602357
Recipient::PhantomNode => &self.phantom_secret,
23612358
};
2362-
Ok(self.inner.secp_ctx.sign_ecdsa_recoverable(
2363-
&hash_to_message!(&Sha256::hash(&preimage).to_byte_array()),
2364-
secret,
2365-
))
2359+
Ok(self.inner.secp_ctx.sign_ecdsa_recoverable(&hash_to_message!(&hash), secret))
23662360
}
23672361

23682362
fn sign_bolt12_invoice_request(

lightning/src/util/invoice.rs

-28
This file was deleted.

lightning/src/util/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ pub mod ser_macros;
1818
pub mod errors;
1919
pub mod ser;
2020
pub mod message_signing;
21-
pub mod invoice;
2221
pub mod persist;
2322
pub mod scid_utils;
2423
pub mod sweep;

lightning/src/util/test_utils.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,15 @@ use bitcoin::secp256k1::ecdh::SharedSecret;
6565
use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
6666
use bitcoin::secp256k1::schnorr;
6767

68+
use lightning_invoice::RawBolt11Invoice;
69+
6870
use crate::io;
6971
use crate::prelude::*;
7072
use core::cell::RefCell;
7173
use core::time::Duration;
7274
use crate::sync::{Mutex, Arc};
7375
use core::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
7476
use core::mem;
75-
use bech32::u5;
7677
use crate::sign::{InMemorySigner, RandomBytes, Recipient, EntropySource, NodeSigner, SignerProvider};
7778

7879
#[cfg(feature = "std")]
@@ -1217,7 +1218,7 @@ impl NodeSigner for TestNodeSigner {
12171218
Ok(SharedSecret::new(other_key, &node_secret))
12181219
}
12191220

1220-
fn sign_invoice(&self, _: &[u8], _: &[bech32::u5], _: Recipient) -> Result<bitcoin::secp256k1::ecdsa::RecoverableSignature, ()> {
1221+
fn sign_invoice(&self, _: &RawBolt11Invoice, _: Recipient) -> Result<RecoverableSignature, ()> {
12211222
unreachable!()
12221223
}
12231224

@@ -1270,8 +1271,8 @@ impl NodeSigner for TestKeysInterface {
12701271
self.backing.get_inbound_payment_key_material()
12711272
}
12721273

1273-
fn sign_invoice(&self, hrp_bytes: &[u8], invoice_data: &[u5], recipient: Recipient) -> Result<RecoverableSignature, ()> {
1274-
self.backing.sign_invoice(hrp_bytes, invoice_data, recipient)
1274+
fn sign_invoice(&self, invoice: &RawBolt11Invoice, recipient: Recipient) -> Result<RecoverableSignature, ()> {
1275+
self.backing.sign_invoice(invoice, recipient)
12751276
}
12761277

12771278
fn sign_bolt12_invoice_request(

0 commit comments

Comments
 (0)