@@ -64,6 +64,7 @@ use crate::ln::wire::Encode;
6464use crate::offers::invoice::{BlindedPayInfo, Bolt12Invoice, DEFAULT_RELATIVE_EXPIRY, DerivedSigningPubkey, ExplicitSigningPubkey, InvoiceBuilder, UnsignedBolt12Invoice};
6565use crate::offers::invoice_error::InvoiceError;
6666use crate::offers::invoice_request::{DerivedPayerId, InvoiceRequestBuilder};
67+ use crate::offers::nonce::Nonce;
6768use crate::offers::offer::{Offer, OfferBuilder};
6869use crate::offers::parse::Bolt12SemanticError;
6970use crate::offers::refund::{Refund, RefundBuilder};
@@ -2254,7 +2255,10 @@ where
22542255 event_persist_notifier: Notifier,
22552256 needs_persist_flag: AtomicBool,
22562257
2258+ #[cfg(not(any(test, feature = "_test_utils")))]
22572259 pending_offers_messages: Mutex<Vec<PendingOnionMessage<OffersMessage>>>,
2260+ #[cfg(any(test, feature = "_test_utils"))]
2261+ pub(crate) pending_offers_messages: Mutex<Vec<PendingOnionMessage<OffersMessage>>>,
22582262
22592263 /// Tracks the message events that are to be broadcasted when we are connected to some peer.
22602264 pending_broadcast_messages: Mutex<Vec<MessageSendEvent>>,
@@ -4199,15 +4203,35 @@ where
41994203 /// whether or not the payment was successful.
42004204 ///
42014205 /// [timer tick]: Self::timer_tick_occurred
4202- pub fn send_payment_for_bolt12_invoice(&self, invoice: &Bolt12Invoice) -> Result<(), Bolt12PaymentError> {
4203- let secp_ctx = &self.secp_ctx;
4204- let expanded_key = &self.inbound_payment_key;
4205- match invoice.verify(expanded_key, secp_ctx ) {
4206+ pub fn send_payment_for_bolt12_invoice(
4207+ &self, invoice: &Bolt12Invoice, context: &OffersContext,
4208+ ) -> Result<(), Bolt12PaymentError> {
4209+ match self.verify_bolt12_invoice(invoice, context ) {
42064210 Ok(payment_id) => self.send_payment_for_verified_bolt12_invoice(invoice, payment_id),
42074211 Err(()) => Err(Bolt12PaymentError::UnexpectedInvoice),
42084212 }
42094213 }
42104214
4215+ fn verify_bolt12_invoice(
4216+ &self, invoice: &Bolt12Invoice, context: &OffersContext,
4217+ ) -> Result<PaymentId, ()> {
4218+ let secp_ctx = &self.secp_ctx;
4219+ let expanded_key = &self.inbound_payment_key;
4220+
4221+ match context {
4222+ OffersContext::Unknown {} if invoice.is_for_refund_without_paths() => {
4223+ invoice.verify_using_metadata(expanded_key, secp_ctx)
4224+ },
4225+ OffersContext::OutboundPayment { payment_id, nonce } => {
4226+ invoice
4227+ .verify_using_payer_data(*payment_id, *nonce, expanded_key, secp_ctx)
4228+ .then(|| *payment_id)
4229+ .ok_or(())
4230+ },
4231+ _ => Err(()),
4232+ }
4233+ }
4234+
42114235 fn send_payment_for_verified_bolt12_invoice(&self, invoice: &Bolt12Invoice, payment_id: PaymentId) -> Result<(), Bolt12PaymentError> {
42124236 let best_block_height = self.best_block.read().unwrap().height;
42134237 let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
@@ -8784,13 +8808,12 @@ macro_rules! create_offer_builder { ($self: ident, $builder: ty) => {
87848808 let entropy = &*$self.entropy_source;
87858809 let secp_ctx = &$self.secp_ctx;
87868810
8787- let path = $self.create_blinded_paths_using_absolute_expiry(OffersContext::Unknown {}, absolute_expiry)
8811+ let nonce = Nonce::from_entropy_source(entropy);
8812+ let context = OffersContext::InvoiceRequest { nonce };
8813+ let path = $self.create_blinded_paths_using_absolute_expiry(context, absolute_expiry)
87888814 .and_then(|paths| paths.into_iter().next().ok_or(()))
87898815 .map_err(|_| Bolt12SemanticError::MissingPaths)?;
8790-
8791- let builder = OfferBuilder::deriving_signing_pubkey(
8792- node_id, expanded_key, entropy, secp_ctx
8793- )
8816+ let builder = OfferBuilder::deriving_signing_pubkey(node_id, expanded_key, nonce, secp_ctx)
87948817 .chain_hash($self.chain_hash)
87958818 .path(path);
87968819
@@ -8858,13 +8881,14 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
88588881 let entropy = &*$self.entropy_source;
88598882 let secp_ctx = &$self.secp_ctx;
88608883
8861- let context = OffersContext::OutboundPayment { payment_id };
8884+ let nonce = Nonce::from_entropy_source(entropy);
8885+ let context = OffersContext::OutboundPayment { payment_id, nonce };
88628886 let path = $self.create_blinded_paths_using_absolute_expiry(context, Some(absolute_expiry))
88638887 .and_then(|paths| paths.into_iter().next().ok_or(()))
88648888 .map_err(|_| Bolt12SemanticError::MissingPaths)?;
88658889
88668890 let builder = RefundBuilder::deriving_payer_id(
8867- node_id, expanded_key, entropy , secp_ctx, amount_msats, payment_id
8891+ node_id, expanded_key, nonce , secp_ctx, amount_msats, payment_id
88688892 )?
88698893 .chain_hash($self.chain_hash)
88708894 .absolute_expiry(absolute_expiry)
@@ -8973,8 +8997,9 @@ where
89738997 let entropy = &*self.entropy_source;
89748998 let secp_ctx = &self.secp_ctx;
89758999
9000+ let nonce = Nonce::from_entropy_source(entropy);
89769001 let builder: InvoiceRequestBuilder<DerivedPayerId, secp256k1::All> = offer
8977- .request_invoice_deriving_payer_id(expanded_key, entropy , secp_ctx, payment_id)?
9002+ .request_invoice_deriving_payer_id(expanded_key, nonce , secp_ctx, payment_id)?
89789003 .into();
89799004 let builder = builder.chain_hash(self.chain_hash)?;
89809005
@@ -8992,8 +9017,9 @@ where
89929017 };
89939018 let invoice_request = builder.build_and_sign()?;
89949019
8995- let context = OffersContext::OutboundPayment { payment_id };
8996- let reply_paths = self.create_blinded_paths(context).map_err(|_| Bolt12SemanticError::MissingPaths)?;
9020+ let context = OffersContext::OutboundPayment { payment_id, nonce };
9021+ let reply_paths = self.create_blinded_paths(context)
9022+ .map_err(|_| Bolt12SemanticError::MissingPaths)?;
89979023
89989024 let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
89999025
@@ -10692,7 +10718,7 @@ where
1069210718
1069310719 let abandon_if_payment = |context| {
1069410720 match context {
10695- OffersContext::OutboundPayment { payment_id } => self.abandon_payment(payment_id),
10721+ OffersContext::OutboundPayment { payment_id, .. } => self.abandon_payment(payment_id),
1069610722 _ => {},
1069710723 }
1069810724 };
@@ -10703,19 +10729,32 @@ where
1070310729 Some(responder) => responder,
1070410730 None => return ResponseInstruction::NoResponse,
1070510731 };
10732+
10733+ let nonce = match context {
10734+ OffersContext::Unknown {} if invoice_request.metadata().is_some() => None,
10735+ OffersContext::InvoiceRequest { nonce } => Some(nonce),
10736+ _ => return ResponseInstruction::NoResponse,
10737+ };
10738+
10739+ let invoice_request = match nonce {
10740+ Some(nonce) => match invoice_request.verify_using_recipient_data(
10741+ nonce, expanded_key, secp_ctx,
10742+ ) {
10743+ Ok(invoice_request) => invoice_request,
10744+ Err(()) => return ResponseInstruction::NoResponse,
10745+ },
10746+ None => match invoice_request.verify_using_metadata(expanded_key, secp_ctx) {
10747+ Ok(invoice_request) => invoice_request,
10748+ Err(()) => return ResponseInstruction::NoResponse,
10749+ },
10750+ };
10751+
1070610752 let amount_msats = match InvoiceBuilder::<DerivedSigningPubkey>::amount_msats(
10707- &invoice_request
10753+ &invoice_request.inner
1070810754 ) {
1070910755 Ok(amount_msats) => amount_msats,
1071010756 Err(error) => return responder.respond(OffersMessage::InvoiceError(error.into())),
1071110757 };
10712- let invoice_request = match invoice_request.verify(expanded_key, secp_ctx) {
10713- Ok(invoice_request) => invoice_request,
10714- Err(()) => {
10715- let error = Bolt12SemanticError::InvalidMetadata;
10716- return responder.respond(OffersMessage::InvoiceError(error.into()));
10717- },
10718- };
1071910758
1072010759 let relative_expiry = DEFAULT_RELATIVE_EXPIRY.as_secs() as u32;
1072110760 let (payment_hash, payment_secret) = match self.create_inbound_payment(
@@ -10788,24 +10827,28 @@ where
1078810827 }
1078910828 },
1079010829 OffersMessage::Invoice(invoice) => {
10791- let result = match invoice.verify(expanded_key, secp_ctx) {
10792- Ok(payment_id) => {
10793- let features = self.bolt12_invoice_features();
10794- if invoice.invoice_features().requires_unknown_bits_from(&features) {
10795- Err(InvoiceError::from(Bolt12SemanticError::UnknownRequiredFeatures))
10796- } else if self.default_configuration.manually_handle_bolt12_invoices {
10797- let event = Event::InvoiceReceived { payment_id, invoice, responder };
10798- self.pending_events.lock().unwrap().push_back((event, None));
10799- return ResponseInstruction::NoResponse;
10800- } else {
10801- self.send_payment_for_verified_bolt12_invoice(&invoice, payment_id)
10802- .map_err(|e| {
10803- log_trace!(self.logger, "Failed paying invoice: {:?}", e);
10804- InvoiceError::from_string(format!("{:?}", e))
10805- })
10806- }
10807- },
10808- Err(()) => Err(InvoiceError::from_string("Unrecognized invoice".to_owned())),
10830+ let payment_id = match self.verify_bolt12_invoice(&invoice, &context) {
10831+ Ok(payment_id) => payment_id,
10832+ Err(()) => return ResponseInstruction::NoResponse,
10833+ };
10834+
10835+ let result = {
10836+ let features = self.bolt12_invoice_features();
10837+ if invoice.invoice_features().requires_unknown_bits_from(&features) {
10838+ Err(InvoiceError::from(Bolt12SemanticError::UnknownRequiredFeatures))
10839+ } else if self.default_configuration.manually_handle_bolt12_invoices {
10840+ let event = Event::InvoiceReceived {
10841+ payment_id, invoice, context, responder,
10842+ };
10843+ self.pending_events.lock().unwrap().push_back((event, None));
10844+ return ResponseInstruction::NoResponse;
10845+ } else {
10846+ self.send_payment_for_verified_bolt12_invoice(&invoice, payment_id)
10847+ .map_err(|e| {
10848+ log_trace!(self.logger, "Failed paying invoice: {:?}", e);
10849+ InvoiceError::from_string(format!("{:?}", e))
10850+ })
10851+ }
1080910852 };
1081010853
1081110854 match result {
0 commit comments