3 This file is part of the This file is part of the AVR-Crypto-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"
32 #define MDS(a,b) pgm_read_byte(&(twister_mds[(a)][(b)]))
34 #ifdef TWISTER_MUL_TABLE
35 # define MULT(a,b) pgm_read_byte(&(twister_multab[(a)][(b)]))
37 # define MULT(a,b) gf256mul((a),(b), 0x4D)
40 void twister_blank_round(twister_state_t* ctx){
43 /* add twist counter */
45 ctx->s[i][1] ^= ((uint8_t*)&(ctx->counter))[7-i];
51 tmp[i][j] = pgm_read_byte(twister_sbox+ctx->s[i][j]);
54 /* mix columns with integrates shift rows */
56 // multiply with mds matrix
60 MULT( MDS(j,0), tmp[0][i] ) ^
61 MULT( MDS(j,1), tmp[1][k] ) ^
62 MULT( MDS(j,2), tmp[2][(++k)&7] ) ^
63 MULT( MDS(j,3), tmp[3][(++k)&7] ) ^
64 MULT( MDS(j,4), tmp[4][(++k)&7] ) ^
65 MULT( MDS(j,5), tmp[5][(++k)&7] ) ^
66 MULT( MDS(j,6), tmp[6][(++k)&7] ) ^
67 MULT( MDS(j,7), tmp[7][(++k)&7] ) ;
73 void twister_mini_round(twister_state_t* ctx, const void* msg){
77 ctx->s[7][7-i] ^= *((uint8_t*)msg);
78 msg = (uint8_t*)msg +1;
80 twister_blank_round(ctx);
83 void twister_ctx2hash(void* dest, twister_state_t* ctx, uint16_t hashsize_b){
86 uint16_t i=hashsize_b;
89 memcpy(tmp,ctx->s, 64);
90 twister_blank_round(ctx);
91 memxor(ctx->s, tmp, 64);
92 twister_blank_round(ctx);
94 *((uint8_t*)dest) = ctx->s[7-j][0] ^ tmp[7-j][0];
95 dest = (uint8_t*)dest + 1;
99 memcpy(tmp,ctx->s, 64);
100 twister_blank_round(ctx);
101 memxor(ctx->s, tmp, 64);
102 twister_blank_round(ctx);
104 *((uint8_t*)dest) = ctx->s[3-j][0] ^ tmp[3-j][0];
105 dest = (uint8_t*)dest + 1;