From a466f2e2f475eb12209f57ab67463139c8e18622 Mon Sep 17 00:00:00 2001 From: Jeffrey Czyz Date: Thu, 1 Aug 2024 17:25:44 -0500 Subject: [PATCH] Add issuer_signing_pubkey to Bolt12Invoice Useful for determining if the signing_pubkey is the issuer_signing_pubkey or is from a blinded path. --- lightning/src/offers/invoice.rs | 43 ++++++++++++++++++++++++++ lightning/src/offers/invoice_macros.rs | 5 --- lightning/src/offers/static_invoice.rs | 30 ++++++++++++++++++ 3 files changed, 73 insertions(+), 5 deletions(-) diff --git a/lightning/src/offers/invoice.rs b/lightning/src/offers/invoice.rs index 144ed4ef0..eae1c14dc 100644 --- a/lightning/src/offers/invoice.rs +++ b/lightning/src/offers/invoice.rs @@ -714,6 +714,16 @@ macro_rules! invoice_accessors { ($self: ident, $contents: expr) => { $contents.supported_quantity() } + /// The public key used by the recipient to sign invoices. + /// + /// From [`Offer::issuer_signing_pubkey`] and may be `None`; also `None` if the invoice was + /// created in response to a [`Refund`]. + /// + /// [`Offer::issuer_signing_pubkey`]: crate::offers::offer::Offer::issuer_signing_pubkey + pub fn issuer_signing_pubkey(&$self) -> Option { + $contents.issuer_signing_pubkey() + } + /// An unpredictable series of bytes from the payer. /// /// From [`InvoiceRequest::payer_metadata`] or [`Refund::payer_metadata`]. @@ -761,13 +771,37 @@ macro_rules! invoice_accessors { ($self: ident, $contents: expr) => { } } } + +macro_rules! invoice_accessors_signing_pubkey { + ($self: ident, $contents: expr, $invoice_type: ty) => +{ + /// A typically transient public key corresponding to the key used to sign the invoice. + /// + /// If the invoices was created in response to an [`Offer`], then this will be: + /// - [`Offer::issuer_signing_pubkey`] if it's `Some`, otherwise + /// - the final blinded node id from a [`BlindedMessagePath`] in [`Offer::paths`] if `None`. + /// + /// If the invoice was created in response to a [`Refund`], then it is a valid pubkey chosen by + /// the recipient. + /// + /// [`Offer`]: crate::offers::offer::Offer + /// [`Offer::issuer_signing_pubkey`]: crate::offers::offer::Offer::issuer_signing_pubkey + /// [`Offer::paths`]: crate::offers::offer::Offer::paths + /// [`Refund`]: crate::offers::refund::Refund + pub fn signing_pubkey(&$self) -> PublicKey { + $contents.signing_pubkey() + } +} } + impl UnsignedBolt12Invoice { invoice_accessors_common!(self, self.contents, Bolt12Invoice); + invoice_accessors_signing_pubkey!(self, self.contents, Bolt12Invoice); invoice_accessors!(self, self.contents); } impl Bolt12Invoice { invoice_accessors_common!(self, self.contents, Bolt12Invoice); + invoice_accessors_signing_pubkey!(self, self.contents, Bolt12Invoice); invoice_accessors!(self, self.contents); /// Signature of the invoice verified using [`Bolt12Invoice::signing_pubkey`]. @@ -954,6 +988,15 @@ impl InvoiceContents { } } + fn issuer_signing_pubkey(&self) -> Option { + match self { + InvoiceContents::ForOffer { invoice_request, .. } => { + invoice_request.inner.offer.issuer_signing_pubkey() + }, + InvoiceContents::ForRefund { .. } => None, + } + } + fn payer_metadata(&self) -> &[u8] { match self { InvoiceContents::ForOffer { invoice_request, .. } => invoice_request.metadata(), diff --git a/lightning/src/offers/invoice_macros.rs b/lightning/src/offers/invoice_macros.rs index 3037ccfa8..c41ff8b24 100644 --- a/lightning/src/offers/invoice_macros.rs +++ b/lightning/src/offers/invoice_macros.rs @@ -139,11 +139,6 @@ macro_rules! invoice_accessors_common { ($self: ident, $contents: expr, $invoice pub fn invoice_features(&$self) -> &Bolt12InvoiceFeatures { $contents.features() } - - /// The public key corresponding to the key used to sign the invoice. - pub fn signing_pubkey(&$self) -> PublicKey { - $contents.signing_pubkey() - } } } pub(super) use invoice_accessors_common; diff --git a/lightning/src/offers/static_invoice.rs b/lightning/src/offers/static_invoice.rs index 2163d5ef4..81fc8bc3b 100644 --- a/lightning/src/offers/static_invoice.rs +++ b/lightning/src/offers/static_invoice.rs @@ -241,6 +241,30 @@ macro_rules! invoice_accessors { ($self: ident, $contents: expr) => { pub fn supported_quantity(&$self) -> Quantity { $contents.supported_quantity() } + + /// The public key used by the recipient to sign invoices, from + /// [`Offer::issuer_signing_pubkey`]. + /// + /// [`Offer::issuer_signing_pubkey`]: crate::offers::offer::Offer::issuer_signing_pubkey + pub fn issuer_signing_pubkey(&$self) -> Option { + $contents.issuer_signing_pubkey() + } +} } + +macro_rules! invoice_accessors_signing_pubkey { + ($self: ident, $contents: expr, $invoice_type: ty) => +{ + /// The public key corresponding to the key used to sign the invoice. + /// + /// This will be: + /// - [`Offer::issuer_signing_pubkey`] if it's `Some`, otherwise + /// - the final blinded node id from a [`BlindedMessagePath`] in [`Offer::paths`] if `None`. + /// + /// [`Offer::issuer_signing_pubkey`]: crate::offers::offer::Offer::issuer_signing_pubkey + /// [`Offer::paths`]: crate::offers::offer::Offer::paths + pub fn signing_pubkey(&$self) -> PublicKey { + $contents.signing_pubkey() + } } } impl UnsignedStaticInvoice { @@ -272,6 +296,7 @@ impl UnsignedStaticInvoice { } invoice_accessors_common!(self, self.contents, StaticInvoice); + invoice_accessors_signing_pubkey!(self, self.contents, StaticInvoice); invoice_accessors!(self, self.contents); } @@ -307,6 +332,7 @@ where impl StaticInvoice { invoice_accessors_common!(self, self.contents, StaticInvoice); + invoice_accessors_signing_pubkey!(self, self.contents, StaticInvoice); invoice_accessors!(self, self.contents); /// Signature of the invoice verified using [`StaticInvoice::signing_pubkey`]. @@ -418,6 +444,10 @@ impl InvoiceContents { self.offer.supported_quantity() } + fn issuer_signing_pubkey(&self) -> Option { + self.offer.issuer_signing_pubkey() + } + fn payment_paths(&self) -> &[BlindedPaymentPath] { &self.payment_paths[..] } -- 2.39.5