Commit graph

128 commits

Author SHA1 Message Date
Jeffrey Czyz
6c67e3e279
Functional tests for offers without blinded paths 2024-01-16 11:12:35 -06:00
henghonglee
ff5e5221d2 logging every sent and receive onion message
Logs every sent + receive for P2P messages
solves #2346
2023-12-03 00:24:14 +05:30
Matt Corallo
a41954d841 Remove now-redundant checks in BOLT12 Invoice fallback addresses
Now that we use the `rust-bitcoin` `WitnessProgram` to check our
addresses, we can just rely on it, rather than checking the program
length and version.
2023-11-26 19:09:06 +00:00
Wilmer Paulino
ec928d55b4
Bump rust-bitcoin to v0.30.2 2023-11-22 15:58:01 -08:00
Matt Corallo
1aa5210c2f Avoid an unnecessary allocation in TaggedHash
A well-formed tag is always a constant, so allocating to store it
is unnecessary when we can just make the tag a `&'static str`.
2023-11-07 05:08:16 +00:00
Matt Corallo
96e7d7a258
Merge pull request #2687 from orbitalturtle/signature-data-enum
Expose more granular data in TaggedHash struct
2023-11-07 05:04:48 +00:00
Orbital
caafcedf3f
expose more granular data in TaggedHash struct
Expose tag and merkle root fields in the TaggedHash struct.
2023-11-06 21:36:54 -06:00
Orbital
38dfbf99db
refactor to remove message_digest
We change the Bolt12Invoice struct to carry a tagged hash. Because
message_digest is then only used in one place, we can inline it in
the TaggedHash constructor.
2023-11-06 21:29:50 -06:00
valentinewallace
415cbf088e
Merge pull request #2682 from jkczyz/2023-09-bolt12-test-vectors
BOLT 12 Offer test vectors
2023-11-01 14:34:29 -04:00
benthecarman
5ddd8a7559
Add is_expired_no_std to Offer & Refund
This was available for OfferContents but not an Offer so dependent
projects could not access it.
2023-10-26 20:58:04 -05:00
Jeffrey Czyz
e469492d95
BOLT 12 test vectors for offer parsing
One discrepancy from the spec still needs to be resolved:

https://github.com/lightning/bolts/pull/798/files#r1334851959
2023-10-24 15:45:35 -05:00
Jeffrey Czyz
452a30e746
Separate and describe BOLT 12 test vectors 2023-10-24 14:19:21 -05:00
Jeffrey Czyz
5fc4abc5cd
Move bech32 parsing tests to the parse module
Additional BOLT 12 tests specific to Offer were added, which will live
in the offer module. Thus, it makes sense to move the bech32 tests to
the parse module.
2023-10-24 13:09:15 -05:00
Matt Corallo
d974a07e96 Avoid a redundant allocation in InvoiceError handling in one case
... by passing an owned `String`, rather than taking an `&str` and
`to_owned()`ing it.
2023-10-21 14:30:13 +00:00
Jeffrey Czyz
debc20cc3e
OffersMessageHandler impl for ChannelManager
Define the BOLT 12 message flow in ChannelManager's
OffersMessageHandler implementation.
- An invoice_request message results in responding with an invoice
  message if it can be verified that the request is for a valid offer.
- An invoice is paid if it can be verified to have originated from a
  sent invoice_request or a refund.
- An invoice_error is sent in some failure cases.
- Initial messages enqueued for sending are released to OnionMessenger
2023-10-20 09:49:57 -05:00
Jeffrey Czyz
b191fd48d5
Check offer expiry when building invoice in no-std
Building an invoice will fail if the underlying offer or refund has
already expired. The check was skipped in no-std since there is no
system clock. However, the invoice creation time can be used instead.
This prevents responding to an invoice request if the offer has already
expired.
2023-10-20 09:49:57 -05:00
Jeffrey Czyz
ffe9ae285d
Utility for paying for an Offer
Add a utility to ChannelManager for sending an InvoiceRequest for an
Offer such that derived keys are used for the payer id. This allows for
stateless verification of any Invoice messages before it is paid.

Also tracks future payments using the given PaymentId such that the
corresponding Invoice is paid only once.
2023-10-20 09:49:56 -05:00
Jeffrey Czyz
7c6e62f423
Stateless offer and refund builder utilities
Add utility functions to ChannelManager for creating OfferBuilder,
and RefundBuilder such that derived keys are used for the signing
pubkey and payer id, respectively. This allows for stateless
verification of any InvoiceRequest and Invoice messages.

Later, blinded paths can be included in the returned builders.

Also tracks future payments using the given PaymentId such that the
corresponding Invoice is paid only once.
2023-10-18 18:33:14 -05:00
Matt Corallo
9c78d8e90e Drop unnecessary crate:: prefix when accessing bitcoin in macro
Unexported macros don't need to use the `$crate` prefix.
2023-10-01 00:05:01 +00:00
Jeffrey Czyz
50336b3c7b
Add tests for send_payment_for_bolt12_invoice 2023-09-07 16:55:22 -05:00
Jeffrey Czyz
19c43d0693
pub(crate) visibility for offers/test_utils.rs
The test utilities for Offers are needed for testing message handling in
ChannelManager and OutboundPayments.
2023-09-07 16:55:22 -05:00
Jeffrey Czyz
7a3e06b1e7
Include PaymentId in payer metadata
When receiving a BOLT 12 invoice originating from either an invoice
request or a refund, the invoice should only be paid once. To accomplish
this, require that the invoice includes an encrypted payment id in the
payer metadata. This allows ChannelManager to track a payment when
requesting but prior to receiving the invoice. Thus, it can determine if
the invoice has already been paid.
2023-08-29 11:08:11 -05:00
Jeffrey Czyz
971cb20d2e
Remove unnecessary #[allow(unused)] 2023-08-29 11:08:11 -05:00
Jeffrey Czyz
21fa551825
Split InvoiceRequest::verify_and_respond_using_derived_keys
InvoiceRequest::verify_and_respond_using_derived_keys takes a payment
hash. To avoid generating one for invoice requests that ultimately
cannot be verified, split the method into one for verifying and another
for responding.
2023-08-29 11:08:04 -05:00
Matt Corallo
0211daa48b
Merge pull request #2412 from valentinewallace/2023-07-construct-blinded-paths
Add API for constructing blinded payment paths
2023-08-23 17:35:06 +00:00
Valentine Wallace
4a30d9e78a
Rename ser macro
We want a similar macro for reading TLV streams without a length prefix, so
rename this one to disambiguate.
2023-08-22 13:26:12 -04:00
Jeffrey Czyz
39012e3595
Support signing BOLT 12 invoices 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 invoices such
that it can be used in the latter contexts. The method could be used
in an OffersMessageHandler.
2023-08-21 19:14:29 -05:00
Jeffrey Czyz
63d0d5583d
Use TaggedHash in merkle::verify_signature
An earlier commit introduced TaggedHash for use in sign_message. For
consistency, use it in verify_signature, too.
2023-08-21 19:14:29 -05:00
Jeffrey Czyz
7f641da655
Expose Offer/InvoiceRequest methods in Invoice
Bolt12Invoice can either be for an Offer (via an InvoiceRequest) or a
Refund. It wraps those types, so expose their methods on both
Bolt12Invoice and UnsignedBolt12Invoice.

Since Refund does not have all the Offer/InvoiceRequest methods, use an
Option return type such that None can returned for refund-based
invoices.

For methods that are duplicated between Offer/InvoiceRequest and
Bolt12Invoice, prefer the (non-Option, if applicable) method from
Bolt12Invoice (e.g., amount_msats, signing_pubkey).
2023-08-21 19:14:29 -05:00
Jeffrey Czyz
57e62da9f4
Expose invoice accessors in UnsignedBolt12Invoice 2023-08-21 19:14:29 -05:00
Jeffrey Czyz
bde982344a
Expose Offer accessor functions in InvoiceRequest
Also, expose both Offer and InvoiceRequest functions in
UnsignedInvoiceRequest.
2023-08-21 19:14:29 -05:00
Jeffrey Czyz
9d02d06e06
Macro-ize InvoiceRequest accessors for reuse
Various messages wrap InvoiceRequestContents, which shouldn't be exposed
as it is an implementation detail. Define a macro for InvoiceRequest
accessor methods so that these messages can also define them.
2023-08-21 19:14:28 -05:00
Jeffrey Czyz
66060cae8a
Macro-ize Offer accessors for reuse
InvoiceRequest wraps OfferContents, which shouldn't be exposed as it is
an implementation detail. Define a macro for Offer accessor methods so
that InvoiceRequest and UnsignedInvoiceRequest can also define them.
2023-08-21 19:14:28 -05:00
Jeffrey Czyz
68d471751b
Move BOLT 12 invoice method implementations 2023-08-21 19:14:28 -05:00
Jeffrey Czyz
85c471aac2
Move BOLT 12 InvoiceRequest method implementations 2023-08-21 19:14:28 -05:00
Jeffrey Czyz
270bc2e4c0
Move BOLT 12 offer method implementations 2023-08-21 19:14:28 -05:00
Jeffrey Czyz
230f081e5a
Unsigned BOLT 12 message parsing and serialization 2023-08-21 19:14:28 -05:00
Jeffrey Czyz
889848d5ed
Rename field of unsigned BOLT message contents
Using `contents` for the field name is more consistent with the signed
messages.
2023-08-21 19:14:27 -05:00
Jeffrey Czyz
239f22c0c9
Wrap KeyPair by DerivedSigningPubkey
InvoiceBuilder is parameterized by a SigningPubkeyStrategy, either
ExplicitSigningPubkey and DerivedSigningPubkey. It also holds an
Option<KeyPair>, which may be None and Some for those strategies,
respectively. This leads to methods for InvoiceBuilder parameterized by
DerivedSigningPubkey needing to blindly unwrap the Option<KeyPair>.
Instead, have DerivedSigningPubkey wrap KeyPair.
2023-08-21 19:14:27 -05:00
Jeffrey Czyz
1811ebff32
TaggedHash for BOLT 12 signing function
The function used to sign BOLT 12 messages only takes a message digest.
This doesn't allow signers to independently verify the message before
signing nor does it allow them to derive the necessary signing keys, if
needed.

Introduce a TaggedHash wrapper for a message digest, which each unsigned
BOLT 12 message type constructs upon initialization. Change the signing
function to take AsRef<TaggedHash>, which each unsigned type implements.
This allows the signing function to take any unsigned message and obtain
its tagged hash.
2023-08-21 19:14:27 -05:00
Jeffrey Czyz
4bb4a970e8
Make offers::merkle::SignError visible 2023-07-28 14:21:19 -05:00
Matt Corallo
5f120b1b65 Make OffersMessage and offers errors Cloneable 2023-07-20 21:43:52 +00:00
Matt Corallo
6d62d5d021 No-export un-exportable types in BOLT12 module
We missed one method that now cannot be bindings exported - the
`payment_paths` method, as it returns a slice of objects, which
cannot be supported in bindings.
2023-07-20 21:43:52 +00:00
Jeffrey Czyz
3234136f57
Qualify the BOLT 12 semantic error
To avoid a naming conflict in bindings with BOLT 11 semantic error,
qualify the BOLT 12 semantic error type.
2023-07-14 15:04:43 -05:00
Jeffrey Czyz
5627d7cc1f
Qualify the BOLT 12 parse error
To avoid a naming conflict in bindings with BOLT 11 parse error, qualify
the BOLT 12 parse error type.
2023-07-14 15:04:43 -05:00
Jeffrey Czyz
d94227cc13
Qualify the BOLT 12 unsigned invoice type
A previous commit qualified the BOLT 12 invoice type, so any related
types should be similarly qualified, if public.
2023-07-14 15:04:43 -05:00
Jeffrey Czyz
f8c9b092fd
Qualify the BOLT 12 invoice type
To avoid a naming conflict in bindings with BOLT 11 invoices, qualify
the BOLT 12 invoice type.
2023-07-14 15:04:43 -05:00
Matt Corallo
ba342de241
Merge pull request #2120 from valentinewallace/2023-03-blinded-pathfinding 2023-06-20 15:51:59 +00:00
Valentine Wallace
3184393df2
Reverse (BlindedPath, BlindedPayInfo) tuple order in offers invoice.
To make it uniform with PaymentParameters' Payee::Blinded::route_hints.
2023-06-16 11:14:53 -04:00
Jeffrey Czyz
9b3a35a133
Add InvoiceError message
If an InvoiceRequest or an Invoice delivered via an onion message cannot
be handled, the recipient should reply with an InvoiceError if a reply
path was given. Define the message and conversion from SemanticError.
2023-06-13 13:07:46 -05:00