#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,
0xF3, 0x2E, 0xF3, 0x2E, 0x0C, 0xD1, 0x0C, 0x2E, 0xAC, 0x71, 0xAC, 0x71, 0x53, 0x71, 0xA3, 0xD4 };
#endif
-uint8_t grain_enc(grain_ctx_t* ctx){
+uint8_t grain_enc(grain_ctx_t *ctx){
uint8_t s80, s0, c1, c2;
uint8_t i;
/* clock the LFSR */
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
#endif
-void grain_init(const void* key, const void* iv, grain_ctx_t* ctx){
+void grain_init(const void *key, const void *iv, grain_ctx_t *ctx){
uint8_t i,t;
/* load the 80bit key */