|
|
@ -7,35 +7,6 @@ |
|
|
|
#include <wire/peer_wire.h> |
|
|
|
#include <wire/wire_io.h> |
|
|
|
|
|
|
|
#undef io_read |
|
|
|
#undef io_write |
|
|
|
|
|
|
|
static char *read_buf; |
|
|
|
static size_t read_buf_len; |
|
|
|
|
|
|
|
static void do_read(void *buf, size_t len) |
|
|
|
{ |
|
|
|
assert(len <= read_buf_len); |
|
|
|
memcpy(buf, read_buf, len); |
|
|
|
read_buf += len; |
|
|
|
read_buf_len -= len; |
|
|
|
} |
|
|
|
|
|
|
|
#define io_read(conn, p, len, next, arg) \ |
|
|
|
(do_read((p), (len)), (next)((conn), (arg)), NULL) |
|
|
|
|
|
|
|
static char *write_buf; |
|
|
|
|
|
|
|
static void do_write(const void *buf, size_t len) |
|
|
|
{ |
|
|
|
size_t oldlen = tal_count(write_buf); |
|
|
|
tal_resize(&write_buf, oldlen + len); |
|
|
|
memcpy(write_buf + oldlen, buf, len); |
|
|
|
} |
|
|
|
|
|
|
|
#define io_write(conn, p, len, next, arg) \ |
|
|
|
(do_write((p), (len)), (next)((conn), (arg)), NULL) |
|
|
|
|
|
|
|
void status_fmt(enum log_level level UNUSED, const char *fmt, ...) |
|
|
|
{ |
|
|
|
va_list ap; |
|
|
@ -46,49 +17,8 @@ void status_fmt(enum log_level level UNUSED, const char *fmt, ...) |
|
|
|
va_end(ap); |
|
|
|
} |
|
|
|
|
|
|
|
void status_peer_io(enum log_level dir UNUSED, const u8 *msg UNUSED) |
|
|
|
{ |
|
|
|
} |
|
|
|
|
|
|
|
#if DEVELOPER |
|
|
|
/* AUTOGENERATED MOCKS START */ |
|
|
|
/* Generated stub for dev_blackhole_fd */ |
|
|
|
void dev_blackhole_fd(int fd UNNEEDED) |
|
|
|
{ fprintf(stderr, "dev_blackhole_fd called!\n"); abort(); } |
|
|
|
/* Generated stub for dev_sabotage_fd */ |
|
|
|
void dev_sabotage_fd(int fd UNNEEDED) |
|
|
|
{ fprintf(stderr, "dev_sabotage_fd called!\n"); abort(); } |
|
|
|
/* AUTOGENERATED MOCKS END */ |
|
|
|
|
|
|
|
enum dev_disconnect dev_disconnect(int pkt_type UNUSED) |
|
|
|
{ |
|
|
|
return DEV_DISCONNECT_NORMAL; |
|
|
|
} |
|
|
|
#endif /* DEVELOPER */ |
|
|
|
|
|
|
|
/* We test what look like unknown messages. */ |
|
|
|
#define is_unknown_msg_discardable(x) 0 |
|
|
|
|
|
|
|
#define fromwire_peektype(msg) 0 |
|
|
|
|
|
|
|
#include "../cryptomsg.c" |
|
|
|
|
|
|
|
const void *trc; |
|
|
|
|
|
|
|
static struct io_plan *check_msg_write(struct io_conn *conn UNUSED, struct peer *peer UNUSED) |
|
|
|
{ |
|
|
|
assert(tal_count(write_buf) == 2 + 16 + 5 + 16); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
static struct io_plan *check_msg_read(struct io_conn *conn UNUSED, struct peer *peer UNUSED, |
|
|
|
u8 *msg) |
|
|
|
{ |
|
|
|
assert(tal_count(msg) == 5); |
|
|
|
assert(memcmp(msg, "hello", 5) == 0); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
static struct secret secret_from_hex(const char *hex) |
|
|
|
{ |
|
|
|
struct secret secret; |
|
|
@ -98,11 +28,16 @@ static struct secret secret_from_hex(const char *hex) |
|
|
|
return secret; |
|
|
|
} |
|
|
|
|
|
|
|
static void check_result(const u8 *msg, const char *hex) |
|
|
|
{ |
|
|
|
assert(streq(hex, tal_hex(tmpctx, msg))); |
|
|
|
} |
|
|
|
|
|
|
|
int main(void) |
|
|
|
{ |
|
|
|
setup_locale(); |
|
|
|
|
|
|
|
struct peer_crypto_state cs_out, cs_in; |
|
|
|
struct crypto_state cs_out, cs_in; |
|
|
|
struct secret sk, rk, ck; |
|
|
|
const void *msg; |
|
|
|
size_t i; |
|
|
@ -125,27 +60,60 @@ int main(void) |
|
|
|
sk = secret_from_hex("0x969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9"); |
|
|
|
rk = secret_from_hex("0xbb9020b8965f4df047e07f955f3c4b88418984aadc5cdb35096b9ea8fa5c3442"); |
|
|
|
|
|
|
|
cs_out.cs.sn = cs_out.cs.rn = cs_in.cs.sn = cs_in.cs.rn = 0; |
|
|
|
cs_out.cs.sk = cs_in.cs.rk = sk; |
|
|
|
cs_out.cs.rk = cs_in.cs.sk = rk; |
|
|
|
cs_out.cs.s_ck = cs_out.cs.r_ck = cs_in.cs.s_ck = cs_in.cs.r_ck = ck; |
|
|
|
init_peer_crypto_state((void *)tmpctx, &cs_in); |
|
|
|
init_peer_crypto_state((void *)tmpctx, &cs_out); |
|
|
|
cs_out.sn = cs_out.rn = cs_in.sn = cs_in.rn = 0; |
|
|
|
cs_out.sk = cs_in.rk = sk; |
|
|
|
cs_out.rk = cs_in.sk = rk; |
|
|
|
cs_out.s_ck = cs_out.r_ck = cs_in.s_ck = cs_in.r_ck = ck; |
|
|
|
|
|
|
|
for (i = 0; i < 1002; i++) { |
|
|
|
write_buf = tal_arr(tmpctx, char, 0); |
|
|
|
u8 *dec, *enc; |
|
|
|
u16 len; |
|
|
|
|
|
|
|
peer_write_message(NULL, &cs_out, msg, check_msg_write); |
|
|
|
if ((i % 500) < 2) |
|
|
|
status_trace("output %zu: 0x%s", i, |
|
|
|
tal_hex(tmpctx, write_buf)); |
|
|
|
enc = cryptomsg_encrypt_msg(tmpctx, &cs_out, msg); |
|
|
|
|
|
|
|
/* BOLT #8:
|
|
|
|
* |
|
|
|
* output 0: 0xcf2b30ddf0cf3f80e7c35a6e6730b59fe802473180f396d88a8fb0db8cbcf25d2f214cf9ea1d95 |
|
|
|
*/ |
|
|
|
if (i == 0) |
|
|
|
check_result(enc, "cf2b30ddf0cf3f80e7c35a6e6730b59fe802473180f396d88a8fb0db8cbcf25d2f214cf9ea1d95"); |
|
|
|
/* BOLT #8:
|
|
|
|
* |
|
|
|
* output 1: 0x72887022101f0b6753e0c7de21657d35a4cb2a1f5cde2650528bbc8f837d0f0d7ad833b1a256a1 |
|
|
|
*/ |
|
|
|
if (i == 1) |
|
|
|
check_result(enc, "72887022101f0b6753e0c7de21657d35a4cb2a1f5cde2650528bbc8f837d0f0d7ad833b1a256a1"); |
|
|
|
|
|
|
|
/* BOLT #8:
|
|
|
|
* |
|
|
|
* output 500: 0x178cb9d7387190fa34db9c2d50027d21793c9bc2d40b1e14dcf30ebeeeb220f48364f7a4c68bf8 |
|
|
|
* output 501: 0x1b186c57d44eb6de4c057c49940d79bb838a145cb528d6e8fd26dbe50a60ca2c104b56b60e45bd |
|
|
|
*/ |
|
|
|
if (i == 500) |
|
|
|
check_result(enc, "178cb9d7387190fa34db9c2d50027d21793c9bc2d40b1e14dcf30ebeeeb220f48364f7a4c68bf8"); |
|
|
|
if (i == 501) |
|
|
|
check_result(enc, "1b186c57d44eb6de4c057c49940d79bb838a145cb528d6e8fd26dbe50a60ca2c104b56b60e45bd"); |
|
|
|
|
|
|
|
/* BOLT #8:
|
|
|
|
* |
|
|
|
* output 1000: 0x4a2f3cc3b5e78ddb83dcb426d9863d9d9a723b0337c89dd0b005d89f8d3c05c52b76b29b740f09 |
|
|
|
* output 1001: 0x2ecd8c8a5629d0d02ab457a0fdd0f7b90a192cd46be5ecb6ca570bfc5e268338b1a16cf4ef2d36 |
|
|
|
*/ |
|
|
|
if (i == 1000) |
|
|
|
check_result(enc, "4a2f3cc3b5e78ddb83dcb426d9863d9d9a723b0337c89dd0b005d89f8d3c05c52b76b29b740f09"); |
|
|
|
if (i == 1001) |
|
|
|
check_result(enc, "2ecd8c8a5629d0d02ab457a0fdd0f7b90a192cd46be5ecb6ca570bfc5e268338b1a16cf4ef2d36"); |
|
|
|
|
|
|
|
if (!cryptomsg_decrypt_header(&cs_in, enc, &len)) |
|
|
|
abort(); |
|
|
|
|
|
|
|
read_buf = write_buf; |
|
|
|
read_buf_len = tal_count(read_buf); |
|
|
|
write_buf = tal_arr(tmpctx, char, 0); |
|
|
|
/* Trim header */ |
|
|
|
memmove(enc, enc + CRYPTOMSG_HDR_SIZE, |
|
|
|
tal_bytelen(enc) - CRYPTOMSG_HDR_SIZE); |
|
|
|
tal_resize(&enc, tal_bytelen(enc) - CRYPTOMSG_HDR_SIZE); |
|
|
|
|
|
|
|
peer_read_message(NULL, &cs_in, check_msg_read); |
|
|
|
assert(read_buf_len == 0); |
|
|
|
dec = cryptomsg_decrypt_body(enc, &cs_in, enc); |
|
|
|
assert(memeq(dec, tal_bytelen(dec), msg, tal_bytelen(msg))); |
|
|
|
} |
|
|
|
tal_free(tmpctx); |
|
|
|
return 0; |
|
|
|