engines/ccgost/gosthash.c: simplify and avoid SEGV.

PR: 3275
(cherry picked from commit ea38f020492042bc1d1adc26ef197b0b9cadf968)
This commit is contained in:
Andy Polyakov 2014-03-07 11:02:25 +01:00
parent e67c71c8fd
commit ce2c6d8452

View 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) 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) if (ctx->left)
{ {
/*There are some bytes from previous step*/ /*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; return 1;
} }
curptr=block+add_bytes; block+=add_bytes;
length-=add_bytes;
hash_step(ctx->cipher_ctx,ctx->H,ctx->remainder); hash_step(ctx->cipher_ctx,ctx->H,ctx->remainder);
add_blocks(32,ctx->S,ctx->remainder); add_blocks(32,ctx->S,ctx->remainder);
ctx->len+=32; ctx->len+=32;
ctx->left=0; 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; ctx->len+=32;
curptr+=32; block+=32;
length-=32;
} }
if (curptr!=block+length) if (length)
{ {
ctx->left=block+length-curptr; memcpy(ctx->remainder,block,ctx->left=length);
memcpy(ctx->remainder,curptr,ctx->left);
} }
return 1; return 1;
} }