rendered paste bodystatic inline translate_bytes(void *target, const void *source,
unsigned int len, const void *table)
{
asm ("tr %0,%1,%2,%3"
: "=Q" (*target)
: "Q" (*source), "m" (*table), "r" (len)
}
void aes_encrypt_256(u128 *context, u128 *key)
{
u128 t[2] cachealigned;
u64 x[10] cachealigned;
unsigned int i;
for (i = 0; i < 13; i++) {
/* do sbox and multiply */
translate_bytes(&t[0], context, 16, aes_sbox);
translate_bytes(&t[1], context, 16, aes_sbox2);
/* do shift and add */
translate_bytes(x, aes_perm, 80, t);
context->u64[0] = x[0] ^ x[1] ^ x[2] ^ x[3] ^ x[4] ^ key[i].u64[0];
context->u64[1] = x[5] ^ x[6] ^ x[7] ^ x[8] ^ x[9] ^ key[i].u64[1];
}
/* final round is simpler */
translate_bytes(&t[0], context, 16, aes_sbox);
translate_bytes(x, aes_perm, 16, context);
context->u64[0] ^= key[13].u64[0];
context->u64[1] ^= key[13].u64[1];
}