/* * Function: ECRYPT_ivsetup * * Synopsis * Load the key and perform initial clockings. * * Assumptions * The key is 10 bytes and the IV is 8 bytes. The * registers are loaded in the following way: * * NFSR[0] = lsb of key[0] * ... * NFSR[7] = msb of key[0] * ... * ... * NFSR[72] = lsb of key[9] * ... * NFSR[79] = msb of key[9] * LFSR[0] = lsb of IV[0] * ... * LFSR[7] = msb of IV[0] * ... * ... * LFSR[56] = lsb of IV[7] * ... * LFSR[63] = msb of IV[7] */ void ECRYPT_ivsetup( ECRYPT_ctx* ctx, const u8* iv) { u32 i,j; u8 outbit; /* load registers */ for (i=0;i<(ctx->ivsize)/8;++i) { for (j=0;j<8;++j) { ctx->NFSR[i*8+j]=((ctx->p_key[i]>>j)&1); ctx->LFSR[i*8+j]=((iv[i]>>j)&1); } } for (i=(ctx->ivsize)/8;i<(ctx->keysize)/8;++i) { for (j=0;j<8;++j) { ctx->NFSR[i*8+j]=((ctx->p_key[i]>>j)&1); ctx->LFSR[i*8+j]=1; } } /* do initial clockings */ for (i=0;i<INITCLOCKS;++i) { outbit=grain_keystream(ctx); ctx->LFSR[79]^=outbit; ctx->NFSR[79]^=outbit; } }
/* * Function: ECRYPT_ivsetup * * Synopsis * Load the key and perform initial clockings. * * Assumptions * The key is 10 bytes and the IV is 8 bytes. * */ void ECRYPT_ivsetup( ECRYPT_ctx* ctx, const u8* iv) { u32 outbit; int i; u8 *b=(u8*)ctx->b; u8 *s=(u8*)ctx->s; for(i=0;i<10;i++) b[i]=ctx->p_key[i]; for(i=0;i<ctx->ivsize/8;i++) s[i]=iv[i]; for(i=ctx->ivsize/8;i<10;i++) s[i]=0xff; /* do initial clockings */ for (i=0;i<INITCLOCKS;++i) { outbit=grain_keystream(ctx); xor79(S,outbit); xor79(B,outbit); } //print_ctx(ctx); }
/* * Function: ECRYPT_keystream_bytes * * Synopsis * Generate keystream in bytes. * * Assumptions * Bits are generated in order z0,z1,z2,... * The bits are stored in a byte in order: * * lsb of keystream[0] = z0 * ... * msb of keystream[0] = z7 * ... * lsb of keystream[1] = z8 * ... * msb of keystream[1] = z15 * ... * ... * ... * Example: The bit keystream: 10011100 10110011 .. * corresponds to the byte keystream: 39 cd .. */ void ECRYPT_keystream_bytes( ECRYPT_ctx* ctx, u8* keystream, u32 msglen) { u32 i,j; for (i = 0; i < msglen; ++i) { keystream[i]=0; for (j = 0; j < 8; ++j) { keystream[i]|=(grain_keystream(ctx)<<j); } } }
void ECRYPT_decrypt_bytes( ECRYPT_ctx* ctx, const u8* ciphertext, u8* plaintext, u32 msglen) { u32 i,j; u8 k=0; for (i = 0; i < msglen; ++i) { k=0; for (j = 0; j < 8; ++j) { k|=(grain_keystream(ctx)<<j); } plaintext[i]=ciphertext[i]^k; } }