From f0446ca8d746ff138a892588e33597411f59f5fa Mon Sep 17 00:00:00 2001 From: Ben Laurie Date: Sat, 11 Aug 2001 11:32:54 +0000 Subject: [PATCH] Move CIPHER_CTX cleanups to _Final routines instead of _Init, which avoids problems with leaks and uninitialised structures. --- crypto/evp/evp_enc.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/crypto/evp/evp_enc.c b/crypto/evp/evp_enc.c index e3ed556f26..9abb9855ff 100644 --- a/crypto/evp/evp_enc.c +++ b/crypto/evp/evp_enc.c @@ -78,8 +78,6 @@ int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, if(enc && (enc != -1)) enc = 1; if (cipher) { - if(ctx->cipher) - EVP_CIPHER_CTX_cleanup(ctx); ctx->cipher=cipher; ctx->cipher_data=OPENSSL_malloc(ctx->cipher->ctx_size); ctx->key_len = cipher->key_len; @@ -219,7 +217,7 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) { - int i,n,b,bl; + int i,n,b,bl,ret; b=ctx->cipher->block_size; if (b == 1) @@ -230,6 +228,7 @@ int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) bl=ctx->buf_len; if (ctx->flags & EVP_CIPH_NO_PADDING) { + EVP_CIPHER_CTX_cleanup(ctx); if(bl) { EVPerr(EVP_F_EVP_ENCRYPTFINAL,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH); @@ -238,12 +237,18 @@ int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) *outl = 0; return 1; } + n=b-bl; for (i=bl; ibuf[i]=n; - if(!ctx->cipher->do_cipher(ctx,out,ctx->buf,b)) return 0; - *outl=b; - return 1; + ret=ctx->cipher->do_cipher(ctx,out,ctx->buf,b); + + EVP_CIPHER_CTX_cleanup(ctx); + + if(ret) + *outl=b; + + return ret; } int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,