core-lightning/common/keyset.c
Christian Decker 94eb2620dc bolt: Updated the BOLT specification to the latest version
This is mainly just copying over the copy-editing from the
lightning-rfc repository.

[ Split to just perform changes after the UNKNOWN_PAYMENT_HASH change --RR ]

Signed-off-by: Christian Decker <decker.christian@gmail.com>
Reported-by: Rusty Russell <@rustyrussell>
2019-01-15 02:19:56 +00:00

66 lines
2.1 KiB
C

#include <common/derive_basepoints.h>
#include <common/key_derive.h>
#include <common/keyset.h>
bool derive_keyset(const struct pubkey *per_commitment_point,
const struct basepoints *self,
const struct basepoints *other,
struct keyset *keyset)
{
/* BOLT #3:
*
* ### `localpubkey`, `remotepubkey`, `local_htlcpubkey`, `remote_htlcpubkey`, `local_delayedpubkey`, and `remote_delayedpubkey` Derivation
*
* These pubkeys are simply generated by addition from their base points:
*
* pubkey = basepoint + SHA256(per_commitment_point || basepoint) * G
*
* The `localpubkey` uses the local node's `payment_basepoint`;
* the `remotepubkey` uses the remote node's `payment_basepoint`;
* the `local_htlcpubkey` uses the local node's `htlc_basepoint`;
* the `remote_htlcpubkey` uses the remote node's `htlc_basepoint`;
* the `local_delayedpubkey` uses the local node's `delayed_payment_basepoint`;
* and the `remote_delayedpubkey` uses the remote node's `delayed_payment_basepoint`.
*/
if (!derive_simple_key(&self->payment,
per_commitment_point,
&keyset->self_payment_key))
return false;
if (!derive_simple_key(&other->payment,
per_commitment_point,
&keyset->other_payment_key))
return false;
if (!derive_simple_key(&self->htlc,
per_commitment_point,
&keyset->self_htlc_key))
return false;
if (!derive_simple_key(&other->htlc,
per_commitment_point,
&keyset->other_htlc_key))
return false;
if (!derive_simple_key(&self->delayed_payment,
per_commitment_point,
&keyset->self_delayed_payment_key))
return false;
/* BOLT #3:
*
* ### `revocationpubkey` Derivation
*
* The `revocationpubkey` is a blinded key: when the local node wishes
* to create a new commitment for the remote node, it uses its own
* `revocation_basepoint` and the remote node's `per_commitment_point`
* to derive a new `revocationpubkey` for the commitment.
*/
if (!derive_revocation_key(&other->revocation,
per_commitment_point,
&keyset->self_revocation_key))
return false;
return true;
}