1 #include "config.h"
2 #include <assert.h>
3 #include <ccan/array_size/array_size.h>
4 #include <ccan/mem/mem.h>
5 #include <ccan/str/hex/hex.h>
6 #include <common/node_id.h>
7 #include <common/type_to_string.h>
8 #include <wire/wire.h>
9 
10 /* Convert from pubkey to compressed pubkey. */
node_id_from_pubkey(struct node_id * id,const struct pubkey * key)11 void node_id_from_pubkey(struct node_id *id, const struct pubkey *key)
12 {
13 	size_t outlen = ARRAY_SIZE(id->k);
14 	if (!secp256k1_ec_pubkey_serialize(secp256k1_ctx, id->k, &outlen,
15 					   &key->pubkey,
16 					   SECP256K1_EC_COMPRESSED))
17 		abort();
18 }
19 
20 WARN_UNUSED_RESULT
pubkey_from_node_id(struct pubkey * key,const struct node_id * id)21 bool pubkey_from_node_id(struct pubkey *key, const struct node_id *id)
22 {
23 	return secp256k1_ec_pubkey_parse(secp256k1_ctx, &key->pubkey,
24 					 memcheck(id->k, sizeof(id->k)),
25 					 sizeof(id->k));
26 }
27 
28 WARN_UNUSED_RESULT
point32_from_node_id(struct point32 * key,const struct node_id * id)29 bool point32_from_node_id(struct point32 *key, const struct node_id *id)
30 {
31 	struct pubkey k;
32 	if (!pubkey_from_node_id(&k, id))
33 		return false;
34 	return secp256k1_xonly_pubkey_from_pubkey(secp256k1_ctx, &key->pubkey,
35 						  NULL, &k.pubkey) == 1;
36 }
37 
38 /* It's valid if we can convert to a real pubkey. */
node_id_valid(const struct node_id * id)39 bool node_id_valid(const struct node_id *id)
40 {
41 	struct pubkey key;
42 	return pubkey_from_node_id(&key, id);
43 }
44 
45 /* Convert to hex string of SEC1 encoding */
node_id_to_hexstr(const tal_t * ctx,const struct node_id * id)46 char *node_id_to_hexstr(const tal_t *ctx, const struct node_id *id)
47 {
48 	return tal_hexstr(ctx, id->k, sizeof(id->k));
49 }
50 REGISTER_TYPE_TO_STRING(node_id, node_id_to_hexstr);
51 
52 /* Convert from hex string of SEC1 encoding */
node_id_from_hexstr(const char * str,size_t slen,struct node_id * id)53 bool node_id_from_hexstr(const char *str, size_t slen, struct node_id *id)
54 {
55 	return hex_decode(str, slen, id->k, sizeof(id->k))
56 		&& node_id_valid(id);
57 }
58 
node_id_cmp(const struct node_id * a,const struct node_id * b)59 int node_id_cmp(const struct node_id *a, const struct node_id *b)
60 {
61 	return memcmp(a->k, b->k, sizeof(a->k));
62 }
63 
fromwire_node_id(const u8 ** cursor,size_t * max,struct node_id * id)64 void fromwire_node_id(const u8 **cursor, size_t *max, struct node_id *id)
65 {
66 	fromwire(cursor, max, &id->k, sizeof(id->k));
67 }
68 
towire_node_id(u8 ** pptr,const struct node_id * id)69 void towire_node_id(u8 **pptr, const struct node_id *id)
70 {
71 	/* Cheap sanity check */
72 	assert(id->k[0] == 0x2 || id->k[0] == 0x3);
73 	towire(pptr, id->k, sizeof(id->k));
74 }
75