void kuz_lt (w128_t *w, int enc) { int i, j; uint8_t x; // Linear vector from sect 5.1.2 const uint8_t kuz_lvec[16] = { 0x94, 0x20, 0x85, 0x10, 0xC2, 0xC0, 0x01, 0xFB, 0x01, 0xC0, 0xC2, 0x10, 0x85, 0x20, 0x94, 0x01 }; // 16 rounds for (j=0; j<16; j++) { if (enc == KUZ_ENCRYPT) { // An LFSR with 16 elements from GF(2^8) x = w->b[15]; // since lvec[15] = 1 for (i = 14; i >= 0; i--) { w->b[i + 1] = w->b[i]; x ^= kuz_mul_gf256(w->b[i], kuz_lvec[i]); } w->b[0] = x; } else { x = w->b[0]; for (i = 0; i < 15; i++) { w->b[i] = w->b[i + 1]; x ^= kuz_mul_gf256(w->b[i], kuz_lvec[i]); } w->b[15] = x; } } }
INLINE void kuz_l(w128_t *w) { #if(!USE_ASM) uint8_t x; // 16 rounds for (unsigned int j = 0; j < sizeof(kuz_lvec)/sizeof(kuz_lvec[0]); j++) { // An LFSR with 16 elements from GF(2^8) x = w->b[15]; // since lvec[15] = 1 for (int i = 14; i >= 0; i--) { w->b[i + 1] = w->b[i]; x ^= kuz_mul_gf256(w->b[i], kuz_lvec[i]); } w->b[0] = x; } #else #if(USE_MUL_TABLE) kuz_l_asm_table(w); #else kuz_l_asm(w); #endif #endif }
INLINE void kuz_l_inv(w128_t *w) { #if(!USE_ASM) uint8_t x; // 16 rounds for (unsigned int j = 0; j < sizeof(kuz_lvec)/sizeof(kuz_lvec[0]); j++) { x = w->b[0]; for (int i = 0; i < 15; i++) { w->b[i] = w->b[i + 1]; x ^= kuz_mul_gf256(w->b[i], kuz_lvec[i]); } w->b[15] = x; } #else #if(USE_MUL_TABLE) kuz_l_inv_asm_table(w); #else kuz_l_inv_asm(w); #endif #endif }