X-Git-Url: https://git.cryptolib.org/?p=avr-crypto-lib.git;a=blobdiff_plain;f=rabbit%2Frabbit_c.c;h=89019d82bfa763d537729d29c402d05fbe4a47c0;hp=6c750a5280995387a3f6823314340dfb0387da74;hb=4b5da1dc27a791b5c448274a3db09cd035b33493;hpb=89bbbf7604fa48ddba5877263220791045b6ee6f diff --git a/rabbit/rabbit_c.c b/rabbit/rabbit_c.c index 6c750a5..89019d8 100644 --- a/rabbit/rabbit_c.c +++ b/rabbit/rabbit_c.c @@ -1,7 +1,7 @@ /* rabbit_c.c */ /* This file is part of the ARM-Crypto-Lib. - Copyright (C) 2006-2011 Daniel Otte (daniel.otte@rub.de) + Copyright (C) 2006-2015 Daniel Otte (bg@nerilex.org) 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 @@ -23,11 +23,11 @@ #include "rabbit.h" #ifndef ESTREAM -#define ESTREAM 1 +#define ESTREAM 0 #endif /* -void dump_ctx(rabbit_ctx_t* ctx){ +void dump_ctx(rabbit_ctx_t *ctx){ uint8_t i=0; cli_putstr_P(PSTR("\r\n --- ctx dump ---\r\n b = ")); cli_hexdump_byte(ctx->carry); @@ -62,7 +62,7 @@ const uint32_t c_const[8] PROGMEM = { }; static -void gen_g(uint32_t* dest, rabbit_ctx_t* ctx){ +void gen_g(uint32_t *dest, rabbit_ctx_t *ctx){ uint8_t i=0; uint64_t a; uint32_t t, *x, *c; @@ -76,7 +76,7 @@ void gen_g(uint32_t* dest, rabbit_ctx_t* ctx){ } static -void update_c(rabbit_ctx_t* ctx){ +void update_c(rabbit_ctx_t *ctx){ uint8_t i=0; uint64_t a; uint32_t *c; @@ -97,7 +97,7 @@ void update_c(rabbit_ctx_t* ctx){ #define ROT8(a) (((a)<< 8) | ((a)>>24)) static -void step(rabbit_ctx_t* ctx){ +void step(rabbit_ctx_t *ctx){ uint32_t g[8]; uint8_t i=0; update_c(ctx); @@ -111,7 +111,7 @@ void step(rabbit_ctx_t* ctx){ } static -void keysetup(rabbit_ctx_t* ctx, const void* key){ +void keysetup(rabbit_ctx_t *ctx, const void *key){ uint16_t *x, *c; uint8_t i=0; x = (uint16_t*)(ctx->x); @@ -139,27 +139,31 @@ void keysetup(rabbit_ctx_t* ctx, const void* key){ } static -void ivsetup(rabbit_ctx_t* ctx, const void* iv){ +void ivsetup(rabbit_ctx_t *ctx, const void *iv){ uint8_t i; uint32_t t; - uint8_t t_iv[8]; + union __attribute__((packed)){ + uint8_t v8[8]; + uint16_t v16[4]; + uint32_t v32[2]; + }t_iv; i=0; #if ESTREAM - memcpy(t_iv, iv, 8); + memcpy(t_iv.v8, iv, 8); #else do{ - t_iv[i] = ((uint8_t*)iv)[7-i]; - t_iv[7-i] = ((uint8_t*)iv)[i]; + t_iv.v8[i] = ((uint8_t*)iv)[7-i]; + t_iv.v8[7-i] = ((uint8_t*)iv)[i]; }while(++i<4); #endif - ctx->c[0] ^= *((uint32_t*)t_iv); - ctx->c[4] ^= *((uint32_t*)t_iv); - ctx->c[2] ^= ((uint32_t*)t_iv)[1]; - ctx->c[6] ^= ((uint32_t*)t_iv)[1]; - t = (( (uint32_t)((uint16_t*)t_iv)[3])<<16) | (((uint16_t*)t_iv)[1]); + ctx->c[0] ^= t_iv.v32[0]; + ctx->c[4] ^= t_iv.v32[0]; + ctx->c[2] ^= t_iv.v32[1]; + ctx->c[6] ^= t_iv.v32[1]; + t = ( ((uint32_t)(t_iv.v16[3]))<<16) | (t_iv.v16[1]); ctx->c[1] ^= t; ctx->c[5] ^= t; - t = (( (uint32_t)((uint16_t*)t_iv)[2])<<16) | (((uint16_t*)t_iv)[0]); + t = ( ((uint32_t)(t_iv.v16[2]))<<16) | (t_iv.v16[0]); ctx->c[3] ^= t; ctx->c[7] ^= t; i=4; @@ -169,7 +173,7 @@ void ivsetup(rabbit_ctx_t* ctx, const void* iv){ } static -void extract(rabbit_ctx_t* ctx){ +void extract(rabbit_ctx_t *ctx){ int8_t i=0; uint8_t *t; uint16_t v; @@ -200,9 +204,9 @@ void extract(rabbit_ctx_t* ctx){ static const uint8_t key80_pad[] PROGMEM = { 0xDE, 0x05, 0x6E, 0xAC, 0x8A, 0x11 }; -void rabbit_init(const void* key, uint16_t keysize_b, - const void* iv, - rabbit_ctx_t* ctx){ +void rabbit_init(const void *key, uint16_t keysize_b, + const void *iv, + rabbit_ctx_t *ctx){ uint8_t t_key[16]; if(keysize_b==80){ memcpy(t_key, key, 10); @@ -228,7 +232,7 @@ void rabbit_init(const void* key, uint16_t keysize_b, ctx->buffer_idx = 16; } -uint8_t rabbit_gen(rabbit_ctx_t* ctx){ +uint8_t rabbit_gen(rabbit_ctx_t *ctx){ if(ctx->buffer_idx==16){ step(ctx); extract(ctx);