commit 16cd6ddcedb5bb3c08f049f8bfb5b8f375cd6739
parent 8fc4cf4afebe363c8023b00b7e2cae18d15b5a2d
Author: nolash <dev@holbrook.no>
Date: Sun, 12 Sep 2021 12:50:43 +0200
WIP revert to keccak-tiny
Diffstat:
5 files changed, 71 insertions(+), 33 deletions(-)
diff --git a/Makefile.dev b/Makefile.dev
@@ -1,14 +1,26 @@
export LD_LIBRARY_PATH
+CFLAGS += -I./src -I./aux/keccak-tiny -L./lib/
-build:
- mkdir -p build
- gcc -I./src -c -o build/bmt.o src/bmt.c $(CFLAGS) -lkeccak
- gcc -I./src -c -o build/endian.o $(CFLAGS) src/endian.c
+prep:
+ mkdir -vp lib build
+
+build_keccak: prep
+ $(CC) -D"memset_s(W,WL,V,OL)=memset(W,V,OL)" $(CFLAGS) -O3 -march=native -std=c11 -Wextra -Wpedantic -Wall -rdynamic --shared aux/keccak-tiny/keccak-tiny.c -o lib/libkeccak-tiny.so
+ $(CC) -D"memset_s(W,WL,V,OL)=memset(W,V,OL)" $(CFLAGS) -Os -march=native -std=c11 -Wextra -Wpedantic -Wall -rdynamic --shared aux/keccak-tiny/keccak-tiny.c -o lib/libkeccak-tiny-small.so
+
+
+build: prep build_keccak
+ $(CC) -c -o build/bmt.o src/bmt.c $(CFLAGS) -lkeccak-tiny
+ $(CC) -c -o build/endian.o $(CFLAGS) src/endian.c
build_test: build
- gcc -I./src -o test/check_bmt build/*.o test/check_bmt.c $(CFLAGS) -lcheck -lkeccak
+ $(CC) -I./src -o test/check_bmt build/*.o test/check_bmt.c $(CFLAGS) -lcheck -lkeccak-tiny
-.PHONY: test
+.PHONY: test clean
test: build build_test
CK_FORK=no test/check_bmt
+
+clean:
+ rm -vrf build/*
+ rm -v lib/*
diff --git a/src/bmt.c b/src/bmt.c
@@ -1,55 +1,78 @@
#include <string.h>
-#include <XKCP/KeccakHash.h>
-#include <XKCP/KangarooTwelve.h>
-#include <XKCP/SP800-185.h>
+//#include <XKCP/KeccakHash.h>
+//#include <XKCP/KangarooTwelve.h>
+//#include <XKCP/SP800-185.h>
+#include "keccak-tiny.h"
#include "endian.h"
#include "bmt.h"
-#define _DIGEST_INPUT_SIZE _WORD_SIZE * 2
+#define _DIGEST_INPUT_SIZE _WORD_SIZE*2
#define _ROLLUP_TARGET BLOCK_SIZE + _DATA_LENGTH_TYPESIZE + _WORD_SIZE
+#define _KECCAK_RATE 200-64
+#define _KECCAK_PADDING 0x01
+extern int hash(uint8_t* out, size_t outlen, const uint8_t* in, size_t inlen, size_t rate, uint8_t delim);
static int bmt_rollup(bmt_t *bmt_content) {
- char *last_target = bmt_content->ptr + _WORD_SIZE;
+ char *last_target = bmt_content->w_ptr + _WORD_SIZE;
+ char *start = bmt_content->w_ptr;
+ char buf[256];
+ int r;
while (last_target != 0x00) {
- while (bmt_content->ptr != bmt_content->target) {
- Keccak_HashInstance instance;
- if (Keccak_HashInitialize(&instance, 1088, 512, 256, 0x01)) {
+ while (bmt_content->r_ptr < bmt_content->target) {
+// Keccak_HashInstance instance;
+// if (Keccak_HashInitialize(&instance, 1088, 512, 256, 0x01)) {
+// return 1;
+// }
+// Keccak_HashUpdate(&instance, bmt_content->ptr, _DIGEST_INPUT_SIZE);
+// Keccak_HashFinal(&instance, bmt_content->ptr);
+ r = hash(buf, _WORD_SIZE, bmt_content->r_ptr, _DIGEST_INPUT_SIZE, _KECCAK_RATE, _KECCAK_PADDING);
+ if (r != 0) {
return 1;
}
- Keccak_HashUpdate(&instance, bmt_content->ptr, _DIGEST_INPUT_SIZE);
- Keccak_HashFinal(&instance, bmt_content->ptr);
- bmt_content->ptr += _DIGEST_INPUT_SIZE;
+ memcpy(bmt_content->w_ptr, buf, _WORD_SIZE);
+ bmt_content->w_ptr += _WORD_SIZE;
+ bmt_content->r_ptr += _DIGEST_INPUT_SIZE;
}
- bmt_content->target = (bmt_content->target - bmt_content->ptr) / 2;
- if (bmt_content->target < last_target) {
+ bmt_content->target = start + ((bmt_content->target - start) / 2);
+ if (bmt_content->target == last_target) {
last_target = 0x00;
}
+ bmt_content->r_ptr = start;
+ bmt_content->w_ptr = start;
}
- Keccak_HashInstance instance;
- if (Keccak_HashInitialize(&instance, 1088, 512, 256, 0x01)) {
+ r = hash(buf, _WORD_SIZE, bmt_content->buf, _DATA_LENGTH_TYPESIZE + _WORD_SIZE, _KECCAK_RATE, _KECCAK_PADDING);
+ if (r != 0) {
return 1;
}
- Keccak_HashUpdate(&instance, bmt_content->buf, _DATA_LENGTH_TYPESIZE + _WORD_SIZE);
- Keccak_HashFinal(&instance, bmt_content->buf);
+ memcpy(bmt_content->buf, buf, _WORD_SIZE);
+
+// Keccak_HashInstance instance;
+// if (Keccak_HashInitialize(&instance, 1088, 512, 256, 0x01)) {
+// return 1;
+// }
+// Keccak_HashUpdate(&instance, bmt_content->buf, _DATA_LENGTH_TYPESIZE + _WORD_SIZE);
+// Keccak_HashFinal(&instance, bmt_content->buf);
return 0;
}
void bmt_init(bmt_t *bmt_content, char *input, size_t input_length, long long data_length) {
- bmt_content->ptr = (char*)bmt_content->buf+_DATA_LENGTH_TYPESIZE;
- bmt_content->target = bmt_content->ptr + BLOCK_SIZE;
- memset(bmt_content->buf, 0, BLOCK_SIZE+_DATA_LENGTH_TYPESIZE);
+ bmt_content->w_ptr = (char*)bmt_content->buf+_DATA_LENGTH_TYPESIZE;
+ bmt_content->r_ptr = bmt_content->w_ptr;
+ bmt_content->target = bmt_content->w_ptr + BLOCK_SIZE;
+ memset(bmt_content->buf, 0, _DATA_LENGTH_TYPESIZE + BLOCK_SIZE);
memcpy((char*)bmt_content->buf, &data_length, sizeof(long long));
- to_endian(CONVERT_BIGENDIAN, _DATA_LENGTH_TYPESIZE, bmt_content->buf);
- memcpy(bmt_content->ptr, input, input_length);
+ to_endian(CONVERT_LITTLEENDIAN, _DATA_LENGTH_TYPESIZE, bmt_content->buf);
+
+ memcpy(bmt_content->w_ptr, input, input_length);
}
diff --git a/src/bmt.h b/src/bmt.h
@@ -6,8 +6,9 @@
#define _DATA_LENGTH_TYPESIZE 8
typedef struct bmt {
- char buf[BLOCK_SIZE + _DATA_LENGTH_TYPESIZE];
- char *ptr;
+ char buf[_DATA_LENGTH_TYPESIZE + BLOCK_SIZE];
+ char *w_ptr;
+ char *r_ptr;
char *target;
} bmt_t;
diff --git a/src/bmt.c b/src/bmt_xkcp.c
diff --git a/test/check_bmt.c b/test/check_bmt.c
@@ -8,12 +8,12 @@ START_TEST(check_bmt_init) {
bmt_t bmt_context;
char *input = "foo";
char input_length = 3;
- char data_length_bytes[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03};
+ 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.ptr, input, 3);
+ ck_assert_mem_eq(bmt_context.w_ptr, input, 3);
}
END_TEST
@@ -22,9 +22,11 @@ START_TEST(check_bmt_sum) {
bmt_t bmt_context;
char *input = "foo";
char input_length = 3;
+ int r;
bmt_init(&bmt_context, input, input_length, 3);
- bmt_sum(&bmt_context);
+ r = bmt_sum(&bmt_context);
+ ck_assert_int_eq(r, 0);
}
Suite * common_suite(void) {