X-Git-Url: https://git.cryptolib.org/?p=avr-crypto-lib.git;a=blobdiff_plain;f=trivium%2Ftrivium.c;h=15f2b934ce379ac590a168faeb1c6249031e8760;hp=3ac69c3b263eb60848d8252feaf97cc0d944840d;hb=12b222bf434f472559a8791acdb57c0f154111fb;hpb=66c915087d1f7b8eb7280be43c16e9588faf2e55 diff --git a/trivium/trivium.c b/trivium/trivium.c index 3ac69c3..15f2b93 100644 --- a/trivium/trivium.c +++ b/trivium/trivium.c @@ -29,17 +29,18 @@ #include #include "trivium.h" -#define S(i) ((((*ctx)[(i)/8])>>((i)%8))&1) +#define G(i) ((((*ctx)[(i)/8])>>(((i)%8)))&1) +#define S(i,v) ((*ctx)[(i)/8] = ((*ctx)[(i)/8] & ~(1<<((i)%8))) | ((v)<<((i)%8))) uint8_t trivium_enc(trivium_ctx_t* ctx){ uint8_t t1,t2,t3,z; - t1 = S(65) ^ S(92); - t2 = S(161) ^ S(176); - t3 = S(242) ^ S(287); + t1 = G(65) ^ G(92); + t2 = G(161) ^ G(176); + t3 = G(242) ^ G(287); z = t1^t2^t3; - t1 ^= (S(90) & S(91)) ^ S(170); - t2 ^= (S(174) & S(175)) ^ S(263); - t3 ^= (S(285) & S(286)) ^ S(68); + t1 ^= (G(90) & G(91)) ^ G(170); + t2 ^= (G(174) & G(175)) ^ G(263); + t3 ^= (G(285) & G(286)) ^ G(68); /* shift whole state and insert ts later */ uint8_t i,c1=0,c2; @@ -49,18 +50,18 @@ uint8_t trivium_enc(trivium_ctx_t* ctx){ c1=c2; } /* insert ts */ - (*ctx)[0] = (((*ctx)[0])&0xFE)| t3; /* s0*/ - (*ctx)[93/8] = (((*ctx)[93/8])& (~(1<<(93%8)))) | (t1<<(93%8)); /* s93 */ - (*ctx)[177/8] = (((*ctx)[177/8])& (~(1<<(177%8)))) | (t2<<(177%8));/* s177 */ + S(0, t3); + S(93, t1); + S(177, t2); - return z; + return z?0x080:0x00; } #define KEYSIZE_B ((keysize_b+7)/8) #define IVSIZE_B ((ivsize_b +7)/8) -void trivium_init(const void* key, uint8_t keysize_b, - const void* iv, uint8_t ivsize_b, +void trivium_init(const void* key, uint16_t keysize_b, + const void* iv, uint16_t ivsize_b, trivium_ctx_t* ctx){ uint16_t i; uint8_t c1=0,c2; @@ -68,13 +69,13 @@ void trivium_init(const void* key, uint8_t keysize_b, memset((*ctx)+KEYSIZE_B, 0, 35-KEYSIZE_B); memcpy((*ctx), key, KEYSIZE_B); memcpy((*ctx)+12, iv, IVSIZE_B); /* iv0 is at s96, must shift to s93 */ - + for(i=12+IVSIZE_B; i>10; --i){ c2=(((*ctx)[i])<<5); (*ctx)[i] = (((*ctx)[i])>>3)|c1; c1=c2; } - (*ctx)[35]=0xE0; + (*ctx)[35] |= 0xE0; for(i=0; i<4*288; ++i){ trivium_enc(ctx);