summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNils Maier <maierman@web.de>2014-07-11 02:28:15 +0200
committerNils Maier <maierman@web.de>2014-07-11 04:11:03 +0200
commit84bd18b9a12d284ee0f0a354fff97ba53caec0a8 (patch)
tree26728a78ebab77a5273f0daab2f1521d4be75630 /src
parent1da3af8869517f729d269ee87c1c0870de38f864 (diff)
Merge crypto_* from upstream
Revert "Fix typo" This reverts commit 4dfd8b884775737f85783976958f4e976b65a5fb. Revert "MinGW: Fix compiler warning with -Wstrict-aliasing" This reverts commit 897f0e87f4bd69bf6703a12feb326aeba53b0dcd.
Diffstat (limited to 'src')
-rw-r--r--src/crypto_endian.h25
-rw-r--r--src/crypto_hash.cc19
2 files changed, 27 insertions, 17 deletions
diff --git a/src/crypto_endian.h b/src/crypto_endian.h
index 55b32d80..def6e470 100644
--- a/src/crypto_endian.h
+++ b/src/crypto_endian.h
@@ -45,12 +45,11 @@ namespace crypto {
// Lets spend some quality time mucking around with byte swap and endian-ness.
// First bswap32:
#if (defined(__i386__) || defined(__x86_64__)) && defined(__GNUG__)
-#define __crypto_bswap32(p) \
- ({ \
- uint32_t t = p; \
- __asm__ __volatile__("bswap %0" : "=r"(t) : "0"(t)); \
- t; \
- })
+forceinline uint32_t __crypto_bswap32(uint32_t p)
+{
+ __asm__ __volatile__("bswap %0" : "=r"(p) : "0"(p));
+ return p;
+}
#elif defined(__GNUG__)
#define __crypto_bswap32 __builtin_bswap32
#else // defined(__GNUG__)
@@ -63,13 +62,11 @@ forceinline uint32_t __crypto_bswap32(uint32_t n)
// Next up: bswap64
#if defined(__x86_64__) && defined(__GNUG__)
-#define __crypto_bswap64(p) \
- ({ \
- uint64_t t = p; \
- __asm__ __volatile__("bswapq %q0" : "=r"(t) : "0"(t)); \
- t; \
- })
-
+forceinline uint64_t __crypto_bswap64(uint64_t p)
+{
+ __asm__ __volatile__("bswapq %q0" : "=r"(p) : "0"(p));
+ return p;
+}
#elif defined(__GNUG__)
#define __crypto_bswap64 __builtin_bswap64
#else // defined(__GNUG__)
@@ -109,7 +106,7 @@ inline uint64_t __crypto_bswap(uint64_t n)
#else // LITTLE_ENDIAN != WORD_ORDER
#define __crypto_be(n) (n)
#define __crypto_le(n) __crypto_bswap(n)
-#endif
+#endif // LITTLE_ENDIAN != WORD_ORDER
} // namespace crypto
diff --git a/src/crypto_hash.cc b/src/crypto_hash.cc
index 43a7cc0c..04d5b2a1 100644
--- a/src/crypto_hash.cc
+++ b/src/crypto_hash.cc
@@ -169,11 +169,17 @@ public:
// Append length, multiplied by 8 (because bits!)
const uint_fast64_t bits = __crypto_be(count_ << 3);
if (sizeof(word_t) == 4) {
- memcpy(buffer_.words + bsize - 2, &bits, sizeof(bits));
+#if LITTLE_ENDIAN == BYTE_ORDER
+ buffer_.words[bsize - 2] = bits;
+ buffer_.words[bsize - 1] = bits >> 32;
+#else // LITTLE_ENDIAN != BYTE_ORDER
+ buffer_.words[bsize - 2] = bits >> 32;
+ buffer_.words[bsize - 1] = bits;
+#endif // LITTLE_ENDIAN != BYTE_ORDER
}
else {
buffer_.words[bsize - 2] = 0;
- buffer_.words[bsize - 1] = (word_t)bits;
+ buffer_.words[bsize - 1] = bits;
}
// Last transform:
@@ -340,8 +346,15 @@ public:
// Append length, multiplied by 8 (because bits!)
const uint_fast64_t bits = __crypto_le(count_ << 3);
- memcpy(buffer_.words + 14, &bits, sizeof(bits));
+#if LITTLE_ENDIAN == BYTE_ORDER
+ buffer_.words[14] = bits;
+ buffer_.words[15] = bits >> 32;
+#else // LITTLE_ENDIAN != BYTE_ORDER
+ buffer_.words[14] = bits >> 32;
+ buffer_.words[15] = bits;
+#endif // LITTLE_ENDIAN != BYTE_ORDER
transform(buffer_.words);
+
#if BIG_ENDIAN == BYTE_ORDER
state_.words[0] = __crypto_bswap(state_.words[0]);
state_.words[1] = __crypto_bswap(state_.words[1]);