From cd50f65c371296cc88b46f45a609713f96644662 Mon Sep 17 00:00:00 2001 From: bg Date: Sat, 12 Jan 2013 18:04:32 +0100 Subject: [PATCH] [keccak-c] fixing --- keccak/keccak.c | 100 ++++++++++++++++++------------------------------ keccak/keccak.h | 2 +- 2 files changed, 38 insertions(+), 64 deletions(-) diff --git a/keccak/keccak.c b/keccak/keccak.c index f568ff6..6327595 100644 --- a/keccak/keccak.c +++ b/keccak/keccak.c @@ -96,7 +96,7 @@ const static uint8_t r[5][5] PROGMEM = { }; static inline -void keccak_round(uint64_t a[5][5], uint8_t rci){ +void keccak_round(uint64_t *a, uint8_t rci){ uint64_t b[5][5]; uint8_t i, j; union { @@ -105,12 +105,12 @@ void keccak_round(uint64_t a[5][5], uint8_t rci){ } t; /* theta */ for(i = 0; i < 5; ++i){ - b[i][0] = a[0][i] ^ a[1][i] ^ a[2][i] ^ a[3][i] ^ a[4][i]; + b[i][0] = a[i] ^ a[5 + i] ^ a[10 + i] ^ a[15 + i] ^ a[20 + i]; } for(i = 0; i < 5; ++i){ t.v64 = b[(4 + i) % 5][0] ^ rotate64_1bit_left(b[(i + 1) % 5][0]); for(j = 0; j < 5; ++j){ - a[j][i] ^= t.v64; + a[j * 5 + i] ^= t.v64; } } #if DEBUG @@ -120,7 +120,7 @@ void keccak_round(uint64_t a[5][5], uint8_t rci){ /* rho & pi */ for(i = 0; i < 5; ++i){ for(j = 0; j < 5; ++j){ - b[(2 * i + 3 * j) % 5][j] = rotate64left_code(a[j][i], pgm_read_byte(&(r[i][j]))); + b[(2 * i + 3 * j) % 5][j] = rotate64left_code(a[j * 5 +i], pgm_read_byte(&(r[i][j]))); } } #if DEBUG @@ -130,7 +130,7 @@ void keccak_round(uint64_t a[5][5], uint8_t rci){ /* chi */ for(i = 0; i < 5; ++i){ for(j = 0; j < 5; ++j){ - a[j][i] = b[j][i] ^ ((~(b[j][(i + 1) % 5])) & (b[j][(i + 2) % 5])); + a[j * 5 + i] = b[j][i] ^ ((~(b[j][(i + 1) % 5])) & (b[j][(i + 2) % 5])); } } #if DEBUG @@ -153,14 +153,14 @@ void keccak_round(uint64_t a[5][5], uint8_t rci){ } t.v8[0] &= 0x8F; - a[0][0] ^= t.v64; + a[0] ^= t.v64; #if DEBUG cli_putstr_P(PSTR("\r\nAfter iota:")); keccak_dump_state(a); #endif } -void keccak_f1600(uint64_t a[5][5]){ +void keccak_f1600(void* a){ uint8_t i = 0; do { #if DEBUG @@ -168,7 +168,7 @@ void keccak_f1600(uint64_t a[5][5]){ cli_hexdump(&i, 1); cli_putstr_P(PSTR(" ---")); #endif - keccak_round(a, i); + keccak_round((uint64_t*)a, i); } while (++i < 24); } @@ -178,57 +178,33 @@ void keccak_nextBlock(keccak_ctx_t* ctx, const void* block){ } void keccak_lastBlock(keccak_ctx_t* ctx, const void* block, uint16_t length_b){ - while(length_b>=ctx->r){ - keccak_nextBlock(ctx, block); - block = (uint8_t*)block + ctx->bs; - length_b -= ctx->r; - } - uint8_t tmp[ctx->bs]; - uint8_t pad[3]; - memset(tmp, 0x00, ctx->bs); - memcpy(tmp, block, (length_b+7)/8); - /* appand 1 */ - if(length_b & 7){ - /* we have some single bits */ - uint8_t t; - t = tmp[length_b / 8] >> (8 - (length_b & 7)); - t |= 0x01 << (length_b & 7); - tmp[length_b / 8] = t; - }else{ - tmp[length_b / 8] = 0x01; - } - pad[0] = ctx->d; - pad[1] = ctx->bs; - pad[2] = 0x01; - if(length_b / 8 + 1 + 3 <= ctx->bs){ - memcpy(tmp + length_b / 8 + 1, pad, 3); - }else{ - if(length_b / 8 + 1 + 2 <= ctx->bs){ - memcpy(tmp+length_b/8+1, pad, 2); - keccak_nextBlock(ctx, tmp); - memset(tmp, 0x00, ctx->bs); - tmp[0] = 0x01; - }else{ - if(length_b/8+1+1 <= ctx->bs){ - memcpy(tmp + length_b / 8 + 1, pad, 1); - keccak_nextBlock(ctx, tmp); - memset(tmp, 0x00, ctx->bs); - tmp[0] = ctx->bs; - tmp[1] = 0x01; - }else{ - keccak_nextBlock(ctx, tmp); - memset(tmp, 0x00, ctx->bs); - tmp[0] = ctx->d; - tmp[1] = ctx->bs; - tmp[2] = 0x01; - } - } - } - keccak_nextBlock(ctx, tmp); + uint8_t length_B; + while(length_b >= ctx->r){ + keccak_nextBlock(ctx, block); + block = (uint8_t*)block + ctx->bs; + length_b -= ctx->r; + } + length_B = length_b / 8; + memxor(ctx->a, block, length_B); + /* append 1 */ + if(length_b & 7){ + /* we have some single bits */ + uint8_t t; + t = ((uint8_t*)block)[length_B] >> (8 - (length_b & 7)); + t |= 0x01 << (length_b & 7); + ctx->a[length_B] ^= t; + }else{ + ctx->a[length_B] ^= 0x01; + } + if(length_b == ctx->r - 1){ + keccak_f1600(ctx->a); + } + ctx->a[ctx->bs - 1] ^= 0x80; + keccak_f1600(ctx->a); } void keccak_ctx2hash(void* dest, uint16_t length_b, keccak_ctx_t* ctx){ - while(length_b>=ctx->r){ + while(length_b >= ctx->r){ memcpy(dest, ctx->a, ctx->bs); dest = (uint8_t*)dest + ctx->bs; length_b -= ctx->r; @@ -259,26 +235,24 @@ void keccak512_ctx2hash(void* dest, keccak_ctx_t* ctx){ 3. SHA3-384: ⌊Keccak[r = 832, c = 768, d = 48]⌋384 4. SHA3-512: ⌊Keccak[r = 576, c = 1024, d = 64]⌋512 */ -void keccak_init(uint16_t r, uint16_t c, uint8_t d, keccak_ctx_t* ctx){ +void keccak_init(uint16_t r, keccak_ctx_t* ctx){ memset(ctx->a, 0x00, 5 * 5 * 8); ctx->r = r; - ctx->c = c; - ctx->d = d; ctx->bs = (uint8_t)(r / 8); } void keccak224_init(keccak_ctx_t* ctx){ - keccak_init(1152, 448, 28, ctx); + keccak_init(1152, ctx); } void keccak256_init(keccak_ctx_t* ctx){ - keccak_init(1088, 512, 32, ctx); + keccak_init(1088, ctx); } void keccak384_init(keccak_ctx_t* ctx){ - keccak_init( 832, 768, 48, ctx); + keccak_init( 832, ctx); } void keccak512_init(keccak_ctx_t* ctx){ - keccak_init( 576, 1024, 64, ctx); + keccak_init( 576, ctx); } diff --git a/keccak/keccak.h b/keccak/keccak.h index b9ecd3e..edc8d81 100644 --- a/keccak/keccak.h +++ b/keccak/keccak.h @@ -38,7 +38,7 @@ typedef struct{ } keccak_ctx_t; -void keccak_init(uint16_t r, uint16_t c, uint8_t d, keccak_ctx_t* ctx); +void keccak_init(uint16_t r, keccak_ctx_t* ctx); void keccak224_init(keccak_ctx_t* ctx); void keccak256_init(keccak_ctx_t* ctx); void keccak384_init(keccak_ctx_t* ctx); -- 2.39.2