]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
ocb: Use bswap_if_le, for portability.
authorNiels Möller <nisse@lysator.liu.se>
Sat, 14 May 2022 20:31:41 +0000 (22:31 +0200)
committerNiels Möller <nisse@lysator.liu.se>
Mon, 6 Feb 2023 19:20:01 +0000 (20:20 +0100)
ocb.c

diff --git a/ocb.c b/ocb.c
index 91ab3b174f2985fa31354bf01ae09afc02fc29da..404c5b5a24a27f9878bd51a0de945519b2cc89e7 100644 (file)
--- a/ocb.c
+++ b/ocb.c
 #include "ocb.h"
 #include "block-internal.h"
 
+/* FIXME: Duplicated in nist-keywrap.c */
+#if WORDS_BIGENDIAN
+#define bswap_if_le(x) (x)
+#elif HAVE_BUILTIN_BSWAP64
+#define bswap_if_le(x) (__builtin_bswap64 (x))
+#else
+static uint64_t
+bswap_if_le (uint64_t x)
+{
+  x = ((x >> 32) & UINT64_C (0xffffffff))
+    | ((x & UINT64_C (0xffffffff)) << 32);
+  x = ((x >> 16) & UINT64_C (0xffff0000ffff))
+    | ((x & UINT64_C (0xffff0000ffff)) << 16);
+  x = ((x >> 8) & UINT64_C (0xff00ff00ff00ff))
+    | ((x & UINT64_C (0xff00ff00ff00ff)) << 8);
+  return x;
+}
+#endif
+
 /* Returns 64 bits from the concatenation (u0, u1), starting from bit offset. */
 static inline uint64_t
 extract(uint64_t u0, uint64_t u1, unsigned offset)
 {
   if (offset == 0)
     return u0;
-#if WORDS_BIGENDIAN
-  return (u0 << offset) | (u1 >> (64 - offset));
-#else
-  uint64_t t;
-  u0 = __builtin_bswap64(u0);
-  u1 = __builtin_bswap64(u1);
-  t = (u0 << offset) | (u1 >> (64 - offset));
-  return __builtin_bswap64(t);
-#endif
+  u0 = bswap_if_le(u0);
+  u1 = bswap_if_le(u1);
+  return bswap_if_le((u0 << offset) | (u1 >> (64 - offset)));
 }
 
 void