From 63b1ae54a1e7a0a0d48facd0b90c7ad715006f3f Mon Sep 17 00:00:00 2001 From: Antoine Poinsot Date: Thu, 10 Sep 2020 17:49:13 +0200 Subject: [PATCH] fuzz: add a target for common/bech32 Signed-off-by: Antoine Poinsot --- tests/fuzz/fuzz-bech32.c | 50 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 tests/fuzz/fuzz-bech32.c diff --git a/tests/fuzz/fuzz-bech32.c b/tests/fuzz/fuzz-bech32.c new file mode 100644 index 000000000..e9a8b6c0f --- /dev/null +++ b/tests/fuzz/fuzz-bech32.c @@ -0,0 +1,50 @@ +#include +#include +#include + +#include + +void init(int *argc, char ***argv) +{ +} + +void run(const uint8_t *data, size_t size) +{ + const char hrp_inv[5] = "lnbc\0", hrp_addr[3] = "bc\0"; + char *bech32_str, *hrp_out, *addr; + uint8_t *data_out; + size_t data_out_len; + int wit_version; + + /* Buffer size is defined in each function's doc comment. */ + bech32_str = malloc(size + strlen(hrp_inv) + 8); + /* FIXME: needs a dictionary / a startup seed corpus to pass this more + * frequently. */ + if (bech32_encode(bech32_str, hrp_inv, data, size, size) == 1) { + hrp_out = malloc(strlen(bech32_str) - 6); + data_out = malloc(strlen(bech32_str) - 8); + bech32_decode(hrp_out, data_out, &data_out_len, bech32_str, size); + free(hrp_out); + free(data_out); + } + free(bech32_str); + + data_out = malloc(size); + + /* This is also used as part of sign and check message. */ + data_out_len = 0; + bech32_convert_bits(data_out, &data_out_len, 8, data, size, 5, 1); + data_out_len = 0; + bech32_convert_bits(data_out, &data_out_len, 8, data, size, 5, 0); + + addr = malloc(73 + strlen(hrp_addr)); + wit_version = 0; + if (segwit_addr_encode(addr, hrp_addr, wit_version, data, size) == 1) + segwit_addr_decode(&wit_version, data_out, &data_out_len, hrp_addr, addr); + wit_version = 1; + if (segwit_addr_encode(addr, hrp_addr, wit_version, data, size) == 1) + segwit_addr_decode(&wit_version, data_out, &data_out_len, hrp_addr, addr); + free(addr); + + free(data_out); +}