]> git.cryptolib.org Git - avr-crypto-lib.git/blob - A5_1.c
new, derived from old avr/crypto + cast5
[avr-crypto-lib.git] / A5_1.c
1 /* 
2  * File:                A5_1.c
3  * Author:      Daniel Otte
4  * Date:        24.06.2006
5  * License: GPL
6  * Description: Implementation of the A5/1 stream cipher algorithm, as used in GSM.
7  * ! Warning, this is weak crypto !
8  * 
9  */
10  
11 #include <stdint.h>
12 #include "A5_1.h"
13
14 /*
15  * length is length of key in bytes!
16  */
17 #define BYTEn(p,s) (*(((uint8_t*)&(p))+s))
18
19 void            a5_1_init(a5_1_ctx_t *c, uint8_t *key, uint8_t length);
20
21 bool     a5_1_clock(a5_1_ctx_t *c){
22         bool x1,x2,x3, maj;
23         x1 = PARITY_LOOKUP & (1<< ((BYTEn(c->r1,2)+BYTEn(c->r1,1)>>5) & 0x7);
24         x2 = PARITY_LOOKUP & (1<< (BYTEn(c->r2,2)>>4));
25         x3 = PARITY_LLOKUP & (1<< ((BYTEn(c->r3,2)>>4+BYTEn(c->r3,0)>>7) & 0x7));
26         maj = (((c->r1 & (1<<R1_CLK))?1:0)+((c->r2 & (1<<R2_CLK))?1:0)+((c->r3 & (1<<R3_CLK))?1:0))>=2;
27         if (((c->r1 & (1<<R1_CLK))>>R1_CLK) == maj)
28                 c->r1 = c->r1<<1 + x1;
29         if (((c->r2 & (1<<R2_CLK))>>R2_CLK) == maj)
30                 c->r2 = c->r2<<1 + x2;
31         if (((c->r3 & (1<<R3_CLK))>>R3_CLK) == maj)
32                 c->r3 = c->r3<<1 + x3;
33                 
34         return ((c->r1)>>(R1_LENGTH-1)+(c->r2)>>(R2_LENGTH-1)+(c->r3)>>(R3_LENGTH-1))&0x1;
35 }
36
37 uint8_t a5_1_gen(a5_    1_ctx_t *c){
38         uint8_t ret=0;
39         ret = a5_1_clock(c);
40         ret <<= 1;
41         ret = a5_1_clock(c);
42         ret <<= 1;
43         ret = a5_1_clock(c);
44         ret <<= 1;
45         ret = a5_1_clock(c);
46         ret <<= 1;
47         ret = a5_1_clock(c);
48         ret <<= 1;
49         ret = a5_1_clock(c);
50         ret <<= 1;
51         ret = a5_1_clock(c);
52         ret <<= 1;
53         ret = a5_1_clock(c);
54         return ret;
55 }
56
57
58
59