twister now in ASM
This commit is contained in:
parent
0076b72ccd
commit
288c82e97b
|
@ -107,6 +107,18 @@
|
||||||
out _SFR_IO_ADDR(SPL), \reg1
|
out _SFR_IO_ADDR(SPL), \reg1
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro stack_free_large2 size:req, reg1=r30, reg2=r31
|
||||||
|
in r0, _SFR_IO_ADDR(SREG)
|
||||||
|
in \reg1, _SFR_IO_ADDR(SPL)
|
||||||
|
in \reg2, _SFR_IO_ADDR(SPH)
|
||||||
|
adiw \reg1, 63
|
||||||
|
adiw \reg1, 63
|
||||||
|
adiw \reg1, (\size-63*2)
|
||||||
|
cli
|
||||||
|
out _SFR_IO_ADDR(SPH), \reg2
|
||||||
|
out _SFR_IO_ADDR(SREG), r0
|
||||||
|
out _SFR_IO_ADDR(SPL), \reg1
|
||||||
|
.endm
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
|
|
|
@ -31,17 +31,17 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* param a: r24
|
* param a: r24
|
||||||
* param b; r22
|
* param b: r22
|
||||||
* param reducer: r20
|
* param reducer: r20
|
||||||
*/
|
*/
|
||||||
A = 21
|
A = 23
|
||||||
B = 22
|
B = 22
|
||||||
P = 24
|
P = 24
|
||||||
.global gf256mul
|
.global gf256mul
|
||||||
|
|
||||||
#ifdef OPTIMIZE_SMALL_A
|
#ifdef OPTIMIZE_SMALL_A
|
||||||
gf256mul:
|
gf256mul:
|
||||||
mov r21, r24
|
mov A, r24
|
||||||
clr r24
|
clr r24
|
||||||
1:
|
1:
|
||||||
lsr A
|
lsr A
|
||||||
|
|
|
@ -4,7 +4,7 @@ ALGO_NAME := TWISTER224
|
||||||
# comment out the following line for removement of TWISTER-224 from the build process
|
# comment out the following line for removement of TWISTER-224 from the build process
|
||||||
HASHES += $(ALGO_NAME)
|
HASHES += $(ALGO_NAME)
|
||||||
|
|
||||||
$(ALGO_NAME)_OBJ := twister.o twister-small.o memxor.o gf256mul.o
|
$(ALGO_NAME)_OBJ := twister-small-asm.o twister-asm.o twister224.o
|
||||||
$(ALGO_NAME)_TEST_BIN := main-twister224-test.o debug.o uart.o serial-tools.o \
|
$(ALGO_NAME)_TEST_BIN := main-twister224-test.o debug.o uart.o serial-tools.o \
|
||||||
nessie_hash_test.o nessie_common.o cli.o performance_test.o
|
nessie_hash_test.o nessie_common.o cli.o performance_test.o
|
||||||
$(ALGO_NAME)_NESSIE_TEST := "nessie"
|
$(ALGO_NAME)_NESSIE_TEST := "nessie"
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
# Makefile for TWISTER-224
|
||||||
|
ALGO_NAME := TWISTER224_C
|
||||||
|
|
||||||
|
# comment out the following line for removement of TWISTER-224 from the build process
|
||||||
|
HASHES += $(ALGO_NAME)
|
||||||
|
|
||||||
|
$(ALGO_NAME)_OBJ := twister.o twister-small.o memxor.o gf256mul.o
|
||||||
|
$(ALGO_NAME)_TEST_BIN := main-twister224-test.o debug.o uart.o serial-tools.o \
|
||||||
|
nessie_hash_test.o nessie_common.o cli.o performance_test.o
|
||||||
|
$(ALGO_NAME)_NESSIE_TEST := "nessie"
|
||||||
|
$(ALGO_NAME)_PERFORMANCE_TEST := "performance"
|
||||||
|
|
|
@ -4,7 +4,7 @@ ALGO_NAME := TWISTER256
|
||||||
# comment out the following line for removement of TWISTER-256 from the build process
|
# comment out the following line for removement of TWISTER-256 from the build process
|
||||||
HASHES += $(ALGO_NAME)
|
HASHES += $(ALGO_NAME)
|
||||||
|
|
||||||
$(ALGO_NAME)_OBJ := twister.o twister-small.o memxor.o gf256mul.o
|
$(ALGO_NAME)_OBJ := twister-asm.o twister-small-asm.o twister256.o
|
||||||
$(ALGO_NAME)_TEST_BIN := main-twister256-test.o debug.o uart.o serial-tools.o \
|
$(ALGO_NAME)_TEST_BIN := main-twister256-test.o debug.o uart.o serial-tools.o \
|
||||||
nessie_hash_test.o nessie_common.o cli.o performance_test.o
|
nessie_hash_test.o nessie_common.o cli.o performance_test.o
|
||||||
$(ALGO_NAME)_NESSIE_TEST := "nessie"
|
$(ALGO_NAME)_NESSIE_TEST := "nessie"
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
# Makefile for TWISTER-256
|
||||||
|
ALGO_NAME := TWISTER256_C
|
||||||
|
|
||||||
|
# comment out the following line for removement of TWISTER-256 from the build process
|
||||||
|
HASHES += $(ALGO_NAME)
|
||||||
|
|
||||||
|
$(ALGO_NAME)_OBJ := twister.o twister-small.o memxor.o gf256mul.o
|
||||||
|
$(ALGO_NAME)_TEST_BIN := main-twister256-test.o debug.o uart.o serial-tools.o \
|
||||||
|
nessie_hash_test.o nessie_common.o cli.o performance_test.o
|
||||||
|
$(ALGO_NAME)_NESSIE_TEST := "nessie"
|
||||||
|
$(ALGO_NAME)_PERFORMANCE_TEST := "performance"
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
# Makefile for TWISTER-384
|
||||||
|
ALGO_NAME := TWISTER384
|
||||||
|
|
||||||
|
# comment out the following line for removement of TWISTER-384 from the build process
|
||||||
|
HASHES += $(ALGO_NAME)
|
||||||
|
|
||||||
|
$(ALGO_NAME)_OBJ := twister-asm.o twister-big-asm.o twister384.o
|
||||||
|
$(ALGO_NAME)_TEST_BIN := main-twister384-test.o debug.o uart.o serial-tools.o \
|
||||||
|
nessie_hash_test.o nessie_common.o cli.o performance_test.o
|
||||||
|
$(ALGO_NAME)_NESSIE_TEST := "nessie"
|
||||||
|
$(ALGO_NAME)_PERFORMANCE_TEST := "performance"
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
# Makefile for TWISTER-384
|
||||||
|
ALGO_NAME := TWISTER384_C
|
||||||
|
|
||||||
|
# comment out the following line for removement of TWISTER-384 from the build process
|
||||||
|
HASHES += $(ALGO_NAME)
|
||||||
|
|
||||||
|
$(ALGO_NAME)_OBJ := twister.o twister-big.o memxor.o gf256mul.o
|
||||||
|
$(ALGO_NAME)_TEST_BIN := main-twister384-test.o debug.o uart.o serial-tools.o \
|
||||||
|
nessie_hash_test.o nessie_common.o cli.o performance_test.o
|
||||||
|
$(ALGO_NAME)_NESSIE_TEST := "nessie"
|
||||||
|
$(ALGO_NAME)_PERFORMANCE_TEST := "performance"
|
||||||
|
|
|
@ -4,7 +4,7 @@ ALGO_NAME := TWISTER512
|
||||||
# comment out the following line for removement of TWISTER-512 from the build process
|
# comment out the following line for removement of TWISTER-512 from the build process
|
||||||
HASHES += $(ALGO_NAME)
|
HASHES += $(ALGO_NAME)
|
||||||
|
|
||||||
$(ALGO_NAME)_OBJ := twister.o twister-big.o memxor.o gf256mul.o
|
$(ALGO_NAME)_OBJ := twister-asm.o twister-big-asm.o twister512.o
|
||||||
$(ALGO_NAME)_TEST_BIN := main-twister512-test.o debug.o uart.o serial-tools.o \
|
$(ALGO_NAME)_TEST_BIN := main-twister512-test.o debug.o uart.o serial-tools.o \
|
||||||
nessie_hash_test.o nessie_common.o cli.o performance_test.o
|
nessie_hash_test.o nessie_common.o cli.o performance_test.o
|
||||||
$(ALGO_NAME)_NESSIE_TEST := "nessie"
|
$(ALGO_NAME)_NESSIE_TEST := "nessie"
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
# Makefile for TWISTER-512
|
||||||
|
ALGO_NAME := TWISTER512_C
|
||||||
|
|
||||||
|
# comment out the following line for removement of TWISTER-512 from the build process
|
||||||
|
HASHES += $(ALGO_NAME)
|
||||||
|
|
||||||
|
$(ALGO_NAME)_OBJ := twister.o twister-big.o memxor.o gf256mul.o
|
||||||
|
$(ALGO_NAME)_TEST_BIN := main-twister512-test.o debug.o uart.o serial-tools.o \
|
||||||
|
nessie_hash_test.o nessie_common.o cli.o performance_test.o
|
||||||
|
$(ALGO_NAME)_NESSIE_TEST := "nessie"
|
||||||
|
$(ALGO_NAME)_PERFORMANCE_TEST := "performance"
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#include "nessie_hash_test.h"
|
#include "nessie_hash_test.h"
|
||||||
#include "performance_test.h"
|
#include "performance_test.h"
|
||||||
|
|
||||||
|
#include <util/delay.h>
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -105,7 +107,7 @@ void testrun_twister224(void){
|
||||||
twister224(&hash, &(stestv[i]), stestl[i]);
|
twister224(&hash, &(stestv[i]), stestl[i]);
|
||||||
uart_hexdump(hash, 224/8);
|
uart_hexdump(hash, 224/8);
|
||||||
}
|
}
|
||||||
|
#ifdef TWISTER_LONGTEST
|
||||||
uart_putstr_P(PSTR("\r\n\r\n=== TWISTER-224 test suit (long test) ==="));
|
uart_putstr_P(PSTR("\r\n\r\n=== TWISTER-224 test suit (long test) ==="));
|
||||||
char* ltest= "abcdefghbcdefghicdefghijdefghijk"
|
char* ltest= "abcdefghbcdefghicdefghijdefghijk"
|
||||||
"efghijklfghijklmghijklmnhijklmno";
|
"efghijklfghijklmghijklmnhijklmno";
|
||||||
|
@ -119,6 +121,7 @@ void testrun_twister224(void){
|
||||||
}
|
}
|
||||||
twister224_ctx2hash(hash, &ctx);
|
twister224_ctx2hash(hash, &ctx);
|
||||||
uart_hexdump(hash, 224/8);
|
uart_hexdump(hash, 224/8);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -127,7 +130,7 @@ void testrun_performance_twister224(void){
|
||||||
char str[16];
|
char str[16];
|
||||||
uint8_t data[64];
|
uint8_t data[64];
|
||||||
twister_state_t ctx;
|
twister_state_t ctx;
|
||||||
|
volatile uint16_t i;
|
||||||
calibrateTimer();
|
calibrateTimer();
|
||||||
print_overhead();
|
print_overhead();
|
||||||
|
|
||||||
|
@ -140,6 +143,9 @@ void testrun_performance_twister224(void){
|
||||||
ultoa((unsigned long)t, str, 10);
|
ultoa((unsigned long)t, str, 10);
|
||||||
uart_putstr(str);
|
uart_putstr(str);
|
||||||
|
|
||||||
|
i=3000;
|
||||||
|
while(i--)
|
||||||
|
_delay_ms(1);
|
||||||
|
|
||||||
startTimer(1);
|
startTimer(1);
|
||||||
twister_small_nextBlock(&ctx, data);
|
twister_small_nextBlock(&ctx, data);
|
||||||
|
@ -148,6 +154,9 @@ void testrun_performance_twister224(void){
|
||||||
ultoa((unsigned long)t, str, 10);
|
ultoa((unsigned long)t, str, 10);
|
||||||
uart_putstr(str);
|
uart_putstr(str);
|
||||||
|
|
||||||
|
i=3000;
|
||||||
|
while(i--)
|
||||||
|
_delay_ms(1);
|
||||||
|
|
||||||
startTimer(1);
|
startTimer(1);
|
||||||
twister_small_lastBlock(&ctx, data, 0);
|
twister_small_lastBlock(&ctx, data, 0);
|
||||||
|
@ -155,7 +164,11 @@ void testrun_performance_twister224(void){
|
||||||
uart_putstr_P(PSTR("\r\n\tlast block time: "));
|
uart_putstr_P(PSTR("\r\n\tlast block time: "));
|
||||||
ultoa((unsigned long)t, str, 10);
|
ultoa((unsigned long)t, str, 10);
|
||||||
uart_putstr(str);
|
uart_putstr(str);
|
||||||
|
|
||||||
|
i=3000;
|
||||||
|
while(i--)
|
||||||
|
_delay_ms(1);
|
||||||
|
|
||||||
startTimer(1);
|
startTimer(1);
|
||||||
twister_small_ctx2hash(data, &ctx, 224);
|
twister_small_ctx2hash(data, &ctx, 224);
|
||||||
t = stopTimer();
|
t = stopTimer();
|
||||||
|
@ -163,6 +176,10 @@ void testrun_performance_twister224(void){
|
||||||
ultoa((unsigned long)t, str, 10);
|
ultoa((unsigned long)t, str, 10);
|
||||||
uart_putstr(str);
|
uart_putstr(str);
|
||||||
|
|
||||||
|
i=3000;
|
||||||
|
while(i--)
|
||||||
|
_delay_ms(1);
|
||||||
|
|
||||||
uart_putstr_P(PSTR("\r\n"));
|
uart_putstr_P(PSTR("\r\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -110,7 +110,8 @@ void testrun_twister256(void){
|
||||||
twister256(&hash, &(stestv[i]), stestl[i]);
|
twister256(&hash, &(stestv[i]), stestl[i]);
|
||||||
print_hash(hash);
|
print_hash(hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TWISTER_LONGTEST
|
||||||
uart_putstr_P(PSTR("\r\n\r\n=== TWISTER-256 test suit (long test) ==="));
|
uart_putstr_P(PSTR("\r\n\r\n=== TWISTER-256 test suit (long test) ==="));
|
||||||
char* ltest= "abcdefghbcdefghicdefghijdefghijk"
|
char* ltest= "abcdefghbcdefghicdefghijdefghijk"
|
||||||
"efghijklfghijklmghijklmnhijklmno";
|
"efghijklfghijklmghijklmnhijklmno";
|
||||||
|
@ -124,6 +125,7 @@ void testrun_twister256(void){
|
||||||
}
|
}
|
||||||
twister256_ctx2hash(hash, &ctx);
|
twister256_ctx2hash(hash, &ctx);
|
||||||
print_hash(hash);
|
print_hash(hash);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,210 @@
|
||||||
|
/* main-twister384-test.c */
|
||||||
|
/*
|
||||||
|
This file is part of the Crypto-avr-lib/microcrypt-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/>.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* twister test suit
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "serial-tools.h"
|
||||||
|
#include "uart.h"
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
|
#include "twister-big.h"
|
||||||
|
#include "nessie_hash_test.h"
|
||||||
|
#include "performance_test.h"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "cli.h"
|
||||||
|
|
||||||
|
char* algo_name = "TWISTER-384";
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* additional validation-functions *
|
||||||
|
*****************************************************************************/
|
||||||
|
void twister384_init_dummy(void* ctx){
|
||||||
|
twister_big_init(ctx, 384);
|
||||||
|
}
|
||||||
|
|
||||||
|
void twister384_next_dummy(void* buffer, void* ctx){
|
||||||
|
twister_big_nextBlock(ctx, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void twister384_last_dummy(void* buffer, uint16_t size_b, void* ctx){
|
||||||
|
twister_big_lastBlock(ctx, buffer, size_b);
|
||||||
|
}
|
||||||
|
|
||||||
|
void twister384_ctx2hash_dummy(void* buffer, void* ctx){
|
||||||
|
twister_big_ctx2hash(buffer, ctx, 384);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void testrun_nessie_twister384(void){
|
||||||
|
nessie_hash_ctx.hashsize_b = 384;
|
||||||
|
nessie_hash_ctx.blocksize_B = 512/8;
|
||||||
|
nessie_hash_ctx.ctx_size_B = sizeof(twister_big_ctx_t);
|
||||||
|
nessie_hash_ctx.name = algo_name;
|
||||||
|
nessie_hash_ctx.hash_init = (nessie_hash_init_fpt)twister384_init_dummy;
|
||||||
|
nessie_hash_ctx.hash_next = (nessie_hash_next_fpt)twister384_next_dummy;
|
||||||
|
nessie_hash_ctx.hash_last = (nessie_hash_last_fpt)twister384_last_dummy;
|
||||||
|
nessie_hash_ctx.hash_conv = (nessie_hash_conv_fpt)twister384_ctx2hash_dummy;
|
||||||
|
|
||||||
|
nessie_hash_run();
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* selftests
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
void print_hash(void* hash){
|
||||||
|
uart_hexdump(hash, 256/8);
|
||||||
|
uart_putstr_P(PSTR("\r\n\t"));
|
||||||
|
uart_hexdump((uint8_t*)hash+256/8, 128/8);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void testrun_twister384(void){
|
||||||
|
twister384_hash_t hash;
|
||||||
|
char* testv[]={
|
||||||
|
"",
|
||||||
|
"a",
|
||||||
|
"abc",
|
||||||
|
"message digest",
|
||||||
|
"abcdefghijklmnopqrstuvwxyz",
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
|
||||||
|
"12345678901234567890123456789012345678901234567890123456789012345678901234567890"};
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
uart_putstr_P(PSTR("\r\n=== TWISTER-384 test suit (MD5 test values) ==="));
|
||||||
|
for(i=0; i<7; ++i){
|
||||||
|
uart_putstr_P(PSTR("\r\n TWISTER-384 (\""));
|
||||||
|
uart_putstr(testv[i]);
|
||||||
|
uart_putstr_P(PSTR("\") = \r\n\t"));
|
||||||
|
twister384(&hash, testv[i], strlen(testv[i])*8);
|
||||||
|
print_hash(hash);
|
||||||
|
// return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uart_putstr_P(PSTR("\r\n\r\n=== TWISTER-384 test suit (short test values) ==="));
|
||||||
|
uint8_t stestv[]= {0x00, 0x00, 0xC0, 0xC0, 0x80, 0x48, 0x50};
|
||||||
|
uint8_t stestl[]= { 0, 1, 2, 3, 4, 5, 6};
|
||||||
|
for(i=0; i<7; ++i){
|
||||||
|
uart_putstr_P(PSTR("\r\n TWISTER-384 (\""));
|
||||||
|
uart_hexdump(&(stestv[i]), 1);
|
||||||
|
uart_putstr_P(PSTR("\") = \r\n\t"));
|
||||||
|
twister384(hash, &(stestv[i]), stestl[i]);
|
||||||
|
print_hash(hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef TWISTER_LONGTEST
|
||||||
|
uart_putstr_P(PSTR("\r\n\r\n=== TWISTER-384 test suit (long test) ==="));
|
||||||
|
char* ltest= "abcdefghbcdefghicdefghijdefghijk"
|
||||||
|
"efghijklfghijklmghijklmnhijklmno";
|
||||||
|
twister384_ctx_t ctx;
|
||||||
|
twister384_init(&ctx);
|
||||||
|
uart_putstr_P(PSTR("\r\n TWISTER-384 ( 16777216 x \""));
|
||||||
|
uart_putstr(ltest);
|
||||||
|
uart_putstr_P(PSTR("\") = \r\n\t"));
|
||||||
|
for(i=0; i<16777216; ++i){
|
||||||
|
twister384_nextBlock(&ctx, ltest);
|
||||||
|
}
|
||||||
|
twister384_ctx2hash(hash, &ctx);
|
||||||
|
print_hash(hash);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void testrun_performance_twister384(void){
|
||||||
|
uint64_t t;
|
||||||
|
char str[16];
|
||||||
|
uint8_t data[64];
|
||||||
|
twister_big_ctx_t ctx;
|
||||||
|
|
||||||
|
calibrateTimer();
|
||||||
|
print_overhead();
|
||||||
|
|
||||||
|
memset(data, 0, 64);
|
||||||
|
|
||||||
|
startTimer(1);
|
||||||
|
twister_big_init(&ctx, 384);
|
||||||
|
t = stopTimer();
|
||||||
|
uart_putstr_P(PSTR("\r\n\tctx-gen time: "));
|
||||||
|
ultoa((unsigned long)t, str, 10);
|
||||||
|
uart_putstr(str);
|
||||||
|
|
||||||
|
|
||||||
|
startTimer(1);
|
||||||
|
twister_big_nextBlock(&ctx, data);
|
||||||
|
t = stopTimer();
|
||||||
|
uart_putstr_P(PSTR("\r\n\tone-block time: "));
|
||||||
|
ultoa((unsigned long)t, str, 10);
|
||||||
|
uart_putstr(str);
|
||||||
|
|
||||||
|
|
||||||
|
startTimer(1);
|
||||||
|
twister_big_lastBlock(&ctx, data, 0);
|
||||||
|
t = stopTimer();
|
||||||
|
uart_putstr_P(PSTR("\r\n\tlast block time: "));
|
||||||
|
ultoa((unsigned long)t, str, 10);
|
||||||
|
uart_putstr(str);
|
||||||
|
|
||||||
|
startTimer(1);
|
||||||
|
twister_big_ctx2hash(data, &ctx, 384);
|
||||||
|
t = stopTimer();
|
||||||
|
uart_putstr_P(PSTR("\r\n\tctx2hash time: "));
|
||||||
|
ultoa((unsigned long)t, str, 10);
|
||||||
|
uart_putstr(str);
|
||||||
|
|
||||||
|
uart_putstr_P(PSTR("\r\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* main
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
int main (void){
|
||||||
|
char str[20];
|
||||||
|
|
||||||
|
|
||||||
|
DEBUG_INIT();
|
||||||
|
uart_putstr_P(PSTR("\r\n"));
|
||||||
|
|
||||||
|
uart_putstr_P(PSTR("\r\n\r\nCrypto-VS ("));
|
||||||
|
uart_putstr(algo_name);
|
||||||
|
uart_putstr_P(PSTR(")\r\nloaded and running\r\n"));
|
||||||
|
PGM_P u = PSTR("nessie\0test\0performance\0");
|
||||||
|
void_fpt v[] = { testrun_nessie_twister384,
|
||||||
|
testrun_twister384,
|
||||||
|
testrun_performance_twister384 };
|
||||||
|
|
||||||
|
while(1){
|
||||||
|
if (!getnextwordn(str,20)){DEBUG_S("DBG: W1\r\n"); goto error;}
|
||||||
|
if(execcommand_d0_P(str, u, v)<0){
|
||||||
|
uart_putstr_P(PSTR("\r\nunknown command\r\n"));
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
error:
|
||||||
|
uart_putstr("ERROR\r\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -113,7 +113,8 @@ void testrun_twister512(void){
|
||||||
twister512(hash, &(stestv[i]), stestl[i]);
|
twister512(hash, &(stestv[i]), stestl[i]);
|
||||||
print_hash(hash);
|
print_hash(hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TWISTER_LONGTEST
|
||||||
uart_putstr_P(PSTR("\r\n\r\n=== TWISTER-512 test suit (long test) ==="));
|
uart_putstr_P(PSTR("\r\n\r\n=== TWISTER-512 test suit (long test) ==="));
|
||||||
char* ltest= "abcdefghbcdefghicdefghijdefghijk"
|
char* ltest= "abcdefghbcdefghicdefghijdefghijk"
|
||||||
"efghijklfghijklmghijklmnhijklmno";
|
"efghijklfghijklmghijklmnhijklmno";
|
||||||
|
@ -127,6 +128,7 @@ void testrun_twister512(void){
|
||||||
}
|
}
|
||||||
twister512_ctx2hash(hash, &ctx);
|
twister512_ctx2hash(hash, &ctx);
|
||||||
print_hash(hash);
|
print_hash(hash);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,604 @@
|
||||||
|
/* twister-asm.S */
|
||||||
|
/*
|
||||||
|
This file is part of the Crypto-avr-lib/microcrypt-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 twister-asm.S
|
||||||
|
* \email daniel.otte@rub.de
|
||||||
|
* \author Daniel Otte
|
||||||
|
* \date 2008-12-22
|
||||||
|
* \license GPLv3 or later
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "avr-asm-macros.S"
|
||||||
|
|
||||||
|
twister_sbox:
|
||||||
|
.byte 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
|
||||||
|
.byte 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
|
||||||
|
.byte 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
|
||||||
|
.byte 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
|
||||||
|
.byte 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
|
||||||
|
.byte 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
|
||||||
|
.byte 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
|
||||||
|
.byte 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
|
||||||
|
.byte 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
|
||||||
|
.byte 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
|
||||||
|
.byte 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
|
||||||
|
.byte 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
|
||||||
|
.byte 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
|
||||||
|
.byte 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
|
||||||
|
.byte 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
|
||||||
|
.byte 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
|
||||||
|
.byte 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
|
||||||
|
.byte 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
|
||||||
|
.byte 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
|
||||||
|
.byte 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
|
||||||
|
.byte 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
|
||||||
|
.byte 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
|
||||||
|
.byte 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
|
||||||
|
.byte 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
|
||||||
|
.byte 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
|
||||||
|
.byte 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
|
||||||
|
.byte 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
|
||||||
|
.byte 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
|
||||||
|
.byte 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
|
||||||
|
.byte 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
|
||||||
|
.byte 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
|
||||||
|
.byte 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
|
||||||
|
|
||||||
|
/*
|
||||||
|
* param ctx: r24:r25
|
||||||
|
* param msg: r22:r23
|
||||||
|
*/
|
||||||
|
.global twister_mini_round
|
||||||
|
twister_mini_round:
|
||||||
|
movw r26, r24
|
||||||
|
movw r30, r22
|
||||||
|
adiw r26, 8*7
|
||||||
|
adiw r30, 8
|
||||||
|
ldi r21, 8
|
||||||
|
1:
|
||||||
|
ld r22, X
|
||||||
|
ld r23, -Z
|
||||||
|
eor r22, r23
|
||||||
|
st X+, r22
|
||||||
|
dec r21
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
/*
|
||||||
|
* param ctx: r24:r25
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
X_SAVE0 = 4
|
||||||
|
X_SAVE1 = 5
|
||||||
|
Y_SAVE0 = 6
|
||||||
|
Y_SAVE1 = 7
|
||||||
|
MDS0 = 8
|
||||||
|
MDS1 = 9
|
||||||
|
MDS2 = 10
|
||||||
|
MDS3 = 11
|
||||||
|
MDS4 = 12
|
||||||
|
MDS5 = 13
|
||||||
|
MDS6 = 14
|
||||||
|
MDS7 = 15
|
||||||
|
|
||||||
|
|
||||||
|
.global twister_blank_round
|
||||||
|
twister_blank_round:
|
||||||
|
push_range 4, 17
|
||||||
|
push r28
|
||||||
|
push r29
|
||||||
|
stack_alloc_large 64, r28, r29
|
||||||
|
|
||||||
|
movw X_SAVE0, r24
|
||||||
|
movw r30, r24
|
||||||
|
adiw r30, 63
|
||||||
|
adiw r30, 1+8 /* Z points behind counter */
|
||||||
|
movw r26, r24
|
||||||
|
adiw r26, 1
|
||||||
|
ldi r22, 8
|
||||||
|
1: /* "add" counter */
|
||||||
|
ld r16, -Z
|
||||||
|
ld r21, X
|
||||||
|
eor r21, r16
|
||||||
|
st X, r21
|
||||||
|
adiw r26, 8
|
||||||
|
dec r22
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
/* decrement counter */
|
||||||
|
subi r16, 1
|
||||||
|
st Z+, r16
|
||||||
|
ldi r17, 7
|
||||||
|
1:
|
||||||
|
ld r16, Z
|
||||||
|
sbci r16, 0
|
||||||
|
st Z+, r16
|
||||||
|
dec r17
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
movw r26, r24
|
||||||
|
adiw r28, 1 /* Y points to stack memory */
|
||||||
|
movw Y_SAVE0, r28
|
||||||
|
movw r24, r28
|
||||||
|
ldi r20, lo8(twister_sbox)
|
||||||
|
ldi r21, hi8(twister_sbox)
|
||||||
|
ldi r18, 8
|
||||||
|
1:
|
||||||
|
ldi r19, 0
|
||||||
|
|
||||||
|
2: /* sbox substitution */
|
||||||
|
ld r0, X+
|
||||||
|
movw r30, r20
|
||||||
|
add r30, r0
|
||||||
|
adc r31, r1
|
||||||
|
lpm r0, Z
|
||||||
|
movw r28, r24
|
||||||
|
mov r16, r18
|
||||||
|
add r16, r19
|
||||||
|
andi r16, 0x07
|
||||||
|
add r28, r16
|
||||||
|
adc r29, r1
|
||||||
|
st Y, r0
|
||||||
|
inc r19
|
||||||
|
cpi r19, 8
|
||||||
|
brne 2b
|
||||||
|
adiw r24, 8
|
||||||
|
dec r18
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
/* load MDS-Table to MDS0:MDS7 */
|
||||||
|
ldi r18, 1
|
||||||
|
mov MDS1, r18
|
||||||
|
mov MDS2, r18
|
||||||
|
mov MDS7, r18
|
||||||
|
ldi r18, 2
|
||||||
|
mov MDS0, r18
|
||||||
|
ldi r18, 5
|
||||||
|
mov MDS3, r18
|
||||||
|
ldi r18, 6
|
||||||
|
mov MDS6, r18
|
||||||
|
ldi r18, 7
|
||||||
|
mov MDS4, r18
|
||||||
|
ldi r18, 8
|
||||||
|
mov MDS5, r18
|
||||||
|
|
||||||
|
ldi r20, 0x4D /* reducer for gf256mul*/
|
||||||
|
ldi r16, 0
|
||||||
|
|
||||||
|
1:
|
||||||
|
movw r26, X_SAVE0
|
||||||
|
add r26, r16
|
||||||
|
adc r27, r1
|
||||||
|
ldi r17, 8
|
||||||
|
2:
|
||||||
|
mov r24, MDS0
|
||||||
|
movw r28, Y_SAVE0
|
||||||
|
add r28, r16
|
||||||
|
adc r29, r1
|
||||||
|
ld r22, Y
|
||||||
|
rcall gf256mul
|
||||||
|
mov r0, r24
|
||||||
|
|
||||||
|
mov r24, MDS1
|
||||||
|
ldd r22, Y+8
|
||||||
|
rcall gf256mul
|
||||||
|
eor r0, r24
|
||||||
|
|
||||||
|
mov r24, MDS2
|
||||||
|
ldd r22, Y+8*2
|
||||||
|
rcall gf256mul
|
||||||
|
eor r0, r24
|
||||||
|
|
||||||
|
mov r24, MDS3
|
||||||
|
ldd r22, Y+8*3
|
||||||
|
rcall gf256mul
|
||||||
|
eor r0, r24
|
||||||
|
|
||||||
|
mov r24, MDS4
|
||||||
|
ldd r22, Y+8*4
|
||||||
|
rcall gf256mul
|
||||||
|
eor r0, r24
|
||||||
|
|
||||||
|
mov r24, MDS5
|
||||||
|
ldd r22, Y+8*5
|
||||||
|
rcall gf256mul
|
||||||
|
eor r0, r24
|
||||||
|
|
||||||
|
mov r24, MDS6
|
||||||
|
ldd r22, Y+8*6
|
||||||
|
rcall gf256mul
|
||||||
|
eor r0, r24
|
||||||
|
|
||||||
|
mov r24, MDS7
|
||||||
|
ldd r22, Y+8*7
|
||||||
|
rcall gf256mul
|
||||||
|
eor r0, r24
|
||||||
|
|
||||||
|
st X, r0
|
||||||
|
adiw r26, 8
|
||||||
|
|
||||||
|
mov r0, MDS7
|
||||||
|
mov MDS7, MDS6
|
||||||
|
mov MDS6, MDS5
|
||||||
|
mov MDS5, MDS4
|
||||||
|
mov MDS4, MDS3
|
||||||
|
mov MDS3, MDS2
|
||||||
|
mov MDS2, MDS1
|
||||||
|
mov MDS1, MDS0
|
||||||
|
mov MDS0, r0
|
||||||
|
|
||||||
|
dec r17
|
||||||
|
brne 2b
|
||||||
|
8:
|
||||||
|
inc r16
|
||||||
|
cpi r16, 8
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
9:
|
||||||
|
stack_free_large 64
|
||||||
|
pop r29
|
||||||
|
pop r28
|
||||||
|
pop_range 4, 17
|
||||||
|
ret
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
A = 23
|
||||||
|
B = 22
|
||||||
|
P = 24
|
||||||
|
|
||||||
|
gf256mul:
|
||||||
|
mov A, r24
|
||||||
|
clr P
|
||||||
|
1:
|
||||||
|
lsr A
|
||||||
|
breq 4f
|
||||||
|
brcc 2f
|
||||||
|
eor P, B
|
||||||
|
2:
|
||||||
|
lsl B
|
||||||
|
brcc 3f
|
||||||
|
eor B, r20
|
||||||
|
3:
|
||||||
|
rjmp 1b
|
||||||
|
4:
|
||||||
|
brcc 2f
|
||||||
|
eor P, B
|
||||||
|
2:
|
||||||
|
ret
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
/* twister_ctx2hash */
|
||||||
|
/*
|
||||||
|
* param dest: r24:r25
|
||||||
|
* param ctx: r22:r23
|
||||||
|
* param hashsize_b: r20:r21
|
||||||
|
*/
|
||||||
|
DEST_SAVE0 = 10
|
||||||
|
DEST_SAVE1 = 11
|
||||||
|
CTX_SAVE0 = 12
|
||||||
|
CTX_SAVE1 = 13
|
||||||
|
LEN_SAVE = 14
|
||||||
|
LEN32_SAVE = 15
|
||||||
|
TMP_SAVE0 = 16
|
||||||
|
TMP_SAVE1 = 17
|
||||||
|
|
||||||
|
|
||||||
|
.global twister_ctx2hash
|
||||||
|
.global twister_small_ctx2hash
|
||||||
|
.global twister_big_ctx2hash
|
||||||
|
.global twister224_ctx2hash
|
||||||
|
.global twister256_ctx2hash
|
||||||
|
.global twister384_ctx2hash
|
||||||
|
.global twister512_ctx2hash
|
||||||
|
|
||||||
|
twister224_ctx2hash:
|
||||||
|
ldi r20, lo8(224)
|
||||||
|
ldi r21, hi8(224)
|
||||||
|
rjmp twister_ctx2hash
|
||||||
|
|
||||||
|
twister256_ctx2hash:
|
||||||
|
ldi r20, lo8(256)
|
||||||
|
ldi r21, hi8(256)
|
||||||
|
rjmp twister_ctx2hash
|
||||||
|
|
||||||
|
twister384_ctx2hash:
|
||||||
|
ldi r20, lo8(384)
|
||||||
|
ldi r21, hi8(384)
|
||||||
|
rjmp twister_ctx2hash
|
||||||
|
|
||||||
|
twister512_ctx2hash:
|
||||||
|
ldi r20, lo8(512)
|
||||||
|
ldi r21, hi8(512)
|
||||||
|
; rjmp twister_ctx2hash
|
||||||
|
|
||||||
|
twister_big_ctx2hash:
|
||||||
|
twister_small_ctx2hash:
|
||||||
|
twister_ctx2hash:
|
||||||
|
push_range 10, 17
|
||||||
|
push r28
|
||||||
|
push r29
|
||||||
|
stack_alloc_large 64
|
||||||
|
movw DEST_SAVE0, r24
|
||||||
|
movw CTX_SAVE0, r22
|
||||||
|
clr LEN32_SAVE
|
||||||
|
sbrc r20, 5
|
||||||
|
inc LEN32_SAVE
|
||||||
|
lsr r21
|
||||||
|
ror r20
|
||||||
|
lsr r21
|
||||||
|
ror r20 /* length is max 512 so we now only have to shift r20 */
|
||||||
|
swap r20 /* this is faster than 4 shifts */
|
||||||
|
andi r20, 0x0f
|
||||||
|
add r20, LEN32_SAVE
|
||||||
|
mov LEN_SAVE, r20
|
||||||
|
|
||||||
|
adiw r30, 1
|
||||||
|
movw TMP_SAVE0, r30
|
||||||
|
1:
|
||||||
|
dec LEN_SAVE
|
||||||
|
brmi 9f
|
||||||
|
/* tmp <- ctx-s */
|
||||||
|
movw r30, TMP_SAVE0
|
||||||
|
movw r26, CTX_SAVE0
|
||||||
|
ldi r20, 64/4
|
||||||
|
3:
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
dec r20
|
||||||
|
brne 3b
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_blank_round
|
||||||
|
/* ctx-s ^= tmp */
|
||||||
|
movw r30, TMP_SAVE0
|
||||||
|
movw r26, CTX_SAVE0
|
||||||
|
ldi r20, 64
|
||||||
|
3:
|
||||||
|
ld r0, X
|
||||||
|
ld r21, Z+
|
||||||
|
eor r0, r21
|
||||||
|
st X+, r0
|
||||||
|
dec r20
|
||||||
|
brne 3b
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_blank_round
|
||||||
|
|
||||||
|
|
||||||
|
movw r26, CTX_SAVE0
|
||||||
|
|
||||||
|
tst LEN_SAVE
|
||||||
|
brne 2f
|
||||||
|
tst LEN32_SAVE
|
||||||
|
brne 5f
|
||||||
|
2:
|
||||||
|
adiw r26, 8*7
|
||||||
|
movw r30, TMP_SAVE0
|
||||||
|
adiw r30, 8*7
|
||||||
|
movw r28, DEST_SAVE0
|
||||||
|
ldi r20, 8
|
||||||
|
3:
|
||||||
|
ld r0, Z
|
||||||
|
ld r21, X
|
||||||
|
eor r0, r21
|
||||||
|
st Y+, r0
|
||||||
|
sbiw r26, 8
|
||||||
|
sbiw r30, 8
|
||||||
|
dec r20
|
||||||
|
brne 3b
|
||||||
|
movw DEST_SAVE0, r28
|
||||||
|
7:
|
||||||
|
rjmp 1b
|
||||||
|
|
||||||
|
5:
|
||||||
|
adiw r26, 8*3
|
||||||
|
movw r30, TMP_SAVE0
|
||||||
|
adiw r30, 8*3
|
||||||
|
movw r28, DEST_SAVE0
|
||||||
|
ldi r20, 4
|
||||||
|
3:
|
||||||
|
ld r0, Z
|
||||||
|
ld r21, X
|
||||||
|
eor r0, r21
|
||||||
|
st Y+, r0
|
||||||
|
sbiw r26, 8
|
||||||
|
sbiw r30, 8
|
||||||
|
dec r20
|
||||||
|
brne 3b
|
||||||
|
|
||||||
|
9:
|
||||||
|
stack_free_large 64
|
||||||
|
pop r29
|
||||||
|
pop r28
|
||||||
|
pop_range 10, 17
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
/* void twister_small_nextBlock(twister_state_t* ctx, void* msg) */
|
||||||
|
/*
|
||||||
|
* param ctx: r24:r25
|
||||||
|
* param msg: r22:r23
|
||||||
|
*/
|
||||||
|
CTX_SAVE0 = 14
|
||||||
|
CTX_SAVE1 = 15
|
||||||
|
TMP_SAVE0 = 12
|
||||||
|
TMP_SAVE1 = 13
|
||||||
|
MSG_SAVE0 = 28
|
||||||
|
MSG_SAVE1 = 29
|
||||||
|
.global twister_small_nextBlock
|
||||||
|
.global twister224_nextBlock
|
||||||
|
.global twister256_nextBlock
|
||||||
|
|
||||||
|
twister224_nextBlock:
|
||||||
|
twister256_nextBlock:
|
||||||
|
twister_small_nextBlock:
|
||||||
|
push_range 12, 15
|
||||||
|
push r28
|
||||||
|
push r29
|
||||||
|
stack_alloc_large 64
|
||||||
|
adiw r30, 1
|
||||||
|
movw TMP_SAVE0, r30
|
||||||
|
movw CTX_SAVE0, r24
|
||||||
|
movw MSG_SAVE0, r22
|
||||||
|
movw r26, CTX_SAVE0
|
||||||
|
ldi r18, 64/8
|
||||||
|
1:
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
dec r18
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
movw r30, TMP_SAVE0
|
||||||
|
movw r26, CTX_SAVE0
|
||||||
|
ldi r18, 64
|
||||||
|
1:
|
||||||
|
ld r0, X
|
||||||
|
ld r23, Z
|
||||||
|
eor r0, r23
|
||||||
|
st X+, r0
|
||||||
|
st Z+, r0
|
||||||
|
dec r18
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
movw r30, TMP_SAVE0
|
||||||
|
movw r26, CTX_SAVE0
|
||||||
|
ldi r18, 64
|
||||||
|
1:
|
||||||
|
ld r0, X
|
||||||
|
ld r23, Z
|
||||||
|
eor r0, r23
|
||||||
|
st X+, r0
|
||||||
|
st Z+, r0
|
||||||
|
dec r18
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_blank_round
|
||||||
|
|
||||||
|
movw r30, TMP_SAVE0
|
||||||
|
movw r26, CTX_SAVE0
|
||||||
|
ldi r18, 64
|
||||||
|
1:
|
||||||
|
ld r0, X
|
||||||
|
ld r23, Z+
|
||||||
|
eor r0, r23
|
||||||
|
st X+, r0
|
||||||
|
dec r18
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
adiw r26, 9
|
||||||
|
ldi r19, 2
|
||||||
|
ld r0, X
|
||||||
|
add r0, r19
|
||||||
|
st X+, r0
|
||||||
|
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
|
||||||
|
stack_free_large 64
|
||||||
|
pop r29
|
||||||
|
pop r28
|
||||||
|
pop_range 12, 15
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,513 @@
|
||||||
|
/* twister-big-asm.S */
|
||||||
|
/*
|
||||||
|
This file is part of the Crypto-avr-lib/microcrypt-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 twister-big-asm.S
|
||||||
|
* \email daniel.otte@rub.de
|
||||||
|
* \author Daniel Otte
|
||||||
|
* \date 2008-12-27
|
||||||
|
* \license GPLv3 or later
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "avr-asm-macros.S"
|
||||||
|
|
||||||
|
/* void checksum_update(twister_big_ctx_t* ctx, uint8_t col) */
|
||||||
|
/*
|
||||||
|
* param ctx: r24:r25
|
||||||
|
* param col: r22
|
||||||
|
*/
|
||||||
|
checksum_update:
|
||||||
|
push r16
|
||||||
|
push r28
|
||||||
|
push r29
|
||||||
|
lsl r22
|
||||||
|
lsl r22
|
||||||
|
lsl r22
|
||||||
|
mov r16, r22
|
||||||
|
movw r30, r24 /* X points to ctx->state.s */
|
||||||
|
|
||||||
|
ldd r18, Z+7*8
|
||||||
|
ldd r19, Z+6*8
|
||||||
|
ldd r20, Z+5*8
|
||||||
|
ldd r21, Z+4*8
|
||||||
|
ldd r22, Z+3*8
|
||||||
|
ldd r23, Z+2*8
|
||||||
|
ldd r24, Z+1*8
|
||||||
|
ldd r25, Z+0*8
|
||||||
|
|
||||||
|
adiw r30, 63
|
||||||
|
adiw r30, 1+3*8 /* Z points at ctx->checksum[0][8] */
|
||||||
|
movw r28, r30 /* Y points at ctx->checksum[0][8] */
|
||||||
|
andi r16, 63
|
||||||
|
add r30, r16 /* Z points at ctx->checksum[col][8]*/
|
||||||
|
adc r31, r1
|
||||||
|
ldi r26, 8
|
||||||
|
add r16, r26
|
||||||
|
andi r16, 63
|
||||||
|
add r28, r16
|
||||||
|
adc r29, r1 /* Y points at ctx->checksum[(col+1)%8][8]*/
|
||||||
|
|
||||||
|
ld r0, -Y
|
||||||
|
add r18, r0
|
||||||
|
ld r0, -Z
|
||||||
|
eor r0, r18
|
||||||
|
st Z, r0
|
||||||
|
|
||||||
|
ld r0, -Y
|
||||||
|
adc r19, r0
|
||||||
|
ld r0, -Z
|
||||||
|
eor r0, r19
|
||||||
|
st Z, r0
|
||||||
|
|
||||||
|
ld r0, -Y
|
||||||
|
adc r20, r0
|
||||||
|
ld r0, -Z
|
||||||
|
eor r0, r20
|
||||||
|
st Z, r0
|
||||||
|
|
||||||
|
ld r0, -Y
|
||||||
|
adc r21, r0
|
||||||
|
ld r0, -Z
|
||||||
|
eor r0, r21
|
||||||
|
st Z, r0
|
||||||
|
|
||||||
|
ld r0, -Y
|
||||||
|
adc r22, r0
|
||||||
|
ld r0, -Z
|
||||||
|
eor r0, r22
|
||||||
|
st Z, r0
|
||||||
|
|
||||||
|
ld r0, -Y
|
||||||
|
adc r23, r0
|
||||||
|
ld r0, -Z
|
||||||
|
eor r0, r23
|
||||||
|
st Z, r0
|
||||||
|
|
||||||
|
ld r0, -Y
|
||||||
|
adc r24, r0
|
||||||
|
ld r0, -Z
|
||||||
|
eor r0, r24
|
||||||
|
st Z, r0
|
||||||
|
|
||||||
|
ld r0, -Y
|
||||||
|
adc r25, r0
|
||||||
|
ld r0, -Z
|
||||||
|
eor r0, r25
|
||||||
|
st Z, r0
|
||||||
|
|
||||||
|
pop r29
|
||||||
|
pop r28
|
||||||
|
pop r16
|
||||||
|
ret
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
/* void twister_big_init(twister_big_ctx_t* ctx, uint16_t hashsize_b)*/
|
||||||
|
/*
|
||||||
|
* param ctx: r24:r25
|
||||||
|
* param hashsize_b: r22:r23
|
||||||
|
*/
|
||||||
|
.global twister384_init
|
||||||
|
twister384_init:
|
||||||
|
ldi r22, lo8(384)
|
||||||
|
ldi r23, hi8(384)
|
||||||
|
rjmp twister_big_init
|
||||||
|
|
||||||
|
.global twister512_init
|
||||||
|
twister512_init:
|
||||||
|
ldi r22, lo8(512)
|
||||||
|
ldi r23, hi8(512)
|
||||||
|
|
||||||
|
.global twister_big_init
|
||||||
|
twister_big_init:
|
||||||
|
movw r30, r24
|
||||||
|
ldi r24, 64
|
||||||
|
1:
|
||||||
|
st Z+, r1
|
||||||
|
dec r24
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
dec r1
|
||||||
|
ldi r24, 8
|
||||||
|
1:
|
||||||
|
st Z+, r1
|
||||||
|
dec r24
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
inc r1
|
||||||
|
ldi r24, 8+64
|
||||||
|
1:
|
||||||
|
st Z+, r1
|
||||||
|
dec r24
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
subi r30, lo8(1+8+8+8*7+64)
|
||||||
|
sbci r31, hi8(1+8+8+8*7+64)
|
||||||
|
st Z, r23
|
||||||
|
std Z+8, r22
|
||||||
|
ret
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
/* void twister_big_nextBlock(twister_state_t* ctx, void* msg) */
|
||||||
|
/*
|
||||||
|
* param ctx: r24:r25
|
||||||
|
* param msg: r22:r23
|
||||||
|
*/
|
||||||
|
CTX_SAVE0 = 14
|
||||||
|
CTX_SAVE1 = 15
|
||||||
|
TMP_SAVE0 = 12
|
||||||
|
TMP_SAVE1 = 13
|
||||||
|
MSG_SAVE0 = 28
|
||||||
|
MSG_SAVE1 = 29
|
||||||
|
.global twister_big_nextBlock
|
||||||
|
.global twister384_nextBlock
|
||||||
|
.global twister512_nextBlock
|
||||||
|
|
||||||
|
twister384_nextBlock:
|
||||||
|
twister512_nextBlock:
|
||||||
|
twister_big_nextBlock:
|
||||||
|
push_range 12, 15
|
||||||
|
push r28
|
||||||
|
push r29
|
||||||
|
stack_alloc_large 64
|
||||||
|
adiw r30, 1
|
||||||
|
movw TMP_SAVE0, r30
|
||||||
|
movw CTX_SAVE0, r24
|
||||||
|
movw MSG_SAVE0, r22
|
||||||
|
movw r26, CTX_SAVE0
|
||||||
|
ldi r18, 64/8
|
||||||
|
1:
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
dec r18
|
||||||
|
brne 1b
|
||||||
|
/* maxi round 1 */
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
ldi r22, 0
|
||||||
|
rcall checksum_update
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
ldi r22, 1
|
||||||
|
rcall checksum_update
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
ldi r22, 2
|
||||||
|
rcall checksum_update
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
movw r30, TMP_SAVE0
|
||||||
|
movw r26, CTX_SAVE0
|
||||||
|
ldi r18, 64
|
||||||
|
1:
|
||||||
|
ld r0, X
|
||||||
|
ld r23, Z
|
||||||
|
eor r0, r23
|
||||||
|
st X+, r0
|
||||||
|
st Z+, r0
|
||||||
|
dec r18
|
||||||
|
brne 1b
|
||||||
|
/* maxi round 2 */
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
ldi r22, 3
|
||||||
|
rcall checksum_update
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_blank_round
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
ldi r22, 4
|
||||||
|
rcall checksum_update
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
movw r30, TMP_SAVE0
|
||||||
|
movw r26, CTX_SAVE0
|
||||||
|
ldi r18, 64
|
||||||
|
1:
|
||||||
|
ld r0, X
|
||||||
|
ld r23, Z
|
||||||
|
eor r0, r23
|
||||||
|
st X+, r0
|
||||||
|
st Z+, r0
|
||||||
|
dec r18
|
||||||
|
brne 1b
|
||||||
|
/* maxi round 3 */
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
ldi r22, 5
|
||||||
|
rcall checksum_update
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
ldi r22, 6
|
||||||
|
rcall checksum_update
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
ldi r22, 7
|
||||||
|
rcall checksum_update
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_blank_round
|
||||||
|
|
||||||
|
movw r30, TMP_SAVE0
|
||||||
|
movw r26, CTX_SAVE0
|
||||||
|
ldi r18, 64
|
||||||
|
1:
|
||||||
|
ld r0, X
|
||||||
|
ld r23, Z+
|
||||||
|
eor r0, r23
|
||||||
|
st X+, r0
|
||||||
|
dec r18
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
adiw r26, 9
|
||||||
|
ldi r19, 2
|
||||||
|
ld r0, X
|
||||||
|
add r0, r19
|
||||||
|
st X+, r0
|
||||||
|
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
adc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
|
||||||
|
stack_free_large 64
|
||||||
|
pop r29
|
||||||
|
pop r28
|
||||||
|
pop_range 12, 15
|
||||||
|
ret
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
/* void twister_big_lastBlock(twister_state_t* ctx, void* msg, uint16_t length_b) */
|
||||||
|
/*
|
||||||
|
* param ctx: r24:r25
|
||||||
|
* param msg: r22:r23
|
||||||
|
* param length_b: r20:r21
|
||||||
|
*/
|
||||||
|
TMP_SAVE0 = 12
|
||||||
|
TMP_SAVE1 = 13
|
||||||
|
CTX_SAVE0 = 14
|
||||||
|
CTX_SAVE1 = 15
|
||||||
|
LEN_SAVE0 = 16
|
||||||
|
LEN_SAVE1 = 17
|
||||||
|
MSG_SAVE0 = 28
|
||||||
|
MSG_SAVE1 = 29
|
||||||
|
.global twister_big_lastBlock
|
||||||
|
.global twister384_lastBlock
|
||||||
|
.global twister512_lastBlock
|
||||||
|
|
||||||
|
twister384_lastBlock:
|
||||||
|
twister512_lastBlock:
|
||||||
|
twister_big_lastBlock:
|
||||||
|
push_range 12, 17
|
||||||
|
push r28
|
||||||
|
push r29
|
||||||
|
stack_alloc_large 64
|
||||||
|
adiw r30, 1
|
||||||
|
movw TMP_SAVE0, r30
|
||||||
|
movw CTX_SAVE0, r24
|
||||||
|
movw MSG_SAVE0, r22
|
||||||
|
movw LEN_SAVE0, r20
|
||||||
|
1:
|
||||||
|
cpi LEN_SAVE1, 2
|
||||||
|
brmi 2f
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
rcall twister_big_nextBlock
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
subi LEN_SAVE1, 2
|
||||||
|
rjmp 1b
|
||||||
|
2:
|
||||||
|
movw r18, LEN_SAVE0
|
||||||
|
lsr r19
|
||||||
|
ror r18
|
||||||
|
lsr r18
|
||||||
|
lsr r18
|
||||||
|
ldi r19, 63
|
||||||
|
movw r26, MSG_SAVE0
|
||||||
|
movw r30, TMP_SAVE0
|
||||||
|
ldi r20, 0x80
|
||||||
|
sub r19, r18 /* r18: bytes to copy, r19: bytes to clear */
|
||||||
|
|
||||||
|
ld r0, X+
|
||||||
|
3:
|
||||||
|
tst r18
|
||||||
|
breq 4f
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
dec r18
|
||||||
|
|
||||||
|
4:
|
||||||
|
mov r18, LEN_SAVE0
|
||||||
|
andi r18, 0x07
|
||||||
|
ldi r20, 0x80
|
||||||
|
breq 5f
|
||||||
|
4:
|
||||||
|
lsr r20
|
||||||
|
dec r18
|
||||||
|
brne 4b
|
||||||
|
or r20, r0
|
||||||
|
rjmp 5f
|
||||||
|
|
||||||
|
5:
|
||||||
|
st Z+, r20
|
||||||
|
6:
|
||||||
|
st Z+, r1
|
||||||
|
dec r19
|
||||||
|
brne 6b
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, TMP_SAVE0
|
||||||
|
rcall twister_big_nextBlock
|
||||||
|
|
||||||
|
ldi r19, 2
|
||||||
|
clr r18
|
||||||
|
|
||||||
|
sub r18, LEN_SAVE0
|
||||||
|
sbc r19, LEN_SAVE1
|
||||||
|
movw r26, CTX_SAVE0
|
||||||
|
adiw r26, 63
|
||||||
|
adiw r26, 1+8
|
||||||
|
|
||||||
|
ld r0, X
|
||||||
|
sub r0, r18
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r19
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
|
||||||
|
sbiw r26, 8
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, r26
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, CTX_SAVE0
|
||||||
|
ldi r16, 64+8+8
|
||||||
|
add r22, r16
|
||||||
|
adc r23, r1
|
||||||
|
movw r30, r22
|
||||||
|
ldi r26, 8
|
||||||
|
1:
|
||||||
|
ld r12, Z+
|
||||||
|
ld r13, Z+
|
||||||
|
ld r16, Z+
|
||||||
|
ld r17, Z+
|
||||||
|
ld r18, Z+
|
||||||
|
ld r19, Z+
|
||||||
|
ld r20, Z+
|
||||||
|
ld r21, Z+
|
||||||
|
st -Z, r12
|
||||||
|
st -Z, r13
|
||||||
|
st -Z, r16
|
||||||
|
st -Z, r17
|
||||||
|
st -Z, r18
|
||||||
|
st -Z, r19
|
||||||
|
st -Z, r20
|
||||||
|
st -Z, r21
|
||||||
|
adiw r30, 8
|
||||||
|
dec r26
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, CTX_SAVE0
|
||||||
|
ldi r26, 64+2*8
|
||||||
|
add r22, r26
|
||||||
|
adc r23, r1
|
||||||
|
rcall twister_small_nextBlock
|
||||||
|
|
||||||
|
stack_free_large 64
|
||||||
|
pop r29
|
||||||
|
pop r28
|
||||||
|
pop_range 12, 17
|
||||||
|
ret
|
|
@ -9,6 +9,9 @@
|
||||||
#undef DEBUG
|
#undef DEBUG
|
||||||
#define DEBUG
|
#define DEBUG
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include "uart.h"
|
#include "uart.h"
|
||||||
|
@ -24,6 +27,8 @@ void print_checksum(twister_big_ctx_t* ctx, PGM_P s){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void print_matrix(void* m, PGM_P s){
|
void print_matrix(void* m, PGM_P s){
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
uart_putstr_P(PSTR("\r\n"));
|
uart_putstr_P(PSTR("\r\n"));
|
||||||
|
@ -36,6 +41,8 @@ void print_matrix(void* m, PGM_P s){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
#define DEBUG_CHKSUM(a,s) print_checksum((a),PSTR(s))
|
#define DEBUG_CHKSUM(a,s) print_checksum((a),PSTR(s))
|
||||||
#else
|
#else
|
||||||
#define DEBUG_CHKSUM(a,s)
|
#define DEBUG_CHKSUM(a,s)
|
||||||
|
@ -50,6 +57,8 @@ void print_matrix(void* m, PGM_P s){
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void print_twister_state(twister_state_t* ctx){
|
void print_twister_state(twister_state_t* ctx){
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
uart_putstr_P(PSTR("\r\nState:\r\n matrix:\r\n"));
|
uart_putstr_P(PSTR("\r\nState:\r\n matrix:\r\n"));
|
||||||
|
@ -66,6 +75,8 @@ void print_twister_state(twister_state_t* ctx){
|
||||||
uart_putstr_P(PSTR("\r\n"));
|
uart_putstr_P(PSTR("\r\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void debug_print(twister_state_t* ctx, PGM_P msg){
|
void debug_print(twister_state_t* ctx, PGM_P msg){
|
||||||
uart_putstr_P(PSTR("\r\n"));
|
uart_putstr_P(PSTR("\r\n"));
|
||||||
uart_putstr_P(msg);
|
uart_putstr_P(msg);
|
||||||
|
@ -74,14 +85,7 @@ void debug_print(twister_state_t* ctx, PGM_P msg){
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void transp_matrix(void* dest, void* src){
|
/*********************************************************************/
|
||||||
uint8_t i,j;
|
|
||||||
for(i=0; i<8; i++){
|
|
||||||
for(j=0; j<8; ++j){
|
|
||||||
((uint8_t*)dest)[i*8+j] = ((uint8_t*)src)[j*8+i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static
|
static
|
||||||
void checksum_update(twister_big_ctx_t* ctx, uint8_t col){
|
void checksum_update(twister_big_ctx_t* ctx, uint8_t col){
|
||||||
|
@ -103,6 +107,8 @@ void checksum_update(twister_big_ctx_t* ctx, uint8_t col){
|
||||||
// DEBUG_CHKSUM(ctx, "post run");
|
// DEBUG_CHKSUM(ctx, "post run");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister_big_init(twister_big_ctx_t* ctx, uint16_t hashsize_b){
|
void twister_big_init(twister_big_ctx_t* ctx, uint16_t hashsize_b){
|
||||||
memset(ctx->state.s, 0, 64);
|
memset(ctx->state.s, 0, 64);
|
||||||
memset(ctx->checksum, 0, 64);
|
memset(ctx->checksum, 0, 64);
|
||||||
|
@ -112,6 +118,8 @@ void twister_big_init(twister_big_ctx_t* ctx, uint16_t hashsize_b){
|
||||||
ctx->state.length_counter_b = 0;
|
ctx->state.length_counter_b = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister_big_nextBlock(twister_big_ctx_t* ctx, void* msg){
|
void twister_big_nextBlock(twister_big_ctx_t* ctx, void* msg){
|
||||||
uint8_t tmp[8][8];
|
uint8_t tmp[8][8];
|
||||||
|
|
||||||
|
@ -161,11 +169,15 @@ void twister_big_nextBlock(twister_big_ctx_t* ctx, void* msg){
|
||||||
ctx->state.length_counter_b += 512;
|
ctx->state.length_counter_b += 512;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister_inject_chksum(twister_big_ctx_t* ctx, uint8_t col){
|
void twister_inject_chksum(twister_big_ctx_t* ctx, uint8_t col){
|
||||||
*((uint64_t*)(&ctx->state.s[7][0])) ^= *((uint64_t*)(&ctx->checksum[col][0]));
|
*((uint64_t*)(&ctx->state.s[7][0])) ^= *((uint64_t*)(&ctx->checksum[col][0]));
|
||||||
twister_blank_round(&ctx->state);
|
twister_blank_round(&ctx->state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister_big_lastBlock(twister_big_ctx_t* ctx, void* msg, uint16_t length_b){
|
void twister_big_lastBlock(twister_big_ctx_t* ctx, void* msg, uint16_t length_b){
|
||||||
uint8_t tmp[64];
|
uint8_t tmp[64];
|
||||||
while(length_b>512){
|
while(length_b>512){
|
||||||
|
@ -204,29 +216,39 @@ void twister_big_lastBlock(twister_big_ctx_t* ctx, void* msg, uint16_t length_b)
|
||||||
// DEBUG_PRINT(&(ctx->state), "post check-round");
|
// DEBUG_PRINT(&(ctx->state), "post check-round");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister_big_ctx2hash(void* dest, twister_big_ctx_t* ctx, uint16_t hashsize_b){
|
void twister_big_ctx2hash(void* dest, twister_big_ctx_t* ctx, uint16_t hashsize_b){
|
||||||
twister_ctx2hash(dest, &(ctx->state), hashsize_b);
|
twister_ctx2hash(dest, &(ctx->state), hashsize_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/*********************************************************************/
|
||||||
/******************************************************************************/
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister384_init(twister384_ctx_t* ctx){
|
void twister384_init(twister384_ctx_t* ctx){
|
||||||
twister_big_init(ctx, 384);
|
twister_big_init(ctx, 384);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister384_nextBlock(twister384_ctx_t* ctx, void* msg){
|
void twister384_nextBlock(twister384_ctx_t* ctx, void* msg){
|
||||||
twister_big_nextBlock(ctx, msg);
|
twister_big_nextBlock(ctx, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister384_lastBlock(twister384_ctx_t* ctx, void* msg, uint16_t length_b){
|
void twister384_lastBlock(twister384_ctx_t* ctx, void* msg, uint16_t length_b){
|
||||||
twister_big_lastBlock(ctx, msg, length_b);
|
twister_big_lastBlock(ctx, msg, length_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister384_ctx2hash(void* dest, twister384_ctx_t* ctx){
|
void twister384_ctx2hash(void* dest, twister384_ctx_t* ctx){
|
||||||
twister_big_ctx2hash(dest, ctx, 384);
|
twister_big_ctx2hash(dest, ctx, 384);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister384(void* dest, void* msg, uint32_t msg_length_b){
|
void twister384(void* dest, void* msg, uint32_t msg_length_b){
|
||||||
twister_big_ctx_t ctx;
|
twister_big_ctx_t ctx;
|
||||||
twister_big_init(&ctx, 384);
|
twister_big_init(&ctx, 384);
|
||||||
|
@ -239,24 +261,34 @@ void twister384(void* dest, void* msg, uint32_t msg_length_b){
|
||||||
twister_big_ctx2hash(dest, &ctx, 384);
|
twister_big_ctx2hash(dest, &ctx, 384);
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/*********************************************************************/
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
|
||||||
void twister512_init(twister512_ctx_t* ctx){
|
void twister512_init(twister512_ctx_t* ctx){
|
||||||
twister_big_init(ctx, 512);
|
twister_big_init(ctx, 512);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister512_nextBlock(twister512_ctx_t* ctx, void* msg){
|
void twister512_nextBlock(twister512_ctx_t* ctx, void* msg){
|
||||||
twister_big_nextBlock(ctx, msg);
|
twister_big_nextBlock(ctx, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister512_lastBlock(twister512_ctx_t* ctx, void* msg, uint16_t length_b){
|
void twister512_lastBlock(twister512_ctx_t* ctx, void* msg, uint16_t length_b){
|
||||||
twister_big_lastBlock(ctx, msg, length_b);
|
twister_big_lastBlock(ctx, msg, length_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister512_ctx2hash(void* dest, twister512_ctx_t* ctx){
|
void twister512_ctx2hash(void* dest, twister512_ctx_t* ctx){
|
||||||
twister_big_ctx2hash(dest, ctx, 512);
|
twister_big_ctx2hash(dest, ctx, 512);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister512(void* dest, void* msg, uint32_t msg_length_b){
|
void twister512(void* dest, void* msg, uint32_t msg_length_b){
|
||||||
twister_big_ctx_t ctx;
|
twister_big_ctx_t ctx;
|
||||||
twister_big_init(&ctx, 512);
|
twister_big_init(&ctx, 512);
|
||||||
|
|
|
@ -17,11 +17,14 @@ typedef struct {
|
||||||
typedef twister_big_ctx_t twister384_ctx_t;
|
typedef twister_big_ctx_t twister384_ctx_t;
|
||||||
typedef twister_big_ctx_t twister512_ctx_t;
|
typedef twister_big_ctx_t twister512_ctx_t;
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister_big_nextBlock(twister_big_ctx_t* ctx, void* msg);
|
void twister_big_nextBlock(twister_big_ctx_t* ctx, void* msg);
|
||||||
void twister_big_init(twister_big_ctx_t* ctx, uint16_t hashsize_b);
|
void twister_big_init(twister_big_ctx_t* ctx, uint16_t hashsize_b);
|
||||||
void twister_big_lastBlock(twister_big_ctx_t* ctx, void* msg, uint16_t length_b);
|
void twister_big_lastBlock(twister_big_ctx_t* ctx, void* msg, uint16_t length_b);
|
||||||
void twister_big_ctx2hash(void* dest, twister_big_ctx_t* ctx, uint16_t hashsize_b);
|
void twister_big_ctx2hash(void* dest, twister_big_ctx_t* ctx, uint16_t hashsize_b);
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister384_init(twister384_ctx_t* ctx);
|
void twister384_init(twister384_ctx_t* ctx);
|
||||||
void twister384_nextBlock(twister384_ctx_t* ctx, void* msg);
|
void twister384_nextBlock(twister384_ctx_t* ctx, void* msg);
|
||||||
|
@ -29,6 +32,8 @@ void twister384_lastBlock(twister384_ctx_t* ctx, void* msg, uint16_t length_b);
|
||||||
void twister384_ctx2hash(void* dest, twister384_ctx_t* ctx);
|
void twister384_ctx2hash(void* dest, twister384_ctx_t* ctx);
|
||||||
void twister384(void* dest, void* msg, uint32_t msg_length_b);
|
void twister384(void* dest, void* msg, uint32_t msg_length_b);
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
void twister512_init(twister512_ctx_t* ctx);
|
void twister512_init(twister512_ctx_t* ctx);
|
||||||
void twister512_nextBlock(twister512_ctx_t* ctx, void* msg);
|
void twister512_nextBlock(twister512_ctx_t* ctx, void* msg);
|
||||||
void twister512_lastBlock(twister512_ctx_t* ctx, void* msg, uint16_t length_b);
|
void twister512_lastBlock(twister512_ctx_t* ctx, void* msg, uint16_t length_b);
|
||||||
|
|
|
@ -0,0 +1,206 @@
|
||||||
|
/* twister-small-asm.S */
|
||||||
|
/*
|
||||||
|
This file is part of the Crypto-avr-lib/microcrypt-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 twister-small-asm.S
|
||||||
|
* \email daniel.otte@rub.de
|
||||||
|
* \author Daniel Otte
|
||||||
|
* \date 2008-12-26
|
||||||
|
* \license GPLv3 or later
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "avr-asm-macros.S"
|
||||||
|
|
||||||
|
/* void twister_small_init(twister_state_t* ctx, uint16_t hashsize_b)*/
|
||||||
|
/*
|
||||||
|
* param ctx: r24:r25
|
||||||
|
* param hashsize_b: r22:r23
|
||||||
|
*/
|
||||||
|
.global twister224_init
|
||||||
|
twister224_init:
|
||||||
|
ldi r22, lo8(224)
|
||||||
|
ldi r23, hi8(224)
|
||||||
|
rjmp 1f
|
||||||
|
|
||||||
|
.global twister256_init
|
||||||
|
twister256_init:
|
||||||
|
ldi r22, lo8(256)
|
||||||
|
ldi r23, hi8(256)
|
||||||
|
|
||||||
|
.global twister_small_init
|
||||||
|
twister_small_init:
|
||||||
|
movw r30, r24
|
||||||
|
ldi r24, 64
|
||||||
|
1:
|
||||||
|
st Z+, r1
|
||||||
|
dec r24
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
dec r1
|
||||||
|
ldi r24, 8
|
||||||
|
1:
|
||||||
|
st Z+, r1
|
||||||
|
dec r24
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
inc r1
|
||||||
|
ldi r24, 8
|
||||||
|
1:
|
||||||
|
st Z+, r1
|
||||||
|
dec r24
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
sbiw r30, 1+8+8
|
||||||
|
sbiw r30, 8*7
|
||||||
|
st Z, r23
|
||||||
|
std Z+8, r22
|
||||||
|
ret
|
||||||
|
#if 1
|
||||||
|
/*********************************************************************/
|
||||||
|
/* void twister_small_lastBlock(twister_state_t* ctx, void* msg, uint16_t length_b) */
|
||||||
|
/*
|
||||||
|
* param ctx: r24:r25
|
||||||
|
* param msg: r22:r23
|
||||||
|
* param length_b: r20:r21
|
||||||
|
*/
|
||||||
|
TMP_SAVE0 = 12
|
||||||
|
TMP_SAVE1 = 13
|
||||||
|
CTX_SAVE0 = 14
|
||||||
|
CTX_SAVE1 = 15
|
||||||
|
LEN_SAVE0 = 16
|
||||||
|
LEN_SAVE1 = 17
|
||||||
|
MSG_SAVE0 = 28
|
||||||
|
MSG_SAVE1 = 29
|
||||||
|
.global twister_small_lastBlock
|
||||||
|
.global twister224_lastBlock
|
||||||
|
.global twister256_lastBlock
|
||||||
|
|
||||||
|
twister224_lastBlock:
|
||||||
|
twister256_lastBlock:
|
||||||
|
twister_small_lastBlock:
|
||||||
|
push_range 12, 17
|
||||||
|
push r28
|
||||||
|
push r29
|
||||||
|
stack_alloc_large 64
|
||||||
|
adiw r30, 1
|
||||||
|
movw TMP_SAVE0, r30
|
||||||
|
movw CTX_SAVE0, r24
|
||||||
|
movw MSG_SAVE0, r22
|
||||||
|
movw LEN_SAVE0, r20
|
||||||
|
1:
|
||||||
|
cpi LEN_SAVE1, 2
|
||||||
|
brmi 2f
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
rcall twister_small_nextBlock
|
||||||
|
adiw MSG_SAVE0, 8
|
||||||
|
subi LEN_SAVE1, 2
|
||||||
|
rjmp 1b
|
||||||
|
2:
|
||||||
|
movw r18, LEN_SAVE0
|
||||||
|
lsr r19
|
||||||
|
ror r18
|
||||||
|
lsr r18
|
||||||
|
lsr r18
|
||||||
|
ldi r19, 63
|
||||||
|
movw r26, MSG_SAVE0
|
||||||
|
movw r30, TMP_SAVE0
|
||||||
|
ldi r20, 0x80
|
||||||
|
sub r19, r18 /* r18: bytes to copy, r19: bytes to clear */
|
||||||
|
|
||||||
|
ld r0, X+
|
||||||
|
3:
|
||||||
|
tst r18
|
||||||
|
breq 4f
|
||||||
|
st Z+, r0
|
||||||
|
ld r0, X+
|
||||||
|
dec r18
|
||||||
|
|
||||||
|
4:
|
||||||
|
mov r18, LEN_SAVE0
|
||||||
|
andi r18, 0x07
|
||||||
|
ldi r20, 0x80
|
||||||
|
breq 5f
|
||||||
|
4:
|
||||||
|
lsr r20
|
||||||
|
dec r18
|
||||||
|
brne 4b
|
||||||
|
or r20, r0
|
||||||
|
rjmp 5f
|
||||||
|
|
||||||
|
5:
|
||||||
|
st Z+, r20
|
||||||
|
6:
|
||||||
|
st Z+, r1
|
||||||
|
dec r19
|
||||||
|
brne 6b
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, TMP_SAVE0
|
||||||
|
rcall twister_small_nextBlock
|
||||||
|
|
||||||
|
ldi r19, 2
|
||||||
|
clr r18
|
||||||
|
|
||||||
|
sub r18, LEN_SAVE0
|
||||||
|
sbc r19, LEN_SAVE1
|
||||||
|
movw r26, CTX_SAVE0
|
||||||
|
adiw r26, 63
|
||||||
|
adiw r26, 1+8
|
||||||
|
|
||||||
|
ld r0, X
|
||||||
|
sub r0, r18
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r19
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
sbc r0, r1
|
||||||
|
st X+, r0
|
||||||
|
|
||||||
|
sbiw r26, 8
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, r26
|
||||||
|
rcall twister_mini_round
|
||||||
|
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
rcall twister_blank_round
|
||||||
|
|
||||||
|
stack_free_large 64
|
||||||
|
pop r29
|
||||||
|
pop r28
|
||||||
|
pop_range 12, 17
|
||||||
|
ret
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,167 @@
|
||||||
|
/* twister-small.c */
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "memxor.h"
|
||||||
|
#include "twister-small.h"
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
#if 0
|
||||||
|
void twister_small_init(twister_state_t* ctx, uint16_t hashsize_b){
|
||||||
|
memset(ctx->s, 0, 64);
|
||||||
|
ctx->counter=0xffffffffffffffffLL;
|
||||||
|
ctx->s[0][7] = hashsize_b>>8;
|
||||||
|
ctx->s[1][7] = hashsize_b&0xff;
|
||||||
|
ctx->length_counter_b = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
void twister_small_nextBlock(twister_state_t* ctx, void* msg){
|
||||||
|
uint8_t tmp[8][8];
|
||||||
|
/* round 1 */
|
||||||
|
memcpy(tmp, ctx->s, 64);
|
||||||
|
twister_mini_round(ctx, msg);
|
||||||
|
msg = ((uint8_t*)msg) + 8;
|
||||||
|
twister_mini_round(ctx, msg);
|
||||||
|
msg = ((uint8_t*)msg) + 8;
|
||||||
|
twister_mini_round(ctx, msg);
|
||||||
|
msg = ((uint8_t*)msg) + 8;
|
||||||
|
memxor(ctx->s, tmp, 64);
|
||||||
|
|
||||||
|
/* round 2 */
|
||||||
|
memcpy(tmp, ctx->s, 64);
|
||||||
|
twister_mini_round(ctx, msg);
|
||||||
|
msg = ((uint8_t*)msg) + 8;
|
||||||
|
twister_mini_round(ctx, msg);
|
||||||
|
msg = ((uint8_t*)msg) + 8;
|
||||||
|
twister_mini_round(ctx, msg);
|
||||||
|
msg = ((uint8_t*)msg) + 8;
|
||||||
|
memxor(ctx->s, tmp, 64);
|
||||||
|
|
||||||
|
/* round 3 */
|
||||||
|
memcpy(tmp, ctx->s, 64);
|
||||||
|
twister_mini_round(ctx, msg);
|
||||||
|
msg = ((uint8_t*)msg) + 8;
|
||||||
|
twister_mini_round(ctx, msg);
|
||||||
|
twister_blank_round(ctx);
|
||||||
|
memxor(ctx->s, tmp, 64);
|
||||||
|
ctx->length_counter_b += 512;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/*********************************************************************/
|
||||||
|
#if 0
|
||||||
|
void twister_small_lastBlock(twister_state_t* ctx, void* msg, uint16_t length_b){
|
||||||
|
uint8_t tmp[64];
|
||||||
|
while(length_b>512){
|
||||||
|
twister_small_nextBlock(ctx, msg);
|
||||||
|
msg = ((uint8_t*)msg)+64;
|
||||||
|
length_b -= 512;
|
||||||
|
}
|
||||||
|
memset(tmp, 0, 64);
|
||||||
|
memcpy(tmp, msg, (length_b+7)/8);
|
||||||
|
tmp[length_b/8] |= 0x80 >> (length_b&0x07);
|
||||||
|
twister_small_nextBlock(ctx, tmp);
|
||||||
|
ctx->length_counter_b -= 512 - length_b;
|
||||||
|
twister_mini_round(ctx, &(ctx->length_counter_b));
|
||||||
|
twister_blank_round(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void twister256_lastBlock(twister256_ctx_t* ctx, void* msg, uint16_t length_b){
|
||||||
|
twister_small_lastBlock(ctx, msg, length_b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void twister224_lastBlock(twister224_ctx_t* ctx, void* msg, uint16_t length_b){
|
||||||
|
twister_small_lastBlock(ctx, msg, length_b);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if 0
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
void twister_small_ctx2hash(void* dest, twister_state_t* ctx, uint16_t hashsize_b){
|
||||||
|
twister_ctx2hash(dest, ctx, hashsize_b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
#ifndef NO_TWISTER_256
|
||||||
|
|
||||||
|
void twister256_init(twister256_ctx_t* ctx){
|
||||||
|
twister_small_init(ctx, 256);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
void twister256_nextBlock(twister256_ctx_t* ctx, void* msg){
|
||||||
|
twister_small_nextBlock(ctx, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
void twister256_ctx2hash(void* dest, twister256_ctx_t* ctx){
|
||||||
|
twister_ctx2hash(dest, ctx, 256);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
void twister256(void* dest, void* msg, uint32_t msg_length_b){
|
||||||
|
twister_state_t ctx;
|
||||||
|
twister_small_init(&ctx, 256);
|
||||||
|
while(msg_length_b >=512){
|
||||||
|
twister_small_nextBlock(&ctx, msg);
|
||||||
|
msg = (uint8_t*)msg + 512/8;
|
||||||
|
msg_length_b -= 512;
|
||||||
|
}
|
||||||
|
twister_small_lastBlock(&ctx, msg, msg_length_b);
|
||||||
|
twister_ctx2hash(dest, &ctx, 256);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
#ifndef NO_TWISTER_224
|
||||||
|
|
||||||
|
void twister224_init(twister224_ctx_t* ctx){
|
||||||
|
twister_small_init(ctx, 224);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
void twister224_nextBlock(twister224_ctx_t* ctx, void* msg){
|
||||||
|
twister_small_nextBlock(ctx, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
void twister224_ctx2hash(void* dest, twister224_ctx_t* ctx){
|
||||||
|
twister_ctx2hash(dest, ctx, 224);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
void twister224(void* dest, void* msg, uint32_t msg_length_b){
|
||||||
|
twister_state_t ctx;
|
||||||
|
twister_small_init(&ctx, 224);
|
||||||
|
while(msg_length_b >=512){
|
||||||
|
twister_small_nextBlock(&ctx, msg);
|
||||||
|
msg = (uint8_t*)msg + 512/8;
|
||||||
|
msg_length_b -= 512;
|
||||||
|
}
|
||||||
|
twister_small_lastBlock(&ctx, msg, msg_length_b);
|
||||||
|
twister_ctx2hash(dest, &ctx, 224);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -53,6 +53,7 @@ void twister_small_nextBlock(twister_state_t* ctx, void* msg){
|
||||||
|
|
||||||
void twister_small_lastBlock(twister_state_t* ctx, void* msg, uint16_t length_b){
|
void twister_small_lastBlock(twister_state_t* ctx, void* msg, uint16_t length_b){
|
||||||
uint8_t tmp[64];
|
uint8_t tmp[64];
|
||||||
|
uint8_t i;
|
||||||
while(length_b>512){
|
while(length_b>512){
|
||||||
twister_small_nextBlock(ctx, msg);
|
twister_small_nextBlock(ctx, msg);
|
||||||
msg = ((uint8_t*)msg)+64;
|
msg = ((uint8_t*)msg)+64;
|
||||||
|
@ -63,6 +64,7 @@ void twister_small_lastBlock(twister_state_t* ctx, void* msg, uint16_t length_b)
|
||||||
tmp[length_b/8] |= 0x80 >> (length_b&0x07);
|
tmp[length_b/8] |= 0x80 >> (length_b&0x07);
|
||||||
twister_small_nextBlock(ctx, tmp);
|
twister_small_nextBlock(ctx, tmp);
|
||||||
ctx->length_counter_b -= 512 - length_b;
|
ctx->length_counter_b -= 512 - length_b;
|
||||||
|
|
||||||
twister_mini_round(ctx, &(ctx->length_counter_b));
|
twister_mini_round(ctx, &(ctx->length_counter_b));
|
||||||
twister_blank_round(ctx);
|
twister_blank_round(ctx);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,159 @@
|
||||||
|
/* twister.c */
|
||||||
|
/*
|
||||||
|
This file is part of the Crypto-avr-lib/microcrypt-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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#include "twister.h"
|
||||||
|
#include "twister_tables.h"
|
||||||
|
#include "memxor.h"
|
||||||
|
|
||||||
|
#ifndef TWISTER_MUL_TABLE
|
||||||
|
# include "gf256mul.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
# include "uart.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
# define DEBUG_PRINT(ctx, msg) debug_print((ctx), PSTR(msg))
|
||||||
|
#else
|
||||||
|
# define DEBUG_PRINT(ctx, msg)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
|
||||||
|
void print_twister_state(twister_state_t* ctx){
|
||||||
|
uint8_t i;
|
||||||
|
uart_putstr_P(PSTR("\r\nState:\r\n matrix:\r\n"));
|
||||||
|
for(i=0; i<8; ++i){
|
||||||
|
uart_putstr_P(PSTR("\t[ "));
|
||||||
|
uart_hexdump(&(ctx->s[i][0]), 8);
|
||||||
|
uart_putstr_P(PSTR("]\r\n"));
|
||||||
|
}
|
||||||
|
uart_putstr_P(PSTR("counter: "));
|
||||||
|
uart_hexdump(&(ctx->counter), 8);
|
||||||
|
|
||||||
|
uart_putstr_P(PSTR("\r\nlength_counter_b: "));
|
||||||
|
uart_hexdump(&(ctx->length_counter_b), 8);
|
||||||
|
uart_putstr_P(PSTR("\r\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void debug_print(twister_state_t* ctx, PGM_P msg){
|
||||||
|
uart_putstr_P(PSTR("\r\n"));
|
||||||
|
uart_putstr_P(msg);
|
||||||
|
print_twister_state(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static
|
||||||
|
void shiftrow(void* row, uint8_t shift){
|
||||||
|
*((uint64_t*)row) = *((uint64_t*)row)>>(8*shift) | *((uint64_t*)row)<<(64-8*shift);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MDS(a,b) pgm_read_byte(&(twister_mds[(a)][(b)]))
|
||||||
|
|
||||||
|
#ifdef TWISTER_MUL_TABLE
|
||||||
|
# define MULT(a,b) pgm_read_byte(&(twister_multab[a][b]))
|
||||||
|
#else
|
||||||
|
# define MULT(a,b) gf256mul((a),(b), 0x4D)
|
||||||
|
#endif
|
||||||
|
void twister_blank_round(twister_state_t* ctx){
|
||||||
|
uint8_t i,j,k=0;
|
||||||
|
uint8_t tmp[8][8];
|
||||||
|
DEBUG_PRINT(ctx, "blank init");
|
||||||
|
/* add twist counter */
|
||||||
|
for(i=0; i<8; ++i){
|
||||||
|
ctx->s[i][1] ^= ((uint8_t*)&(ctx->counter))[7-i];
|
||||||
|
}
|
||||||
|
ctx->counter--;
|
||||||
|
// DEBUG_PRINT(ctx, "counter added");
|
||||||
|
/* sub bytes */
|
||||||
|
for(i=0; i<8; ++i){
|
||||||
|
for(j=0;j<8;++j){
|
||||||
|
tmp[i][j] = pgm_read_byte(twister_sbox+ctx->s[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* shift rows */
|
||||||
|
// for(i=1;i<8; ++i){
|
||||||
|
// shiftrow(&(tmp[i][0]), i);
|
||||||
|
// }
|
||||||
|
/* mix columns */
|
||||||
|
for( i=0; i<8; i++ ){
|
||||||
|
// multiply with mds matrix
|
||||||
|
for( j=0; j<8; j++ ){
|
||||||
|
k=(i+1)&7;
|
||||||
|
ctx->s[j][i] =
|
||||||
|
MULT( MDS(j,0), tmp[0][i] ) ^
|
||||||
|
MULT( MDS(j,1), tmp[1][k] ) ^
|
||||||
|
MULT( MDS(j,2), tmp[2][(++k)&7] ) ^
|
||||||
|
MULT( MDS(j,3), tmp[3][(++k)&7] ) ^
|
||||||
|
MULT( MDS(j,4), tmp[4][(++k)&7] ) ^
|
||||||
|
MULT( MDS(j,5), tmp[5][(++k)&7] ) ^
|
||||||
|
MULT( MDS(j,6), tmp[6][(++k)&7] ) ^
|
||||||
|
MULT( MDS(j,7), tmp[7][(++k)&7] ) ;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DEBUG_PRINT(ctx, "post MDS");
|
||||||
|
}
|
||||||
|
|
||||||
|
void twister_mini_round(twister_state_t* ctx, void* msg){
|
||||||
|
/* inject message */
|
||||||
|
uint8_t i;
|
||||||
|
for(i=0; i<8; ++i){
|
||||||
|
ctx->s[7][7-i] ^= *((uint8_t*)msg);
|
||||||
|
msg = (uint8_t*)msg +1;
|
||||||
|
}
|
||||||
|
twister_blank_round(ctx);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
void twister_ctx2hash(void* dest, twister_state_t* ctx, uint16_t hashsize_b){
|
||||||
|
uint8_t tmp[8][8];
|
||||||
|
uint8_t j;
|
||||||
|
uint16_t i=hashsize_b;
|
||||||
|
while(i>=64){
|
||||||
|
i-=64;
|
||||||
|
memcpy(tmp,ctx->s, 64);
|
||||||
|
twister_blank_round(ctx);
|
||||||
|
memxor(ctx->s, tmp, 64);
|
||||||
|
twister_blank_round(ctx);
|
||||||
|
for(j=0; j<8; ++j){
|
||||||
|
*((uint8_t*)dest) = ctx->s[7-j][0] ^ tmp[7-j][0];
|
||||||
|
dest = (uint8_t*)dest + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(i>=32){
|
||||||
|
memcpy(tmp,ctx->s, 64);
|
||||||
|
twister_blank_round(ctx);
|
||||||
|
memxor(ctx->s, tmp, 64);
|
||||||
|
twister_blank_round(ctx);
|
||||||
|
for(j=0; j<4; ++j){
|
||||||
|
*((uint8_t*)dest) = ctx->s[3-j][0] ^ tmp[3-j][0];
|
||||||
|
dest = (uint8_t*)dest + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
36
twister.c
36
twister.c
|
@ -72,43 +72,47 @@ void shiftrow(void* row, uint8_t shift){
|
||||||
*((uint64_t*)row) = *((uint64_t*)row)>>(8*shift) | *((uint64_t*)row)<<(64-8*shift);
|
*((uint64_t*)row) = *((uint64_t*)row)>>(8*shift) | *((uint64_t*)row)<<(64-8*shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MDS(a,b) pgm_read_byte(&(twister_mds[a][b]))
|
#define MDS(a,b) pgm_read_byte(&(twister_mds[(a)][(b)]))
|
||||||
|
|
||||||
#ifdef TWISTER_MUL_TABLE
|
#ifdef TWISTER_MUL_TABLE
|
||||||
# define MULT(a,b) pgm_read_byte(&(twister_multab[a][b]))
|
# define MULT(a,b) pgm_read_byte(&(twister_multab[a][b]))
|
||||||
#else
|
#else
|
||||||
# define MULT(a,b) gf256mul(a,b, 0x4D)
|
# define MULT(a,b) gf256mul((a),(b), 0x4D)
|
||||||
#endif
|
#endif
|
||||||
void twister_blank_round(twister_state_t* ctx){
|
void twister_blank_round(twister_state_t* ctx){
|
||||||
uint8_t i,j;
|
uint8_t i,j,k=0;
|
||||||
uint8_t tmp[8][8];
|
uint8_t tmp[8][8];
|
||||||
DEBUG_PRINT(ctx, "blank init");
|
DEBUG_PRINT(ctx, "blank init");
|
||||||
/* add twist counter */
|
/* add twist counter */
|
||||||
for(i=0; i<8; ++i)
|
for(i=0; i<8; ++i){
|
||||||
ctx->s[i][1] ^= ((uint8_t*)&(ctx->counter))[7-i];
|
ctx->s[i][1] ^= ((uint8_t*)&(ctx->counter))[7-i];
|
||||||
|
}
|
||||||
ctx->counter--;
|
ctx->counter--;
|
||||||
// DEBUG_PRINT(ctx, "counter added");
|
// DEBUG_PRINT(ctx, "counter added");
|
||||||
/* sub bytes */
|
/* sub bytes */
|
||||||
for(i=0; i<8; ++i)
|
for(i=0; i<8; ++i){
|
||||||
for(j=0;j<8;++j)
|
for(j=0;j<8;++j){
|
||||||
tmp[i][j] = pgm_read_byte(twister_sbox+ctx->s[i][j]);
|
tmp[i][j] = pgm_read_byte(twister_sbox+ctx->s[i][j]);
|
||||||
/* shift rows */
|
}
|
||||||
for(i=1;i<8; ++i){
|
|
||||||
shiftrow(&(tmp[i][0]), i);
|
|
||||||
}
|
}
|
||||||
|
/* shift rows */
|
||||||
|
// for(i=1;i<8; ++i){
|
||||||
|
// shiftrow(&(tmp[i][0]), i);
|
||||||
|
// }
|
||||||
/* mix columns */
|
/* mix columns */
|
||||||
for( i=0; i<8; i++ ){
|
for( i=0; i<8; i++ ){
|
||||||
// multiply with mds matrix
|
// multiply with mds matrix
|
||||||
for( j=0; j<8; j++ ){
|
for( j=0; j<8; j++ ){
|
||||||
|
k=(i+1)&7;
|
||||||
ctx->s[j][i] =
|
ctx->s[j][i] =
|
||||||
MULT( MDS(j,0), tmp[0][i] ) ^
|
MULT( MDS(j,0), tmp[0][i] ) ^
|
||||||
MULT( MDS(j,1), tmp[1][i] ) ^
|
MULT( MDS(j,1), tmp[1][k] ) ^
|
||||||
MULT( MDS(j,2), tmp[2][i] ) ^
|
MULT( MDS(j,2), tmp[2][(++k)&7] ) ^
|
||||||
MULT( MDS(j,3), tmp[3][i] ) ^
|
MULT( MDS(j,3), tmp[3][(++k)&7] ) ^
|
||||||
MULT( MDS(j,4), tmp[4][i] ) ^
|
MULT( MDS(j,4), tmp[4][(++k)&7] ) ^
|
||||||
MULT( MDS(j,5), tmp[5][i] ) ^
|
MULT( MDS(j,5), tmp[5][(++k)&7] ) ^
|
||||||
MULT( MDS(j,6), tmp[6][i] ) ^
|
MULT( MDS(j,6), tmp[6][(++k)&7] ) ^
|
||||||
MULT( MDS(j,7), tmp[7][i] ) ;
|
MULT( MDS(j,7), tmp[7][(++k)&7] ) ;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
/* twister224.S */
|
||||||
|
/*
|
||||||
|
This file is part of the Crypto-avr-lib/microcrypt-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 twister224.S
|
||||||
|
* \email daniel.otte@rub.de
|
||||||
|
* \author Daniel Otte
|
||||||
|
* \date 2008-12-28
|
||||||
|
* \license GPLv3 or later
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "avr-asm-macros.S"
|
||||||
|
/*********************************************************************/
|
||||||
|
/* void twister224(void* dest, void* msg, uint32_t msg_length_b) */
|
||||||
|
/*
|
||||||
|
* param dest: r24:r25
|
||||||
|
* param msg: r22:r23
|
||||||
|
* param msg_length_b: r18:r21
|
||||||
|
*/
|
||||||
|
|
||||||
|
CTX_SAVE0 = 10
|
||||||
|
CTX_SAVE1 = 11
|
||||||
|
DST_SAVE0 = 14
|
||||||
|
DST_SAVE1 = 15
|
||||||
|
MSG_LEN0 = 16
|
||||||
|
MSG_LEN1 = 17
|
||||||
|
MSG_LEN2 = 12
|
||||||
|
MSG_LEN3 = 13
|
||||||
|
MSG_SAVE0 = 28
|
||||||
|
MSG_SAVE1 = 29
|
||||||
|
|
||||||
|
.global twister224
|
||||||
|
twister224:
|
||||||
|
push_range 10, 17
|
||||||
|
push r28
|
||||||
|
push r29
|
||||||
|
stack_alloc_large 64+2*8
|
||||||
|
adiw r30, 1
|
||||||
|
movw CTX_SAVE0, r30
|
||||||
|
movw DST_SAVE0, r24
|
||||||
|
movw MSG_SAVE0, r22
|
||||||
|
movw MSG_LEN0, r18
|
||||||
|
movw MSG_LEN2, r20
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
ldi r22, lo8(224)
|
||||||
|
ldi r23, hi8(224)
|
||||||
|
rcall twister_small_init
|
||||||
|
1:
|
||||||
|
tst MSG_LEN3
|
||||||
|
brne 2f
|
||||||
|
tst MSG_LEN2
|
||||||
|
brne 2f
|
||||||
|
cpi MSG_LEN1, 2
|
||||||
|
brmi 3f
|
||||||
|
2:
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
rcall twister_small_nextBlock
|
||||||
|
adiw MSG_SAVE0, 63
|
||||||
|
adiw MSG_SAVE0, 1
|
||||||
|
subi MSG_LEN1, 2
|
||||||
|
sbc MSG_LEN2, r1
|
||||||
|
sbc MSG_LEN3, r1
|
||||||
|
rjmp 1b
|
||||||
|
3:
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r20, MSG_LEN0
|
||||||
|
rcall twister_small_lastBlock
|
||||||
|
|
||||||
|
movw r24, DST_SAVE0
|
||||||
|
movw r22, CTX_SAVE0
|
||||||
|
ldi r20, lo8(224)
|
||||||
|
ldi r21, hi8(224)
|
||||||
|
rcall twister_small_ctx2hash
|
||||||
|
|
||||||
|
stack_free_large 64+2*8
|
||||||
|
pop r29
|
||||||
|
pop r28
|
||||||
|
pop_range 10, 17
|
||||||
|
ret
|
||||||
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
/* twister256.S */
|
||||||
|
/*
|
||||||
|
This file is part of the Crypto-avr-lib/microcrypt-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 twister256.S
|
||||||
|
* \email daniel.otte@rub.de
|
||||||
|
* \author Daniel Otte
|
||||||
|
* \date 2008-12-28
|
||||||
|
* \license GPLv3 or later
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "avr-asm-macros.S"
|
||||||
|
/*********************************************************************/
|
||||||
|
/* void twister256(void* dest, void* msg, uint32_t msg_length_b) */
|
||||||
|
/*
|
||||||
|
* param dest: r24:r25
|
||||||
|
* param msg: r22:r23
|
||||||
|
* param msg_length_b: r18:r21
|
||||||
|
*/
|
||||||
|
|
||||||
|
CTX_SAVE0 = 10
|
||||||
|
CTX_SAVE1 = 11
|
||||||
|
DST_SAVE0 = 14
|
||||||
|
DST_SAVE1 = 15
|
||||||
|
MSG_LEN0 = 16
|
||||||
|
MSG_LEN1 = 17
|
||||||
|
MSG_LEN2 = 12
|
||||||
|
MSG_LEN3 = 13
|
||||||
|
MSG_SAVE0 = 28
|
||||||
|
MSG_SAVE1 = 29
|
||||||
|
|
||||||
|
.global twister256
|
||||||
|
twister256:
|
||||||
|
push_range 10, 17
|
||||||
|
push r28
|
||||||
|
push r29
|
||||||
|
stack_alloc_large 64+2*8
|
||||||
|
adiw r30, 1
|
||||||
|
movw CTX_SAVE0, r30
|
||||||
|
movw DST_SAVE0, r24
|
||||||
|
movw MSG_SAVE0, r22
|
||||||
|
movw MSG_LEN0, r18
|
||||||
|
movw MSG_LEN2, r20
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
ldi r22, lo8(256)
|
||||||
|
ldi r23, hi8(256)
|
||||||
|
rcall twister_small_init
|
||||||
|
1:
|
||||||
|
tst MSG_LEN3
|
||||||
|
brne 2f
|
||||||
|
tst MSG_LEN2
|
||||||
|
brne 2f
|
||||||
|
cpi MSG_LEN1, 2
|
||||||
|
brmi 3f
|
||||||
|
2:
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
rcall twister_small_nextBlock
|
||||||
|
adiw MSG_SAVE0, 63
|
||||||
|
adiw MSG_SAVE0, 1
|
||||||
|
subi MSG_LEN1, 2
|
||||||
|
sbc MSG_LEN2, r1
|
||||||
|
sbc MSG_LEN3, r1
|
||||||
|
rjmp 1b
|
||||||
|
3:
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r20, MSG_LEN0
|
||||||
|
rcall twister_small_lastBlock
|
||||||
|
|
||||||
|
movw r24, DST_SAVE0
|
||||||
|
movw r22, CTX_SAVE0
|
||||||
|
ldi r20, lo8(256)
|
||||||
|
ldi r21, hi8(256)
|
||||||
|
rcall twister_small_ctx2hash
|
||||||
|
|
||||||
|
stack_free_large 64+2*8
|
||||||
|
pop r29
|
||||||
|
pop r28
|
||||||
|
pop_range 10, 17
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
/* twister384.S */
|
||||||
|
/*
|
||||||
|
This file is part of the Crypto-avr-lib/microcrypt-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 twister384.S
|
||||||
|
* \email daniel.otte@rub.de
|
||||||
|
* \author Daniel Otte
|
||||||
|
* \date 2008-12-28
|
||||||
|
* \license GPLv3 or later
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "avr-asm-macros.S"
|
||||||
|
/*********************************************************************/
|
||||||
|
/* void twister384(void* dest, void* msg, uint32_t msg_length_b) */
|
||||||
|
/*
|
||||||
|
* param dest: r24:r25
|
||||||
|
* param msg: r22:r23
|
||||||
|
* param msg_length_b: r18:r21
|
||||||
|
*/
|
||||||
|
|
||||||
|
CTX_SAVE0 = 10
|
||||||
|
CTX_SAVE1 = 11
|
||||||
|
DST_SAVE0 = 14
|
||||||
|
DST_SAVE1 = 15
|
||||||
|
MSG_LEN0 = 16
|
||||||
|
MSG_LEN1 = 17
|
||||||
|
MSG_LEN2 = 12
|
||||||
|
MSG_LEN3 = 13
|
||||||
|
MSG_SAVE0 = 28
|
||||||
|
MSG_SAVE1 = 29
|
||||||
|
|
||||||
|
.global twister384
|
||||||
|
twister384:
|
||||||
|
push_range 10, 17
|
||||||
|
push r28
|
||||||
|
push r29
|
||||||
|
stack_alloc_large 64+2*8+64
|
||||||
|
adiw r30, 1
|
||||||
|
movw CTX_SAVE0, r30
|
||||||
|
movw DST_SAVE0, r24
|
||||||
|
movw MSG_SAVE0, r22
|
||||||
|
movw MSG_LEN0, r18
|
||||||
|
movw MSG_LEN2, r20
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
ldi r22, lo8(384)
|
||||||
|
ldi r23, hi8(384)
|
||||||
|
rcall twister_big_init
|
||||||
|
1:
|
||||||
|
tst MSG_LEN3
|
||||||
|
brne 2f
|
||||||
|
tst MSG_LEN2
|
||||||
|
brne 2f
|
||||||
|
cpi MSG_LEN1, 2
|
||||||
|
brmi 3f
|
||||||
|
2:
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
rcall twister_big_nextBlock
|
||||||
|
adiw MSG_SAVE0, 63
|
||||||
|
adiw MSG_SAVE0, 1
|
||||||
|
subi MSG_LEN1, 2
|
||||||
|
sbc MSG_LEN2, r1
|
||||||
|
sbc MSG_LEN3, r1
|
||||||
|
rjmp 1b
|
||||||
|
3:
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r20, MSG_LEN0
|
||||||
|
rcall twister_big_lastBlock
|
||||||
|
|
||||||
|
movw r24, DST_SAVE0
|
||||||
|
movw r22, CTX_SAVE0
|
||||||
|
ldi r20, lo8(384)
|
||||||
|
ldi r21, hi8(384)
|
||||||
|
rcall twister_big_ctx2hash
|
||||||
|
|
||||||
|
stack_free_large2 64+2*8+64
|
||||||
|
pop r29
|
||||||
|
pop r28
|
||||||
|
pop_range 10, 17
|
||||||
|
ret
|
|
@ -0,0 +1,97 @@
|
||||||
|
/* twister512.S */
|
||||||
|
/*
|
||||||
|
This file is part of the Crypto-avr-lib/microcrypt-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 twister512.S
|
||||||
|
* \email daniel.otte@rub.de
|
||||||
|
* \author Daniel Otte
|
||||||
|
* \date 2008-12-28
|
||||||
|
* \license GPLv3 or later
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "avr-asm-macros.S"
|
||||||
|
/*********************************************************************/
|
||||||
|
/* void twister384(void* dest, void* msg, uint32_t msg_length_b) */
|
||||||
|
/*
|
||||||
|
* param dest: r24:r25
|
||||||
|
* param msg: r22:r23
|
||||||
|
* param msg_length_b: r18:r21
|
||||||
|
*/
|
||||||
|
|
||||||
|
CTX_SAVE0 = 10
|
||||||
|
CTX_SAVE1 = 11
|
||||||
|
DST_SAVE0 = 14
|
||||||
|
DST_SAVE1 = 15
|
||||||
|
MSG_LEN0 = 16
|
||||||
|
MSG_LEN1 = 17
|
||||||
|
MSG_LEN2 = 12
|
||||||
|
MSG_LEN3 = 13
|
||||||
|
MSG_SAVE0 = 28
|
||||||
|
MSG_SAVE1 = 29
|
||||||
|
|
||||||
|
.global twister512
|
||||||
|
twister512:
|
||||||
|
push_range 10, 17
|
||||||
|
push r28
|
||||||
|
push r29
|
||||||
|
stack_alloc_large 64+2*8+64
|
||||||
|
adiw r30, 1
|
||||||
|
movw CTX_SAVE0, r30
|
||||||
|
movw DST_SAVE0, r24
|
||||||
|
movw MSG_SAVE0, r22
|
||||||
|
movw MSG_LEN0, r18
|
||||||
|
movw MSG_LEN2, r20
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
ldi r22, lo8(512)
|
||||||
|
ldi r23, hi8(512)
|
||||||
|
rcall twister_big_init
|
||||||
|
1:
|
||||||
|
tst MSG_LEN3
|
||||||
|
brne 2f
|
||||||
|
tst MSG_LEN2
|
||||||
|
brne 2f
|
||||||
|
cpi MSG_LEN1, 2
|
||||||
|
brmi 3f
|
||||||
|
2:
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
rcall twister_big_nextBlock
|
||||||
|
adiw MSG_SAVE0, 63
|
||||||
|
adiw MSG_SAVE0, 1
|
||||||
|
subi MSG_LEN1, 2
|
||||||
|
sbc MSG_LEN2, r1
|
||||||
|
sbc MSG_LEN3, r1
|
||||||
|
rjmp 1b
|
||||||
|
3:
|
||||||
|
movw r24, CTX_SAVE0
|
||||||
|
movw r22, MSG_SAVE0
|
||||||
|
movw r20, MSG_LEN0
|
||||||
|
rcall twister_big_lastBlock
|
||||||
|
|
||||||
|
movw r24, DST_SAVE0
|
||||||
|
movw r22, CTX_SAVE0
|
||||||
|
ldi r20, lo8(512)
|
||||||
|
ldi r21, hi8(512)
|
||||||
|
rcall twister_big_ctx2hash
|
||||||
|
|
||||||
|
stack_free_large2 64+2*8+64
|
||||||
|
pop r29
|
||||||
|
pop r28
|
||||||
|
pop_range 10, 17
|
||||||
|
ret
|
|
@ -0,0 +1,90 @@
|
||||||
|
/******************************************************************
|
||||||
|
** Header File for the Reference Implementation of Twister
|
||||||
|
**
|
||||||
|
** Author: Ewan Fleischmann <ewan.fleischmann@uni-weimar.de> 2008
|
||||||
|
**
|
||||||
|
** This algorithm and source code is released into the public domain.
|
||||||
|
**
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
#ifndef TWISTER_REF_H_
|
||||||
|
#define TWISTER_REF_H_
|
||||||
|
|
||||||
|
#define DEBUG
|
||||||
|
|
||||||
|
#define MIN(a,b) ((a)>(b)?(b):(a))
|
||||||
|
/* state matrix has size of 8x8 BYTES i.e. 8 rows and 8 columns*/
|
||||||
|
#define NUMROWSCOLUMNS 8
|
||||||
|
#define STATESIZE NUMROWSCOLUMNS * NUMROWSCOLUMNS
|
||||||
|
|
||||||
|
/* blocksize in BITS, i.e. size of an input message block for a compression function call*/
|
||||||
|
#define BLOCKSIZE 512
|
||||||
|
|
||||||
|
/* unit64 def for ANSIC/GNUC <-> MSVC */
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#include <stdint.h>
|
||||||
|
#else
|
||||||
|
typedef unsigned __int64 uint64_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* multiplication in F_256 */
|
||||||
|
#define MULT(a,b) (multab[a-1][b])
|
||||||
|
|
||||||
|
/* NIST requirements definitions */
|
||||||
|
typedef unsigned char BitSequence;
|
||||||
|
typedef uint64_t DataLength;
|
||||||
|
typedef enum {SUCCESS=0, FAIL=1, BAD_HASHBITLEN=2 } HashReturn;
|
||||||
|
typedef enum {FULL = 0, NOT_FULL = 1 } INTERMEDIATE_RESULT;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* statematrix[Y][X] */
|
||||||
|
unsigned char hs_State[NUMROWSCOLUMNS][NUMROWSCOLUMNS];
|
||||||
|
|
||||||
|
/* matrix for checksum */
|
||||||
|
unsigned char hs_Checksum[NUMROWSCOLUMNS][NUMROWSCOLUMNS];
|
||||||
|
|
||||||
|
/* Processed message bits */
|
||||||
|
DataLength hs_ProcessedMsgLen;
|
||||||
|
|
||||||
|
/* Unprocessed message block */
|
||||||
|
BitSequence hs_Data[STATESIZE];
|
||||||
|
|
||||||
|
/* size of data hs_Data, in bits*/
|
||||||
|
uint64_t hs_DataBitLen;
|
||||||
|
|
||||||
|
/* Twist counter, prevents slide attacks, counts the number of twist operations */
|
||||||
|
uint64_t hs_Counter;
|
||||||
|
|
||||||
|
/* output hash bit length, in bits */
|
||||||
|
uint64_t hs_HashBitLen;
|
||||||
|
|
||||||
|
} hashState;
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************/
|
||||||
|
/************************* N I S T A P I ***********************/
|
||||||
|
/******************************************************************/
|
||||||
|
|
||||||
|
/* Initiate Twister */
|
||||||
|
HashReturn Init(hashState *state, int hashbitlen);
|
||||||
|
|
||||||
|
/* Process the supplied data */
|
||||||
|
HashReturn Update(hashState *state, const BitSequence *data,
|
||||||
|
DataLength databitlen);
|
||||||
|
|
||||||
|
/* Perform any post processing and output filtering */
|
||||||
|
HashReturn Final(hashState *state, BitSequence *hashval);
|
||||||
|
|
||||||
|
/* Hash the supplied data and provie the resulting hash value */
|
||||||
|
HashReturn Hash(int hashbitlen, const BitSequence *data,
|
||||||
|
DataLength databitlen, BitSequence *hashval);
|
||||||
|
|
||||||
|
|
||||||
|
/* only for testing */
|
||||||
|
INTERMEDIATE_RESULT fill_intermediate_state( hashState *state, const BitSequence *data, DataLength *databitlen, DataLength *processed );
|
||||||
|
void twist( hashState *state, uint64_t *data );
|
||||||
|
void twist_mini_round( hashState *state );
|
||||||
|
void checksum( hashState *state, int col );
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* TWISTER_REF_H_ */
|
Loading…
Reference in New Issue