about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tools/p_sha1.c16
1 files 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. */