Make EVP_DecryptUpdate work again.
authorDr. Stephen Henson <steve@openssl.org>
Tue, 2 Oct 2001 16:19:49 +0000 (16:19 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Tue, 2 Oct 2001 16:19:49 +0000 (16:19 +0000)
crypto/evp/evp_enc.c

index ff7f7705a4bdf7423b48541d716328db22261f57..3fbe5c6527736d6fc046bd4d1295c752385e112b 100644 (file)
@@ -302,7 +302,7 @@ int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
 int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
             const unsigned char *in, int inl)
        {
 int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
             const unsigned char *in, int inl)
        {
-       int b;
+       int b, fix_len;
 
        if (inl == 0)
                {
 
        if (inl == 0)
                {
@@ -314,12 +314,17 @@ int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
                return EVP_EncryptUpdate(ctx, out, outl, in, inl);
 
        b=ctx->cipher->block_size;
                return EVP_EncryptUpdate(ctx, out, outl, in, inl);
 
        b=ctx->cipher->block_size;
+
        if(ctx->final_used)
                {
                memcpy(out,ctx->final,b);
                out+=b;
        if(ctx->final_used)
                {
                memcpy(out,ctx->final,b);
                out+=b;
+               fix_len = 1;
                }
                }
-               
+       else
+               fix_len = 0;
+
+
        if(!EVP_EncryptUpdate(ctx,out,outl,in,inl))
                return 0;
 
        if(!EVP_EncryptUpdate(ctx,out,outl,in,inl))
                return 0;
 
@@ -327,18 +332,16 @@ int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
         * we have a copy of this last block */
        if (b > 1 && !ctx->buf_len)
                {
         * we have a copy of this last block */
        if (b > 1 && !ctx->buf_len)
                {
-               if(!ctx->final_used)
-                       {
-                       *outl-=b;
-                       ctx->final_used=1;
-                       }
+               *outl-=b;
+               ctx->final_used=1;
                memcpy(ctx->final,&out[*outl],b);
                }
                memcpy(ctx->final,&out[*outl],b);
                }
-       else if(ctx->final_used)
-               {
-               ctx->final_used=0;
-               *outl+=b;
-               }
+       else
+               ctx->final_used = 0;
+
+       if (fix_len)
+               *outl += b;
+               
        return 1;
        }
 
        return 1;
        }