]> git.cryptolib.org Git - avr-crypto-lib.git/blob - trivium.c
cd89b5671680a1340b5a6ae1e50232bc19cb18ee
[avr-crypto-lib.git] / trivium.c
1 /**
2  * 
3  * author: Daniel Otte
4  * email:  daniel.otte@rub.de
5  * license: GPLv3
6  * 
7  */
8
9  
10 #include <stdint.h>
11 #include <string.h>
12 #include "trivium.h"
13
14 #define S(i) ((((*ctx)[(i)/8])>>((i)%8))&1)
15 uint8_t trivium_enc(trivium_ctx_t* ctx){
16         uint8_t t1,t2,t3,z;
17         
18         t1 = S(65)  ^ S(92);
19         t2 = S(161) ^ S(176);
20         t3 = S(242) ^ S(287);
21         z  = t1^t2^t3;
22         t1 ^= (S(90)  & S(91))  ^ S(170);
23         t2 ^= (S(174) & S(175)) ^ S(263);
24         t3 ^= (S(285) & S(286)) ^ S(68);
25         
26         /* shift whole state and insert ts later */
27         uint8_t i,c1=0,c2;
28         for(i=0; i<36; ++i){
29                 c2=(((*ctx)[i])>>7);
30                 (*ctx)[i] = (((*ctx)[i])<<1)|c1;
31                 c1=c2;
32         }
33         /* insert ts */
34         (*ctx)[0] = (((*ctx)[0])&0xFE)| t3; /* s0*/
35         (*ctx)[93/8] = (((*ctx)[93/8])& (~(1<<(93%8)))) | (t1<<(93%8)); /* s93 */
36         (*ctx)[177/8] = (((*ctx)[177/8])& (~(1<<(177%8)))) | (t2<<(177%8));/* s177 */
37         
38         return z;
39 }
40
41 #define KEYSIZE_B ((keysize_b+7)/8)
42 #define IVSIZE_B  ((ivsize_b +7)/8)
43
44 void trivium_init(const void* key, uint8_t keysize_b, 
45                   const void* iv,  uint8_t ivsize_b,
46                   trivium_ctx_t* ctx){
47         uint16_t i;
48         uint8_t c1=0,c2;
49
50         memset((*ctx)+KEYSIZE_B, 0, 35-KEYSIZE_B);
51         memcpy((*ctx), key, KEYSIZE_B);
52         memcpy((*ctx)+12, iv, IVSIZE_B); /* iv0 is at s96, must shift to s93 */
53         
54         for(i=12+IVSIZE_B; i>10; --i){
55                 c2=(((*ctx)[i])<<5);
56                 (*ctx)[i] = (((*ctx)[i])>>3)|c1;
57                 c1=c2;
58         }
59         (*ctx)[35]=0xE0;
60         
61         for(i=0; i<4*288; ++i){
62                 trivium_enc(ctx);
63         }
64 }
65
66