speed upgrade for grøstl

This commit is contained in:
bg 2009-06-10 21:10:43 +00:00
parent 402f8b98e8
commit dbbf324199
1 changed files with 21 additions and 22 deletions

View File

@ -40,7 +40,7 @@
#if DEBUG #if DEBUG
#include "cli.h" #include "cli.h"
void dump_m(uint8_t* m){ void dump_m(const uint8_t* m){
uint8_t i,j; uint8_t i,j;
for(i=0; i<8; ++i){ for(i=0; i<8; ++i){
cli_putstr_P(PSTR("\r\n")); cli_putstr_P(PSTR("\r\n"));
@ -70,7 +70,7 @@ void groestl_small_rounds(uint8_t *m, uint8_t q){
uint8_t tmp[8]; uint8_t tmp[8];
for(r=0; r<ROUNDS; ++r){ for(r=0; r<ROUNDS; ++r){
if(q){ if(q){
m[8*7] ^= 0xff ^ r; m[7] ^= 0xff ^ r;
}else{ }else{
m[0] ^= r; m[0] ^= r;
} }
@ -84,9 +84,10 @@ void groestl_small_rounds(uint8_t *m, uint8_t q){
m[i] = pgm_read_byte(aes_sbox+m[i]); m[i] = pgm_read_byte(aes_sbox+m[i]);
} }
for(i=1; i<8; ++i){ for(i=1; i<8; ++i){
memcpy(tmp, m+8*i, 8); for(j=0; j<8; ++j)
tmp[j] = m[i+8*j];
for(j=0; j<8; ++j){ for(j=0; j<8; ++j){
m[8*i+(j-i+8)%8] = tmp[j]; m[i+((j-i+8)%8)*8] = tmp[j];
} }
} }
#if DEBUG #if DEBUG
@ -96,11 +97,9 @@ void groestl_small_rounds(uint8_t *m, uint8_t q){
} }
#endif #endif
for(i=0; i<8; ++i){ for(i=0; i<8; ++i){
memcpy(tmp, m+8*i, 8);
for(j=0; j<8; ++j){ for(j=0; j<8; ++j){
tmp[j] = m[j*8+i]; m[j+i*8] = gf256mul(pgm_read_byte(matrix+8*j+0),tmp[0], POLYNOM)
}
for(j=0; j<8; ++j){
m[j*8+i] = gf256mul(pgm_read_byte(matrix+8*j+0),tmp[0], POLYNOM)
^ gf256mul(pgm_read_byte(matrix+8*j+1),tmp[1], POLYNOM) ^ gf256mul(pgm_read_byte(matrix+8*j+1),tmp[1], POLYNOM)
^ gf256mul(pgm_read_byte(matrix+8*j+2),tmp[2], POLYNOM) ^ gf256mul(pgm_read_byte(matrix+8*j+2),tmp[2], POLYNOM)
^ gf256mul(pgm_read_byte(matrix+8*j+3),tmp[3], POLYNOM) ^ gf256mul(pgm_read_byte(matrix+8*j+3),tmp[3], POLYNOM)
@ -108,7 +107,7 @@ void groestl_small_rounds(uint8_t *m, uint8_t q){
^ gf256mul(pgm_read_byte(matrix+8*j+5),tmp[5], POLYNOM) ^ gf256mul(pgm_read_byte(matrix+8*j+5),tmp[5], POLYNOM)
^ gf256mul(pgm_read_byte(matrix+8*j+6),tmp[6], POLYNOM) ^ gf256mul(pgm_read_byte(matrix+8*j+6),tmp[6], POLYNOM)
^ gf256mul(pgm_read_byte(matrix+8*j+7),tmp[7], POLYNOM); ^ gf256mul(pgm_read_byte(matrix+8*j+7),tmp[7], POLYNOM);
} }
} }
#if DEBUG #if DEBUG
if(r<2){ if(r<2){
@ -127,18 +126,19 @@ void groestl224_init(groestl224_ctx_t* ctx){
void groestl256_init(groestl256_ctx_t* ctx){ void groestl256_init(groestl256_ctx_t* ctx){
memset(ctx->h, 0, 8*8); memset(ctx->h, 0, 8*8);
ctx->h[8*7-1] = 1; ctx->h[8*8-2] = 1;
ctx->counter = 0; ctx->counter = 0;
} }
void groestl_small_nextBlock(groestl_small_ctx_t* ctx, const void* block){ void groestl_small_nextBlock(groestl_small_ctx_t* ctx, const void* block){
uint8_t tmp1[64], tmp2[65]; uint8_t tmp1[64], tmp2[65];
uint8_t i,j; /* for(i=0; i<8; ++i){
for(i=0; i<8; ++i){
for(j=0; j<8; ++j){ for(j=0; j<8; ++j){
tmp1[j*8+i] = ((uint8_t*)block)[i*8+j]; tmp1[j*8+i] = ((uint8_t*)block)[i*8+j];
} }
} }
*/
memcpy(tmp1, block, 64);
memcpy(tmp2, tmp1, 64); memcpy(tmp2, tmp1, 64);
memxor(tmp1, ctx->h, 64); memxor(tmp1, ctx->h, 64);
groestl_small_rounds(tmp1, 0); groestl_small_rounds(tmp1, 0);
@ -163,24 +163,23 @@ void groestl_small_lastBlock(groestl_small_ctx_t* ctx, const void* block, uint16
memset(buffer, 0, 64-4); memset(buffer, 0, 64-4);
} }
ctx->counter++; ctx->counter++;
buffer[64-1] = (uint8_t)(ctx->counter); buffer[64-1] = (uint8_t)(ctx->counter);
buffer[64-2] = (uint8_t)((ctx->counter)>>8); buffer[64-2] = (uint8_t)((ctx->counter)>>8);
buffer[64-3] = (uint8_t)((ctx->counter)>>16); buffer[64-3] = (uint8_t)((ctx->counter)>>16);
buffer[64-4] = (uint8_t)((ctx->counter)>>24); buffer[64-4] = (uint8_t)((ctx->counter)>>24);
groestl_small_nextBlock(ctx, buffer); groestl_small_nextBlock(ctx, buffer);
} }
void groestl_small_ctx2hash(void* dest, const groestl_small_ctx_t* ctx, uint16_t outlength_b){ void groestl_small_ctx2hash(void* dest, const groestl_small_ctx_t* ctx, uint16_t outlength_b){
uint8_t tmp[64]; uint8_t tmp[64];
uint8_t i,a,b;
memcpy(tmp, ctx->h, 64); memcpy(tmp, ctx->h, 64);
groestl_small_rounds(tmp, 0); groestl_small_rounds(tmp, 0);
memxor(tmp, ctx->h, 64); memxor(tmp, ctx->h, 64);
for(i=0; i<outlength_b/8; ++i){ #if DEBUG
a = (64-i-1)%8; cli_putstr_P(PSTR("\r\npost finalisation"));
b = (64-i-1)/8; dump_m(tmp);
((uint8_t*)dest)[outlength_b/8-1-i] = tmp[a*8+b]; #endif
} memcpy(dest, tmp+64-outlength_b/8, outlength_b/8);
} }
void groestl224_ctx2hash(void* dest, const groestl224_ctx_t* ctx){ void groestl224_ctx2hash(void* dest, const groestl224_ctx_t* ctx){