6 * Description: Implementation of the A5/1 stream cipher algorithm, as used in GSM.
7 * ! Warning, this is weak crypto !
14 #include <avr/pgmspace.h>
16 uint8_t a5_1_clock_core(a5_1_ctx_t *c, uint8_t clockoverride);
20 * length is length of key in bytes!
23 void a5_1_init(a5_1_ctx_t *c, void* key, uint8_t keylength_b, void* iv, uint8_t ivlength_b){
28 for(i=0; i<keylength_b; ++i){
29 t=((uint8_t*)key)[i/8];
34 a5_1_clock_core(c, 0x7);
36 for(i=0; i<ivlength_b; ++i){
37 t=((uint8_t*)iv)[i/8];
42 a5_1_clock_core(c, 0x7);
49 void shiftreg(uint8_t* d){
55 d[2] = (d[2]<<1) | c2;
58 uint8_t parity3_lut[] PROGMEM = {0, 1, 1, 0,
60 uint8_t clock_lut[] PROGMEM = {0x7, 0x6, 0x5, 0x3,
63 uint8_t a5_1_clock_core(a5_1_ctx_t *c, uint8_t clockoverride){
65 ret = (0x04&c->r1[2]) | (0x20&c->r2[2]) | (0x40&c->r3[2]);
68 ret = pgm_read_byte(parity3_lut+ret);
69 clk = (0x08&c->r1[1]) | (0x10&c->r2[1]) | (0x20&c->r3[1]);
71 clk = pgm_read_byte(clock_lut+clk);
75 fb = c->r1[2] ^ (1&((c->r1[1])>>5));
77 fb = pgm_read_byte(parity3_lut+fb);
86 fb = pgm_read_byte(parity3_lut+fb);
94 fb = (c->r3[2]>>4) ^ (1&((c->r3[0])>>7));
96 fb = pgm_read_byte(parity3_lut+fb);
104 uint8_t a5_1_clock(a5_1_ctx_t *c){
105 return a5_1_clock_core(c, 0);
109 uint8_t a5_1_gen(a5_1_ctx_t *c){