/* 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
#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);
};
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;
}
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;
#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);
}
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);
}
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;
}
static
-void extract(rabbit_ctx_t* ctx){
+void extract(rabbit_ctx_t *ctx){
int8_t i=0;
uint8_t *t;
uint16_t v;
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);
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);