Good morning list,

I'd like to explore some enhancements for unannounced (sometimes called
private) channels.
Unannounced channels are really useful for mobile nodes that won't be
online often enough to route
payments. That does leak information to your channel peer, but that's a
topic for another post.

One of the nice properties of unannounced channels is that they help break
linkability between
on-chain and off-chain payments (because only your channel peer knows the
link between your
`funding_key`, your on-chain UTXOs and your `node_id`).

However the current implementation is broken: invoices leak both your
`node_id` and
`short_channel_id` (via the signature and Bolt 11 routing hints [1]).
It doesn't have to be like this though; invoices don't always require you
to use your real
`short_channel_id` nor your real `node_id`.

Let's set the scene:

* Alice is our mobile wallet user
* Bob is a normal lightning node connected to Alice via an unannounced
channel
* Carol wants to pay Alice via Bolt 11 invoices

There is already a first proposal to fix this problem [2], with the
following trade-offs:

(-) Adds a new stateful protocol (with new messages) between Alice and Bob
(-) Can't use a unique `short_channel_id` for every invoice
(+) Carol doesn't need to change anything from the existing flow

I'd like to propose an alternative design with the following, different
trade-offs:

(+) No state to synchronize between Alice and Bob
(+) Can use unique `short_channel_id`s and `node_id`s for each invoice
(-) But Carol needs to add a new record in the onion (probably needs a
feature bit)

## Decoy `node_id`s

Alice currently signs all invoices with the private key associated to her
`node_id`.
This makes sense when Alice wants to be reached via public channels, but it
isn't used at all when
Alice provides routing hints. In that case she can generate a one-time
private key and sign the
invoice with it. This way Alice doesn't leak her real `node_id` to payers.

## Decoy `short_channel_id`s

Here is a simple construction for generating a `decoy_short_channel_id`:

* Alice draws a random `invoice_key`
* Alice computes the corresponding public key: `P_I = invoice_key * G`
* Alice computes `decoy_short_channel_id = H(invoice_key * bob_node_id) xor
short_channel_id`
* Alice provides a routing hint using `decoy_short_channel_id` in the
invoice
* Alice provides `P_I` in the invoice

Now when Carol wants to pay, she has to include `P_I` in the onion payload
for Bob.
When Bob receives the HTLC, he can compute `short_channel_id =
H(bob_private_key * P_I) xor decoy_short_channel_id`.
That allows Bob to correctly forward the payment to Alice without any prior
negotiation.

## Improvements

The two main drawbacks of this scheme are:

1. It uses 33 bytes in the invoice
2. It uses 33 bytes in the onion payload for Bob

We can easily get rid of (1.) by leveraging the `payment_secret`. The
improved scheme is:

* Alice draws a random `decoy_key`
* Alice computes the corresponding `decoy_node_id = decoy_key * G`
* Alice draws a random `payment_secret`
* Alice computes `decoy_short_channel_id = H(payment_secret * decoy_key *
bob_node_id) xor short_channel_id`
* Alice uses the `decoy_key` to sign the invoice
* Carol recovers `decoy_node_id` from the invoice signature
* Carol includes `P_I = payment_secret * decoy_node_id` in the onion
payload for Bob
* Bob can compute `short_channel_id = H(bob_private_key * P_I) xor
decoy_short_channel_id`

But I don't see how to get rid of (2.). If anyone has a clever idea on how
to do that, I'd love to hear it!

These constructions definitely need more eyes on them; I don't see anything
obviously broken, but
neither did the designers of PKCS #1 until Bleichenbacher ruined the party
[3].

Thank you for reading,
Bastien

[1]
https://github.com/lightningnetwork/lightning-rfc/blob/master/11-payment-encoding.md#tagged-fields
[2] https://github.com/lightningnetwork/lightning-rfc/pull/681
[3] http://archiv.infsec.ethz.ch/education/fs08/secsem/bleichenbacher98.pdf
_______________________________________________
Lightning-dev mailing list
Lightning-dev@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/lightning-dev

Reply via email to