about summary refs log tree commit diff stats
path: root/src/tools/p_sha1.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/p_sha1.c')
-rw-r--r--src/tools/p_sha1.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/tools/p_sha1.c b/src/tools/p_sha1.c
index 7c059c97..1936b89c 100644
--- a/src/tools/p_sha1.c
+++ b/src/tools/p_sha1.c
@@ -101,19 +101,14 @@ A million repetitions of "a"
 
 #include "p_sha1.h"
 
+static uint32_t host_to_be(uint32_t i);
 void P_SHA1_Transform(uint32_t state[5], const uint8_t buffer[64]);
 
 #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
 
 /* blk0() and blk() perform the initial expand. */
 /* I got the idea of expanding during the round function from SSLeay */
-/* FIXME: can we do this in an endian-proof way? */
-#ifdef WORDS_BIGENDIAN
-#define blk0(i) block->l[i]
-#else
-#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
-    |(rol(block->l[i],8)&0x00FF00FF))
-#endif
+#define blk0(i) (block->l[i] = host_to_be(block->l[i]))
 #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
     ^block->l[(i+2)&15]^block->l[i&15],1))
 
@@ -138,6 +133,15 @@ void SHAPrintContext(P_P_SHA1_CTX *context, char *msg){
 }
 #endif /* VERBOSE */
 
+static uint32_t host_to_be(uint32_t i)
+{
+    static const union {
+        unsigned u;
+        unsigned char c;
+    } check = {1};
+    return check.c ? (rol(i,24)&0xFF00FF00)|(rol(i,8)&0x00FF00FF) : i;
+}
+
 /* Hash a single 512-bit block. This is the core of the algorithm. */
 void P_SHA1_Transform(uint32_t state[5], const uint8_t buffer[64])
 {
f='#n144'>144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186