As the code is, EVP_EncryptFinal and EVP_DecryptFinal, do not reset
ctx->buf_len to 0 once done (there is an internal buffer to
EVP_CIPHER_CTX, that is used to hold on to trailing bytes that do not
complete a block).  

This means that encrypting two sets of data with the same CTX will require
EVP_(Encrypt|Decrypt)Init to be called in between. This is wasteful, so I
have modified EVP_EncryptFinal and EVP_DecryptFinal to reset the value of
ctx->buf_len to zero.

Nagendra

diff -urN openssl-0.9.5a/crypto/evp/evp_enc.c openssl-0.9.5a-work/crypto/evp/evp_enc.c
--- openssl-0.9.5a/crypto/evp/evp_enc.c Fri Apr 23 15:10:20 1999
+++ openssl-0.9.5a-work/crypto/evp/evp_enc.c    Thu Jul 20 09:41:05 2000
@@ -173,6 +173,7 @@
                ctx->buf[i]=n;
        ctx->cipher->do_cipher(ctx,out,ctx->buf,b);
        *outl=b;
+       ctx->buf_len=0;
        }
 
 void EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
@@ -255,6 +256,7 @@
                for (i=0; i<n; i++)
                        out[i]=ctx->buf[i];
                *outl=n;
+               ctx->buf_len=0;
                }
        else
                *outl=0;

Reply via email to