diff options
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/evp/e_aes.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/crypto/evp/e_aes.c b/crypto/evp/e_aes.c index 93d6d973e0..00bb519cfb 100644 --- a/crypto/evp/e_aes.c +++ b/crypto/evp/e_aes.c @@ -196,14 +196,30 @@ static int aes_cfb8_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out, return 1; } +#define MAXBITCHUNK ((size_t)1<<(sizeof(size_t)*8-4)) + static int aes_cfb1_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out, const unsigned char *in,size_t len) { - CRYPTO_cfb128_1_encrypt(in,out,len,ctx->cipher_data, - ctx->iv,&ctx->num,ctx->encrypt, - OPENSSL_ia32cap_P[1]&AESNI_CAPABLE ? + block128_f block = OPENSSL_ia32cap_P[1]&AESNI_CAPABLE ? (block128_f)aesni_encrypt : (block128_f)AES_encrypt); + + if (ctx->flags&EVP_CIPH_FLAG_LENGTH_BITS) { + CRYPTO_cfb128_1_encrypt(in,out,len,ctx->cipher_data, + ctx->iv,&ctx->num,ctx->encrypt,block); + return 1; + } + + while (len>=MAXBITCHUNK) { + CRYPTO_cfb128_1_encrypt(in,out,MAXBITCHUNK*8,ctx->cipher_data, + ctx->iv,&ctx->num,ctx->encrypt,block); + len-=MAXBITCHUNK; + } + if (len) + CRYPTO_cfb128_1_encrypt(in,out,len*8,ctx->cipher_data, + ctx->iv,&ctx->num,ctx->encrypt,block); + return 1; } |