From 6c980969e051676dbd7ee62e19b8463ad57e7852 Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 26 Oct 2014 21:43:50 +0000 Subject: [PATCH] Added compile time checks for big endian from @pasis --- src/tools/p_sha1.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/tools/p_sha1.c b/src/tools/p_sha1.c index 1936b89c..11adede3 100644 --- a/src/tools/p_sha1.c +++ b/src/tools/p_sha1.c @@ -135,11 +135,23 @@ void SHAPrintContext(P_P_SHA1_CTX *context, char *msg){ static uint32_t host_to_be(uint32_t i) { +#define le_to_be(i) ((rol((i),24) & 0xFF00FF00) | (rol((i),8) & 0x00FF00FF)) +#if defined(__BIG_ENDIAN__) || \ + (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ + __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) + return i; +#elif defined(__LITTLE_ENDIAN__) || \ + (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ + __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) + return le_to_be(i); +#else /* fallback to run-time check */ static const union { - unsigned u; + uint32_t u; unsigned char c; } check = {1}; - return check.c ? (rol(i,24)&0xFF00FF00)|(rol(i,8)&0x00FF00FF) : i; + + return check.c ? le_to_be(i) : i; +#endif } /* Hash a single 512-bit block. This is the core of the algorithm. */