keysend: enforce BOLT11 description length limit#8535
Merged
rustyrussell merged 2 commits intoElementsProject:masterfrom Nov 13, 2025
Merged
keysend: enforce BOLT11 description length limit#8535rustyrussell merged 2 commits intoElementsProject:masterfrom
rustyrussell merged 2 commits intoElementsProject:masterfrom
Conversation
noblepayne
commented
Sep 5, 2025
plugins/keysend.c
Outdated
| json_add_string(req->js, "description", desc); | ||
| /* Don't exceed max possible desc length! */ | ||
| if (strlen(desc) > 1023) | ||
| if (strlen(desc) >= BOLT11_FIELD_BYTE_LIMIT) |
Contributor
Author
There was a problem hiding this comment.
Should this be > or >=? lightningd/invoice.c uses >, however the BOLT11 spec says:
Note that the maximum length of a Tagged Field's data is constricted by the maximum value of data_length. This is 1023 x 5 bits, or 639 bytes.
In common/bolt11.c BOLT11_FIELD_BYTE_LIMIT has a value of 640.
Far from an expert here and appreciate any insight. Happy to update as needed.
Contributor
There was a problem hiding this comment.
Hmm, we should fix invoice.c too. Let me write a test.
4a7cfe3 to
68241bf
Compare
Contributor
|
OK, I fixed the invoice 640-byte desc error you found! And I modified the Changelog-None to a proper changelog line for your fix. Thanks! |
f4eb101 to
5a35a72
Compare
5a35a72 to
cecf436
Compare
The keysend plugin previously used `> 1023` as the cutoff for description length when inserting an invoice. This was inconsistent with invoice.c, which enforces the BOLT11 description field limit defined in `common/bolt11.h`. This patch switches to using `BOLT11_FIELD_BYTE_LIMIT` directly. As a result, keysend no longer fails on descriptions between 641–1023 bytes, which previously caused unexpected failures. A new regression test (`test_keysend_description_size_limit`) exercises boundary cases just below, at, and above the limit. Changelog-Fixed: Protocol: `keysend` with descriptions of length 640-1023 bytes fixed. Signed-off-by: Wes Payne <[email protected]>
They are invalid! This is because our BOLT11_FIELD_BYTE_LIMIT is not the limit, it's one greater than the limit. Reported-by: https://github.com/noblepayne Signed-off-by: Rusty Russell <[email protected]> Changelog-Fixed: JSON-RPC: `invoice` no longer accepts 640-byte descriptions (it would produce malformed invoices).
cecf436 to
dbe99aa
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The keysend plugin uses
> 1023as the cutoff for description length when inserting an invoice. This was inconsistent withlightnind/invoice.c, which enforces the BOLT11 description field limit defined incommon/bolt11.h.This patch switches to using
BOLT11_FIELD_BYTE_LIMITdirectly. As a result, keysend no longer fails on descriptions between 641–1023 bytes, which previously caused unexpected failures.A new regression test (
test_keysend_description_size_limit) exercises boundary cases just below, at, and above the limit.Changelog-None
Checklist
Before submitting the PR, ensure the following tasks are completed. If an item is not applicable to your PR, please mark it as checked: