diff --git a/crypto/engine/eng_aesni.c b/crypto/engine/eng_aesni.c index 26c2e073ff06bde12a887727883ef5df6b9e6b47..112375826175f52eb037ec05000c8dda0dc04455 100644 --- a/crypto/engine/eng_aesni.c +++ b/crypto/engine/eng_aesni.c @@ -401,55 +401,10 @@ static int aesni_counter(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t len) { AES_KEY *key = AESNI_ALIGN(ctx->cipher_data); - u32 n, ctr32; - n = ctx->num; - - while (n && len) { - *(out++) = *(in++) ^ ctx->buf[n]; - --len; - n = (n+1) % 16; - } - - ctr32 = GETU32(ctx->iv+12); - while (len>=16) { - size_t blocks = len/16; - /* - * 1<<24 is just a not-so-small yet not-so-large number... - */ - if (blocks > (1U<<24)) blocks = (1U<<24); - /* - * As aesni_ctr32 operates on 32-bit counter, caller - * has to handle overflow. 'if' below detects the - * overflow, which is then handled by limiting the - * amount of blocks to the exact overflow point... - */ - ctr32 += (u32)blocks; - if (ctr32 < blocks) { - blocks -= ctr32; - ctr32 = 0; - } - aesni_ctr32_encrypt_blocks(in,out,blocks,key,ctx->iv); - /* aesni_ctr32 does not update ctx->iv, caller does: */ - PUTU32(ctx->iv+12,ctr32); - /* ... overflow was detected, propogate carry. */ - if (ctr32 == 0) ctr96_inc(ctx->iv); - blocks *= 16; - len -= blocks; - out += blocks; - in += blocks; - } - if (len) { - aesni_encrypt(ctx->iv,ctx->buf,key); - ++ctr32; - PUTU32(ctx->iv+12,ctr32); - if (ctr32 == 0) ctr96_inc(ctx->iv); - while (len--) { - out[n] = in[n] ^ ctx->buf[n]; - ++n; - } - } - ctx->num = n; + CRYPTO_ctr128_encrypt_ctr32(in,out,len,key, + ctx->iv,ctx->buf,&ctx->num, + aesni_ctr32_encrypt_blocks); return 1; }