mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 18:11:28 +01:00
64008e275a
Often we only need a single secret, so it's clearer to have routines to do just that. When we change to the lnd key scheme, there will be no benefit in calculating them all together. This also adds a test! Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
129 lines
4.3 KiB
C
129 lines
4.3 KiB
C
#ifndef LIGHTNING_COMMON_DERIVE_BASEPOINTS_H
|
|
#define LIGHTNING_COMMON_DERIVE_BASEPOINTS_H
|
|
#include "config.h"
|
|
#include <assert.h>
|
|
#include <bitcoin/privkey.h>
|
|
#include <bitcoin/pubkey.h>
|
|
#include <ccan/build_assert/build_assert.h>
|
|
#include <ccan/crypto/shachain/shachain.h>
|
|
|
|
struct sha256;
|
|
|
|
struct basepoints {
|
|
struct pubkey revocation;
|
|
struct pubkey payment;
|
|
struct pubkey htlc;
|
|
struct pubkey delayed_payment;
|
|
};
|
|
|
|
struct secrets {
|
|
struct privkey funding_privkey;
|
|
struct secret revocation_basepoint_secret;
|
|
struct secret payment_basepoint_secret;
|
|
struct secret htlc_basepoint_secret;
|
|
struct secret delayed_payment_basepoint_secret;
|
|
};
|
|
|
|
/**
|
|
* derive_basepoints - given a (per-peer) seed, get the basepoints
|
|
* @seed: (in) seed (derived by master daemon from counter and main seed)
|
|
* @funding_pubkey: (out) pubkey for funding tx output (if non-NULL)
|
|
* @basepoints: (out) basepoints for channel (if non-NULL)
|
|
* @secrets: (out) basepoints for channel (if non-NULL)
|
|
* @shaseed: (out) seed for shachain (if non-NULL)
|
|
*/
|
|
bool derive_basepoints(const struct secret *seed,
|
|
struct pubkey *funding_pubkey,
|
|
struct basepoints *basepoints,
|
|
struct secrets *secrets,
|
|
struct sha256 *shaseed);
|
|
|
|
/**
|
|
* derive_funding_key - give a (per-peer) seed, get just funding key
|
|
* @seed: (in) seed (derived by master daemon from counter and main seed)
|
|
* @funding_pubkey: (out) pubkey for funding tx output (if non-NULL)
|
|
* @funding_privkey: (out) privkey for funding tx output (if non-NULL)
|
|
*
|
|
* This is a cut-down version of derive_basepoints.
|
|
*/
|
|
bool derive_funding_key(const struct secret *seed,
|
|
struct pubkey *funding_pubkey,
|
|
struct privkey *funding_privkey);
|
|
|
|
/**
|
|
* derive_payment_basepoint - give a (per-channel) seed, get just payment basepoint
|
|
* @seed: (in) seed (derived by master daemon from counter and main seed)
|
|
* @payment_basepoint: (out) basepoint for payment output (if non-NULL)
|
|
* @payment_secret: (out) secret for payment basepoint (if non-NULL)
|
|
*
|
|
* This is a cut-down version of derive_basepoints.
|
|
*/
|
|
bool derive_payment_basepoint(const struct secret *seed,
|
|
struct pubkey *payment_basepoint,
|
|
struct secret *payment_secret);
|
|
|
|
/**
|
|
* derive_shaseed - give a (per-peer) seed, get just the shaseed
|
|
* @seed: (in) seed (derived by master daemon from counter and main seed)
|
|
* @shaseed: (out) seed for shachain
|
|
*
|
|
* This is a cut-down version of derive_basepoints.
|
|
*/
|
|
bool derive_shaseed(const struct secret *seed, struct sha256 *shaseed);
|
|
|
|
/**
|
|
* derive_delayed_payment_basepoint - give a (per-channel) seed, get just delayed payment basepoint
|
|
* @seed: (in) seed (derived by master daemon from counter and main seed)
|
|
* @delayed_payment_basepoint: (out) basepoint for payment output (if non-NULL)
|
|
* @delayed_payment_secret: (out) secret for payment basepoint (if non-NULL)
|
|
*
|
|
* This is a cut-down version of derive_basepoints.
|
|
*/
|
|
bool derive_delayed_payment_basepoint(const struct secret *seed,
|
|
struct pubkey *delayed_payment_basepoint,
|
|
struct secret *delayed_payment_secret);
|
|
|
|
/**
|
|
* per_commit_secret - get a secret for this index.
|
|
* @shaseed: the sha256 seed
|
|
* @commit_secret: the returned per-commit secret.
|
|
* @per_commit_index: (in) which @commit_secret to return.
|
|
*/
|
|
void per_commit_secret(const struct sha256 *shaseed,
|
|
struct secret *commit_secret,
|
|
u64 per_commit_index);
|
|
|
|
/**
|
|
* per_commit_point - get the per-commit-point for this index.
|
|
* @shaseed: the sha256 seed
|
|
* @commit_point: the returned per-commit point.
|
|
* @per_commit_index: (in) which @commit_point to return.
|
|
*/
|
|
bool per_commit_point(const struct sha256 *shaseed,
|
|
struct pubkey *commit_point,
|
|
u64 per_commit_index);
|
|
|
|
/* BOLT #3:
|
|
*
|
|
* The first secret used:
|
|
* - MUST be index 281474976710655,
|
|
* - and from there, the index is decremented.
|
|
*/
|
|
static inline u64 shachain_index(u64 per_commit_index)
|
|
{
|
|
BUILD_ASSERT((1ULL << SHACHAIN_BITS)-1 == 281474976710655);
|
|
assert(per_commit_index < (1ULL << SHACHAIN_BITS));
|
|
return (1ULL << SHACHAIN_BITS)-1 - per_commit_index;
|
|
}
|
|
|
|
static inline u64 revocations_received(const struct shachain *shachain)
|
|
{
|
|
return (1ULL << SHACHAIN_BITS) - (shachain_next_index(shachain) + 1);
|
|
}
|
|
|
|
void towire_basepoints(u8 **pptr, const struct basepoints *b);
|
|
void fromwire_basepoints(const u8 **ptr, size_t *max,
|
|
struct basepoints *b);
|
|
|
|
#endif /* LIGHTNING_COMMON_DERIVE_BASEPOINTS_H */
|