From: Ulrich Drepper Date: Sat, 2 Jul 2011 17:03:53 +0000 (-0400) Subject: Fix last patch for big-endian machines X-Git-Tag: upstream/2.30~12256 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=feea4948bca7e442edad3f995696f33450549e80;p=external%2Fglibc.git Fix last patch for big-endian machines --- diff --git a/crypt/sha256.c b/crypt/sha256.c index 0ca3355..1a3aca6 100644 --- a/crypt/sha256.c +++ b/crypt/sha256.c @@ -224,9 +224,11 @@ __sha256_finish_ctx (ctx, resbuf) #ifdef _STRING_ARCH_unaligned *(uint64_t *) &ctx->buffer[bytes + pad] = SWAP64 (ctx->total64 << 3); #else - *(uint32_t *) &ctx->buffer[bytes + pad + 4] = SWAP (ctx->total[0] << 3); - *(uint32_t *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) | - (ctx->total[0] >> 29)); + *(uint32_t *) &ctx->buffer[bytes + pad + 4] + = SWAP (ctx->total[TOTAL64_low] << 3); + *(uint32_t *) &ctx->buffer[bytes + pad] + = SWAP ((ctx->total[TOTAL64_high] << 3) | + (ctx->total[TOTAL64_low] >> 29)); #endif /* Process last bytes. */ diff --git a/crypt/sha256.h b/crypt/sha256.h index fcf6148..0457bfa 100644 --- a/crypt/sha256.h +++ b/crypt/sha256.h @@ -24,6 +24,7 @@ #include #include #include +#include /* Structure to save state of computation between the single steps. */ @@ -34,6 +35,8 @@ struct sha256_ctx union { uint64_t total64; +#define TOTAL64_low (1 - (BYTE_ORDER == LITTLE_ENDIAN)) +#define TOTAL64_high (BYTE_ORDER == LITTLE_ENDIAN) uint32_t total[2]; }; uint32_t buflen; diff --git a/crypt/sha512.c b/crypt/sha512.c index 16b4877..60a7ca5 100644 --- a/crypt/sha512.c +++ b/crypt/sha512.c @@ -124,9 +124,9 @@ sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx) #ifdef USE_TOTAL128 ctx->total128 += len; #else - ctx->total[0] += len; - if (ctx->total[0] < len) - ++ctx->total[1]; + ctx->total[TOTAL128_low] += len; + if (ctx->total[TOTAL128_low] < len) + ++ctx->total[TOTAL128_high]; #endif /* Process all bytes in the buffer with 128 bytes in each round of @@ -244,18 +244,20 @@ __sha512_finish_ctx (ctx, resbuf) #ifdef USE_TOTAL128 ctx->total128 += bytes; #else - ctx->total[0] += bytes; - if (ctx->total[0] < bytes) - ++ctx->total[1]; + ctx->total[TOTAL128_low] += bytes; + if (ctx->total[TOTAL128_low] < bytes) + ++ctx->total[TOTAL128_high]; #endif pad = bytes >= 112 ? 128 + 112 - bytes : 112 - bytes; memcpy (&ctx->buffer[bytes], fillbuf, pad); /* Put the 128-bit file length in *bits* at the end of the buffer. */ - *(uint64_t *) &ctx->buffer[bytes + pad + 8] = SWAP (ctx->total[0] << 3); - *(uint64_t *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) | - (ctx->total[0] >> 61)); + *(uint64_t *) &ctx->buffer[bytes + pad + 8] + = SWAP (ctx->total[TOTAL128_low] << 3); + *(uint64_t *) &ctx->buffer[bytes + pad] + = SWAP ((ctx->total[TOTAL128_high] << 3) | + (ctx->total[TOTAL128_low] >> 61)); /* Process last bytes. */ sha512_process_block (ctx->buffer, bytes + pad + 16, ctx); diff --git a/crypt/sha512.h b/crypt/sha512.h index 90e55dc..d98a2fc 100644 --- a/crypt/sha512.h +++ b/crypt/sha512.h @@ -24,9 +24,8 @@ #include #include #include -#ifdef _LIBC -# include -#endif +#include +#include /* Structure to save state of computation between the single steps. */ @@ -40,6 +39,13 @@ struct sha512_ctx # define USE_TOTAL128 unsigned int total128 __attribute__ ((__mode__ (TI))); #endif +#if BYTE_ORDER == LITTLE_ENDIAN +# define TOTAL128_low 0 +# define TOTAL128_high 1 +#else +# define TOTAL128_low 1 +# define TOTAL128_high 0 +#endif uint64_t total[2]; }; uint64_t buflen;