aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Laurie <ben@openssl.org>2001-08-11 11:32:54 +0000
committerBen Laurie <ben@openssl.org>2001-08-11 11:32:54 +0000
commitf0446ca8d746ff138a892588e33597411f59f5fa (patch)
treeecb28fcc5d23898cdfac5f0ddfc184e12dbc94d3
parent6bc847e49e234ba81008f7ea196651ec45b25c2c (diff)
downloadopenssl-f0446ca8d746ff138a892588e33597411f59f5fa.tar.gz
Move CIPHER_CTX cleanups to _Final routines instead of _Init, which avoids
problems with leaks and uninitialised structures.
-rw-r--r--crypto/evp/evp_enc.c17
1 files 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; i<b; i++)
ctx->buf[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,