aboutsummaryrefslogtreecommitdiff
path: root/block-sha1
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-08-06 07:45:46 -0700
committerJunio C Hamano <gitster@pobox.com>2009-08-06 13:56:45 -0700
commit5d5210c35aa83342163ab0ab80b8e6d6fa3ce931 (patch)
tree9440ebf9146a0c9b7a67fac1b6ca52fea7d519a5 /block-sha1
parente869e113c8f91999f9a433436e0b863fe2727b61 (diff)
downloadgit-5d5210c35aa83342163ab0ab80b8e6d6fa3ce931.tar.gz
git-5d5210c35aa83342163ab0ab80b8e6d6fa3ce931.tar.xz
block-sha1: get rid of redundant 'lenW' context
.. and simplify the ctx->size logic. We now count the size in bytes, which means that 'lenW' was always just the low 6 bits of the total size, so we don't carry it around separately any more. And we do the 'size in bits' shift at the end. Suggested by Nicolas Pitre and linux@horizon.com. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'block-sha1')
-rw-r--r--block-sha1/sha1.c17
-rw-r--r--block-sha1/sha1.h1
2 files changed, 7 insertions, 11 deletions
diff --git a/block-sha1/sha1.c b/block-sha1/sha1.c
index 5bf1b36bd..fdd400f22 100644
--- a/block-sha1/sha1.c
+++ b/block-sha1/sha1.c
@@ -14,7 +14,6 @@ static void blk_SHA1Block(blk_SHA_CTX *ctx, const unsigned int *data);
void blk_SHA1_Init(blk_SHA_CTX *ctx)
{
- ctx->lenW = 0;
ctx->size = 0;
/* Initialize H with the magic constants (see FIPS180 for constants)
@@ -29,9 +28,9 @@ void blk_SHA1_Init(blk_SHA_CTX *ctx)
void blk_SHA1_Update(blk_SHA_CTX *ctx, const void *data, unsigned long len)
{
- int lenW = ctx->lenW;
+ int lenW = ctx->size & 63;
- ctx->size += (unsigned long long) len << 3;
+ ctx->size += len;
/* Read the data into W and process blocks as they get full
*/
@@ -43,7 +42,6 @@ void blk_SHA1_Update(blk_SHA_CTX *ctx, const void *data, unsigned long len)
lenW = (lenW + left) & 63;
len -= left;
data += left;
- ctx->lenW = lenW;
if (lenW)
return;
blk_SHA1Block(ctx, ctx->W);
@@ -53,10 +51,8 @@ void blk_SHA1_Update(blk_SHA_CTX *ctx, const void *data, unsigned long len)
data += 64;
len -= 64;
}
- if (len) {
+ if (len)
memcpy(ctx->W, data, len);
- ctx->lenW = len;
- }
}
@@ -68,10 +64,11 @@ void blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx)
/* Pad with a binary 1 (ie 0x80), then zeroes, then length
*/
- padlen[0] = htonl(ctx->size >> 32);
- padlen[1] = htonl(ctx->size);
+ padlen[0] = htonl(ctx->size >> 29);
+ padlen[1] = htonl(ctx->size << 3);
- blk_SHA1_Update(ctx, pad, 1+ (63 & (55 - ctx->lenW)));
+ i = ctx->size & 63;
+ blk_SHA1_Update(ctx, pad, 1+ (63 & (55 - i)));
blk_SHA1_Update(ctx, padlen, 8);
/* Output hash
diff --git a/block-sha1/sha1.h b/block-sha1/sha1.h
index 7be2d93a2..c1ae74d3d 100644
--- a/block-sha1/sha1.h
+++ b/block-sha1/sha1.h
@@ -7,7 +7,6 @@
typedef struct {
unsigned int H[5];
unsigned int W[16];
- int lenW;
unsigned long long size;
} blk_SHA_CTX;