engines/ccgost/gosthash.c: simplify and avoid SEGV.
authorAndy Polyakov <appro@openssl.org>
Fri, 7 Mar 2014 10:02:25 +0000 (11:02 +0100)
committerAndy Polyakov <appro@openssl.org>
Fri, 7 Mar 2014 10:03:51 +0000 (11:03 +0100)
PR: 3275
(cherry picked from commit ea38f020492042bc1d1adc26ef197b0b9cadf968)

engines/ccgost/gosthash.c

index 8c278aa..91b2ce8 100644 (file)
@@ -180,8 +180,6 @@ int start_hash(gost_hash_ctx *ctx)
  */
 int hash_block(gost_hash_ctx *ctx,const byte *block, size_t length)
        {
-       const byte *curptr=block;
-       const byte *barrier=block+(length-32);/* Last byte we can safely hash*/
        if (ctx->left)
                {
                /*There are some bytes from previous step*/
@@ -196,24 +194,25 @@ int hash_block(gost_hash_ctx *ctx,const byte *block, size_t length)
                        {
                        return 1;
                        }       
-               curptr=block+add_bytes;
+               block+=add_bytes;
+               length-=add_bytes;
                hash_step(ctx->cipher_ctx,ctx->H,ctx->remainder);
                add_blocks(32,ctx->S,ctx->remainder);
                ctx->len+=32;
                ctx->left=0;
                }
-       while (curptr<=barrier)
+       while (length>=32)
                {       
-               hash_step(ctx->cipher_ctx,ctx->H,curptr);
+               hash_step(ctx->cipher_ctx,ctx->H,block);
                        
-               add_blocks(32,ctx->S,curptr);
+               add_blocks(32,ctx->S,block);
                ctx->len+=32;
-               curptr+=32;
+               block+=32;
+               length-=32;
                }       
-       if (curptr!=block+length)
+       if (length)
                {
-               ctx->left=block+length-curptr;
-               memcpy(ctx->remainder,curptr,ctx->left);
+               memcpy(ctx->remainder,block,ctx->left=length);
                }       
        return 1;       
        }