aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/hash/blake2/blake2b.cpp83
1 files changed, 44 insertions, 39 deletions
diff --git a/src/lib/hash/blake2/blake2b.cpp b/src/lib/hash/blake2/blake2b.cpp
index 33cc8a2f4..6d897b29f 100644
--- a/src/lib/hash/blake2/blake2b.cpp
+++ b/src/lib/hash/blake2/blake2b.cpp
@@ -53,6 +53,38 @@ void Blake2b::state_init()
m_F[0] = m_F[1] = 0;
}
+namespace {
+
+inline void G(uint64_t& a, uint64_t& b, uint64_t& c, uint64_t& d,
+ uint64_t M0, uint64_t M1)
+ {
+ a = a + b + M0;
+ d = rotr<32>(d ^ a);
+ c = c + d;
+ b = rotr<24>(b ^ c);
+ a = a + b + M1;
+ d = rotr<16>(d ^ a);
+ c = c + d;
+ b = rotr<63>(b ^ c);
+ }
+
+template<size_t i0, size_t i1, size_t i2, size_t i3, size_t i4, size_t i5, size_t i6, size_t i7,
+ size_t i8, size_t i9, size_t iA, size_t iB, size_t iC, size_t iD, size_t iE, size_t iF>
+inline void ROUND(uint64_t* v, const uint64_t* M)
+ {
+ G(v[ 0], v[ 4], v[ 8], v[12], M[i0], M[i1]);
+ G(v[ 1], v[ 5], v[ 9], v[13], M[i2], M[i3]);
+ G(v[ 2], v[ 6], v[10], v[14], M[i4], M[i5]);
+ G(v[ 3], v[ 7], v[11], v[15], M[i6], M[i7]);
+ G(v[ 0], v[ 5], v[10], v[15], M[i8], M[i9]);
+ G(v[ 1], v[ 6], v[11], v[12], M[iA], M[iB]);
+ G(v[ 2], v[ 7], v[ 8], v[13], M[iC], M[iD]);
+ G(v[ 3], v[ 4], v[ 9], v[14], M[iE], M[iF]);
+ }
+
+
+}
+
void Blake2b::compress(const uint8_t* input, size_t blocks, uint64_t increment)
{
for(size_t b = 0; b != blocks; ++b)
@@ -79,51 +111,24 @@ void Blake2b::compress(const uint8_t* input, size_t blocks, uint64_t increment)
v[14] ^= m_F[0];
v[15] ^= m_F[1];
-#define G(a, b, c, d, M0, M1) \
- do { \
- a = a + b + M0; \
- d = rotr<32>(d ^ a); \
- c = c + d; \
- b = rotr<24>(b ^ c); \
- a = a + b + M1; \
- d = rotr<16>(d ^ a); \
- c = c + d; \
- b = rotr<63>(b ^ c); \
- } while(0)
-
-#define ROUND(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, iA, iB, iC, iD, iE, iF) \
- do { \
- G(v[ 0], v[ 4], v[ 8], v[12], M[i0], M[i1]); \
- G(v[ 1], v[ 5], v[ 9], v[13], M[i2], M[i3]); \
- G(v[ 2], v[ 6], v[10], v[14], M[i4], M[i5]); \
- G(v[ 3], v[ 7], v[11], v[15], M[i6], M[i7]); \
- G(v[ 0], v[ 5], v[10], v[15], M[i8], M[i9]); \
- G(v[ 1], v[ 6], v[11], v[12], M[iA], M[iB]); \
- G(v[ 2], v[ 7], v[ 8], v[13], M[iC], M[iD]); \
- G(v[ 3], v[ 4], v[ 9], v[14], M[iE], M[iF]); \
- } while(0)
-
- ROUND( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
- ROUND(14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3);
- ROUND(11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4);
- ROUND( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8);
- ROUND( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13);
- ROUND( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9);
- ROUND(12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11);
- ROUND(13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10);
- ROUND( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5);
- ROUND(10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0);
- ROUND( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
- ROUND(14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3);
+ ROUND< 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15>(v, M);
+ ROUND<14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3>(v, M);
+ ROUND<11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4>(v, M);
+ ROUND< 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8>(v, M);
+ ROUND< 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13>(v, M);
+ ROUND< 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9>(v, M);
+ ROUND<12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11>(v, M);
+ ROUND<13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10>(v, M);
+ ROUND< 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5>(v, M);
+ ROUND<10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0>(v, M);
+ ROUND< 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15>(v, M);
+ ROUND<14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3>(v, M);
for(size_t i = 0; i < 8; i++)
{
m_H[i] ^= v[i] ^ v[i + 8];
}
}
-
-#undef G
-#undef ROUND
}
void Blake2b::add_data(const uint8_t input[], size_t length)