X-Git-Url: https://git.cryptolib.org/?p=avr-crypto-lib.git;a=blobdiff_plain;f=jh%2Fjh_simple_speed.c;fp=jh%2Fjh_simple_speed.c;h=0000000000000000000000000000000000000000;hp=6c3e32dd58c870a7e3a41a7c238f0a89b574a987;hb=e2a5b474634f8c07d75119c2affdc6bb7f4e7848;hpb=bd740a03aa9137d46277a2eee05ac6be538ef69d diff --git a/jh/jh_simple_speed.c b/jh/jh_simple_speed.c deleted file mode 100644 index 6c3e32d..0000000 --- a/jh/jh_simple_speed.c +++ /dev/null @@ -1,224 +0,0 @@ -/* jh_simple_speed.c */ -/* - This file is part of the AVR-Crypto-Lib. - Copyright (C) 2006-2010 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 . -*/ - -#include -#include -#include -#include -#include "memxor.h" -#include "jh_simple.h" -#include "jh_tables.h" - -#define DEBUG 0 - -#if DEBUG -#include "cli.h" -#endif - -void jh_round(uint8_t* a, uint8_t roundno){ - uint8_t b[128]; - uint8_t i,r,u,v,x,y; - uint8_t *pr; - pr = jh_round_const + 32*roundno; - for(i=0; i<128; ++i){ - if(i%4==0){ - r = pgm_read_byte(pr++); - } - b[i]=pgm_read_byte(&(jh_lutbox[((r&0xC0)<<2)|a[i]])); - r<<=2; - } - for(i=0;i<128;++i){ - u = pgm_read_byte(jh_permutation_table+2*i); - v = pgm_read_byte(jh_permutation_table+2*i+1); - x = b[u>>1]; - y = b[v>>1]; - if(u&1){ - x <<= 4; - }else{ - x &= 0xf0; - } - if(v&1){ - y &= 0x0f; - }else{ - y >>= 4; - } - a[i] = x|y; - } -} - -uint8_t jh_l_inv(uint8_t a){ - uint8_t v,w; - v = a>>4; - w = a&0xf; - v ^= ((w<<1)^(w>>3)^((w>>2)&2))&0xf; - w ^= ((v<<1)^(v>>3)^((v>>2)&2))&0xf; - return w|(v<<4); -} - -void group(uint8_t *a){ - uint8_t b[128]; - uint8_t i,x,y; - for(i=0; i<128; ++i){ - x = (((a[i/8+ 0])>>4)&0x8) - | (((a[i/8+ 32])>>5)&0x4) - | (((a[i/8+ 64])>>6)&0x2) - | (((a[i/8+ 96])>>7)&0x1); - a[i/8] <<= 1; a[i/8+32]<<=1; a[i/8+64]<<=1; a[i/8+96]<<=1; - y = (((a[i/8+ 16])>>4)&0x8) - | (((a[i/8+ 48])>>5)&0x4) - | (((a[i/8+ 80])>>6)&0x2) - | (((a[i/8+112])>>7)&0x1); - a[i/8+16] <<= 1; a[i/8+48]<<=1; a[i/8+80]<<=1; a[i/8+112]<<=1; - b[i]= (x<<4)|y; - } - memcpy(a,b,128); -} - -void degroup(uint8_t *a){ - uint8_t b[128]; - uint8_t i,j; - for(i=0;i<128;++i){ - j=i/8; - b[j+ 0]<<=1; b[j+ 0] |= ((a[i])>>7)&1; - b[j+ 32]<<=1; b[j+ 32] |= ((a[i])>>6)&1; - b[j+ 64]<<=1; b[j+ 64] |= ((a[i])>>5)&1; - b[j+ 96]<<=1; b[j+ 96] |= ((a[i])>>4)&1; - b[j+ 16]<<=1; b[j+ 16] |= ((a[i])>>3)&1; - b[j+ 48]<<=1; b[j+ 48] |= ((a[i])>>2)&1; - b[j+ 80]<<=1; b[j+ 80] |= ((a[i])>>1)&1; - b[j+112]<<=1; b[j+112] |= ((a[i])>>0)&1; - } - memcpy(a,b,128); -} - -void jh_encrypt(uint8_t* a){ - uint8_t i; - /* grouping */ -#if DEBUG - cli_putstr_P(PSTR("\r\n== pre group ==\r\n")); - cli_hexdump_block(a, 128, 4, 16); -#endif - group(a); - for(i=0;i<35;++i){ - jh_round(a, i); - } - uint8_t r; - uint8_t *pr; - - pr = jh_round_const + 32*35; - for(i=0; i<128; ++i){ - if(i%4==0){ - r = pgm_read_byte(pr++); - } - a[i]=jh_l_inv(pgm_read_byte(&(jh_lutbox[((r&0xC0)<<2)|a[i]]))); - r<<=2; - } - /* degrouping */ -#if DEBUG - cli_putstr_P(PSTR("\r\n== pre degroup ==\r\n")); - cli_hexdump_block(a, 128, 4, 16); -#endif - degroup(a); -#if DEBUG - cli_putstr_P(PSTR("\r\n== post degroup ==\r\n")); - cli_hexdump_block(a, 128, 4, 16); -#endif -} - -void jh_init(uint16_t hashlen_b, jh_ctx_t* ctx){ - memset(ctx->a, 0, 128); - ctx->a[0] = hashlen_b>>8; - ctx->a[1] = hashlen_b&0xff; - jh_encrypt(ctx->a); - ctx->block_hashed=0; -} - -void jh_nextBlock(jh_ctx_t* ctx, void* block){ - memxor(ctx->a, block, 64); - jh_encrypt(ctx->a); - memxor(ctx->a+64, block, 64); - ctx->block_hashed++; -} - -void jh_lastBlock(jh_ctx_t* ctx, void* block, uint16_t length_b){ - while(length_b>=64*8){ - jh_nextBlock(ctx, block); - block = (uint8_t*)block + 64; - length_b -= 64*8; - } - uint8_t buffer[64]; - uint64_t total_length; - memset(buffer, 0, 64); - memcpy(buffer, block, (length_b+7)/8); - buffer[length_b/8] |= 0x80>>(length_b%8); - total_length=ctx->block_hashed*512+length_b; - if(length_b==0){ - - }else{ - jh_nextBlock(ctx, buffer); - buffer[0]=0; - } - memset(buffer+1, 0, 64-8-1); - buffer[63] = total_length&0xff; - buffer[62] = (total_length>> 8)&0xff; - buffer[61] = (total_length>>16)&0xff; - buffer[60] = (total_length>>24)&0xff; - buffer[59] = (total_length>>32)&0xff; - buffer[58] = (total_length>>40)&0xff; - buffer[57] = (total_length>>48)&0xff; - buffer[56] = (total_length>>56)&0xff; - jh_nextBlock(ctx, buffer); -} - -void jh_ctx2hash(void* dest, uint16_t length_b, jh_ctx_t* ctx){ - memcpy(dest, ctx->a+128-(length_b+7)/8, (length_b+7)/8); -} - - -void jh224_init(jh_ctx_t* ctx){ - jh_init(224, ctx); -} - -void jh224_ctx2hash(void* dest, jh_ctx_t* ctx){ - jh_ctx2hash(dest, 224, ctx); -} - -void jh256_init(jh_ctx_t* ctx){ - jh_init(256, ctx); -} - -void jh256_ctx2hash(void* dest, jh_ctx_t* ctx){ - jh_ctx2hash(dest, 256, ctx); -} - -void jh384_init(jh_ctx_t* ctx){ - jh_init(384, ctx); -} - -void jh384_ctx2hash(void* dest, jh_ctx_t* ctx){ - jh_ctx2hash(dest, 384, ctx); -} - -void jh512_init(jh_ctx_t* ctx){ - jh_init(512, ctx); -} - -void jh512_ctx2hash(void* dest, jh_ctx_t* ctx){ - jh_ctx2hash(dest, 512, ctx); -}