e_aes_cbc_hmac_sha1.c: align calculated MAC at cache line.
[oweals/openssl.git] / crypto / evp / evp_enc.c
index 3f8473b348a653cb7a59e7921ca6893eb5b7dd13..5b3bf3bb2c209571ddc9519ea1c076c3ab766328 100644 (file)
@@ -115,10 +115,14 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *imp
                /* Ensure a context left lying around from last time is cleared
                 * (the previous check attempted to avoid this if the same
                 * ENGINE and EVP_CIPHER could be used). */
-               EVP_CIPHER_CTX_cleanup(ctx);
-
-               /* Restore encrypt field: it is zeroed by cleanup */
-               ctx->encrypt = enc;
+               if (ctx->cipher)
+                       {
+                       unsigned long flags = ctx->flags;
+                       EVP_CIPHER_CTX_cleanup(ctx);
+                       /* Restore encrypt and flags */
+                       ctx->encrypt = enc;
+                       ctx->flags = flags;
+                       }
 #ifndef OPENSSL_NO_ENGINE
                if(impl)
                        {
@@ -215,6 +219,7 @@ skip_to_init:
                        break;
 
                        case EVP_CIPH_CTR_MODE:
+                       ctx->num = 0;
                        /* Don't reuse IV for CTR mode */
                        if(iv)
                                memcpy(ctx->iv, iv, EVP_CIPHER_CTX_iv_length(ctx));
@@ -368,11 +373,11 @@ int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
 
        if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
                {
-               i = ctx->cipher->do_cipher(ctx, out, NULL, -1);
-               if (i < 0)
+               ret = ctx->cipher->do_cipher(ctx, out, NULL, 0);
+               if (ret < 0)
                        return 0;
-               else
-                       *outl = i;
+               else 
+                       *outl = ret;
                return 1;
                }
 
@@ -483,7 +488,7 @@ int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
 
        if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
                {
-               i = ctx->cipher->do_cipher(ctx, out, NULL, -1);
+               i = ctx->cipher->do_cipher(ctx, out, NULL, 0);
                if (i < 0)
                        return 0;
                else