static void inv_mix_columns(uint8_t *input) { static uint8_t mult9[16]; static uint8_t mult11[16]; static uint8_t mult13[16]; static uint8_t mult14[16]; int i; for (i = 0; i < 16; i++) { mult9[i] = gf_mult(9, input[i]); mult11[i] = gf_mult(11, input[i]); mult13[i] = gf_mult(13, input[i]); mult14[i] = gf_mult(14, input[i]); } for (i = 0; i < 4;i++) { input[i * 4] = mult14[i * 4] ^ mult11[i * 4 + 1] ^ mult13[i * 4 + 2] ^ mult9[i * 4 + 3]; input[i * 4 + 1] = mult9[i * 4] ^ mult14[i * 4 + 1] ^ mult11[i * 4 + 2] ^ mult13[i * 4 + 3]; input[i * 4 + 2] = mult13[i * 4] ^ mult9[i * 4 + 1] ^ mult14[i * 4 + 2] ^ mult11[i * 4 + 3]; input[i * 4 + 3] = mult11[i * 4] ^ mult13[i * 4 + 1] ^ mult9[i * 4 + 2] ^ mult14[i * 4 + 3]; } }
static void mix_bytes (uint8_t block[8][16]) { uint8_t temp[8][16]; memset (temp, 0, sizeof (temp)); for (uint_fast8_t i = 0; i < 8; i++) { for (uint_fast8_t j = 0; j < 16; j++) { for (uint_fast8_t k = 0; k < 8; k++) { temp[i][j] ^= gf_mult (diffusion_matrix[i][k], block[k][j]); } } } memcpy (block, temp, sizeof (temp)); }
static void ghash(const u8 *h, const u8 *x, size_t xlen, u8 *y) { size_t m, i; const u8 *xpos = x; u8 tmp[16]; m = xlen / 16; for (i = 0; i < m; i++) { /* Y_i = (Y^(i-1) XOR X_i) dot H */ xor_block(y, xpos); xpos += 16; /* dot operation: * multiplication operation for binary Galois (finite) field of * 2^128 elements */ gf_mult(y, h, tmp); os_memcpy(y, tmp, 16); } if (x + xlen > xpos) { /* Add zero padded last block */ size_t last = x + xlen - xpos; os_memcpy(tmp, xpos, last); os_memset(tmp + last, 0, sizeof(tmp) - last); /* Y_i = (Y^(i-1) XOR X_i) dot H */ xor_block(y, tmp); /* dot operation: * multiplication operation for binary Galois (finite) field of * 2^128 elements */ gf_mult(y, h, tmp); os_memcpy(y, tmp, 16); } /* Return Y_m */ }
void test_distributive_law() { suite("distributive law"); SOME3( test(gf_mult(gf_add(a,b), c) == gf_add(gf_mult(a,c), gf_mult(b,c))); ) }
void test_mult_zeroes() { suite("multiplication by zero is zero"); ALL1( test(gf_mult(a,0) == 0); ) }
void test_mult_associates() { suite("multiplication associates"); SOME3( test(gf_mult(gf_mult(a,b), c) == gf_mult(a, gf_mult(b,c))); ) }
void test_mult_commutes() { suite("multiplication commutes"); ALL2( test(gf_mult(a,b) == gf_mult(b,a)); ) }