3 This file is part of the ARM-Crypto-Lib.
4 Copyright (C) 2006-2011 Daniel Otte (daniel.otte@rub.de)
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
29 void dump_ctx(rabbit_ctx_t* ctx){
31 cli_putstr_P(PSTR("\r\n --- ctx dump ---\r\n b = "));
32 cli_hexdump_byte(ctx->carry);
35 cli_putstr_P(PSTR("\r\n"));
37 cli_putstr_P(PSTR(" X"));
39 cli_putstr_P(PSTR(" = 0x"));
40 cli_hexdump_rev(&(ctx->x[i]), 4);
45 cli_putstr_P(PSTR("\r\n"));
47 cli_putstr_P(PSTR(" C"));
49 cli_putstr_P(PSTR(" = 0x"));
50 cli_hexdump_rev(&(ctx->c[i]), 4);
56 const uint32_t c_const[8] = {
57 0x4D34D34D, 0xD34D34D3,
58 0x34D34D34, 0x4D34D34D,
59 0xD34D34D3, 0x34D34D34,
60 0x4D34D34D, 0xD34D34D3
64 void gen_g(uint32_t* dest, rabbit_ctx_t* ctx){
72 a = ((uint64_t)t)*((uint64_t)t);
73 dest[i] = (uint32_t)(a^(a>>32));
78 void update_c(rabbit_ctx_t* ctx){
95 #define ROT16(a) (((a)<<16) | ((a)>>16))
96 #define ROT8(a) (((a)<< 8) | ((a)>>24))
99 void step(rabbit_ctx_t* ctx){
104 memcpy(ctx->x, g, 8*4);
106 ctx->x[i] += ROT16(g[(i+8-1)%8]) + ROT16(g[(i+8-2)%8]);
108 ctx->x[i] += ROT8(g[(i+8-1)%8]) + g[(i+8-2)%8];
113 void keysetup(rabbit_ctx_t* ctx, const void* key){
116 x = (uint16_t*)(ctx->x);
117 c = (uint16_t*)(ctx->c);
120 *x++ = ((uint16_t*)key)[i];
121 *x++ = ((uint16_t*)key)[(i+1)%8];
122 *c++ = ((uint16_t*)key)[(i+5)%8];
123 *c++ = ((uint16_t*)key)[(i+4)%8];
125 *x++ = ((uint16_t*)key)[(i+4)%8];
126 *x++ = ((uint16_t*)key)[(i+5)%8];
127 *c++ = ((uint16_t*)key)[(i+1)%8];
128 *c++ = ((uint16_t*)key)[i];
136 ctx->c[i] ^= ctx->x[(i+4)%8];
141 void ivsetup(rabbit_ctx_t* ctx, const void* iv){
144 union __attribute__((packed)){
151 memcpy(t_iv.v8, iv, 8);
154 t_iv.v8[i] = ((uint8_t*)iv)[7-i];
155 t_iv.v8[7-i] = ((uint8_t*)iv)[i];
158 ctx->c[0] ^= t_iv.v32[0];
159 ctx->c[4] ^= t_iv.v32[0];
160 ctx->c[2] ^= t_iv.v32[1];
161 ctx->c[6] ^= t_iv.v32[1];
162 t = ( ((uint32_t)(t_iv.v16[3]))<<16) | (t_iv.v16[1]);
165 t = ( ((uint32_t)(t_iv.v16[2]))<<16) | (t_iv.v16[0]);
175 void extract(rabbit_ctx_t* ctx){
182 v = ((uint16_t*)(ctx->x))[(2*(i+ 8)+1)%16]
183 ^ ((uint16_t*)(ctx->x))[(2*(i+11)+0)%16];
186 v = ((uint16_t*)(ctx->x))[(2*(i+ 8)+0)%16]
187 ^ ((uint16_t*)(ctx->x))[(2*(i+13)+1)%16];
198 ctx->buffer[i] = ctx->buffer[15-i];
199 ctx->buffer[15-i] = x;
204 static const uint8_t key80_pad[] = { 0xDE, 0x05, 0x6E, 0xAC, 0x8A, 0x11 };
206 void rabbit_init(const void* key, uint16_t keysize_b,
211 memcpy(t_key, key, 10);
212 memcpy(t_key+10, key80_pad, 6);
214 memcpy(t_key, key, 16);
220 t_key[i] = t_key[15-i];
224 keysetup(ctx, t_key);
231 ctx->buffer_idx = 16;
234 uint8_t rabbit_gen(rabbit_ctx_t* ctx){
235 if(ctx->buffer_idx==16){
240 return ctx->buffer[ctx->buffer_idx++];