]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - grain/grain.c
a lot of fixes
[avr-crypto-lib.git] / grain / grain.c
index 8d30d2266299a367a2f5891daa0220f58642fe2d..ff6b97de41b46b689c211635d0d9613d557bca36 100644 (file)
 #define _B(i) (((ctx->nfsr[9-((i)/8)])>>(7-((i)%8)))&1)
 
 
-uint8_t h_lut[4] PROGMEM = {0x4C, 0xB6, 0xD3, 0x26};
+const uint8_t h_lut[4] PROGMEM = {0x4C, 0xB6, 0xD3, 0x26};
 
 #ifdef GRAIN_BADOPTIMISATION
-uint8_t g_lut[128] PROGMEM = {
+const uint8_t g_lut[128] PROGMEM = {
         0xF0, 0xA5, 0x0F, 0x5A, 0x0F, 0x5A, 0xF0, 0xA5, 0x0F, 0x5A, 0xF0, 0xA5, 0xF0, 0x5A, 0x0F, 0x0F, 
         0xC3, 0x96, 0x3C, 0x69, 0x3C, 0x69, 0xC3, 0x96, 0x9C, 0xC9, 0x63, 0x36, 0x63, 0xC9, 0x9C, 0x9C, 
         0x0F, 0x5A, 0x0F, 0x5A, 0xF0, 0xA5, 0xF0, 0x5A, 0xF0, 0xA5, 0xF0, 0xA5, 0x0F, 0xA5, 0x0F, 0xF0, 
@@ -134,7 +134,17 @@ uint8_t grain_enc(grain_ctx_t* ctx){
        h = (pgm_read_byte(h_lut+(i/8)))>>(i%8);
        
        h ^= B(0) ^ B(1) ^ B(3) ^ B(9) ^ B(30) ^ B(42) ^ B(55);
-       return h&1;
+       return (h&1);
+}
+
+uint8_t grain_getbyte(grain_ctx_t* ctx){
+       uint8_t i=0;
+       uint8_t r=0;
+       do{
+               r >>= 1;
+               r |= grain_enc(ctx)?0x80:0x00;
+       }while(++i<8);
+       return r;
 }
 
 #ifdef GRAIN_REVERSEKEY