Skip to content

Commit 9e8f945

Browse files
committed
fuzz: add support for fuzzing tx parsing
1 parent b56a0b6 commit 9e8f945

File tree

4 files changed

+69
-17
lines changed

4 files changed

+69
-17
lines changed

_CMakeLists.txt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,17 @@ add_subdirectory(./src/secp256k1/)
6060
add_subdirectory(./src)
6161

6262
if(WALLYCORE_ENABLE_FUZZING)
63-
add_executable(fuzz_psbt fuzz/fuzz_psbt.c)
64-
target_include_directories(fuzz_psbt PRIVATE include)
65-
target_link_libraries(fuzz_psbt PRIVATE wallycore)
66-
target_link_options(fuzz_psbt PRIVATE -fsanitize=fuzzer)
67-
set_target_properties(fuzz_psbt PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/fuzz)
63+
add_executable(fuzz_psbt_from_bytes fuzz/fuzz_psbt_from_bytes.c)
64+
target_include_directories(fuzz_psbt_from_bytes PRIVATE include)
65+
target_link_libraries(fuzz_psbt_from_bytes PRIVATE wallycore)
66+
target_link_options(fuzz_psbt_from_bytes PRIVATE -fsanitize=fuzzer)
67+
set_target_properties(fuzz_psbt_from_bytes PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/fuzz)
68+
69+
add_executable(fuzz_tx_from_bytes fuzz/fuzz_tx_from_bytes.c)
70+
target_include_directories(fuzz_tx_from_bytes PRIVATE include)
71+
target_link_libraries(fuzz_tx_from_bytes PRIVATE wallycore)
72+
target_link_options(fuzz_tx_from_bytes PRIVATE -fsanitize=fuzzer)
73+
set_target_properties(fuzz_tx_from_bytes PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/fuzz)
6874
endif()
6975

7076
if(NOT WALLYCORE_ENABLE_TESTS)

fuzz/Makefile.am

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
noinst_PROGRAMS = fuzz_psbt
1+
noinst_PROGRAMS = fuzz_psbt_from_bytes fuzz_tx_from_bytes
22

3-
fuzz_psbt_SOURCES = fuzz_psbt.c
4-
fuzz_psbt_CFLAGS = -I$(top_srcdir)/include $(AM_CFLAGS)
5-
fuzz_psbt_LDFLAGS = -fsanitize=fuzzer
6-
fuzz_psbt_LDADD = $(top_builddir)/src/libwallycore.la
3+
fuzz_psbt_from_bytes_SOURCES = fuzz_psbt_from_bytes.c
4+
fuzz_psbt_from_bytes_CFLAGS = -I$(top_srcdir)/include $(AM_CFLAGS)
5+
fuzz_psbt_from_bytes_LDFLAGS = -fsanitize=fuzzer
6+
fuzz_psbt_from_bytes_LDADD = $(top_builddir)/src/libwallycore.la
7+
8+
fuzz_tx_from_bytes_SOURCES = fuzz_tx_from_bytes.c
9+
fuzz_tx_from_bytes_CFLAGS = -I$(top_srcdir)/include $(AM_CFLAGS)
10+
fuzz_tx_from_bytes_LDFLAGS = -fsanitize=fuzzer
11+
fuzz_tx_from_bytes_LDADD = $(top_builddir)/src/libwallycore.la
Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
#include <wally_psbt.h>
22

3-
static void test_psbt(const uint8_t *data, size_t size, uint32_t flags)
3+
static void test_fuzz_psbt_from_bytes(const uint8_t *data, size_t size, uint32_t flags)
44
{
55
struct wally_psbt *psbt = NULL;
66
int ret;
77

8-
/* Test strict parsing */
98
ret = wally_psbt_from_bytes(data, size, flags, &psbt);
109
if (psbt) {
1110
if (ret == WALLY_OK && flags == WALLY_PSBT_PARSE_FLAG_STRICT) {
12-
/* Parsing succeeded: try to serialize it back */
11+
/* Parsing succeeded: try to serialize it back to bytes */
1312
size_t len = 0, written = 0;
1413
ret = wally_psbt_get_length(psbt, 0, &len);
1514
if (ret == WALLY_OK && len) {
@@ -21,18 +20,17 @@ static void test_psbt(const uint8_t *data, size_t size, uint32_t flags)
2120
}
2221
}
2322
wally_psbt_free(psbt);
24-
psbt = NULL;
2523
}
2624
}
2725

2826
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
2927
{
3028
/* Test strict parsing */
31-
test_psbt(data, size, WALLY_PSBT_PARSE_FLAG_STRICT);
29+
test_fuzz_psbt_from_bytes(data, size, WALLY_PSBT_PARSE_FLAG_STRICT);
3230
/* Test loose parsing */
33-
test_psbt(data, size, WALLY_PSBT_PARSE_FLAG_LOOSE);
31+
test_fuzz_psbt_from_bytes(data, size, WALLY_PSBT_PARSE_FLAG_LOOSE);
3432
/* Test default flags (no flags) */
35-
test_psbt(data, size, 0);
33+
test_fuzz_psbt_from_bytes(data, size, 0);
3634

3735
return 0;
3836
}

fuzz/fuzz_tx_from_bytes.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include <wally_transaction.h>
2+
3+
static void test_tx_from_bytes(const uint8_t *data, size_t size, uint32_t flags)
4+
{
5+
struct wally_tx *tx = NULL;
6+
int ret;
7+
8+
ret = wally_tx_from_bytes(data, size, flags, &tx);
9+
if (tx) {
10+
if (ret == WALLY_OK &&
11+
(flags == WALLY_TX_FLAG_USE_WITNESS ||
12+
flags == (WALLY_TX_FLAG_USE_WITNESS|WALLY_TX_FLAG_USE_ELEMENTS))) {
13+
/* Parsing succeeded: try to serialize it back to bytes */
14+
size_t len = 0, written = 0;
15+
ret = wally_tx_get_length(tx, flags, &len);
16+
if (ret == WALLY_OK && len) {
17+
unsigned char *bytes = malloc(len);
18+
if (bytes) {
19+
wally_tx_to_bytes(tx, flags, bytes, len, &written);
20+
free(bytes);
21+
}
22+
}
23+
}
24+
wally_tx_free(tx);
25+
}
26+
}
27+
28+
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
29+
{
30+
static const uint32_t flags[6] = {
31+
0,
32+
WALLY_TX_FLAG_USE_WITNESS,
33+
WALLY_TX_FLAG_USE_ELEMENTS,
34+
WALLY_TX_FLAG_USE_WITNESS | WALLY_TX_FLAG_USE_ELEMENTS,
35+
WALLY_TX_FLAG_ALLOW_PARTIAL,
36+
WALLY_TX_FLAG_PRE_BIP144
37+
};
38+
39+
for (size_t i = 0; i < sizeof(flags) / sizeof(flags[0]); ++i)
40+
test_tx_from_bytes(data, size, flags[i]);
41+
42+
return 0;
43+
}

0 commit comments

Comments
 (0)