AES: 16-byte align the key schedule arrays.

This is going to be important in the next commit, when we start
accessing them using x86 SSE instructions.
This commit is contained in:
Pavel I. Kryukov 2017-10-20 19:13:47 +01:00 коммит произвёл Simon Tatham
Родитель 0816e2b1a0
Коммит e8be7ea98a
1 изменённых файлов: 14 добавлений и 2 удалений

Просмотреть файл

@ -40,8 +40,9 @@
typedef struct AESContext AESContext;
struct AESContext {
word32 keysched[(MAX_NR + 1) * NB];
word32 invkeysched[(MAX_NR + 1) * NB];
word32 keysched_buf[(MAX_NR + 1) * NB + 3];
word32 invkeysched_buf[(MAX_NR + 1) * NB + 3];
word32 *keysched, *invkeysched;
word32 iv[NB];
int Nr; /* number of rounds */
};
@ -653,9 +654,20 @@ static const word32 D3[256] = {
static void aes_setup(AESContext * ctx, unsigned char *key, int keylen)
{
int i, j, Nk, rconst;
size_t bufaddr;
ctx->Nr = 6 + (keylen / 4); /* Number of rounds */
/* Ensure the key schedule arrays are 16-byte aligned */
bufaddr = (size_t)ctx->keysched_buf;
ctx->keysched = ctx->keysched_buf +
(0xF & -bufaddr) / sizeof(word32);
assert((size_t)ctx->keysched % 16 == 0);
bufaddr = (size_t)ctx->invkeysched_buf;
ctx->invkeysched = ctx->invkeysched_buf +
(0xF & -bufaddr) / sizeof(word32);
assert((size_t)ctx->invkeysched % 16 == 0);
assert(keylen == 16 || keylen == 24 || keylen == 32);
Nk = keylen / 4;