1 /* jh_simple_speed.c */
3 This file is part of the AVR-Crypto-Lib.
4 Copyright (C) 2006-2010 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/>.
21 #include <avr/pgmspace.h>
25 #include "jh_simple.h"
26 #include "jh_tables.h"
34 void jh_round(uint8_t* a, uint8_t roundno){
38 pr = jh_round_const + 32*roundno;
41 r = pgm_read_byte(pr++);
43 b[i]=pgm_read_byte(&(jh_lutbox[((r&0xC0)<<2)|a[i]]));
47 u = pgm_read_byte(jh_permutation_table+2*i);
48 v = pgm_read_byte(jh_permutation_table+2*i+1);
65 uint8_t jh_l_inv(uint8_t a){
69 v ^= ((w<<1)^(w>>3)^((w>>2)&2))&0xf;
70 w ^= ((v<<1)^(v>>3)^((v>>2)&2))&0xf;
74 void group(uint8_t *a){
78 x = (((a[i/8+ 0])>>4)&0x8)
79 | (((a[i/8+ 32])>>5)&0x4)
80 | (((a[i/8+ 64])>>6)&0x2)
81 | (((a[i/8+ 96])>>7)&0x1);
82 a[i/8] <<= 1; a[i/8+32]<<=1; a[i/8+64]<<=1; a[i/8+96]<<=1;
83 y = (((a[i/8+ 16])>>4)&0x8)
84 | (((a[i/8+ 48])>>5)&0x4)
85 | (((a[i/8+ 80])>>6)&0x2)
86 | (((a[i/8+112])>>7)&0x1);
87 a[i/8+16] <<= 1; a[i/8+48]<<=1; a[i/8+80]<<=1; a[i/8+112]<<=1;
93 void degroup(uint8_t *a){
98 b[j+ 0]<<=1; b[j+ 0] |= ((a[i])>>7)&1;
99 b[j+ 32]<<=1; b[j+ 32] |= ((a[i])>>6)&1;
100 b[j+ 64]<<=1; b[j+ 64] |= ((a[i])>>5)&1;
101 b[j+ 96]<<=1; b[j+ 96] |= ((a[i])>>4)&1;
102 b[j+ 16]<<=1; b[j+ 16] |= ((a[i])>>3)&1;
103 b[j+ 48]<<=1; b[j+ 48] |= ((a[i])>>2)&1;
104 b[j+ 80]<<=1; b[j+ 80] |= ((a[i])>>1)&1;
105 b[j+112]<<=1; b[j+112] |= ((a[i])>>0)&1;
110 void jh_encrypt(uint8_t* a){
114 cli_putstr_P(PSTR("\r\n== pre group ==\r\n"));
115 cli_hexdump_block(a, 128, 4, 16);
124 pr = jh_round_const + 32*35;
125 for(i=0; i<128; ++i){
127 r = pgm_read_byte(pr++);
129 a[i]=jh_l_inv(pgm_read_byte(&(jh_lutbox[((r&0xC0)<<2)|a[i]])));
134 cli_putstr_P(PSTR("\r\n== pre degroup ==\r\n"));
135 cli_hexdump_block(a, 128, 4, 16);
139 cli_putstr_P(PSTR("\r\n== post degroup ==\r\n"));
140 cli_hexdump_block(a, 128, 4, 16);
144 void jh_init(uint16_t hashlen_b, jh_ctx_t* ctx){
145 memset(ctx->a, 0, 128);
146 ctx->a[0] = hashlen_b>>8;
147 ctx->a[1] = hashlen_b&0xff;
152 void jh_nextBlock(jh_ctx_t* ctx, void* block){
153 memxor(ctx->a, block, 64);
155 memxor(ctx->a+64, block, 64);
159 void jh_lastBlock(jh_ctx_t* ctx, void* block, uint16_t length_b){
160 while(length_b>=64*8){
161 jh_nextBlock(ctx, block);
162 block = (uint8_t*)block + 64;
166 uint64_t total_length;
167 memset(buffer, 0, 64);
168 memcpy(buffer, block, (length_b+7)/8);
169 buffer[length_b/8] |= 0x80>>(length_b%8);
170 total_length=ctx->block_hashed*512+length_b;
174 jh_nextBlock(ctx, buffer);
177 memset(buffer+1, 0, 64-8-1);
178 buffer[63] = total_length&0xff;
179 buffer[62] = (total_length>> 8)&0xff;
180 buffer[61] = (total_length>>16)&0xff;
181 buffer[60] = (total_length>>24)&0xff;
182 buffer[59] = (total_length>>32)&0xff;
183 buffer[58] = (total_length>>40)&0xff;
184 buffer[57] = (total_length>>48)&0xff;
185 buffer[56] = (total_length>>56)&0xff;
186 jh_nextBlock(ctx, buffer);
189 void jh_ctx2hash(void* dest, uint16_t length_b, jh_ctx_t* ctx){
190 memcpy(dest, ctx->a+128-(length_b+7)/8, (length_b+7)/8);
194 void jh224_init(jh_ctx_t* ctx){
198 void jh224_ctx2hash(void* dest, jh_ctx_t* ctx){
199 jh_ctx2hash(dest, 224, ctx);
202 void jh256_init(jh_ctx_t* ctx){
206 void jh256_ctx2hash(void* dest, jh_ctx_t* ctx){
207 jh_ctx2hash(dest, 256, ctx);
210 void jh384_init(jh_ctx_t* ctx){
214 void jh384_ctx2hash(void* dest, jh_ctx_t* ctx){
215 jh_ctx2hash(dest, 384, ctx);
218 void jh512_init(jh_ctx_t* ctx){
222 void jh512_ctx2hash(void* dest, jh_ctx_t* ctx){
223 jh_ctx2hash(dest, 512, ctx);