block-sha1: get rid of redundant 'lenW' context
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 6 Aug 2009 14:45:46 +0000 (07:45 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 6 Aug 2009 20:56:45 +0000 (13:56 -0700)
.. 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>
block-sha1/sha1.c
block-sha1/sha1.h

index 5bf1b36bd18882b57c4953a1c9a5aa01d688944f..fdd400f22db5ce02a6a0e5dd2ea4f5e894426c8b 100644 (file)
@@ -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
index 7be2d93a2a150b5c54e1d7192eefb5f0f0a8f1cf..c1ae74d3dab1686a886d145fc0fb9bf4c9b669c9 100644 (file)
@@ -7,7 +7,6 @@
 typedef struct {
        unsigned int H[5];
        unsigned int W[16];
-       int lenW;
        unsigned long long size;
 } blk_SHA_CTX;