Add support for option_message_padding - #4248

Closed
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding
Closed

Add support for option_message_padding#4248
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding

Conversation

@tnull

@tnulltnull commented Nov 28, 2025

Copy link
Copy Markdown
Contributor

We add support for option_message_padding (feature ??) as proposed in lightning/bolts#1304.

When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.

@ldk-reviews-bot

ldk-reviews-bot commented Nov 28, 2025

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft November 28, 2025 14:16
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch 3 times, most recently from d618e6a to a8e3199CompareNovember 28, 2025 14:42
We add prototypical support for the `option_message_padding` feature
while the BOLTs PR is still underway.
When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.
Note that even without padding we surpassed the standard Ethernet MTU of
1500 bytes for `UpdateAddHtlc` messages, so fitting the packets into
exactly 1500 bytes is a futile endeavor. Furthermore note that any
messages above that threshold size will still stand out in monitored
network traffic. Lastly, we opt to *not* apply padding for any
custom messages, as they might not be set up to handle the optional TLV
extension.
While it shouldn't really make any difference for the Noise protocol, we
here avoid taking any chances w.r.t. known plaintext attacks and opt to
randomize the padding data.
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch from a8e3199 to 5052f4dCompareNovember 28, 2025 15:13
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why even bother with a feature flag for this? We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

@tnull

tnull commented Dec 9, 2025

Copy link
Copy Markdown
ContributorAuthor

Why even bother with a feature flag for this?

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

Right, that's what the current BOLTs draft (and this PR) are doing, mod the feature.

in every (non-gossip) message

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

Yea, okay, should be discussed in the spec meeting. IMO the overhead should be low enough that no one should care (is anyone really bandwidth-restricted in a way that a few Kbps is fine but a few + 2 Kbps isn't?), but even if it is one end can opt out and the other end can still send it, imo.

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

Well, I was just talking about it int he context of the feature flag. Gossip messages are entirely signed, including the extra TLVs, so there has to be a feature flag to signal "ignore TLV type X, its not signed, and not a part of the gossip message". Tho even that has backwards compat concerns (I guess we don't care about someone's gossip getting dropped by half the nodes because they started including the padding field in their message?)

@tnull

Copy link
Copy Markdown
ContributorAuthor

Closing this and will to eventually reopen a new draft PR that implements padding via message chunking + pings so we can explore that possibility.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tnull@ldk-reviews-bot@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add support for option_message_padding - #4248

Closed
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding
Closed

Add support for option_message_padding#4248
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding

Conversation

@tnull

@tnulltnull commented Nov 28, 2025

Copy link
Copy Markdown
Contributor

We add support for option_message_padding (feature ??) as proposed in lightning/bolts#1304.

When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.

@ldk-reviews-bot

ldk-reviews-bot commented Nov 28, 2025

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft November 28, 2025 14:16
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch 3 times, most recently from d618e6a to a8e3199CompareNovember 28, 2025 14:42
We add prototypical support for the `option_message_padding` feature
while the BOLTs PR is still underway.
When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.
Note that even without padding we surpassed the standard Ethernet MTU of
1500 bytes for `UpdateAddHtlc` messages, so fitting the packets into
exactly 1500 bytes is a futile endeavor. Furthermore note that any
messages above that threshold size will still stand out in monitored
network traffic. Lastly, we opt to *not* apply padding for any
custom messages, as they might not be set up to handle the optional TLV
extension.
While it shouldn't really make any difference for the Noise protocol, we
here avoid taking any chances w.r.t. known plaintext attacks and opt to
randomize the padding data.
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch from a8e3199 to 5052f4dCompareNovember 28, 2025 15:13
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why even bother with a feature flag for this? We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

@tnull

tnull commented Dec 9, 2025

Copy link
Copy Markdown
ContributorAuthor

Why even bother with a feature flag for this?

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

Right, that's what the current BOLTs draft (and this PR) are doing, mod the feature.

in every (non-gossip) message

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

Yea, okay, should be discussed in the spec meeting. IMO the overhead should be low enough that no one should care (is anyone really bandwidth-restricted in a way that a few Kbps is fine but a few + 2 Kbps isn't?), but even if it is one end can opt out and the other end can still send it, imo.

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

Well, I was just talking about it int he context of the feature flag. Gossip messages are entirely signed, including the extra TLVs, so there has to be a feature flag to signal "ignore TLV type X, its not signed, and not a part of the gossip message". Tho even that has backwards compat concerns (I guess we don't care about someone's gossip getting dropped by half the nodes because they started including the padding field in their message?)

@tnull

Copy link
Copy Markdown
ContributorAuthor

Closing this and will to eventually reopen a new draft PR that implements padding via message chunking + pings so we can explore that possibility.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tnull@ldk-reviews-bot@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add support for option_message_padding - #4248

Closed
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding
Closed

Add support for option_message_padding#4248
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding

Conversation

@tnull

@tnulltnull commented Nov 28, 2025

Copy link
Copy Markdown
Contributor

We add support for option_message_padding (feature ??) as proposed in lightning/bolts#1304.

When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.

@ldk-reviews-bot

ldk-reviews-bot commented Nov 28, 2025

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft November 28, 2025 14:16
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch 3 times, most recently from d618e6a to a8e3199CompareNovember 28, 2025 14:42
We add prototypical support for the `option_message_padding` feature
while the BOLTs PR is still underway.
When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.
Note that even without padding we surpassed the standard Ethernet MTU of
1500 bytes for `UpdateAddHtlc` messages, so fitting the packets into
exactly 1500 bytes is a futile endeavor. Furthermore note that any
messages above that threshold size will still stand out in monitored
network traffic. Lastly, we opt to *not* apply padding for any
custom messages, as they might not be set up to handle the optional TLV
extension.
While it shouldn't really make any difference for the Noise protocol, we
here avoid taking any chances w.r.t. known plaintext attacks and opt to
randomize the padding data.
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch from a8e3199 to 5052f4dCompareNovember 28, 2025 15:13
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why even bother with a feature flag for this? We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

@tnull

tnull commented Dec 9, 2025

Copy link
Copy Markdown
ContributorAuthor

Why even bother with a feature flag for this?

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

Right, that's what the current BOLTs draft (and this PR) are doing, mod the feature.

in every (non-gossip) message

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

Yea, okay, should be discussed in the spec meeting. IMO the overhead should be low enough that no one should care (is anyone really bandwidth-restricted in a way that a few Kbps is fine but a few + 2 Kbps isn't?), but even if it is one end can opt out and the other end can still send it, imo.

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

Well, I was just talking about it int he context of the feature flag. Gossip messages are entirely signed, including the extra TLVs, so there has to be a feature flag to signal "ignore TLV type X, its not signed, and not a part of the gossip message". Tho even that has backwards compat concerns (I guess we don't care about someone's gossip getting dropped by half the nodes because they started including the padding field in their message?)

@tnull

Copy link
Copy Markdown
ContributorAuthor

Closing this and will to eventually reopen a new draft PR that implements padding via message chunking + pings so we can explore that possibility.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tnull@ldk-reviews-bot@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add support for option_message_padding - #4248

Closed
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding
Closed

Add support for option_message_padding#4248
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding

Conversation

@tnull

@tnulltnull commented Nov 28, 2025

Copy link
Copy Markdown
Contributor

We add support for option_message_padding (feature ??) as proposed in lightning/bolts#1304.

When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.

@ldk-reviews-bot

ldk-reviews-bot commented Nov 28, 2025

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft November 28, 2025 14:16
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch 3 times, most recently from d618e6a to a8e3199CompareNovember 28, 2025 14:42
We add prototypical support for the `option_message_padding` feature
while the BOLTs PR is still underway.
When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.
Note that even without padding we surpassed the standard Ethernet MTU of
1500 bytes for `UpdateAddHtlc` messages, so fitting the packets into
exactly 1500 bytes is a futile endeavor. Furthermore note that any
messages above that threshold size will still stand out in monitored
network traffic. Lastly, we opt to *not* apply padding for any
custom messages, as they might not be set up to handle the optional TLV
extension.
While it shouldn't really make any difference for the Noise protocol, we
here avoid taking any chances w.r.t. known plaintext attacks and opt to
randomize the padding data.
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch from a8e3199 to 5052f4dCompareNovember 28, 2025 15:13
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why even bother with a feature flag for this? We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

@tnull

tnull commented Dec 9, 2025

Copy link
Copy Markdown
ContributorAuthor

Why even bother with a feature flag for this?

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

Right, that's what the current BOLTs draft (and this PR) are doing, mod the feature.

in every (non-gossip) message

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

Yea, okay, should be discussed in the spec meeting. IMO the overhead should be low enough that no one should care (is anyone really bandwidth-restricted in a way that a few Kbps is fine but a few + 2 Kbps isn't?), but even if it is one end can opt out and the other end can still send it, imo.

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

Well, I was just talking about it int he context of the feature flag. Gossip messages are entirely signed, including the extra TLVs, so there has to be a feature flag to signal "ignore TLV type X, its not signed, and not a part of the gossip message". Tho even that has backwards compat concerns (I guess we don't care about someone's gossip getting dropped by half the nodes because they started including the padding field in their message?)

@tnull

Copy link
Copy Markdown
ContributorAuthor

Closing this and will to eventually reopen a new draft PR that implements padding via message chunking + pings so we can explore that possibility.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tnull@ldk-reviews-bot@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add support for option_message_padding - #4248

Closed
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding
Closed

Add support for option_message_padding#4248
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding

Conversation

@tnull

@tnulltnull commented Nov 28, 2025

Copy link
Copy Markdown
Contributor

We add support for option_message_padding (feature ??) as proposed in lightning/bolts#1304.

When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.

@ldk-reviews-bot

ldk-reviews-bot commented Nov 28, 2025

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft November 28, 2025 14:16
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch 3 times, most recently from d618e6a to a8e3199CompareNovember 28, 2025 14:42
We add prototypical support for the `option_message_padding` feature
while the BOLTs PR is still underway.
When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.
Note that even without padding we surpassed the standard Ethernet MTU of
1500 bytes for `UpdateAddHtlc` messages, so fitting the packets into
exactly 1500 bytes is a futile endeavor. Furthermore note that any
messages above that threshold size will still stand out in monitored
network traffic. Lastly, we opt to *not* apply padding for any
custom messages, as they might not be set up to handle the optional TLV
extension.
While it shouldn't really make any difference for the Noise protocol, we
here avoid taking any chances w.r.t. known plaintext attacks and opt to
randomize the padding data.
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch from a8e3199 to 5052f4dCompareNovember 28, 2025 15:13
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why even bother with a feature flag for this? We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

@tnull

tnull commented Dec 9, 2025

Copy link
Copy Markdown
ContributorAuthor

Why even bother with a feature flag for this?

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

Right, that's what the current BOLTs draft (and this PR) are doing, mod the feature.

in every (non-gossip) message

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

Yea, okay, should be discussed in the spec meeting. IMO the overhead should be low enough that no one should care (is anyone really bandwidth-restricted in a way that a few Kbps is fine but a few + 2 Kbps isn't?), but even if it is one end can opt out and the other end can still send it, imo.

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

Well, I was just talking about it int he context of the feature flag. Gossip messages are entirely signed, including the extra TLVs, so there has to be a feature flag to signal "ignore TLV type X, its not signed, and not a part of the gossip message". Tho even that has backwards compat concerns (I guess we don't care about someone's gossip getting dropped by half the nodes because they started including the padding field in their message?)

@tnull

Copy link
Copy Markdown
ContributorAuthor

Closing this and will to eventually reopen a new draft PR that implements padding via message chunking + pings so we can explore that possibility.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tnull@ldk-reviews-bot@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add support for option_message_padding - #4248

Closed
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding
Closed

Add support for option_message_padding#4248
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding

Conversation

@tnull

@tnulltnull commented Nov 28, 2025

Copy link
Copy Markdown
Contributor

We add support for option_message_padding (feature ??) as proposed in lightning/bolts#1304.

When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.

@ldk-reviews-bot

ldk-reviews-bot commented Nov 28, 2025

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft November 28, 2025 14:16
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch 3 times, most recently from d618e6a to a8e3199CompareNovember 28, 2025 14:42
We add prototypical support for the `option_message_padding` feature
while the BOLTs PR is still underway.
When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.
Note that even without padding we surpassed the standard Ethernet MTU of
1500 bytes for `UpdateAddHtlc` messages, so fitting the packets into
exactly 1500 bytes is a futile endeavor. Furthermore note that any
messages above that threshold size will still stand out in monitored
network traffic. Lastly, we opt to *not* apply padding for any
custom messages, as they might not be set up to handle the optional TLV
extension.
While it shouldn't really make any difference for the Noise protocol, we
here avoid taking any chances w.r.t. known plaintext attacks and opt to
randomize the padding data.
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch from a8e3199 to 5052f4dCompareNovember 28, 2025 15:13
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why even bother with a feature flag for this? We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

@tnull

tnull commented Dec 9, 2025

Copy link
Copy Markdown
ContributorAuthor

Why even bother with a feature flag for this?

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

Right, that's what the current BOLTs draft (and this PR) are doing, mod the feature.

in every (non-gossip) message

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

Yea, okay, should be discussed in the spec meeting. IMO the overhead should be low enough that no one should care (is anyone really bandwidth-restricted in a way that a few Kbps is fine but a few + 2 Kbps isn't?), but even if it is one end can opt out and the other end can still send it, imo.

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

Well, I was just talking about it int he context of the feature flag. Gossip messages are entirely signed, including the extra TLVs, so there has to be a feature flag to signal "ignore TLV type X, its not signed, and not a part of the gossip message". Tho even that has backwards compat concerns (I guess we don't care about someone's gossip getting dropped by half the nodes because they started including the padding field in their message?)

@tnull

Copy link
Copy Markdown
ContributorAuthor

Closing this and will to eventually reopen a new draft PR that implements padding via message chunking + pings so we can explore that possibility.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tnull@ldk-reviews-bot@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add support for option_message_padding - #4248

Closed
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding
Closed

Add support for option_message_padding#4248
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding

Conversation

@tnull

@tnulltnull commented Nov 28, 2025

Copy link
Copy Markdown
Contributor

We add support for option_message_padding (feature ??) as proposed in lightning/bolts#1304.

When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.

@ldk-reviews-bot

ldk-reviews-bot commented Nov 28, 2025

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft November 28, 2025 14:16
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch 3 times, most recently from d618e6a to a8e3199CompareNovember 28, 2025 14:42
We add prototypical support for the `option_message_padding` feature
while the BOLTs PR is still underway.
When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.
Note that even without padding we surpassed the standard Ethernet MTU of
1500 bytes for `UpdateAddHtlc` messages, so fitting the packets into
exactly 1500 bytes is a futile endeavor. Furthermore note that any
messages above that threshold size will still stand out in monitored
network traffic. Lastly, we opt to *not* apply padding for any
custom messages, as they might not be set up to handle the optional TLV
extension.
While it shouldn't really make any difference for the Noise protocol, we
here avoid taking any chances w.r.t. known plaintext attacks and opt to
randomize the padding data.
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch from a8e3199 to 5052f4dCompareNovember 28, 2025 15:13
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why even bother with a feature flag for this? We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

@tnull

tnull commented Dec 9, 2025

Copy link
Copy Markdown
ContributorAuthor

Why even bother with a feature flag for this?

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

Right, that's what the current BOLTs draft (and this PR) are doing, mod the feature.

in every (non-gossip) message

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

Yea, okay, should be discussed in the spec meeting. IMO the overhead should be low enough that no one should care (is anyone really bandwidth-restricted in a way that a few Kbps is fine but a few + 2 Kbps isn't?), but even if it is one end can opt out and the other end can still send it, imo.

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

Well, I was just talking about it int he context of the feature flag. Gossip messages are entirely signed, including the extra TLVs, so there has to be a feature flag to signal "ignore TLV type X, its not signed, and not a part of the gossip message". Tho even that has backwards compat concerns (I guess we don't care about someone's gossip getting dropped by half the nodes because they started including the padding field in their message?)

@tnull

Copy link
Copy Markdown
ContributorAuthor

Closing this and will to eventually reopen a new draft PR that implements padding via message chunking + pings so we can explore that possibility.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tnull@ldk-reviews-bot@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add support for option_message_padding - #4248

Closed
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding
Closed

Add support for option_message_padding#4248
tnull wants to merge 3 commits into
lightningdevkit:mainfrom
tnull:2025-11-option-message-padding

Conversation

@tnull

@tnulltnull commented Nov 28, 2025

Copy link
Copy Markdown
Contributor

We add support for option_message_padding (feature ??) as proposed in lightning/bolts#1304.

When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.

@ldk-reviews-bot

ldk-reviews-bot commented Nov 28, 2025

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft November 28, 2025 14:16
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch 3 times, most recently from d618e6a to a8e3199CompareNovember 28, 2025 14:42
We add prototypical support for the `option_message_padding` feature
while the BOLTs PR is still underway.
When both parties signal support for `option_message_padding`, we pad
any sent messages to a fixed size to improve privacy in the face of
an adversary monitoring network traffic.
To this end we utilize an optional TLV-stream extension with an odd
field number of `u64::max_value()` that simply will be discarded by the
counterparty. The padding threshold is chosen to fit even the largest
standard Lightning messages (UpdateAddHtlc) whith some leeway to
guarantee package size uniformity even when some of the optional fields
are set.
Note that even without padding we surpassed the standard Ethernet MTU of
1500 bytes for `UpdateAddHtlc` messages, so fitting the packets into
exactly 1500 bytes is a futile endeavor. Furthermore note that any
messages above that threshold size will still stand out in monitored
network traffic. Lastly, we opt to *not* apply padding for any
custom messages, as they might not be set up to handle the optional TLV
extension.
While it shouldn't really make any difference for the Noise protocol, we
here avoid taking any chances w.r.t. known plaintext attacks and opt to
randomize the padding data.
@tnull
tnullforce-pushed the 2025-11-option-message-padding branch from a8e3199 to 5052f4dCompareNovember 28, 2025 15:13
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why even bother with a feature flag for this? We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

@tnull

tnull commented Dec 9, 2025

Copy link
Copy Markdown
ContributorAuthor

Why even bother with a feature flag for this?

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

We could just include a fixed, high, TLV in every (non-gossip) message based on config and the spec can reserve that TLV for "never to be used, specifically for padding".

Right, that's what the current BOLTs draft (and this PR) are doing, mod the feature.

in every (non-gossip) message

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

One argument could be that bandwidth-restricted can use the feature to completely opt-out of the overhead. The current approach is basically the most minimally invasive it could get, though making this non-optional might of course improve privacy. I hope to get some initial feedback on the approach in the next spec meeting though. Especially if consensus is that making padding a mandatory / core concept it might also be worth to aim to do it at the Noise layer, at least mid-term. But for this initial draft, it seemed a bit rude to propose sending everybody more data without prior concept ACKs from the implementations.

Yea, okay, should be discussed in the spec meeting. IMO the overhead should be low enough that no one should care (is anyone really bandwidth-restricted in a way that a few Kbps is fine but a few + 2 Kbps isn't?), but even if it is one end can opt out and the other end can still send it, imo.

Why wouldn't we use gossip messages to increase the anonymity set size, i.e., also pad them? Btw, as noted on the BOLTs draft, a logical secondary step would of course be to still make use of the padding bytes to improve goodput, e.g., by transmitting queued gossip data whenever it fits.

Well, I was just talking about it int he context of the feature flag. Gossip messages are entirely signed, including the extra TLVs, so there has to be a feature flag to signal "ignore TLV type X, its not signed, and not a part of the gossip message". Tho even that has backwards compat concerns (I guess we don't care about someone's gossip getting dropped by half the nodes because they started including the padding field in their message?)

@tnull

Copy link
Copy Markdown
ContributorAuthor

Closing this and will to eventually reopen a new draft PR that implements padding via message chunking + pings so we can explore that possibility.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tnull@ldk-reviews-bot@TheBlueMatt