*: use SWAP_BE64 instead of open-coding it
authorDenys Vlasenko <dvlasenk@redhat.com>
Mon, 18 Oct 2010 09:39:47 +0000 (11:39 +0200)
committerDenys Vlasenko <dvlasenk@redhat.com>
Mon, 18 Oct 2010 09:39:47 +0000 (11:39 +0200)
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
include/libbb.h
libbb/hash_md5.c
libbb/hash_sha.c
networking/udhcp/dumpleases.c
networking/udhcp/files.c

index dec4e3af5041602537c7e0030e10b9796d745fec..b16157d46fb8c03aaa48ee0f0e926ab712ceadd1 100644 (file)
@@ -1540,7 +1540,7 @@ typedef struct md5_ctx_t {
        uint32_t C;
        uint32_t D;
        uint64_t total64;
-       char wbuffer[64];
+       char wbuffer[64]; /* NB: always correctly aligned for uint64_t */
 } md5_ctx_t;
 #else
 /* libbb/md5prime.c uses a bit different one: */
index 051c8ede4ce2db28d31995f680ff9b9895948ac8..9de27f1d93d7e8b52d80a46f59cb080404b19cc3 100644 (file)
@@ -417,11 +417,9 @@ void FAST_FUNC md5_end(md5_ctx_t *ctx, void *resbuf)
                if (remaining >= 8) {
                        /* Store the 64-bit counter of bits in the buffer in BE format */
                        uint64_t t = ctx->total64 << 3;
-                       unsigned i;
-                       for (i = 0; i < 8; i++) {
-                               ctx->wbuffer[56 + i] = t;
-                               t >>= 8;
-                       }
+                       t = SWAP_BE64(t);
+                       /* wbuffer is suitably aligned for this */
+                       *(uint64_t *) (&ctx->wbuffer[64 - 8]) = t;
                }
                md5_process_block64(ctx);
                if (remaining >= 8)
index d79291148503f793fc149e3294232dacc7df2d62..e7199d317b71300a6bdce82d0e311ec8b3886873 100644 (file)
@@ -52,10 +52,10 @@ static ALWAYS_INLINE uint64_t rotr64(uint64_t x, unsigned n)
        return (x >> n) | (x << (64 - n));
 }
 #if BB_LITTLE_ENDIAN
-/* ALWAYS_INLINE below would hurt code size, using plain inline: */
+/* ALWAYS_INLINE below sometimes hurts code size, using plain inline: */
 static inline uint64_t hton64(uint64_t v)
 {
-       return (((uint64_t)htonl(v)) << 32) | htonl(v >> 32);
+       return SWAP_BE64(v);
 }
 #else
 #define hton64(v) (v)
@@ -76,7 +76,7 @@ static void FAST_FUNC sha1_process_block64(sha1_ctx_t *ctx)
        const uint32_t *words = (uint32_t*) ctx->wbuffer;
 
        for (t = 0; t < 16; ++t)
-               W[t] = ntohl(words[t]);
+               W[t] = SWAP_BE32(words[t]);
        for (/*t = 16*/; t < 80; ++t) {
                uint32_t T = W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16];
                W[t] = rotl32(T, 1);
@@ -198,7 +198,7 @@ static void FAST_FUNC sha256_process_block64(sha256_ctx_t *ctx)
 
        /* Compute the message schedule according to FIPS 180-2:6.2.2 step 2.  */
        for (t = 0; t < 16; ++t)
-               W[t] = ntohl(words[t]);
+               W[t] = SWAP_BE32(words[t]);
        for (/*t = 16*/; t < 64; ++t)
                W[t] = R1(W[t - 2]) + W[t - 7] + R0(W[t - 15]) + W[t - 16];
 
@@ -490,7 +490,7 @@ void FAST_FUNC sha1_end(sha1_ctx_t *ctx, void *resbuf)
        if (BB_LITTLE_ENDIAN) {
                unsigned i;
                for (i = 0; i < bufpos; ++i)
-                       ctx->hash[i] = htonl(ctx->hash[i]);
+                       ctx->hash[i] = SWAP_BE32(ctx->hash[i]);
        }
        memcpy(resbuf, ctx->hash, sizeof(ctx->hash[0]) * bufpos);
 }
index 2eaadb6eb726326897b137cf33c5c0a9389b0862..341815a690677740ab00aa0d432369d11aeee084 100644 (file)
@@ -9,7 +9,7 @@
 #if BB_LITTLE_ENDIAN
 static inline uint64_t hton64(uint64_t v)
 {
-        return (((uint64_t)htonl(v)) << 32) | htonl(v >> 32);
+        return SWAP_BE64(v);
 }
 #else
 #define hton64(v) (v)
index f5348f65834d6d23cc428316fed60a9c99846976..68b2085a9cc54328c0e72d3d4826d0af8f8e50e0 100644 (file)
@@ -14,7 +14,7 @@
 #if BB_LITTLE_ENDIAN
 static inline uint64_t hton64(uint64_t v)
 {
-        return (((uint64_t)htonl(v)) << 32) | htonl(v >> 32);
+        return SWAP_BE64(v);
 }
 #else
 #define hton64(v) (v)