3 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]) );
62 MULT( MDS(j,1), (tmp[1][k]) );
64 MULT( MDS(j,2), (tmp[2][((++k)&7)]) );
66 MULT( MDS(j,3), (tmp[3][((++k)&7)]) );
68 MULT( MDS(j,4), (tmp[4][((++k)&7)]) );
70 MULT( MDS(j,5), (tmp[5][((++k)&7)]) );
72 MULT( MDS(j,6), (tmp[6][((++k)&7)]) );
74 MULT( MDS(j,7), (tmp[7][((++k)&7)]) );
79 void twister_mini_round(twister_state_t* ctx, const void* msg){
83 ctx->s[7][7-i] ^= *((uint8_t*)msg);
84 msg = (uint8_t*)msg +1;
86 twister_blank_round(ctx);
89 void twister_ctx2hash(void* dest, twister_state_t* ctx, uint16_t hashsize_b){
92 uint16_t i=hashsize_b;
95 memcpy(tmp,ctx->s, 64);
96 twister_blank_round(ctx);
97 memxor(ctx->s, tmp, 64);
98 twister_blank_round(ctx);
100 *((uint8_t*)dest) = ctx->s[7-j][0] ^ tmp[7-j][0];
101 dest = (uint8_t*)dest + 1;
105 memcpy(tmp,ctx->s, 64);
106 twister_blank_round(ctx);
107 memxor(ctx->s, tmp, 64);
108 twister_blank_round(ctx);
110 *((uint8_t*)dest) = ctx->s[3-j][0] ^ tmp[3-j][0];
111 dest = (uint8_t*)dest + 1;