summaryrefslogtreecommitdiff
path: root/cipher/tiger.c
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@iki.fi>2013-09-21 13:54:38 +0300
committerJussi Kivilinna <jussi.kivilinna@iki.fi>2013-09-21 13:54:38 +0300
commit592c2ab3deeeccbb6d3b078ed7bf0e6627c8e1fb (patch)
tree067ff9ba60af04b9570da3f54c3ff6c992650a90 /cipher/tiger.c
parent902ea6052c11108bd19333c31b03e084bed1fb86 (diff)
downloadlibgcrypt-592c2ab3deeeccbb6d3b078ed7bf0e6627c8e1fb.tar.gz
Use hash transform function return type for passing burn stack depth
* cipher/gostr4311-94.c (transform): Return stack burn depth. * cipher/hash-common.c (_gcry_md_block_write): Use stack burn depth returned by 'hd->bwrite'. * cipher/hash-common.h (_gcry_md_block_write_t): Change return type to 'unsigned int'. (gry_md_block_ctx_t): Remove 'stack_burn'. * cipher/md4.c (transform): Return stack burn depth. (md4_final): Use stack burn depth from transform. * cipher/md5.c (transform): Return stack burn depth. (md5_final): Use stack burn depth from transform. * cipher/rmd160.c (transform): Return stack burn depth. (rmd160_final): Use stack burn depth from transform. * cipher/sha1.c (transform): Return stack burn depth. (sha1_final): Use stack burn depth from transform. * cipher/sha256.c (transform): Return stack burn depth. (sha256_final): Use stack burn depth from transform. * cipher/sha512.c (__transform, transform): Return stack burn depth. (sha512_final): Use stack burn depth from transform. * cipher/stribog.c (transform64): Return stack burn depth. * cipher/tiger.c (transform): Return stack burn depth. (tiger_final): Use stack burn depth from transform. -- Transform function might want different depth of stack burn depending on detected CPU features (like in SHA-512 on ARM with NEON). So return stack burn depth from transform functions as a request or a hint to calling function. Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'cipher/tiger.c')
-rw-r--r--cipher/tiger.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/cipher/tiger.c b/cipher/tiger.c
index 49d3919b..8f5959b8 100644
--- a/cipher/tiger.c
+++ b/cipher/tiger.c
@@ -587,7 +587,7 @@ static u64 sbox4[256] = {
U64_C(0xc83223f1720aef96) /* 1022 */, U64_C(0xc3a0396f7363a51f) /* 1023 */
};
-static void
+static unsigned int
transform ( void *ctx, const unsigned char *data );
static void
@@ -598,10 +598,10 @@ do_init (void *context, int variant)
hd->a = 0x0123456789abcdefLL;
hd->b = 0xfedcba9876543210LL;
hd->c = 0xf096a5b4c3b2e187LL;
+
hd->bctx.nblocks = 0;
hd->bctx.count = 0;
hd->bctx.blocksize = 64;
- hd->bctx.stack_burn = 21*8+11*sizeof(void*);
hd->bctx.bwrite = transform;
hd->variant = variant;
}
@@ -691,7 +691,7 @@ key_schedule( u64 *x )
/****************
* Transform the message DATA which consists of 512 bytes (8 words)
*/
-static void
+static unsigned int
transform ( void *ctx, const unsigned char *data )
{
TIGER_CONTEXT *hd = ctx;
@@ -735,6 +735,8 @@ transform ( void *ctx, const unsigned char *data )
hd->a = a;
hd->b = b;
hd->c = c;
+
+ return /*burn_stack*/ 21*8+11*sizeof(void*);
}
@@ -747,6 +749,7 @@ tiger_final( void *context )
TIGER_CONTEXT *hd = context;
u32 t, msb, lsb;
byte *p;
+ unsigned int burn;
byte pad = hd->variant == 2? 0x80 : 0x01;
_gcry_md_block_write(hd, NULL, 0); /* flush */;
@@ -788,8 +791,8 @@ tiger_final( void *context )
hd->bctx.buf[61] = msb >> 8;
hd->bctx.buf[62] = msb >> 16;
hd->bctx.buf[63] = msb >> 24;
- transform( hd, hd->bctx.buf );
- _gcry_burn_stack (21*8+11*sizeof(void*));
+ burn = transform( hd, hd->bctx.buf );
+ _gcry_burn_stack (burn);
p = hd->bctx.buf;
#ifdef WORDS_BIGENDIAN