3 This file is part of the Crypto-avr-lib/microcrypt-lib.
4 Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de)
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include <avr/pgmspace.h>
25 #include "twister_tables.h"
28 #ifndef TWISTER_MUL_TABLE
29 # include "gf256mul.h"
39 # define DEBUG_PRINT(ctx, msg) debug_print((ctx), PSTR(msg))
41 # define DEBUG_PRINT(ctx, msg)
46 void print_twister_state(twister_state_t* ctx){
48 uart_putstr_P(PSTR("\r\nState:\r\n matrix:\r\n"));
50 uart_putstr_P(PSTR("\t[ "));
51 uart_hexdump(&(ctx->s[i][0]), 8);
52 uart_putstr_P(PSTR("]\r\n"));
54 uart_putstr_P(PSTR("counter: "));
55 uart_hexdump(&(ctx->counter), 8);
57 uart_putstr_P(PSTR("\r\nlength_counter_b: "));
58 uart_hexdump(&(ctx->length_counter_b), 8);
59 uart_putstr_P(PSTR("\r\n"));
62 void debug_print(twister_state_t* ctx, PGM_P msg){
63 uart_putstr_P(PSTR("\r\n"));
65 print_twister_state(ctx);
71 void shiftrow(void* row, uint8_t shift){
72 *((uint64_t*)row) = *((uint64_t*)row)>>(8*shift) | *((uint64_t*)row)<<(64-8*shift);
75 #define MDS(a,b) pgm_read_byte(&(twister_mds[a][b]))
77 #ifdef TWISTER_MUL_TABLE
78 # define MULT(a,b) pgm_read_byte(&(twister_multab[a][b]))
80 # define MULT(a,b) gf256mul(a,b, 0x4D)
82 void twister_blank_round(twister_state_t* ctx){
85 DEBUG_PRINT(ctx, "blank init");
86 /* add twist counter */
88 ctx->s[i][1] ^= ((uint8_t*)&(ctx->counter))[7-i];
90 // DEBUG_PRINT(ctx, "counter added");
94 tmp[i][j] = pgm_read_byte(twister_sbox+ctx->s[i][j]);
97 shiftrow(&(tmp[i][0]), i);
100 for( i=0; i<8; i++ ){
101 // multiply with mds matrix
102 for( j=0; j<8; j++ ){
104 MULT( MDS(j,0), tmp[0][i] ) ^
105 MULT( MDS(j,1), tmp[1][i] ) ^
106 MULT( MDS(j,2), tmp[2][i] ) ^
107 MULT( MDS(j,3), tmp[3][i] ) ^
108 MULT( MDS(j,4), tmp[4][i] ) ^
109 MULT( MDS(j,5), tmp[5][i] ) ^
110 MULT( MDS(j,6), tmp[6][i] ) ^
111 MULT( MDS(j,7), tmp[7][i] ) ;
115 DEBUG_PRINT(ctx, "post MDS");
118 void twister_mini_round(twister_state_t* ctx, void* msg){
122 ctx->s[7][7-i] ^= *((uint8_t*)msg);
123 msg = (uint8_t*)msg +1;
125 twister_blank_round(ctx);
128 void twister_ctx2hash(void* dest, twister_state_t* ctx, uint16_t hashsize_b){
131 uint16_t i=hashsize_b;
134 memcpy(tmp,ctx->s, 64);
135 twister_blank_round(ctx);
136 memxor(ctx->s, tmp, 64);
137 twister_blank_round(ctx);
139 *((uint8_t*)dest) = ctx->s[7-j][0] ^ tmp[7-j][0];
140 dest = (uint8_t*)dest + 1;
144 memcpy(tmp,ctx->s, 64);
145 twister_blank_round(ctx);
146 memxor(ctx->s, tmp, 64);
147 twister_blank_round(ctx);
149 *((uint8_t*)dest) = ctx->s[3-j][0] ^ tmp[3-j][0];
150 dest = (uint8_t*)dest + 1;