|
|
|
@ -290,6 +290,8 @@ static void aes_128_f8_encrypt(struct crypto_context *c, unsigned char *iv, str |
|
|
|
int k_e_len, k_s_len; /* n_e, n_s */ |
|
|
|
u_int32_t j; |
|
|
|
unsigned char *p, *key; |
|
|
|
u_int64_t *pi, *ki, *lki, *xi; |
|
|
|
u_int32_t *xu; |
|
|
|
|
|
|
|
k_e_len = c->crypto_suite->session_key_len / 8; |
|
|
|
k_s_len = c->crypto_suite->session_salt_len / 8; |
|
|
|
@ -311,7 +313,11 @@ static void aes_128_f8_encrypt(struct crypto_context *c, unsigned char *iv, str |
|
|
|
EVP_EncryptFinal_ex(&ecc, key_block, &outlen); |
|
|
|
EVP_CIPHER_CTX_cleanup(&ecc); |
|
|
|
|
|
|
|
p = (unsigned char *) s->s; |
|
|
|
pi = (void *) s->s; |
|
|
|
ki = (void *) key_block; |
|
|
|
lki = (void *) last_key_block; |
|
|
|
xi = (void *) x; |
|
|
|
xu = (void *) x; |
|
|
|
left = s->len; |
|
|
|
j = 0; |
|
|
|
ZERO(last_key_block); |
|
|
|
@ -323,25 +329,31 @@ static void aes_128_f8_encrypt(struct crypto_context *c, unsigned char *iv, str |
|
|
|
/* S(j) = E(k_e, IV' XOR j XOR S(j-1)) */ |
|
|
|
memcpy(x, ivx, 16); |
|
|
|
|
|
|
|
x[12] ^= ((j >> 24) & 0xff); |
|
|
|
x[13] ^= ((j >> 16) & 0xff); |
|
|
|
x[14] ^= ((j >> 8) & 0xff); |
|
|
|
x[15] ^= ((j >> 0) & 0xff); |
|
|
|
xu[3] ^= htonl(j); |
|
|
|
|
|
|
|
for (i = 0; i < 16; i++) |
|
|
|
x[i] ^= last_key_block[i]; |
|
|
|
xi[0] ^= lki[0]; |
|
|
|
xi[1] ^= lki[1]; |
|
|
|
|
|
|
|
EVP_EncryptUpdate(&ecc, key_block, &outlen, x, 16); |
|
|
|
assert(outlen == 16); |
|
|
|
|
|
|
|
for (i = 0; i < 16; i++) { |
|
|
|
*p ^= key_block[i]; |
|
|
|
p++; |
|
|
|
left--; |
|
|
|
if (!left) |
|
|
|
goto done; |
|
|
|
if (G_UNLIKELY(left < 16)) { |
|
|
|
p = (void *) pi; |
|
|
|
for (i = 0; i < 16; i++) { |
|
|
|
*p++ ^= key_block[i]; |
|
|
|
left--; |
|
|
|
if (!left) |
|
|
|
goto done; |
|
|
|
} |
|
|
|
abort(); |
|
|
|
} |
|
|
|
|
|
|
|
*pi++ ^= ki[0]; |
|
|
|
*pi++ ^= ki[1]; |
|
|
|
left -= 16; |
|
|
|
if (!left) |
|
|
|
break; |
|
|
|
|
|
|
|
j++; |
|
|
|
memcpy(last_key_block, key_block, 16); |
|
|
|
} |
|
|
|
|