forked from ElementsProject/lightning
-
Notifications
You must be signed in to change notification settings - Fork 0
/
towire.c
143 lines (117 loc) · 2.81 KB
/
towire.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "wire.h"
#include <assert.h>
#include <ccan/crypto/ripemd160/ripemd160.h>
#include <ccan/crypto/siphash24/siphash24.h>
#include <ccan/endian/endian.h>
#include <ccan/mem/mem.h>
#include <ccan/tal/tal.h>
#include <common/amount.h>
#include <common/errcode.h>
#include <common/node_id.h>
#include <common/utils.h>
void towire(u8 **pptr, const void *data, size_t len)
{
size_t oldsize = tal_count(*pptr);
tal_resize(pptr, oldsize + len);
memcpy(*pptr + oldsize, memcheck(data, len), len);
}
void towire_u8(u8 **pptr, u8 v)
{
towire(pptr, &v, sizeof(v));
}
void towire_u16(u8 **pptr, u16 v)
{
be16 l = cpu_to_be16(v);
towire(pptr, &l, sizeof(l));
}
void towire_u32(u8 **pptr, u32 v)
{
be32 l = cpu_to_be32(v);
towire(pptr, &l, sizeof(l));
}
void towire_u64(u8 **pptr, u64 v)
{
be64 l = cpu_to_be64(v);
towire(pptr, &l, sizeof(l));
}
static void towire_tlv_uint(u8 **pptr, u64 v)
{
u8 bytes[8];
size_t num_zeroes;
be64 val;
val = cpu_to_be64(v);
BUILD_ASSERT(sizeof(val) == sizeof(bytes));
memcpy(bytes, &val, sizeof(bytes));
for (num_zeroes = 0; num_zeroes < sizeof(bytes); num_zeroes++)
if (bytes[num_zeroes] != 0)
break;
towire(pptr, bytes + num_zeroes, sizeof(bytes) - num_zeroes);
}
void towire_tu16(u8 **pptr, u16 v)
{
return towire_tlv_uint(pptr, v);
}
void towire_tu32(u8 **pptr, u32 v)
{
return towire_tlv_uint(pptr, v);
}
void towire_tu64(u8 **pptr, u64 v)
{
return towire_tlv_uint(pptr, v);
}
void towire_bool(u8 **pptr, bool v)
{
u8 val = v;
towire(pptr, &val, sizeof(val));
}
void towire_errcode_t(u8 **pptr, errcode_t v)
{
towire_u32(pptr, (u32)v);
}
void towire_secp256k1_ecdsa_signature(u8 **pptr,
const secp256k1_ecdsa_signature *sig)
{
u8 compact[64];
secp256k1_ecdsa_signature_serialize_compact(secp256k1_ctx,
compact, sig);
towire(pptr, compact, sizeof(compact));
}
void towire_secp256k1_ecdsa_recoverable_signature(u8 **pptr,
const secp256k1_ecdsa_recoverable_signature *rsig)
{
u8 compact[64];
int recid;
secp256k1_ecdsa_recoverable_signature_serialize_compact(secp256k1_ctx,
compact,
&recid,
rsig);
towire(pptr, compact, sizeof(compact));
towire_u8(pptr, recid);
}
void towire_sha256(u8 **pptr, const struct sha256 *sha256)
{
towire(pptr, sha256, sizeof(*sha256));
}
void towire_ripemd160(u8 **pptr, const struct ripemd160 *ripemd)
{
towire(pptr, ripemd, sizeof(*ripemd));
}
void towire_u8_array(u8 **pptr, const u8 *arr, size_t num)
{
towire(pptr, arr, num);
}
void towire_pad(u8 **pptr, size_t num)
{
/* Simply insert zeros. */
size_t oldsize = tal_count(*pptr);
tal_resize(pptr, oldsize + num);
memset(*pptr + oldsize, 0, num);
}
void towire_wirestring(u8 **pptr, const char *str)
{
towire(pptr, str, strlen(str) + 1);
}
void towire_siphash_seed(u8 **pptr, const struct siphash_seed *seed)
{
towire(pptr, seed, sizeof(*seed));
}