libswarm-ng

C implementation of BMT hasher, Swarmhash and Single Owner Chunk for swarm
git clone git://git.defalsify.org/libswarm-ng.git
Log | Files | Refs | Submodules | README

commit 25c309e94eabb0f45a00a5407354a725cb85dad3
parent b20ad5ca1e26ecdf9175949a2ead6d770995041f
Author: nolash <dev@holbrook.no>
Date:   Thu, 23 Sep 2021 08:06:10 +0200

Add malloc alternate

Diffstat:
MMakefile.dev | 30++++++++++++++++++++++--------
Msrc/bmt.c | 30++++++++++++++++++++----------
Msrc/bmt.h | 19++++++++-----------
Asrc/bmt_interface.h | 7+++++++
Asrc/bmt_malloc.h | 16++++++++++++++++
Msrc/chunk.c | 4++++
Msrc/chunk.h | 1-
Msrc/swarmfile.h | 4++++
Msrc/wasm/common.c | 6+++---
Msrc/wasm/wasm.c | 8++++----
Mtest/check_bmt.c | 13++++++++-----
Mtest/check_chunk.c | 1+
12 files changed, 97 insertions(+), 42 deletions(-)

diff --git a/Makefile.dev b/Makefile.dev @@ -10,7 +10,7 @@ wasm_cc = /usr/bin/clang wasm_libcdir = /opt/wasi-libc wasm_libdir = $(wasm_libcdir)/lib/wasm32-wasi wasm_target = wasm32-unknown-wasi -wasm_cflags = -I./src/wasm -m32 --target=$(wasm_target) -Wl,--import-memory -Wl,--import-table -Wl,--allow-undefined -Wl,--no-entry -nostdlib -nostartfiles +wasm_cflags = -I./src/wasm -m32 --target=$(wasm_target) -Wl,--import-memory -Wl,--import-table -Wl,--allow-undefined -Wl,--no-entry -nostdlib -nostartfiles -DLIBSWARM_MALLOC wasm_cflags_stdlib = $(wasm_cflags) --sysroot $(wasm_libcdir) prep: @@ -30,6 +30,14 @@ build_base: prep build_keccak $(CC) -c -o build/swarm.o $(CFLAGS) src/swarm.c $(CC) -c -o build/chunk.o $(CFLAGS) src/chunk.c +build_base_malloc: prep build_keccak + $(CC) -c -o build/bmt.o src/bmt.c $(CFLAGS) -DLIBSWARM_MALLOC -lkeccak-tiny + $(CC) -c -o build/endian.o $(CFLAGS) -DLIBSWARM_MALLOC src/endian.c + $(CC) -c -o build/swarmfile.o $(CFLAGS) -DLIBSWARM_MALLOC src/swarmfile.c + $(CC) -c -o build/swarm.o $(CFLAGS) -DLIBSWARM_MALLOC src/swarm.c + $(CC) -c -o build/chunk.o $(CFLAGS) -DLIBSWARM_MALLOC src/chunk.c + + build_secp256k1: prep build_keystore: prep build_keccak build_secp256k1 @@ -47,17 +55,17 @@ build_check_common: ar -rvs build/test/libtestcommon.a build/common.o build/hex.o # TODO: should not be necessary to add -lsecp256k1 here -build_check: build_base build_check_common +build_check: build_base_malloc build_check_common $(CC) -I./src -o build/test/check_bmt build/swarm.o build/bmt.o build/endian.o build/swarmfile.o test/check_bmt.c $(CFLAGS_CHECK) -lcheck -lkeccak-tiny -ltestcommon -lsecp256k1 $(CC) -I./src -o build/test/check_file build/swarm.o build/bmt.o build/endian.o build/swarmfile.o test/check_file.c $(CFLAGS_CHECK) -lcheck -lkeccak-tiny -ltestcommon -lsecp256k1 $(CC) -I./src -o build/test/check_chunk build/chunk.o build/swarm.o build/bmt.o build/endian.o build/swarmfile.o test/check_chunk.c $(CFLAGS_CHECK) -lcheck -lkeccak-tiny -ltestcommon -lsecp256k1 -build_check_keystore: build_base build_keystore build_check_common +build_check_keystore: build_base_malloc build_keystore build_check_common $(CC) -I./src -o build/test/check_keystore build/swarm.o build/keystore.o test/check_keystore.c $(CFLAGS_CHECK) -lcheck -lkeccak-tiny -ltestcommon -build_check_soc: build build_check_common build_soc +build_check_soc: build_check build_check_common build_soc $(CC) -I./src -o build/test/check_soc build/keystore.o build/endian.o build/bmt.o build/chunk.o build/swarm.o build/soc.o test/check_soc.c -L./aux/secp256k1/.libs $(CFLAGS_CHECK) -lcheck -lkeccak-tiny -ltestcommon -lsecp256k1 build_lib: build @@ -66,15 +74,21 @@ build_lib: build .PHONY: test clean -check_base: build build_check - LD_LIBRARY_PATH=./build/:./build/test CK_FORK=no build/test/check_bmt +check_bmt: build_check + LD_LIBRARY_PATH=./build/:./build/test CK_FORK=no CFLAGS=-DLIBSWARM_MALLOC build/test/check_bmt + +check_chunk: build_check LD_LIBRARY_PATH=./build/:./build/test CK_FORK=no build/test/check_chunk + +check_file: build_check LD_LIBRARY_PATH=./build/:./build/test CK_FORK=no build/test/check_file -check_keystore: build build_check_keystore +check_base: check_bmt check_chunk check_file + +check_keystore: build_check_keystore LD_LIBRARY_PATH=./build/:./build/test CK_FORK=no build/test/check_keystore -check_soc: build build_check_soc +check_soc: build_check_soc LD_LIBRARY_PATH=./build/:./build/test CK_FORK=no build/test/check_soc # TODO: file test is flaky, check_base should be first instead diff --git a/src/bmt.c b/src/bmt.c @@ -5,7 +5,11 @@ #include "endian.h" #include "swarm.h" +#ifdef LIBSWARM_MALLOC +#include "bmt_malloc.h" +#else #include "bmt.h" +#endif #define _SWARM_DIGEST_INPUT_SIZE SWARM_WORD_SIZE*2 #define _SWARM_ROLLUP_TARGET SWARM_BLOCK_SIZE + SWARM_DATA_LENGTH_TYPESIZE + SWARM_WORD_SIZE @@ -13,9 +17,9 @@ extern void dlog(int p, int v); static int bmt_rollup(bmt_t *bctx) { - char *last_target = bctx->w_ptr + SWARM_WORD_SIZE; - char *start = bctx->w_ptr; - char buf[256]; + unsigned char *last_target = bctx->w_ptr + SWARM_WORD_SIZE; + unsigned char *start = bctx->w_ptr; + unsigned char buf[256]; int r; while (last_target != 0x00) { @@ -44,9 +48,10 @@ static int bmt_rollup(bmt_t *bctx) { return 0; } -void bmt_init(bmt_t *bctx, const char *input, const size_t input_length, const bmt_spansize_t data_length) { - //TODO: python fails on malloc, wasm needs malloc - //bctx->buf = malloc(sizeof(char) * SWARM_DATA_LENGTH_TYPESIZE + SWARM_BLOCK_SIZE); +void bmt_init(bmt_t *bctx, const unsigned char *input, const size_t input_length, const bmt_spansize_t data_length) { +#ifdef LIBSWARM_MALLOC + bctx->buf = malloc(sizeof(unsigned char) * SWARM_DATA_LENGTH_TYPESIZE + SWARM_BLOCK_SIZE); +#endif bctx->w_ptr = bctx->buf + SWARM_DATA_LENGTH_TYPESIZE; bctx->r_ptr = bctx->w_ptr; bctx->target = bctx->w_ptr + SWARM_BLOCK_SIZE; @@ -62,11 +67,8 @@ int bmt_sum(bmt_t *bctx) { return bmt_rollup(bctx); } -void bmt_free(bmt_t *bctx) { - free(bctx->buf); -} -int bmt_hash(char *zOut, const char *input, const size_t input_length, const bmt_spansize_t data_length) { +int bmt_hash(unsigned char *zOut, const unsigned char *input, const size_t input_length, const bmt_spansize_t data_length) { int i; int r; @@ -74,6 +76,14 @@ int bmt_hash(char *zOut, const char *input, const size_t input_length, const bmt bmt_init(&bctx, input, input_length, data_length); r = bmt_sum(&bctx); memcpy(zOut, bctx.buf, SWARM_WORD_SIZE); +#ifdef LIBSWARM_MALLOC bmt_free(&bctx); +#endif return r; } + +#ifdef LIBSWARM_MALLOC +void bmt_free(bmt_t *bctx) { + free(bctx->buf); +} +#endif diff --git a/src/bmt.h b/src/bmt.h @@ -1,18 +1,15 @@ -#ifndef _LIBSWARM_BMT -#define _LIBSWARM_BMT +#ifndef _LIBSWARM_BMT_H +#define _LIBSWARM_BMT_H #include "swarm.h" typedef struct bmt { - char buf[SWARM_DATA_LENGTH_TYPESIZE + SWARM_BLOCK_SIZE]; - char *w_ptr; - char *r_ptr; - char *target; + unsigned char buf[SWARM_DATA_LENGTH_TYPESIZE + SWARM_BLOCK_SIZE]; + unsigned char *w_ptr; + unsigned char *r_ptr; + unsigned char *target; } bmt_t; -typedef long long bmt_spansize_t; +#include "bmt_interface.h" -void bmt_init(bmt_t *bmt_context, const char *input, const size_t input_length, const bmt_spansize_t data_length); -int bmt_sum(bmt_t *bmt_context); - -#endif // _LIBSWARM_BMT +#endif // _LIBSWARM_BMT_H diff --git a/src/bmt_interface.h b/src/bmt_interface.h @@ -0,0 +1,7 @@ +typedef long long bmt_spansize_t; + +void bmt_init(bmt_t *bmt_context, const unsigned char *input, const size_t input_length, const bmt_spansize_t data_length); +int bmt_sum(bmt_t *bmt_context); +int bmt_hash(unsigned char *zOut, const unsigned char *input, const size_t input_length, const bmt_spansize_t data_length); + + diff --git a/src/bmt_malloc.h b/src/bmt_malloc.h @@ -0,0 +1,16 @@ +#ifndef _LIBSWARM_BMT_MALLOC +#define _LIBSWARM_BMT_MALLOC + +#include "swarm.h" + +typedef struct bmt { + unsigned char *buf; + unsigned char *w_ptr; + unsigned char *r_ptr; + unsigned char *target; +} bmt_t; + +#include "bmt_interface.h" +void bmt_free(bmt_t *bctx); + +#endif // _LIBSWARM_BMT diff --git a/src/chunk.c b/src/chunk.c @@ -2,7 +2,11 @@ #include "string.h" #include "chunk.h" +#ifdef LIBSWARM_MALLOC +#include "bmt_malloc.h" +#else #include "bmt.h" +#endif unsigned char* chunk_serialize(const swarm_chunk_t *chunk, unsigned char *z, size_t *sz) { int crsr; diff --git a/src/chunk.h b/src/chunk.h @@ -1,4 +1,3 @@ - #ifndef _LIBSWARM_CHUNK_H #define _LIBSWARM_CHUNK_H diff --git a/src/swarmfile.h b/src/swarmfile.h @@ -1,7 +1,11 @@ #ifndef _LIBSWARM_FILE #define _LIBSWARM_FILE +#ifdef LIBSWARM_MALLOC +#include "bmt_malloc.h" +#else #include "bmt.h" +#endif #define SWARM_BATCH_SIZE (int)(SWARM_BLOCK_SIZE / SWARM_WORD_SIZE) #define SWARM_LEVELS 9 diff --git a/src/wasm/common.c b/src/wasm/common.c @@ -21,9 +21,9 @@ void *malloc(size_t c) { ptr = base + offset; - dlog(77, &c); + dlog(77, (int)&c); offset += n; - offset_p = &offset; + offset_p = (unsigned char*)&offset; for (i = 0; i < 4; i++) { *(base+i) = *(offset_p+i); } @@ -42,7 +42,7 @@ void *memset(void *p, int v, size_t c) { return p; } -void *memcpy(void *dst, void *src, size_t c) { +void *memcpy(void *dst, const void *src, size_t c) { int i ; dlog(12, c); diff --git a/src/wasm/wasm.c b/src/wasm/wasm.c @@ -3,7 +3,7 @@ #include "bmt.h" -extern dlog(int p, int v); +extern void dlog(int p, int v); size_t keccak_hash_heap_init(size_t outLen, size_t inLen) { return (size_t)malloc(outLen + inLen); @@ -13,10 +13,10 @@ void keccak_hash_heap_free(void *mem) { free(mem); } -void *bmt_hash_heap(const char *input, const size_t input_length, const bmt_spansize_t data_length) { - char *out; +void *bmt_hash_heap(const unsigned char *input, const size_t input_length, const bmt_spansize_t data_length) { + unsigned char *out; - out = malloc(_SWARM_WORD_SIZE + input_length); + out = malloc(SWARM_WORD_SIZE + input_length); bmt_hash(out, input, input_length, data_length); diff --git a/test/check_bmt.c b/test/check_bmt.c @@ -1,21 +1,22 @@ #include <check.h> #include <stdlib.h> -#include "bmt.h" +#include "bmt_malloc.h" #include "hex.h" #include "common.h" START_TEST(check_bmt_init) { bmt_t bmt_context; - char *input = "foo"; - char input_length = 3; - char data_length_bytes[] = {0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + unsigned char *input = "foo"; + unsigned char input_length = 3; + unsigned char data_length_bytes[] = {0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; int r; bmt_init(&bmt_context, input, input_length, 3); ck_assert_mem_eq(bmt_context.buf, data_length_bytes, sizeof(long long)); ck_assert_mem_eq(bmt_context.w_ptr, input, 3); + bmt_free(&bmt_context); } END_TEST @@ -33,6 +34,7 @@ START_TEST(check_bmt_sum_foo) { hex2bin(HASH_OF_FOO, v_chk); ck_assert_mem_eq(bmt_context.buf, v_chk, SWARM_WORD_SIZE); + bmt_free(&bmt_context); } END_TEST @@ -81,6 +83,7 @@ START_TEST(check_bmt_sum_vector) { hex2bin(vectors[i], v_chk); ck_assert_mem_eq(bmt_context.buf, v_chk, SWARM_WORD_SIZE); } + bmt_free(&bmt_context); } END_TEST @@ -92,7 +95,7 @@ Suite * common_suite(void) { s = suite_create("bmt"); tc = tcase_create("core"); tcase_add_test(tc, check_bmt_init); - tcase_add_test(tc, check_bmt_sum_foo); + //tcase_add_test(tc, check_bmt_sum_foo); tcase_add_test(tc, check_bmt_sum_vector); suite_add_tcase(s, tc); diff --git a/test/check_chunk.c b/test/check_chunk.c @@ -5,6 +5,7 @@ #include "hex.h" #include "def.h" #include "chunk.h" +#include "bmt_malloc.h" START_TEST(check_chunk_verify) {