Commit graph

7535 commits

Author SHA1 Message Date
Jeffrey Czyz
14634c6ae1
Add nonce to OffersContext::OutboundPayment
To authenticate that a Bolt12Invoice is for a valid InvoiceRequest or
Refund, include the nonce from the payer_metadata in the InvoiceRequest
reply path or Refund::paths, respectively. This can be used to prevent
de-anonymization attacks where an attacker sends invoices using
self-constructed paths to nodes near the blinded paths' introduction
nodes.
2024-07-22 11:34:04 -05:00
Jeffrey Czyz
868fee7d2d
Add Bolt12Invoice::verify_using_payer_data
Invoices are authenticated by checking the payer metadata in the
corresponding invoice request or refund. For all invoices requests and
for refunds using blinded paths, this will be the encrypted payment id
and a 128-bit nonce. Allows checking the unencrypted payment id and
nonce explicitly instead of the payer metadata. This will be used by an
upcoming change that includes the payment id and nonce in the invoice
request's reply path and the refund's blinded paths instead of
completely in the payer metadata, which mitigates de-anonymization
attacks.
2024-07-22 11:34:04 -05:00
Jeffrey Czyz
114954cbac
Pass Nonce directly to RefundBuilder
When using RefundBuilder::deriving_payer_id, the nonce generated needs
to be the same one included in any RefundBuilder::paths. This is because
the nonce is used along with the refund TLVs to derive a payer id and
will soon be used to authenticate any invoices.
2024-07-22 11:34:04 -05:00
Jeffrey Czyz
fd596c31b5
Pass Nonce directly to InvoiceRequestBuilder
When using InvoiceRequestBuilder::deriving_payer_id, the nonce generated
needs to be the same one included in any reply path. This is because the
nonce is used along with the invoice request TLVs to derive a payer id.
While this data is also included in the payer_metadata, including it in
the blinded path would allow reducing the amount of data needed there to
just enough to provide entropy (i.e., 16 bytes). This is more important
for Refund because it can be transmitted via a QR code. But using the
same payer_metadata structure for both InvoiceRequest and Refund would
be beneficial to avoid more code.
2024-07-22 11:34:04 -05:00
Jeffrey Czyz
bdf333045c
Add failure tests for offer message authentication 2024-07-22 11:34:04 -05:00
Jeffrey Czyz
559daeb2ae
Don't send InvoiceError on failed authentication
When an invoice or invoice request cannot be authenticated from an
OffersContext, simply do not respond instead of sending an InvoiceError
message. According to BOLT4, messages sent over a blinded path not
intended for its use MUST be ignored.
2024-07-22 11:34:04 -05:00
Jeffrey Czyz
c2a120eeef
Authenticate Bolt12Invoice using OfferContext
When a Bolt12Invoice is handled with an OfferContext, use the
containing payment_id to verify that it is for a pending outbound
payment. Only invoices for refunds without any blinded paths can be
verified without an OfferContext.
2024-07-22 11:34:03 -05:00
Jeffrey Czyz
f537abd960
Add docs to Metadata::without_keys 2024-07-22 11:34:03 -05:00
Jeffrey Czyz
9d463408c8
Rename InvoiceRequest::verify 2024-07-22 11:34:03 -05:00
Jeffrey Czyz
bf42847867
Elide metadata from Offer with derived keys
When an Offer uses blinded paths, its metadata consists of a nonce used
to derive its signing keys. Now that the blinded paths contain this
nonce, elide the metadata as it is now redundant. This saves space and
also makes it impossible to derive the signing keys if an invoice
request is received with the incorrect nonce. The nonce shouldn't be
revealed in this case either to prevent de-anonymization attacks.
2024-07-22 11:34:03 -05:00
Jeffrey Czyz
35b75fd1fd
Authenticate InvoiceRequest using OfferContext
When an InvoiceRequest is handled with an OfferContext, use the
containing nonce to verify that it is for a valid Offer. Otherwise, fall
back to using Offer::metadata, which also contains the nonce. The latter
is useful for supporting offers without blinded paths or those created
prior to including an OffersContext in their blinded paths.
2024-07-22 11:34:03 -05:00
Jeffrey Czyz
6a546189e4
Add OffersContext::InvoiceRequest
To authenticate that an InvoiceRequest is for a valid Offer, include the
nonce from the Offer::metadata in the Offer::paths. This can be used to
prevent de-anonymization attacks where an attacker sends requests using
self-constructed paths to nodes near the Offer::paths' introduction
nodes.
2024-07-22 11:34:03 -05:00
Jeffrey Czyz
a5145e4360
Fix OffersContext::Unknown docs 2024-07-22 11:34:03 -05:00
Jeffrey Czyz
1ff8c8d009
Fix grammar 2024-07-22 11:34:02 -05:00
Jeffrey Czyz
f546aad5dc
Expand OffersContext::OutboundPayment docs 2024-07-22 11:34:02 -05:00
Jeffrey Czyz
7904e3c7d2
Wrap docs at 100 characters 2024-07-22 11:34:02 -05:00
Jeffrey Czyz
c58a1bbaa5
Clean up MessageContext docs 2024-07-22 11:34:02 -05:00
Jeffrey Czyz
c0cae08d66
Assert and document valid Metadata states
Metadata is an internal type used within Offer messages. For any
constructed message, Metadata::Bytes is always used. The other variants
are used during construction or verification time. Document this and
debug_assert!(false) accordingly.
2024-07-22 11:34:02 -05:00
Jeffrey Czyz
e156415048
Add InvoiceRequest::verify_using_recipient_data
Invoice requests are authenticated by checking the metadata in the
corresponding offer. For offers using blinded paths, this will simply be
a 128-bit nonce. Allows checking this nonce explicitly instead of the
metadata. This will be used by an upcoming change that includes the
nonce in the offer's blinded paths instead of the metadata, which
mitigate de-anonymization attacks.
2024-07-22 11:34:02 -05:00
Jeffrey Czyz
219691f9ef
Pass Nonce directly to OfferBuilder
When using OfferBuilder::deriving_signing_pubkey, the nonce generated
needs to be the same one included in any OfferBuilder::paths. This is
because the nonce is used along with the offer TLVs to derive a signing
pubkey and will soon be elided from the metadata entirely.
2024-07-22 11:34:02 -05:00
Jeffrey Czyz
d7aeaa0aad
Move Nonce to a separate offers sub-module
Nonce is used when constructing Offer::metadata and will soon be need
when constructing BlindedPath for use in authentication. Move it to
separate module now that it is public and will be more widely used.
2024-07-22 11:34:01 -05:00
Jeffrey Czyz
0a5918e477
Reorder imports 2024-07-22 11:34:01 -05:00
Jeffrey Czyz
5278d314d5
Change Nonce visibility to pub
A nonce is generated in OfferBuilder::deriving_signing_pubkey from an
EntropySource for use in Offer::metadata. The same nonce will need to be
included as recipient data in any blinded paths in the Offer. Increase
the visibility to allow for this.
2024-07-22 11:34:01 -05:00
Elias Rohrer
37331035f9
Merge pull request #3024 from jbesraa/funding-signed-event
Funding signed event
2024-07-22 15:47:59 +02:00
Matt Corallo
9ce3dd5269
Merge pull request #3152 from alecchendev/2024-06-async-commit-secret-raa
Handle fallible commitment secret
2024-07-18 15:17:57 +00:00
Matt Corallo
2bfddea062
Merge pull request #2995 from tnull/2024-04-fallible-event-handler
Make event handling fallible
2024-07-18 15:07:07 +00:00
Elias Rohrer
e617a394e8
Document Failure Behavior and Persistence for every event type 2024-07-18 15:54:21 +02:00
Elias Rohrer
8599bc9784
Add simple test for event replaying 2024-07-18 15:54:21 +02:00
Elias Rohrer
f5cea0e57a
Handle fallible events in OnionMessenger
Previously, we would just fire-and-forget in `OnionMessenger`'s event
handling. Since we now introduced the possibility of event handling
failures, we here adapt the event handling logic to retain any
events which we failed to handle to have them replayed upon the next
invocation of `process_pending_events`/`process_pending_events_async`.
2024-07-18 15:54:21 +02:00
Elias Rohrer
018908fe9e
Make event handling fallible
Previously, we would require our users to handle all events
successfully inline or panic will trying to do so. If they would exit
the `EventHandler` any other way we'd forget about the event and
wouldn't replay them after restart.

Here, we implement fallible event handling, allowing the user to return
`Err(())` which signals to our event providers they should abort event
processing and replay any unhandled events later (i.e., in the next
invocation).
2024-07-18 15:54:21 +02:00
Elias Rohrer
b5b57f188f
Hold sep. Mutexes for pending intercepted_msgs/peer_connected events
This is a minor refactor that will allow us to access the individual
event queue Mutexes separately, allowing us to drop the locks earlier
when processing them individually.
2024-07-18 09:05:43 +02:00
Matt Corallo
0cfe55c007
Merge pull request #3160 from TheBlueMatt/2024-07-better-enum-upgradable-ser
Make `impl_writeable_tlv_based_enum*` actually upgradable
2024-07-17 18:05:22 +00:00
Alec Chen
34130327c5 Test fallible commitment secret 2024-07-17 10:57:51 -07:00
Matt Corallo
012bc50108
Merge pull request #3187 from TheBlueMatt/2024-07-routing-nits
#2803 nits
2024-07-17 17:12:00 +00:00
Matt Corallo
c3c909b369
Merge pull request #3136 from tnull/2024-06-rustfmt-lightning-block-sync
Run `rustfmt` on `lightning-block-sync`
2024-07-17 15:51:42 +00:00
Matt Corallo
1d1f47c45a Add pending changelog entry for the previous commit 2024-07-17 15:02:13 +00:00
Matt Corallo
72f883e0a1 Make impl_writeable_tlv_based_enum* actually upgradable
In cc78b77c71 it was discovered that
`impl_writeable_tlv_based_enum_upgradable` wasn't actually
upgradable - tuple variants weren't written with length-prefixes,
causing downgrades with new tuple variants to be unreadable by
older clients as they wouldn't know where to stop reading.

This was fixed by simply assuming that any new variants will be
non-tuple variants with a length prefix, but no code write-side
changes were made, allowing new code to freely continue to use the
broken tuple-variant serialization.

Here we address this be defining yet more serialization macros
which aren't broken, and convert existing usage of the existing
macros using non-length-prefixed tuple variants to renamed
`*_legacy` macros.

Note that this changes the serialization format of
`impl_writeable_tlv_based_enum[_upgradable]` when tuple fields are
written, and as such deliberately changes the call semantics for
such tuples.

Only the serialization format of `MessageContext` is changed here
which is fine as it has not yet reached a release of LDK.
2024-07-17 15:02:13 +00:00
Matt Corallo
7282aa7a8d Drop excess ()s in router.rs 2024-07-17 14:09:47 +00:00
Matt Corallo
63ecd902db Marginally improve comments around cache lines in gossip.rs 2024-07-17 14:09:47 +00:00
Matt Corallo
ac1463b120
Merge pull request #2803 from TheBlueMatt/2023-12-routing-dist-vec
Misc routing optimization
2024-07-17 14:06:05 +00:00
Alec Chen
5b3d6eabce Handle fallible release_commitment_secret 2024-07-16 15:49:59 -07:00
Matt Corallo
6ed398d42a
Merge pull request #3087 from shaavan/reply_path_diversity
Allow blinded path diversification by expanding `create_blinded_paths`
2024-07-16 19:29:08 +00:00
Matt Corallo
dee3ba7d6a
Merge pull request #3185 from tnull/2024-07-clarify-max-description-length
Clarify maximum length of an invoice description
2024-07-16 08:24:45 -07:00
Matt Corallo
6e73c37657
Merge pull request #3183 from TheBlueMatt/2024-07-no-strict
Drop unnecessary `strict` feature from `lightning-invoice`
2024-07-16 06:31:52 -07:00
Matt Corallo
17d5baa67f
Merge pull request #3150 from alecchendev/2024-06-async-commit-point-raa
Handle fallible per commitment point for RAA
2024-07-16 06:30:57 -07:00
Elias Rohrer
fa7ecc56d7
Clarify maximum length of an invoice description
We previously stated in the docs that the invoice description can be at most `1023`
bytes long, which is wrong. According to BOLT 11 it's at most 1023*5 bits (639 bytes) long.
2024-07-16 10:28:58 +02:00
Alec Chen
45c0a0f10c Test async get per commitment point for revoke_and_ack
Note: this does not test the CS -> RAA resend ordering, because this
requires handling async get_per_commitment_point for channel
reestablishment, which will be addressed in a follow up PR.
2024-07-15 14:28:23 -07:00
Alec Chen
614da40f19 Allow failing revoke_and_ack if commitment point is not available 2024-07-15 14:28:21 -07:00
Alec Chen
1f7f3a366c Change get_per_commitment_point to return result type
Includes simple changes to test util signers and tests, as well as
handling the error case for get_per_commitment_point in
HolderCommitmentPoint. This leaves a couple `.expect`s in places
that will be addressed in a separate PR for handling funding.
2024-07-15 14:28:17 -07:00
Matt Corallo
4bd4f19526
Merge pull request #3165 from Harshit933/link-fix
Fixes `Sensei` broken link
2024-07-15 12:17:09 -07:00