Example #1
0
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];
    }
    
}
Example #2
0
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));
}
Example #3
0
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 */
}
Example #4
0
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))); )
}
Example #5
0
void test_mult_zeroes() {
    suite("multiplication by zero is zero");
    ALL1( test(gf_mult(a,0) == 0); )
}
Example #6
0
void test_mult_associates() {
    suite("multiplication associates");
    SOME3( test(gf_mult(gf_mult(a,b), c) == gf_mult(a, gf_mult(b,c))); )
}
Example #7
0
void test_mult_commutes() {
    suite("multiplication commutes");
    ALL2( test(gf_mult(a,b) == gf_mult(b,a)); )
}