]> git.cryptolib.org Git - avr-crypto-lib.git/commitdiff
+ HashFunctionAbstractionLayer (hfal) for skein +some bug fixes
authorbg <bg@b1d182e4-1ff8-0310-901f-bddb46175740>
Fri, 13 Mar 2009 20:58:34 +0000 (20:58 +0000)
committerbg <bg@b1d182e4-1ff8-0310-901f-bddb46175740>
Fri, 13 Mar 2009 20:58:34 +0000 (20:58 +0000)
19 files changed:
config.h
hfal_skein1024.c [new file with mode: 0644]
hfal_skein1024.h [new file with mode: 0644]
hfal_skein256.c [new file with mode: 0644]
hfal_skein256.h [new file with mode: 0644]
hfal_skein512.c [new file with mode: 0644]
hfal_skein512.h [new file with mode: 0644]
host/shavs_test.rb
mkfiles/skein.mk
skein.h
skein1024.c
skein256.c
skein512.c
test_src/main-skein-test.c
test_src/shavs.c
ubi.h
ubi1024.c
ubi256.c
ubi512.c

index 60aaf4c3c8ddc90ca9384b7bc2c4a2c32f06c7cb..851388f801cdf46febb6430e164d667d303605f3 100644 (file)
--- a/config.h
+++ b/config.h
 /* uart.[ch] defines */
 #define UART_INTERRUPT 1
 #define UART_BAUD_RATE 38400
-#define UART_RXBUFSIZE 16
-#define UART_TXBUFSIZE 16
+#define UART_RXBUFSIZE 64
+#define UART_TXBUFSIZE 64
 #define UART_LINE_BUFFER_SIZE 40
+#define UART_XON_XOFF
+#define UART_XON_XOFF_THRESHOLD_1 (UART_RXBUFSIZE - 24)
+#define UART_XON_XOFF_THRESHOLD_2 (UART_RXBUFSIZE - 30)
+
 #undef UART_LEDS
 /*
 #define UART_HWFLOWCONTROL
diff --git a/hfal_skein1024.c b/hfal_skein1024.c
new file mode 100644 (file)
index 0000000..485bed5
--- /dev/null
@@ -0,0 +1,162 @@
+/* hfal_skein1024.c */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2008  Daniel Otte (daniel.otte@rub.de)
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * \file     hfal_skein1024.c
+ * \email    daniel.otte@rub.de
+ * \author   Daniel Otte 
+ * \date     2009-03-13
+ * \license  GPLv3 or later
+ * 
+ */
+
+#include <avr/pgmspace.h>
+#include <stdlib.h>
+#include "hashfunction_descriptor.h"
+#include "skein.h"
+
+
+static const char skein1024_128_str[]   PROGMEM = "Skein-1024-128";
+static const char skein1024_160_str[]   PROGMEM = "Skein-1024-160";
+static const char skein1024_224_str[]   PROGMEM = "Skein-1024-224";
+static const char skein1024_256_str[]   PROGMEM = "Skein-1024-256";
+static const char skein1024_384_str[]   PROGMEM = "Skein-1024-384";
+static const char skein1024_512_str[]   PROGMEM = "Skein-1024-512";
+static const char skein1024_1024_str[]  PROGMEM = "Skein-1024-1024";
+
+void skein1024_128_init(skein1024_ctx_t* ctx){
+       skein1024_init(ctx, 128);
+}
+void skein1024_160_init(skein1024_ctx_t* ctx){
+       skein1024_init(ctx, 160);
+}
+void skein1024_224_init(skein1024_ctx_t* ctx){
+       skein1024_init(ctx, 224);
+}
+void skein1024_256_init(skein1024_ctx_t* ctx){
+       skein1024_init(ctx, 256);
+}
+void skein1024_384_init(skein1024_ctx_t* ctx){
+       skein1024_init(ctx, 384);
+}
+void skein1024_512_init(skein1024_ctx_t* ctx){
+       skein1024_init(ctx, 512);
+}
+void skein1024_1024_init(skein1024_ctx_t* ctx){
+       skein1024_init(ctx, 1024);
+}
+
+const hfdesc_t skein1024_128_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein1024_128_str,
+       sizeof(skein1024_ctx_t),
+       SKEIN1024_BLOCKSIZE,
+       128,
+       (hf_init_fpt)skein1024_128_init,
+       (hf_nextBlock_fpt)skein1024_nextBlock,
+       (hf_lastBlock_fpt)skein1024_lastBlock,
+       (hf_ctx2hash_fpt)skein1024_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein1024_160_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein1024_160_str,
+       sizeof(skein1024_ctx_t),
+       SKEIN1024_BLOCKSIZE,
+       160,
+       (hf_init_fpt)skein1024_160_init,
+       (hf_nextBlock_fpt)skein1024_nextBlock,
+       (hf_lastBlock_fpt)skein1024_lastBlock,
+       (hf_ctx2hash_fpt)skein1024_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein1024_224_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein1024_224_str,
+       sizeof(skein1024_ctx_t),
+       SKEIN1024_BLOCKSIZE,
+       224,
+       (hf_init_fpt)skein1024_224_init,
+       (hf_nextBlock_fpt)skein1024_nextBlock,
+       (hf_lastBlock_fpt)skein1024_lastBlock,
+       (hf_ctx2hash_fpt)skein1024_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein1024_256_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein1024_256_str,
+       sizeof(skein1024_ctx_t),
+       SKEIN1024_BLOCKSIZE,
+       256,
+       (hf_init_fpt)skein1024_256_init,
+       (hf_nextBlock_fpt)skein1024_nextBlock,
+       (hf_lastBlock_fpt)skein1024_lastBlock,
+       (hf_ctx2hash_fpt)skein1024_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein1024_384_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein1024_384_str,
+       sizeof(skein1024_ctx_t),
+       SKEIN1024_BLOCKSIZE,
+       384,
+       (hf_init_fpt)skein1024_384_init,
+       (hf_nextBlock_fpt)skein1024_nextBlock,
+       (hf_lastBlock_fpt)skein1024_lastBlock,
+       (hf_ctx2hash_fpt)skein1024_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein1024_512_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein1024_512_str,
+       sizeof(skein1024_ctx_t),
+       SKEIN1024_BLOCKSIZE,
+       512,
+       (hf_init_fpt)skein1024_512_init,
+       (hf_nextBlock_fpt)skein1024_nextBlock,
+       (hf_lastBlock_fpt)skein1024_lastBlock,
+       (hf_ctx2hash_fpt)skein1024_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein1024_1024_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein1024_1024_str,
+       sizeof(skein1024_ctx_t),
+       SKEIN1024_BLOCKSIZE,
+       1024,
+       (hf_init_fpt)skein1024_1024_init,
+       (hf_nextBlock_fpt)skein1024_nextBlock,
+       (hf_lastBlock_fpt)skein1024_lastBlock,
+       (hf_ctx2hash_fpt)skein1024_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+
diff --git a/hfal_skein1024.h b/hfal_skein1024.h
new file mode 100644 (file)
index 0000000..e2ce083
--- /dev/null
@@ -0,0 +1,42 @@
+/* hfal_skein1024.h */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2008  Daniel Otte (daniel.otte@rub.de)
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * \file     hfal_skein1024.h
+ * \email    daniel.otte@rub.de
+ * \author   Daniel Otte 
+ * \date     2009-03-13
+ * \license  GPLv3 or later
+ * 
+ */
+
+#ifndef HFAL_SKEIN1024_H_
+#define HFAL_SKEIN1024_H_
+
+#include <avr/pgmspace.h>
+#include "hashfunction_descriptor.h"
+
+extern const hfdesc_t skein1024_128_desc;
+extern const hfdesc_t skein1024_160_desc;
+extern const hfdesc_t skein1024_224_desc;
+extern const hfdesc_t skein1024_256_desc;
+extern const hfdesc_t skein1024_384_desc;
+extern const hfdesc_t skein1024_512_desc;
+extern const hfdesc_t skein1024_1024_desc;
+
+#endif /* HFAL_SHA1024_H_ */
diff --git a/hfal_skein256.c b/hfal_skein256.c
new file mode 100644 (file)
index 0000000..c647e1e
--- /dev/null
@@ -0,0 +1,143 @@
+/* hfal_skein256.c */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2008  Daniel Otte (daniel.otte@rub.de)
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * \file     hfal_skein256.c
+ * \email    daniel.otte@rub.de
+ * \author   Daniel Otte 
+ * \date     2009-03-13
+ * \license  GPLv3 or later
+ * 
+ */
+
+#include <avr/pgmspace.h>
+#include <stdlib.h>
+#include "hashfunction_descriptor.h"
+#include "skein.h"
+
+
+static const char skein256_128_str[]   PROGMEM = "Skein-256-128";
+static const char skein256_160_str[]   PROGMEM = "Skein-256-160";
+static const char skein256_224_str[]   PROGMEM = "Skein-256-224";
+static const char skein256_256_str[]   PROGMEM = "Skein-256-256";
+static const char skein256_384_str[]   PROGMEM = "Skein-256-384";
+static const char skein256_512_str[]   PROGMEM = "Skein-256-512";
+
+void skein256_128_init(skein256_ctx_t* ctx){
+       skein256_init(ctx, 128);
+}
+void skein256_160_init(skein256_ctx_t* ctx){
+       skein256_init(ctx, 160);
+}
+void skein256_224_init(skein256_ctx_t* ctx){
+       skein256_init(ctx, 224);
+}
+void skein256_256_init(skein256_ctx_t* ctx){
+       skein256_init(ctx, 256);
+}
+void skein256_384_init(skein256_ctx_t* ctx){
+       skein256_init(ctx, 384);
+}
+void skein256_512_init(skein256_ctx_t* ctx){
+       skein256_init(ctx, 512);
+}
+
+const hfdesc_t skein256_128_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein256_128_str,
+       sizeof(skein256_ctx_t),
+       SKEIN256_BLOCKSIZE,
+       128,
+       (hf_init_fpt)skein256_128_init,
+       (hf_nextBlock_fpt)skein256_nextBlock,
+       (hf_lastBlock_fpt)skein256_lastBlock,
+       (hf_ctx2hash_fpt)skein256_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein256_160_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein256_160_str,
+       sizeof(skein256_ctx_t),
+       SKEIN256_BLOCKSIZE,
+       160,
+       (hf_init_fpt)skein256_160_init,
+       (hf_nextBlock_fpt)skein256_nextBlock,
+       (hf_lastBlock_fpt)skein256_lastBlock,
+       (hf_ctx2hash_fpt)skein256_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein256_224_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein256_224_str,
+       sizeof(skein256_ctx_t),
+       SKEIN256_BLOCKSIZE,
+       224,
+       (hf_init_fpt)skein256_224_init,
+       (hf_nextBlock_fpt)skein256_nextBlock,
+       (hf_lastBlock_fpt)skein256_lastBlock,
+       (hf_ctx2hash_fpt)skein256_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein256_256_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein256_256_str,
+       sizeof(skein256_ctx_t),
+       SKEIN256_BLOCKSIZE,
+       256,
+       (hf_init_fpt)skein256_256_init,
+       (hf_nextBlock_fpt)skein256_nextBlock,
+       (hf_lastBlock_fpt)skein256_lastBlock,
+       (hf_ctx2hash_fpt)skein256_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein256_384_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein256_384_str,
+       sizeof(skein256_ctx_t),
+       SKEIN256_BLOCKSIZE,
+       384,
+       (hf_init_fpt)skein256_384_init,
+       (hf_nextBlock_fpt)skein256_nextBlock,
+       (hf_lastBlock_fpt)skein256_lastBlock,
+       (hf_ctx2hash_fpt)skein256_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein256_512_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein256_512_str,
+       sizeof(skein256_ctx_t),
+       SKEIN256_BLOCKSIZE,
+       512,
+       (hf_init_fpt)skein256_512_init,
+       (hf_nextBlock_fpt)skein256_nextBlock,
+       (hf_lastBlock_fpt)skein256_lastBlock,
+       (hf_ctx2hash_fpt)skein256_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
diff --git a/hfal_skein256.h b/hfal_skein256.h
new file mode 100644 (file)
index 0000000..1b0e34b
--- /dev/null
@@ -0,0 +1,41 @@
+/* hfal_skein256.h */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2008  Daniel Otte (daniel.otte@rub.de)
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * \file     hfal_skein256.h
+ * \email    daniel.otte@rub.de
+ * \author   Daniel Otte 
+ * \date     2009-03-13
+ * \license  GPLv3 or later
+ * 
+ */
+
+#ifndef HFAL_SKEIN256_H_
+#define HFAL_SKEIN256_H_
+
+#include <avr/pgmspace.h>
+#include "hashfunction_descriptor.h"
+
+extern const hfdesc_t skein256_128_desc;
+extern const hfdesc_t skein256_160_desc;
+extern const hfdesc_t skein256_224_desc;
+extern const hfdesc_t skein256_256_desc;
+extern const hfdesc_t skein256_384_desc;
+extern const hfdesc_t skein256_512_desc;
+
+#endif /* HFAL_SHA256_H_ */
diff --git a/hfal_skein512.c b/hfal_skein512.c
new file mode 100644 (file)
index 0000000..f78bc6f
--- /dev/null
@@ -0,0 +1,162 @@
+/* hfal_skein512.c */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2008  Daniel Otte (daniel.otte@rub.de)
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * \file     hfal_skein512.c
+ * \email    daniel.otte@rub.de
+ * \author   Daniel Otte 
+ * \date     2009-03-13
+ * \license  GPLv3 or later
+ * 
+ */
+
+#include <avr/pgmspace.h>
+#include <stdlib.h>
+#include "hashfunction_descriptor.h"
+#include "skein.h"
+
+
+static const char skein512_128_str[]   PROGMEM = "Skein-512-128";
+static const char skein512_160_str[]   PROGMEM = "Skein-512-160";
+static const char skein512_224_str[]   PROGMEM = "Skein-512-224";
+static const char skein512_256_str[]   PROGMEM = "Skein-512-256";
+static const char skein512_384_str[]   PROGMEM = "Skein-512-384";
+static const char skein512_512_str[]   PROGMEM = "Skein-512-512";
+static const char skein512_1024_str[]  PROGMEM = "Skein-512-1024";
+
+void skein512_128_init(skein512_ctx_t* ctx){
+       skein512_init(ctx, 128);
+}
+void skein512_160_init(skein512_ctx_t* ctx){
+       skein512_init(ctx, 160);
+}
+void skein512_224_init(skein512_ctx_t* ctx){
+       skein512_init(ctx, 224);
+}
+void skein512_256_init(skein512_ctx_t* ctx){
+       skein512_init(ctx, 256);
+}
+void skein512_384_init(skein512_ctx_t* ctx){
+       skein512_init(ctx, 384);
+}
+void skein512_512_init(skein512_ctx_t* ctx){
+       skein512_init(ctx, 512);
+}
+void skein512_1024_init(skein512_ctx_t* ctx){
+       skein512_init(ctx, 1024);
+}
+
+const hfdesc_t skein512_128_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein512_128_str,
+       sizeof(skein512_ctx_t),
+       SKEIN512_BLOCKSIZE,
+       128,
+       (hf_init_fpt)skein512_128_init,
+       (hf_nextBlock_fpt)skein512_nextBlock,
+       (hf_lastBlock_fpt)skein512_lastBlock,
+       (hf_ctx2hash_fpt)skein512_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein512_160_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein512_160_str,
+       sizeof(skein512_ctx_t),
+       SKEIN512_BLOCKSIZE,
+       160,
+       (hf_init_fpt)skein512_160_init,
+       (hf_nextBlock_fpt)skein512_nextBlock,
+       (hf_lastBlock_fpt)skein512_lastBlock,
+       (hf_ctx2hash_fpt)skein512_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein512_224_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein512_224_str,
+       sizeof(skein512_ctx_t),
+       SKEIN512_BLOCKSIZE,
+       224,
+       (hf_init_fpt)skein512_224_init,
+       (hf_nextBlock_fpt)skein512_nextBlock,
+       (hf_lastBlock_fpt)skein512_lastBlock,
+       (hf_ctx2hash_fpt)skein512_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein512_256_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein512_256_str,
+       sizeof(skein512_ctx_t),
+       SKEIN512_BLOCKSIZE,
+       256,
+       (hf_init_fpt)skein512_256_init,
+       (hf_nextBlock_fpt)skein512_nextBlock,
+       (hf_lastBlock_fpt)skein512_lastBlock,
+       (hf_ctx2hash_fpt)skein512_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein512_384_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein512_384_str,
+       sizeof(skein512_ctx_t),
+       SKEIN512_BLOCKSIZE,
+       384,
+       (hf_init_fpt)skein512_384_init,
+       (hf_nextBlock_fpt)skein512_nextBlock,
+       (hf_lastBlock_fpt)skein512_lastBlock,
+       (hf_ctx2hash_fpt)skein512_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein512_512_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein512_512_str,
+       sizeof(skein512_ctx_t),
+       SKEIN512_BLOCKSIZE,
+       512,
+       (hf_init_fpt)skein512_512_init,
+       (hf_nextBlock_fpt)skein512_nextBlock,
+       (hf_lastBlock_fpt)skein512_lastBlock,
+       (hf_ctx2hash_fpt)skein512_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+const hfdesc_t skein512_1024_desc PROGMEM = {
+       HFDESC_TYPE_HASHFUNCTION,
+       0,
+       skein512_1024_str,
+       sizeof(skein512_ctx_t),
+       SKEIN512_BLOCKSIZE,
+       1024,
+       (hf_init_fpt)skein512_1024_init,
+       (hf_nextBlock_fpt)skein512_nextBlock,
+       (hf_lastBlock_fpt)skein512_lastBlock,
+       (hf_ctx2hash_fpt)skein512_ctx2hash,
+       (hf_free_fpt)NULL,
+       (hf_mem_fpt)NULL
+};
+
diff --git a/hfal_skein512.h b/hfal_skein512.h
new file mode 100644 (file)
index 0000000..52fe48f
--- /dev/null
@@ -0,0 +1,42 @@
+/* hfal_skein512.h */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2008  Daniel Otte (daniel.otte@rub.de)
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * \file     hfal_skein512.h
+ * \email    daniel.otte@rub.de
+ * \author   Daniel Otte 
+ * \date     2009-03-13
+ * \license  GPLv3 or later
+ * 
+ */
+
+#ifndef HFAL_SKEIN512_H_
+#define HFAL_SKEIN512_H_
+
+#include <avr/pgmspace.h>
+#include "hashfunction_descriptor.h"
+
+extern const hfdesc_t skein512_128_desc;
+extern const hfdesc_t skein512_160_desc;
+extern const hfdesc_t skein512_224_desc;
+extern const hfdesc_t skein512_256_desc;
+extern const hfdesc_t skein512_384_desc;
+extern const hfdesc_t skein512_512_desc;
+extern const hfdesc_t skein512_1024_desc;
+
+#endif /* HFAL_SHA512_H_ */
index 3983b502164983a8731de00bd45ab13354dd91fb..767054339d3605b5acf27da3645d75e9794fbafa 100644 (file)
@@ -18,7 +18,7 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 =end
 
-
+$debug = false
 
 require 'serialport'
 
@@ -29,7 +29,7 @@ def init_system
 #  print("DBG 0.0: ")
 #  print(line)
 #  sleep 1
-  $sp.print("shavs_set a \r")
+  $sp.print("shavs_set #{$algo_select} \r")
 #  line = $sp.readlines()
 #  print("DBG 0.1: ")
 #  print(line)
@@ -44,7 +44,7 @@ def get_md
   begin
     line = $sp.gets()
        line = "" if line==nil
-#      puts("DBG g: "+line)
+       puts("DBG g: "+line) if $debug
   end while not /[\s]*MD[\s]*=.*/.match(line)
   return line  
 end
@@ -59,7 +59,7 @@ def run_test(filename)
     begin
       lb=file.gets()
     end while not (file.eof or (/[\s]*Len[\s]*=.*/.match(lb)))
-#    puts("DBG sending: "+lb);
+    puts("DBG sending: "+lb) if $debug
        return if file.eof
        $sp.print(lb.strip)
        $sp.print("\r")
@@ -67,7 +67,7 @@ def run_test(filename)
          lb=file.gets()
     end while not (file.eof or (/[\s]*Msg[\s]*=.*/.match(lb)))
     return if file.eof
-#    puts("DBG sending: "+lb);
+    puts("DBG sending: "+lb) if $debug
        $sp.print(lb.strip)
        avr_md = get_md()
     begin
@@ -84,9 +84,9 @@ def run_test(filename)
   
 end
 
-if ARGV.size < 5
+if ARGV.size < 6
   STDERR.print <<EOF
-  Usage: ruby #{$0} port bps nbits stopb testfile ...
+  Usage: ruby #{$0} port bps nbits stopb algo_select testfile ...
 EOF
   exit(1)
 end
@@ -95,15 +95,16 @@ puts("\nPort: "+ARGV[0]+ "@"+ARGV[1]+" "+ARGV[2]+"N"+ARGV[3]+"\n");
 $linewidth = 64
 $sp = SerialPort.new(ARGV[0], ARGV[1].to_i, ARGV[2].to_i, ARGV[3].to_i, SerialPort::NONE);
 $sp.read_timeout=1000; # 5 minutes
-
+$algo_select = ARGV[4]
 #irb
 
 init_system()
 
-for i in (4..(ARGV.size-1))
+for i in (5..(ARGV.size-1))
   run_test(ARGV[i])
   puts("")
 end
+ $sp.print("EXIT\r");
 
 #exit(0);
 
index a2d6ea4855a41c1144ec3bfaa84638fcab64da01..59c6d588a83778a1bea1077d467e5e8482fdbd21 100644 (file)
@@ -8,7 +8,8 @@ HASHES += $(ALGO_NAME)
 $(ALGO_NAME)_OBJ      := threefish256_enc.o threefish512_enc.o threefish1024_enc.o \
                          ubi256.o ubi512.o ubi1024.o memxor.o skein256.o skein512.o skein1024.o
 $(ALGO_NAME)_TEST_BIN := main-skein-test.o debug.o uart.o hexdigit_tab.o  \
-                         dbz_strings.o nessie_common.o cli.o string-extras.o performance_test.o
+                         dbz_strings.o nessie_common.o cli.o string-extras.o performance_test.o \
+                         hfal-basic.o hfal_skein256.o hfal_skein512.o hfal_skein1024.o shavs.o
 $(ALGO_NAME)_NESSIE_TEST      := test nessie
 $(ALGO_NAME)_PERFORMANCE_TEST := performance
 
diff --git a/skein.h b/skein.h
index 94eceacd1020594db1bc0eece817adfe2684f418..f1362906d336a354f8df72cabc8b76d82b1764de 100644 (file)
--- a/skein.h
+++ b/skein.h
 
 #include "ubi.h"
 
+#define SKEIN256_BLOCKSIZE    UBI256_BLOCKSIZE
+#define SKEIN256_BLOCKSIZE_B  UBI256_BLOCKSIZE_B
+
+#define SKEIN512_BLOCKSIZE    UBI512_BLOCKSIZE
+#define SKEIN512_BLOCKSIZE_B  UBI512_BLOCKSIZE_B
+
+#define SKEIN1024_BLOCKSIZE   UBI1024_BLOCKSIZE
+#define SKEIN1024_BLOCKSIZE_B UBI1024_BLOCKSIZE_B
+
 typedef struct{
         uint16_t outsize_b;
         ubi256_ctx_t ubictx;
 }skein256_ctx_t;
 
 void skein256_init(skein256_ctx_t* ctx, uint16_t outsize_b);
-void skein256_nextBlock(skein256_ctx_t* ctx, void* block);
-void skein256_lastBlock(skein256_ctx_t* ctx, void* block, uint16_t length_b);
+void skein256_nextBlock(skein256_ctx_t* ctx, const void* block);
+void skein256_lastBlock(skein256_ctx_t* ctx, const void* block, uint16_t length_b);
 void skein256_ctx2hash(void* dest, skein256_ctx_t* ctx);
+void skein256(void* dest, uint16_t outlength_b, const void* msg, uint32_t length_b);
 
 typedef struct{
         uint16_t outsize_b;
@@ -45,9 +55,10 @@ typedef struct{
 }skein512_ctx_t;
 
 void skein512_init(skein512_ctx_t* ctx, uint16_t outsize_b);
-void skein512_nextBlock(skein512_ctx_t* ctx, void* block);
-void skein512_lastBlock(skein512_ctx_t* ctx, void* block, uint16_t length_b);
+void skein512_nextBlock(skein512_ctx_t* ctx, const void* block);
+void skein512_lastBlock(skein512_ctx_t* ctx, const void* block, uint16_t length_b);
 void skein512_ctx2hash(void* dest, skein512_ctx_t* ctx);
+void skein512(void* dest, uint16_t outlength_b, const void* msg, uint32_t length_b);
 
 typedef struct{
         uint16_t outsize_b;
@@ -55,8 +66,9 @@ typedef struct{
 }skein1024_ctx_t;
 
 void skein1024_init(skein1024_ctx_t* ctx, uint16_t outsize_b);
-void skein1024_nextBlock(skein1024_ctx_t* ctx, void* block);
-void skein1024_lastBlock(skein1024_ctx_t* ctx, void* block, uint16_t length_b);
+void skein1024_nextBlock(skein1024_ctx_t* ctx, const void* block);
+void skein1024_lastBlock(skein1024_ctx_t* ctx, const void* block, uint16_t length_b);
 void skein1024_ctx2hash(void* dest, skein1024_ctx_t* ctx);
+void skein1024(void* dest, uint16_t outlength_b, const void* msg, uint32_t length_b);
 
 #endif /* SKEIN_H_ */
index d8e9b4716a4d27e8137e03bcd7cc62fcc7fb8949..ac3162e53cb3f1370a40d482d1c74b1006870698 100644 (file)
@@ -47,11 +47,11 @@ void skein1024_init(skein1024_ctx_t* ctx, uint16_t outsize_b){
        ubi1024_init(&(ctx->ubictx), ctx->ubictx.g, UBI_TYPE_MSG);
 }
 
-void skein1024_nextBlock(skein1024_ctx_t* ctx, void* block){
+void skein1024_nextBlock(skein1024_ctx_t* ctx, const void* block){
        ubi1024_nextBlock(&(ctx->ubictx), block);
 }
 
-void skein1024_lastBlock(skein1024_ctx_t* ctx, void* block, uint16_t length_b){
+void skein1024_lastBlock(skein1024_ctx_t* ctx, const void* block, uint16_t length_b){
        ubi1024_lastBlock(&(ctx->ubictx), block, length_b);
 }
 
@@ -64,13 +64,13 @@ void skein1024_ctx2hash(void* dest, skein1024_ctx_t* ctx){
        ubi1024_init(&(ctx->ubictx), ctx->ubictx.g, UBI_TYPE_OUT);
        
        outsize_b = ctx->outsize_b;
-       while(outsize_b){
+       while(1){
                memcpy(&uctx, &(ctx->ubictx), sizeof(ubi1024_ctx_t));
                ubi1024_lastBlock(&uctx, &counter, 64);
                ubi1024_ctx2hash(outbuffer, &uctx);
-               if(outsize_b<=UBI1024_BLOCKSIZE_B){
+               if(outsize_b<=UBI1024_BLOCKSIZE){
                        memcpy(dest, outbuffer, (ctx->outsize_b+7)/8);
-                       outsize_b=0;
+                       break;
                }else{
                        memcpy(dest, outbuffer, UBI1024_BLOCKSIZE_B);
                        dest = (uint8_t*)dest + UBI1024_BLOCKSIZE_B;
@@ -80,3 +80,14 @@ void skein1024_ctx2hash(void* dest, skein1024_ctx_t* ctx){
        }
 }
 
+void skein1024(void* dest, uint16_t outlength_b, const void* msg, uint32_t length_b){
+       skein1024_ctx_t ctx;
+       skein1024_init(&ctx, outlength_b);
+       while(length_b>SKEIN1024_BLOCKSIZE){
+               skein1024_nextBlock(&ctx, msg);
+               msg = (uint8_t*)msg + SKEIN1024_BLOCKSIZE_B;
+               length_b -= SKEIN1024_BLOCKSIZE;
+       }
+       skein1024_lastBlock(&ctx, msg, length_b);
+       skein1024_ctx2hash(dest, &ctx);
+}
index f39741505d20aa175fb4fa2f3e183a5a259cd6e9..dfe6ef3a427c64f2e84cd72eda858cbea0fab3d5 100644 (file)
@@ -29,6 +29,7 @@
 #include "ubi.h"
 #include "skein.h"
 
+#include "cli.h"
 
 void skein256_init(skein256_ctx_t* ctx, uint16_t outsize_b){
        skein_config_t conf;
@@ -47,11 +48,11 @@ void skein256_init(skein256_ctx_t* ctx, uint16_t outsize_b){
        ubi256_init(&(ctx->ubictx), ctx->ubictx.g, UBI_TYPE_MSG);
 }
 
-void skein256_nextBlock(skein256_ctx_t* ctx, void* block){
+void skein256_nextBlock(skein256_ctx_t* ctx, const void* block){
        ubi256_nextBlock(&(ctx->ubictx), block);
 }
 
-void skein256_lastBlock(skein256_ctx_t* ctx, void* block, uint16_t length_b){
+void skein256_lastBlock(skein256_ctx_t* ctx, const void* block, uint16_t length_b){
        ubi256_lastBlock(&(ctx->ubictx), block, length_b);
 }
 
@@ -64,13 +65,13 @@ void skein256_ctx2hash(void* dest, skein256_ctx_t* ctx){
        ubi256_init(&(ctx->ubictx), ctx->ubictx.g, UBI_TYPE_OUT);
        
        outsize_b = ctx->outsize_b;
-       while(outsize_b){
+       while(1){
                memcpy(&uctx, &(ctx->ubictx), sizeof(ubi256_ctx_t));
                ubi256_lastBlock(&uctx, &counter, 64);
                ubi256_ctx2hash(outbuffer, &uctx);
-               if(outsize_b<=UBI256_BLOCKSIZE_B){
-                       memcpy(dest, outbuffer, (ctx->outsize_b+7)/8);
-                       outsize_b=0;
+               if(outsize_b<=UBI256_BLOCKSIZE){
+                       memcpy(dest, outbuffer, (outsize_b+7)/8);
+                       break;
                }else{
                        memcpy(dest, outbuffer, UBI256_BLOCKSIZE_B);
                        dest = (uint8_t*)dest + UBI256_BLOCKSIZE_B;
@@ -80,4 +81,14 @@ void skein256_ctx2hash(void* dest, skein256_ctx_t* ctx){
        }
 }
 
-
+void skein256(void* dest, uint16_t outlength_b,const void* msg, uint32_t length_b){
+       skein256_ctx_t ctx;
+       skein256_init(&ctx, outlength_b);
+       while(length_b>SKEIN256_BLOCKSIZE){
+               skein256_nextBlock(&ctx, msg);
+               msg = (uint8_t*)msg + SKEIN256_BLOCKSIZE_B;
+               length_b -= SKEIN256_BLOCKSIZE;
+       }
+       skein256_lastBlock(&ctx, msg, length_b);
+       skein256_ctx2hash(dest, &ctx);
+}
index 86035759e75b6158093cd22a37585a13fd78b056..2558f340d6acea02889606dab16921fe66d2fc34 100644 (file)
@@ -47,11 +47,11 @@ void skein512_init(skein512_ctx_t* ctx, uint16_t outsize_b){
        ubi512_init(&(ctx->ubictx), ctx->ubictx.g, UBI_TYPE_MSG);
 }
 
-void skein512_nextBlock(skein512_ctx_t* ctx, void* block){
+void skein512_nextBlock(skein512_ctx_t* ctx, const void* block){
        ubi512_nextBlock(&(ctx->ubictx), block);
 }
 
-void skein512_lastBlock(skein512_ctx_t* ctx, void* block, uint16_t length_b){
+void skein512_lastBlock(skein512_ctx_t* ctx, const void* block, uint16_t length_b){
        ubi512_lastBlock(&(ctx->ubictx), block, length_b);
 }
 
@@ -64,13 +64,13 @@ void skein512_ctx2hash(void* dest, skein512_ctx_t* ctx){
        ubi512_init(&(ctx->ubictx), ctx->ubictx.g, UBI_TYPE_OUT);
        
        outsize_b = ctx->outsize_b;
-       while(outsize_b){
+       while(1){
                memcpy(&uctx, &(ctx->ubictx), sizeof(ubi512_ctx_t));
                ubi512_lastBlock(&uctx, &counter, 64);
                ubi512_ctx2hash(outbuffer, &uctx);
-               if(outsize_b<=UBI512_BLOCKSIZE_B){
+               if(outsize_b<=UBI512_BLOCKSIZE){
                        memcpy(dest, outbuffer, (ctx->outsize_b+7)/8);
-                       outsize_b=0;
+                       break;
                }else{
                        memcpy(dest, outbuffer, UBI512_BLOCKSIZE_B);
                        dest = (uint8_t*)dest + UBI512_BLOCKSIZE_B;
@@ -80,3 +80,15 @@ void skein512_ctx2hash(void* dest, skein512_ctx_t* ctx){
        }
 }
 
+void skein512(void* dest, uint16_t outlength_b,const void* msg, uint32_t length_b){
+       skein512_ctx_t ctx;
+       skein512_init(&ctx, outlength_b);
+       while(length_b>SKEIN512_BLOCKSIZE){
+               skein512_nextBlock(&ctx, msg);
+               msg = (uint8_t*)msg + SKEIN512_BLOCKSIZE_B;
+               length_b -= SKEIN512_BLOCKSIZE;
+       }
+       skein512_lastBlock(&ctx, msg, length_b);
+       skein512_ctx2hash(dest, &ctx);
+}
+
index 7faaa685c0f33ef7d28f2b454f40f92593755f9c..aa68950a19f971659222fe033f82bc43bbf2010c 100644 (file)
 #include "debug.h"
 
 #include "skein.h"
+#include "hfal_skein256.h"
+#include "hfal_skein512.h"
+#include "hfal_skein1024.h"
 #include "cli.h"
+#include "shavs.h"
 #include "performance_test.h"
 
 #include <stdint.h>
@@ -43,33 +47,23 @@ void testrun_stdtest_skein256(uint16_t outsize_b){
        uint8_t message[64];
        uint8_t hash[(outsize_b+7)/8];
        uint8_t i;
-       skein256_ctx_t ctx;
                
        cli_putstr_P(PSTR("\r\n\r\nTest vectors for Skein (256 bits):"));
        for(i=0; i<64; ++i)
                message[i] = 0xFF-i;
        
        cli_putstr_P(PSTR("\r\nmessage:    "));
-       cli_hexdump(message, 1);
-       skein256_init(&ctx, outsize_b);
-       skein256_lastBlock(&ctx, message, 8);
-       skein256_ctx2hash(hash, &ctx);
+       skein256(hash, outsize_b, message, 8);
        cli_putstr_P(PSTR("\r\nhash:"));
        cli_hexdump_block(hash, (outsize_b+7)/8, 4, 16);
        
        cli_putstr_P(PSTR("\r\nmessage:"));
-       cli_hexdump_block(message, 32, 4, 16);
-       skein256_init(&ctx, outsize_b);
-       skein256_lastBlock(&ctx, message, 32*8);
-       skein256_ctx2hash(hash, &ctx);
+       skein256(hash, outsize_b, message, 32*8);
        cli_putstr_P(PSTR("\r\nhash:"));
        cli_hexdump_block(hash, (outsize_b+7)/8, 4, 16);
        
        cli_putstr_P(PSTR("\r\nmessage:"));
-       cli_hexdump_block(message, 64, 4, 16);
-       skein256_init(&ctx, outsize_b);
-       skein256_lastBlock(&ctx, message, 64*8);
-       skein256_ctx2hash(hash, &ctx);
+       skein256(hash, outsize_b, message, 64*8);
        cli_putstr_P(PSTR("\r\nhash:"));
        cli_hexdump_block(hash, (outsize_b+7)/8, 4, 16);
 }
@@ -78,7 +72,6 @@ void testrun_stdtest_skein512(uint16_t outsize_b){
        uint8_t message[128];
        uint8_t hash[(outsize_b+7)/8];
        uint8_t i;
-       skein512_ctx_t ctx;
                
        cli_putstr_P(PSTR("\r\n\r\nTest vectors for Skein (512 bits):"));
        for(i=0; i<128; ++i)
@@ -86,25 +79,17 @@ void testrun_stdtest_skein512(uint16_t outsize_b){
        
        cli_putstr_P(PSTR("\r\nmessage:    "));
        cli_hexdump(message, 1);
-       skein512_init(&ctx, outsize_b);
-       skein512_lastBlock(&ctx, message, 8);
-       skein512_ctx2hash(hash, &ctx);
+       skein512(hash, outsize_b, message, 8);
        cli_putstr_P(PSTR("\r\nhash:"));
        cli_hexdump_block(hash, (outsize_b+7)/8, 4, 16);
        
        cli_putstr_P(PSTR("\r\nmessage:"));
-       cli_hexdump_block(message, 64, 4, 16);
-       skein512_init(&ctx, outsize_b);
-       skein512_lastBlock(&ctx, message, 64*8);
-       skein512_ctx2hash(hash, &ctx);
+       skein512(hash, outsize_b, message, 64*8);
        cli_putstr_P(PSTR("\r\nhash:"));
        cli_hexdump_block(hash, (outsize_b+7)/8, 4, 16);
        
        cli_putstr_P(PSTR("\r\nmessage:"));
-       cli_hexdump_block(message, 128, 4, 16);
-       skein512_init(&ctx, outsize_b);
-       skein512_lastBlock(&ctx, message, 128*8);
-       skein512_ctx2hash(hash, &ctx);
+       skein512(hash, outsize_b, message, 128*8);
        cli_putstr_P(PSTR("\r\nhash:"));
        cli_hexdump_block(hash, (outsize_b+7)/8, 4, 16);
 }
@@ -113,7 +98,6 @@ void testrun_stdtest_skein1024(uint16_t outsize_b){
        uint8_t message[256];
        uint8_t hash[(outsize_b+7)/8];
        uint16_t i;
-       skein1024_ctx_t ctx;
                
        cli_putstr_P(PSTR("\r\n\r\nTest vectors for Skein (1024 bits):"));
        for(i=0; i<256; ++i)
@@ -121,25 +105,18 @@ void testrun_stdtest_skein1024(uint16_t outsize_b){
        
        cli_putstr_P(PSTR("\r\nmessage:    "));
        cli_hexdump(message, 1);
-       skein1024_init(&ctx, outsize_b);
-       skein1024_lastBlock(&ctx, message, 8);
-       skein1024_ctx2hash(hash, &ctx);
+       skein1024(hash, outsize_b, message, 8);
        cli_putstr_P(PSTR("\r\nhash:"));
        cli_hexdump_block(hash, (outsize_b+7)/8, 4, 16);
        
        cli_putstr_P(PSTR("\r\nmessage:"));
-       cli_hexdump_block(message, 128, 4, 16);
-       skein1024_init(&ctx, outsize_b);
-       skein1024_lastBlock(&ctx, message, 128*8);
-       skein1024_ctx2hash(hash, &ctx);
+       skein1024(hash, outsize_b, message, 128*8);
        cli_putstr_P(PSTR("\r\nhash:"));
        cli_hexdump_block(hash, (outsize_b+7)/8, 4, 16);
        
        cli_putstr_P(PSTR("\r\nmessage:"));
        cli_hexdump_block(message, 256, 4, 16);
-       skein1024_init(&ctx, outsize_b);
-       skein1024_lastBlock(&ctx, message, 256*8);
-       skein1024_ctx2hash(hash, &ctx);
+       skein1024(hash, outsize_b, message, 256*8);
        cli_putstr_P(PSTR("\r\nhash:"));
        cli_hexdump_block(hash, (outsize_b+7)/8, 4, 16);
 }
@@ -149,127 +126,96 @@ void testrun_stdtest_skein(void){
        testrun_stdtest_skein512(512);
        testrun_stdtest_skein1024(1024);
 }
-/*
-void testrun_performance_threefish256(void){
-       uint64_t t;
-       char str[16];
-       uint8_t key[THREEFISH256_BLOCKSIZE_B];
-       uint8_t data[THREEFISH256_BLOCKSIZE_B];
-       uint8_t tweak[16];
-       threefish256_ctx_t ctx;
-       
-       cli_putstr_P(PSTR("\r\nThreefish-256 performance:"));
-       
-       calibrateTimer();
-       print_overhead();       
-       
-//     memset(key,  0, THREEFISH256_BLOCKSIZE_B);
-//     memset(tweak, 0, 16);
-       
-       startTimer(1);
-       threefish256_init(key, tweak, &ctx);
-       t = stopTimer();
-       cli_putstr_P(PSTR("\r\n\tctx-gen time: "));
-       ultoa((unsigned long)t, str, 10);
-       cli_putstr(str);        
-       
-       startTimer(1);
-       threefish256_enc(data, &ctx);
-       t = stopTimer();
-       cli_putstr_P(PSTR("\r\n\tencrypt time: "));
-       ultoa((unsigned long)t, str, 10);
-       cli_putstr(str);        
-       
-       cli_putstr_P(PSTR("\r\n"));     
-}
 
-void testrun_performance_threefish512(void){
-       uint64_t t;
-       char str[16];
-       uint8_t key[THREEFISH512_BLOCKSIZE_B];
-       uint8_t data[THREEFISH512_BLOCKSIZE_B];
-       uint8_t tweak[16];
-       threefish512_ctx_t ctx;
-       
-       cli_putstr_P(PSTR("\r\nThreefish-512 performance:"));
-       
-       calibrateTimer();
-       print_overhead();       
-       
-//     memset(key,  0, THREEFISH512_BLOCKSIZE_B);
-//     memset(tweak, 0, 16);
+void zeromsg_test_skein(uint16_t outsize_b){
+       char str[8];
+       uint8_t hash[(outsize_b+7)/8];
        
-       startTimer(1);
-       threefish512_init(key, tweak, &ctx);
-       t = stopTimer();
-       cli_putstr_P(PSTR("\r\n\tctx-gen time: "));
-       ultoa((unsigned long)t, str, 10);
-       cli_putstr(str);        
+       skein256(hash, outsize_b, NULL, 0);
+       cli_putstr_P(PSTR("\r\nskein256-"));
+       utoa(outsize_b, str, 10);
+       cli_putstr(str);
+       cli_putstr_P(PSTR(" :"));
+       cli_hexdump_block(hash, (outsize_b+7)/8, 4, 16);
        
-       startTimer(1);
-       threefish512_enc(data, &ctx);
-       t = stopTimer();
-       cli_putstr_P(PSTR("\r\n\tencrypt time: "));
-       ultoa((unsigned long)t, str, 10);
-       cli_putstr(str);        
+       skein512(hash, outsize_b, NULL, 0);
+       cli_putstr_P(PSTR("\r\nskein512-"));
+       utoa(outsize_b, str, 10);
+       cli_putstr(str);
+       cli_putstr_P(PSTR(" :"));
+       cli_hexdump_block(hash, (outsize_b+7)/8, 4, 16);
        
-       cli_putstr_P(PSTR("\r\n"));     
+       skein1024(hash, outsize_b, NULL, 0);
+       cli_putstr_P(PSTR("\r\nskein1024-"));
+       utoa(outsize_b, str, 10);
+       cli_putstr(str);
+       cli_putstr_P(PSTR(" :"));
+       cli_hexdump_block(hash, (outsize_b+7)/8, 4, 16);
 }
 
-void testrun_performance_threefish1024(void){
-       uint64_t t;
-       char str[16];
-       uint8_t key[THREEFISH1024_BLOCKSIZE_B];
-       uint8_t data[THREEFISH1024_BLOCKSIZE_B];
-       uint8_t tweak[16];
-       threefish1024_ctx_t ctx;
-       
-       cli_putstr_P(PSTR("\r\nThreefish-1024 performance:"));
-       
-       calibrateTimer();
-       print_overhead();       
-       
-//     memset(key,  0, THREEFISH1024_BLOCKSIZE_B);
-//     memset(tweak, 0, 16);
-       
-       startTimer(1);
-       threefish1024_init(key, tweak, &ctx);
-       t = stopTimer();
-       cli_putstr_P(PSTR("\r\n\tctx-gen time: "));
-       ultoa((unsigned long)t, str, 10);
-       cli_putstr(str);        
-       
-       startTimer(1);
-       threefish1024_enc(data, &ctx);
-       t = stopTimer();
-       cli_putstr_P(PSTR("\r\n\tencrypt time: "));
-       ultoa((unsigned long)t, str, 10);
-       cli_putstr(str);        
-       
-       cli_putstr_P(PSTR("\r\n"));     
+void zeromsg_test_common(char* p){
+       uint8_t i;
+       uint16_t s=0;
+       uint16_t sizes[]={128, 160, 224, 256, 384, 512, 1024};
+       if(p){
+               s = strtoul(p, NULL, 0);
+       }
+       if(s){
+               zeromsg_test_skein(s);
+       }else{
+               for(i=0; i<7; ++i)
+                       zeromsg_test_skein(sizes[i]);
+       }
 }
 
-void testrun_performance_threefish(void){
-       testrun_performance_threefish256();
-       testrun_performance_threefish512();
-       testrun_performance_threefish1024();
-}
-*/
 /*****************************************************************************
  *  main                                                                                                                                        *
  *****************************************************************************/
 
+const hfdesc_t* algolist[] PROGMEM = {
+       (hfdesc_t*)&skein256_128_desc,
+       (hfdesc_t*)&skein256_160_desc,
+       (hfdesc_t*)&skein256_224_desc,
+       (hfdesc_t*)&skein256_256_desc,
+       (hfdesc_t*)&skein256_384_desc,
+       (hfdesc_t*)&skein256_512_desc,
+       
+       (hfdesc_t*)&skein512_128_desc,
+       (hfdesc_t*)&skein512_160_desc,
+       (hfdesc_t*)&skein512_224_desc,
+       (hfdesc_t*)&skein512_256_desc,
+       (hfdesc_t*)&skein512_384_desc,
+       (hfdesc_t*)&skein512_512_desc,
+       (hfdesc_t*)&skein512_1024_desc,
+       
+       (hfdesc_t*)&skein1024_128_desc,
+       (hfdesc_t*)&skein1024_160_desc,
+       (hfdesc_t*)&skein1024_224_desc,
+       (hfdesc_t*)&skein1024_256_desc,
+       (hfdesc_t*)&skein1024_384_desc,
+       (hfdesc_t*)&skein1024_512_desc,
+       (hfdesc_t*)&skein1024_1024_desc,
+       NULL
+};
+
 const char nessie_str[]      PROGMEM = "nessie";
 const char test_str[]        PROGMEM = "test";
+const char ztest_str[]       PROGMEM = "zerotest";
 const char performance_str[] PROGMEM = "performance";
 const char echo_str[]        PROGMEM = "echo";
+const char shavs_list_str[]  PROGMEM = "shavs_list";
+const char shavs_set_str[]   PROGMEM = "shavs_set";
+const char shavs_test1_str[] PROGMEM = "shavs_test1";
 
 cmdlist_entry_t cmdlist[] PROGMEM = {
 //     { nessie_str,      NULL, testrun_nessie_noekeon},
-       { test_str,        NULL, testrun_stdtest_skein},
-//     { performance_str, NULL, testrun_performance_threefish},
-       { echo_str,    (void*)1, (void_fpt)echo_ctrl},
-       { NULL,            NULL, NULL}
+       { test_str,            NULL, testrun_stdtest_skein},
+       { ztest_str,       (void*)1, (void_fpt)zeromsg_test_common},
+       { shavs_list_str,      NULL, shavs_listalgos},
+       { shavs_set_str,   (void*)1, (void_fpt)shavs_setalgo},
+       { shavs_test1_str,     NULL, shavs_test1},
+       { echo_str,        (void*)1, (void_fpt)echo_ctrl},
+       { NULL,                NULL, NULL}
 };
 
 int main (void){
@@ -277,6 +223,8 @@ int main (void){
        
        cli_rx = uart_getc;
        cli_tx = uart_putc;             
+       shavs_algolist=(hfdesc_t**)algolist;
+       shavs_algo=(hfdesc_t*)&skein256_256_desc;
        for(;;){
                cli_putstr_P(PSTR("\r\n\r\nCrypto-VS ("));
                cli_putstr(algo_name);
index c6518610504f1668dd4d765d70097a02b763eb33..48d913374d2a00c9e8f77ebe281d12cffbe75518 100644 (file)
@@ -88,6 +88,7 @@ void shavs_setalgo(char* param){
 
 static uint16_t buffer_idx=0;
 static uint8_t  in_byte=0;
+static uint16_t blocks=0;
 static uint8_t* buffer;
 static uint16_t buffersize_B;
 static hfgen_ctx_t ctx;
@@ -95,6 +96,12 @@ static hfgen_ctx_t ctx;
 static
 uint8_t buffer_add(char c){
        uint8_t v,t;
+       if(buffer_idx==buffersize_B){
+               hfal_hash_nextBlock(&ctx, buffer);
+               ++blocks;
+               buffer_idx=0;
+               in_byte=0;
+       }
        if(c>='0' && c<='9'){
                v=c-'0';
        }else{
@@ -106,13 +113,7 @@ uint8_t buffer_add(char c){
                        }else{
                                return 1;
                        }
-               }
-                       
-       }
-       if(buffer_idx==buffersize_B){
-               hfal_hash_nextBlock(&ctx, buffer);
-               buffer_idx=0;
-               in_byte=0;
+               }       
        }
 
        t=buffer[buffer_idx];
@@ -133,8 +134,8 @@ void shavs_test1(void){
        char* len2;
        uint32_t length=0;
        uint8_t len_set=0;
-       if(!shavs_algo){
-               cli_putstr_P(PSTR("\r\nERROR: select algorithm first!"));
+       if(!shavs_algo){                
+                       cli_putstr_P(PSTR("\r\nERROR: select algorithm first!"));
                return;
        }
        
@@ -142,6 +143,7 @@ void shavs_test1(void){
        buffer = malloc(buffersize_B);
 
        for(;;){
+               blocks = 0;
                do{     
                        cli_putstr_P(PSTR("\r\n"));
                        cli_getsn(lenstr, 20);
@@ -156,11 +158,12 @@ void shavs_test1(void){
                                }
                        } else {
                                if(!strncasecmp_P(len2, PSTR("EXIT"), 4)){
+                                       free(buffer);
                                        return;
                                }
                        }               
                }while(!len_set);
-               volatile int16_t expect_input;
+               volatile int32_t expect_input;
                char c;
                                
                if(length==0){
@@ -172,7 +175,7 @@ void shavs_test1(void){
                buffer_idx = 0;
                in_byte=0;
                len_set = 0;
-
+               
                hfal_hash_init(shavs_algo, &ctx);
                cli_putstr_P(PSTR("\r\n"));
                while((c=cli_getc_cecho())!='M' && c!='m'){
@@ -180,20 +183,24 @@ void shavs_test1(void){
                                cli_putstr_P(PSTR("\r\nERROR: wrong input (1) [0x"));
                                cli_hexdump(&c, 1);
                                cli_putstr_P(PSTR("]!\r\n"));
+                               free(buffer);
                                return;
                        }
                }
                if((c=cli_getc_cecho())!='s' && c!='S'){
                                cli_putstr_P(PSTR("\r\nERROR: wrong input (2)!\r\n"));
+                               free(buffer);
                                return;
                }
                if((c=cli_getc_cecho())!='g' && c!='G'){
                                cli_putstr_P(PSTR("\r\nERROR: wrong input (3)!\r\n"));
+                               free(buffer);
                                return;
                }
                while((c=cli_getc_cecho())!='='){
                        if(!isblank(c)){
                                cli_putstr_P(PSTR("\r\nERROR: wrong input (4)!\r\n"));
+                               free(buffer);
                                return;
                        }
                }
@@ -202,27 +209,25 @@ void shavs_test1(void){
                while(expect_input>0){
                        c=cli_getc_cecho();
                        if(buffer_add(c)==0){
-                               --expect_input;
+                               --expect_input;         
                        }else{
                                if(!isblank((uint16_t)c)){
                                        cli_putstr_P(PSTR("\r\nERROR: wrong input (5) ("));
                                        cli_putc(c);
                                        cli_putstr_P(PSTR(")!\r\n"));
+                                       free(buffer);
                                        return;
                                }
                        }
                }
-               
                uint8_t diggest[pgm_read_word(shavs_algo->hashsize_b)/8];
-               if(length && length%(buffersize_B*8)==0)
-                       hfal_hash_nextBlock(&ctx, buffer);
-               hfal_hash_lastBlock(&ctx, buffer, length%(buffersize_B*8));
+               hfal_hash_lastBlock(&ctx, buffer, length-blocks*(buffersize_B*8));
                hfal_hash_ctx2hash(diggest, &ctx);
                hfal_hash_free(&ctx);
                cli_putstr_P(PSTR("\r\n MD = "));
                cli_hexdump(diggest, pgm_read_word(&(shavs_algo->hashsize_b))/8);
                
        }
-       
+       free(buffer);
 }
 
diff --git a/ubi.h b/ubi.h
index 582a54e90bce0a92f46f22bd9c41347ef4e8661c..14718810c9515405087d45ac0c0e89f5cf773697 100644 (file)
--- a/ubi.h
+++ b/ubi.h
@@ -63,20 +63,20 @@ typedef struct{
        uint8_t g[128];
 }ubi1024_ctx_t;
 
-void ubi256_init(ubi256_ctx_t* ctx, void* g, uint8_t type);
-void ubi256_nextBlock(ubi256_ctx_t* ctx, void* block);
-void ubi256_lastBlock(ubi256_ctx_t* ctx, void* block, uint16_t length_b);
-void ubi256_ctx2hash(void* dest, ubi256_ctx_t* ctx);
-
-void ubi512_init(ubi512_ctx_t* ctx, void* g, uint8_t type);
-void ubi512_nextBlock(ubi512_ctx_t* ctx, void* block);
-void ubi512_lastBlock(ubi512_ctx_t* ctx, void* block, uint16_t length_b);
-void ubi512_ctx2hash(void* dest, ubi512_ctx_t* ctx);
-
-void ubi1024_init(ubi1024_ctx_t* ctx, void* g, uint8_t type);
-void ubi1024_nextBlock(ubi1024_ctx_t* ctx, void* block);
-void ubi1024_lastBlock(ubi1024_ctx_t* ctx, void* block, uint16_t length_b);
-void ubi1024_ctx2hash(void* dest, ubi1024_ctx_t* ctx);
+void ubi256_init(ubi256_ctx_t* ctx, const void* g, uint8_t type);
+void ubi256_nextBlock(ubi256_ctx_t* ctx, const void* block);
+void ubi256_lastBlock(ubi256_ctx_t* ctx, const void* block, uint16_t length_b);
+void ubi256_ctx2hash(void* dest, const ubi256_ctx_t* ctx);
+
+void ubi512_init(ubi512_ctx_t* ctx, const void* g, uint8_t type);
+void ubi512_nextBlock(ubi512_ctx_t* ctx, const void* block);
+void ubi512_lastBlock(ubi512_ctx_t* ctx, const void* block, uint16_t length_b);
+void ubi512_ctx2hash(void* dest, const ubi512_ctx_t* ctx);
+
+void ubi1024_init(ubi1024_ctx_t* ctx, const void* g, uint8_t type);
+void ubi1024_nextBlock(ubi1024_ctx_t* ctx, const void* block);
+void ubi1024_lastBlock(ubi1024_ctx_t* ctx, const void* block, uint16_t length_b);
+void ubi1024_ctx2hash(void* dest, const ubi1024_ctx_t* ctx);
 
 typedef struct{
        char     schema[4];
index 6287e68c0c29fc1c6f94c2b89de4588f58d1e69e..ae17cb32da35b862300faec237f8d2fb1b9c62fb 100644 (file)
--- a/ubi1024.c
+++ b/ubi1024.c
 #include "memxor.h"
 #include "ubi.h"
 
-void ubi1024_init(ubi1024_ctx_t* ctx, void* g, uint8_t type){
+void ubi1024_init(ubi1024_ctx_t* ctx, const void* g, uint8_t type){
        memset(ctx->tweak, 0, 15);
        ctx->tweak[15] = 0x40+type;
        memcpy(ctx->g, g, UBI1024_BLOCKSIZE_B);
 }
 
-void ubi1024_nextBlock(ubi1024_ctx_t* ctx, void* block){
+void ubi1024_nextBlock(ubi1024_ctx_t* ctx, const void* block){
        threefish1024_ctx_t tfctx;
        ((uint64_t*)(ctx->tweak))[0] += UBI1024_BLOCKSIZE_B;
        threefish1024_init(ctx->g, ctx->tweak, &tfctx);
@@ -47,7 +47,7 @@ void ubi1024_nextBlock(ubi1024_ctx_t* ctx, void* block){
 } 
 
 
-void ubi1024_lastBlock(ubi1024_ctx_t* ctx, void* block, uint16_t length_b){
+void ubi1024_lastBlock(ubi1024_ctx_t* ctx, const void* block, uint16_t length_b){
        threefish1024_ctx_t tfctx;
        while(length_b>UBI1024_BLOCKSIZE){
                ubi1024_nextBlock(ctx, block);
@@ -65,9 +65,12 @@ void ubi1024_lastBlock(ubi1024_ctx_t* ctx, void* block, uint16_t length_b){
                ctx->g[(length_b+7)/8-1] |= 0x80>>(length_b&7);
        threefish1024_enc(ctx->g, &tfctx);
        memxor(ctx->g, block, (length_b+7)/8);
+       if(length_b & 0x07){
+               ctx->g[((length_b+7)/8)-1] ^= 0x80>>(length_b&7);
+       }
 } 
 
-void ubi1024_ctx2hash(void* dest, ubi1024_ctx_t* ctx){
+void ubi1024_ctx2hash(void* dest, const ubi1024_ctx_t* ctx){
        memcpy(dest, ctx->g, UBI1024_BLOCKSIZE_B);
 }
 
index 8adfda89f02d8969e29becb881d829ea65dd7d90..09eb1e9b2a92fbaa90275e4730680d678c27048c 100644 (file)
--- a/ubi256.c
+++ b/ubi256.c
 #include "memxor.h"
 #include "ubi.h"
 
-void ubi256_init(ubi256_ctx_t* ctx, void* g, uint8_t type){
+void ubi256_init(ubi256_ctx_t* ctx, const void* g, uint8_t type){
        memset(ctx->tweak, 0, 15);
        ctx->tweak[15] = 0x40+type;
        memcpy(ctx->g, g, 32);
 }
 
-void ubi256_nextBlock(ubi256_ctx_t* ctx, void* block){
+void ubi256_nextBlock(ubi256_ctx_t* ctx, const void* block){
        threefish256_ctx_t tfctx;
        ((uint64_t*)(ctx->tweak))[0] += UBI256_BLOCKSIZE_B;
        threefish256_init(ctx->g, ctx->tweak, &tfctx);
@@ -47,7 +47,7 @@ void ubi256_nextBlock(ubi256_ctx_t* ctx, void* block){
 } 
 
 
-void ubi256_lastBlock(ubi256_ctx_t* ctx, void* block, uint16_t length_b){
+void ubi256_lastBlock(ubi256_ctx_t* ctx, const void* block, uint16_t length_b){
        threefish256_ctx_t tfctx;
        while(length_b>UBI256_BLOCKSIZE){
                ubi256_nextBlock(ctx, block);
@@ -56,18 +56,25 @@ void ubi256_lastBlock(ubi256_ctx_t* ctx, void* block, uint16_t length_b){
        }
        ctx->tweak[15] |= 0x80;
        ((uint64_t*)(ctx->tweak))[0] += (length_b+7)/8;
-       if(length_b & 0x07)
+       if(length_b & 0x07){
                ctx->tweak[14] |= 0x80;
+       }
        threefish256_init(ctx->g, ctx->tweak, &tfctx);
        memset(ctx->g, 0, UBI256_BLOCKSIZE_B);
        memcpy(ctx->g, block, (length_b+7)/8);
-       if(length_b & 0x07)
-               ctx->g[(length_b+7)/8-1] |= 0x80>>(length_b&7);
+       if(length_b & 0x07){
+               ctx->g[((length_b+7)/8)-1] |= 0x80>>(length_b&7);
+               ctx->g[((length_b+7)/8)-1] &= ~((0x80>>(length_b&7))-1);
+       }
        threefish256_enc(ctx->g, &tfctx);
        memxor(ctx->g, block, (length_b+7)/8);
+       if(length_b & 0x07){
+               ctx->g[((length_b+7)/8)-1] ^= 0x80>>(length_b&7);
+       }
+
 } 
 
-void ubi256_ctx2hash(void* dest, ubi256_ctx_t* ctx){
+void ubi256_ctx2hash(void* dest, const ubi256_ctx_t* ctx){
        memcpy(dest, ctx->g, UBI256_BLOCKSIZE_B);
 }
 
index c5e6f51abc160ed653da74461210663be828effe..d6bab2d30e151464eea38cb9ed29918c45ecd52c 100644 (file)
--- a/ubi512.c
+++ b/ubi512.c
 #include "memxor.h"
 #include "ubi.h"
 
-void ubi512_init(ubi512_ctx_t* ctx, void* g, uint8_t type){
+void ubi512_init(ubi512_ctx_t* ctx, const void* g, uint8_t type){
        memset(ctx->tweak, 0, 15);
        ctx->tweak[15] = 0x40+type;
        memcpy(ctx->g, g, UBI512_BLOCKSIZE_B);
 }
 
-void ubi512_nextBlock(ubi512_ctx_t* ctx, void* block){
+void ubi512_nextBlock(ubi512_ctx_t* ctx, const void* block){
        threefish512_ctx_t tfctx;
        ((uint64_t*)(ctx->tweak))[0] += UBI512_BLOCKSIZE_B;
        threefish512_init(ctx->g, ctx->tweak, &tfctx);
@@ -47,7 +47,7 @@ void ubi512_nextBlock(ubi512_ctx_t* ctx, void* block){
 } 
 
 
-void ubi512_lastBlock(ubi512_ctx_t* ctx, void* block, uint16_t length_b){
+void ubi512_lastBlock(ubi512_ctx_t* ctx, const void* block, uint16_t length_b){
        threefish512_ctx_t tfctx;
        while(length_b>UBI512_BLOCKSIZE){
                ubi512_nextBlock(ctx, block);
@@ -65,9 +65,12 @@ void ubi512_lastBlock(ubi512_ctx_t* ctx, void* block, uint16_t length_b){
                ctx->g[(length_b+7)/8-1] |= 0x80>>(length_b&7);
        threefish512_enc(ctx->g, &tfctx);
        memxor(ctx->g, block, (length_b+7)/8);
+       if(length_b & 0x07){
+               ctx->g[((length_b+7)/8)-1] ^= 0x80>>(length_b&7);
+       }
 } 
 
-void ubi512_ctx2hash(void* dest, ubi512_ctx_t* ctx){
+void ubi512_ctx2hash(void* dest, const ubi512_ctx_t* ctx){
        memcpy(dest, ctx->g, UBI512_BLOCKSIZE_B);
 }