summaryrefslogtreecommitdiff
path: root/whrlpool.cpp
diff options
context:
space:
mode:
authorweidai <weidai11@users.noreply.github.com>2003-05-18 00:38:56 +0000
committerweidai <weidai11@users.noreply.github.com>2003-05-18 00:38:56 +0000
commit1a1fca3f87fd827ad266a65329e2144930ead5eb (patch)
treeb2ccca7e09b8dc9e5d51a93c246d1ed76f5e6b2d /whrlpool.cpp
parent9aefdc7ea37246428be8d0e91cf5fce0bb17bd91 (diff)
downloadcryptopp-git-1a1fca3f87fd827ad266a65329e2144930ead5eb.tar.gz
work around GCC 3.2 code generation bug
Diffstat (limited to 'whrlpool.cpp')
-rw-r--r--whrlpool.cpp263
1 files changed, 38 insertions, 225 deletions
diff --git a/whrlpool.cpp b/whrlpool.cpp
index 6f483efd..e9207e67 100644
--- a/whrlpool.cpp
+++ b/whrlpool.cpp
@@ -623,8 +623,7 @@ static const word64 C3[256] = {
W64LIT(0x936b3ff8f815f83f), W64LIT(0x44c2a486869786a4),
};
-static const word64 rc[R + 1] = {
- W64LIT(0x0000000000000000),
+static const word64 rc[R] = {
W64LIT(0x1823c6e887b8014f),
W64LIT(0x36a6d2f5796f9152),
W64LIT(0x60bc9b8ea30c7b35),
@@ -637,244 +636,58 @@ static const word64 rc[R + 1] = {
W64LIT(0xca2dbf07ad5a8333)
};
-
// Whirlpool basic transformation. Transforms state based on block.
void Whirlpool::Transform(word64 *digest, const word64 *block)
{
- int r;
- word64 L[8]; // temporary storage
- word64 state[8]; // the cipher state
- word64 K[8]; // the round key
+ word64 w[8]; // temporary storage
+ word64 s[8]; // the cipher state
+ word64 k[8]; // the round key
// Compute and apply K^0 to the cipher state
// Also apply part of the Miyaguchi-Preneel compression function
- digest[0] = state[0] = block[0] ^ (K[0] = digest[0]);
- digest[1] = state[1] = block[1] ^ (K[1] = digest[1]);
- digest[2] = state[2] = block[2] ^ (K[2] = digest[2]);
- digest[3] = state[3] = block[3] ^ (K[3] = digest[3]);
- digest[4] = state[4] = block[4] ^ (K[4] = digest[4]);
- digest[5] = state[5] = block[5] ^ (K[5] = digest[5]);
- digest[6] = state[6] = block[6] ^ (K[6] = digest[6]);
- digest[7] = state[7] = block[7] ^ (K[7] = digest[7]);
+ digest[0] = s[0] = block[0] ^ (k[0] = digest[0]);
+ digest[1] = s[1] = block[1] ^ (k[1] = digest[1]);
+ digest[2] = s[2] = block[2] ^ (k[2] = digest[2]);
+ digest[3] = s[3] = block[3] ^ (k[3] = digest[3]);
+ digest[4] = s[4] = block[4] ^ (k[4] = digest[4]);
+ digest[5] = s[5] = block[5] ^ (k[5] = digest[5]);
+ digest[6] = s[6] = block[6] ^ (k[6] = digest[6]);
+ digest[7] = s[7] = block[7] ^ (k[7] = digest[7]);
// Iterate over all rounds:
- for (r = 1; r <= R; r++) {
+ for (int r = 0; r < R; r++)
+ {
+ word64 t;
// Compute K^r from K^{r-1}:
- L[0] =
- C0[GETBYTE(K[4], 3)] ^
- C1[GETBYTE(K[3], 2)] ^
- C2[GETBYTE(K[2], 1)] ^
- C3[GETBYTE(K[1], 0)];
- L[0] = (L[0] >> 32) | (L[0] << 32);
- L[0] ^=
- C0[GETBYTE(K[0], 7)] ^
- C1[GETBYTE(K[7], 6)] ^
- C2[GETBYTE(K[6], 5)] ^
- C3[GETBYTE(K[5], 4)] ^
- rc[r];
- L[1] =
- C0[GETBYTE(K[5], 3)] ^
- C1[GETBYTE(K[4], 2)] ^
- C2[GETBYTE(K[3], 1)] ^
- C3[GETBYTE(K[2], 0)];
- L[1] = (L[1] >> 32) | (L[1] << 32);
- L[1] ^=
- C0[GETBYTE(K[1], 7)] ^
- C1[GETBYTE(K[0], 6)] ^
- C2[GETBYTE(K[7], 5)] ^
- C3[GETBYTE(K[6], 4)];
- L[2] =
- C0[GETBYTE(K[6], 3)] ^
- C1[GETBYTE(K[5], 2)] ^
- C2[GETBYTE(K[4], 1)] ^
- C3[GETBYTE(K[3], 0)];
- L[2] = (L[2] >> 32) | (L[2] << 32);
- L[2] ^=
- C0[GETBYTE(K[2], 7)] ^
- C1[GETBYTE(K[1], 6)] ^
- C2[GETBYTE(K[0], 5)] ^
- C3[GETBYTE(K[7], 4)];
- L[3] =
- C0[GETBYTE(K[7], 3)] ^
- C1[GETBYTE(K[6], 2)] ^
- C2[GETBYTE(K[5], 1)] ^
- C3[GETBYTE(K[4], 0)];
- L[3] = (L[3] >> 32) | (L[3] << 32);
- L[3] ^=
- C0[GETBYTE(K[3], 7)] ^
- C1[GETBYTE(K[2], 6)] ^
- C2[GETBYTE(K[1], 5)] ^
- C3[GETBYTE(K[0], 4)];
- L[4] =
- C0[GETBYTE(K[0], 3)] ^
- C1[GETBYTE(K[7], 2)] ^
- C2[GETBYTE(K[6], 1)] ^
- C3[GETBYTE(K[5], 0)];
- L[4] = (L[4] >> 32) | (L[4] << 32);
- L[4] ^=
- C0[GETBYTE(K[4], 7)] ^
- C1[GETBYTE(K[3], 6)] ^
- C2[GETBYTE(K[2], 5)] ^
- C3[GETBYTE(K[1], 4)];
- L[5] =
- C0[GETBYTE(K[1], 3)] ^
- C1[GETBYTE(K[0], 2)] ^
- C2[GETBYTE(K[7], 1)] ^
- C3[GETBYTE(K[6], 0)];
- L[5] = (L[5] >> 32) | (L[5] << 32);
- L[5] ^=
- C0[GETBYTE(K[5], 7)] ^
- C1[GETBYTE(K[4], 6)] ^
- C2[GETBYTE(K[3], 5)] ^
- C3[GETBYTE(K[2], 4)];
- L[6] =
- C0[GETBYTE(K[2], 3)] ^
- C1[GETBYTE(K[1], 2)] ^
- C2[GETBYTE(K[0], 1)] ^
- C3[GETBYTE(K[7], 0)];
- L[6] = (L[6] >> 32) | (L[6] << 32);
- L[6] ^=
- C0[GETBYTE(K[6], 7)] ^
- C1[GETBYTE(K[5], 6)] ^
- C2[GETBYTE(K[4], 5)] ^
- C3[GETBYTE(K[3], 4)];
- L[7] =
- C0[GETBYTE(K[3], 3)] ^
- C1[GETBYTE(K[2], 2)] ^
- C2[GETBYTE(K[1], 1)] ^
- C3[GETBYTE(K[0], 0)];
- L[7] = (L[7] >> 32) | (L[7] << 32);
- L[7] ^=
- C0[GETBYTE(K[7], 7)] ^
- C1[GETBYTE(K[6], 6)] ^
- C2[GETBYTE(K[5], 5)] ^
- C3[GETBYTE(K[4], 4)];
- K[0] = L[0];
- K[1] = L[1];
- K[2] = L[2];
- K[3] = L[3];
- K[4] = L[4];
- K[5] = L[5];
- K[6] = L[6];
- K[7] = L[7];
+#define K(i,j) GETBYTE(k[(i+j+1)%8], j)
+#define KS(i) \
+ t = C0[K(i,3)] ^ C1[K(i,2)] ^ C2[K(i,1)] ^ C3[K(i,0)]; \
+ w[i] = (t >> 32) ^ (t << 32) ^ C0[K(i,7)] ^ C1[K(i,6)] ^ C2[K(i,5)] ^ C3[K(i,4)];
+
+ KS(0); KS(1); KS(2); KS(3); KS(4); KS(5); KS(6); KS(7);
+ k[0] = w[0] ^ rc[r];
+ k[1] = w[1]; k[2] = w[2]; k[3] = w[3]; k[4] = w[4]; k[5] = w[5]; k[6] = w[6]; k[7] = w[7];
// Apply the r-th round transformation:
- L[0] =
- C0[GETBYTE(state[4], 3)] ^
- C1[GETBYTE(state[3], 2)] ^
- C2[GETBYTE(state[2], 1)] ^
- C3[GETBYTE(state[1], 0)];
- L[0] = (L[0] >> 32) | (L[0] << 32);
- L[0] ^=
- C0[GETBYTE(state[0], 7)] ^
- C1[GETBYTE(state[7], 6)] ^
- C2[GETBYTE(state[6], 5)] ^
- C3[GETBYTE(state[5], 4)] ^
- K[0];
- L[1] =
- C0[GETBYTE(state[5], 3)] ^
- C1[GETBYTE(state[4], 2)] ^
- C2[GETBYTE(state[3], 1)] ^
- C3[GETBYTE(state[2], 0)];
- L[1] = (L[1] >> 32) | (L[1] << 32);
- L[1] ^=
- C0[GETBYTE(state[1], 7)] ^
- C1[GETBYTE(state[0], 6)] ^
- C2[GETBYTE(state[7], 5)] ^
- C3[GETBYTE(state[6], 4)] ^
- K[1];
- L[2] =
- C0[GETBYTE(state[6], 3)] ^
- C1[GETBYTE(state[5], 2)] ^
- C2[GETBYTE(state[4], 1)] ^
- C3[GETBYTE(state[3], 0)];
- L[2] = (L[2] >> 32) | (L[2] << 32);
- L[2] ^=
- C0[GETBYTE(state[2], 7)] ^
- C1[GETBYTE(state[1], 6)] ^
- C2[GETBYTE(state[0], 5)] ^
- C3[GETBYTE(state[7], 4)] ^
- K[2];
- L[3] =
- C0[GETBYTE(state[7], 3)] ^
- C1[GETBYTE(state[6], 2)] ^
- C2[GETBYTE(state[5], 1)] ^
- C3[GETBYTE(state[4], 0)];
- L[3] = (L[3] >> 32) | (L[3] << 32);
- L[3] ^=
- C0[GETBYTE(state[3], 7)] ^
- C1[GETBYTE(state[2], 6)] ^
- C2[GETBYTE(state[1], 5)] ^
- C3[GETBYTE(state[0], 4)] ^
- K[3];
- L[4] =
- C0[GETBYTE(state[0], 3)] ^
- C1[GETBYTE(state[7], 2)] ^
- C2[GETBYTE(state[6], 1)] ^
- C3[GETBYTE(state[5], 0)];
- L[4] = (L[4] >> 32) | (L[4] << 32);
- L[4] ^=
- C0[GETBYTE(state[4], 7)] ^
- C1[GETBYTE(state[3], 6)] ^
- C2[GETBYTE(state[2], 5)] ^
- C3[GETBYTE(state[1], 4)] ^
- K[4];
- L[5] =
- C0[GETBYTE(state[1], 3)] ^
- C1[GETBYTE(state[0], 2)] ^
- C2[GETBYTE(state[7], 1)] ^
- C3[GETBYTE(state[6], 0)];
- L[5] = (L[5] >> 32) | (L[5] << 32);
- L[5] ^=
- C0[GETBYTE(state[5], 7)] ^
- C1[GETBYTE(state[4], 6)] ^
- C2[GETBYTE(state[3], 5)] ^
- C3[GETBYTE(state[2], 4)] ^
- K[5];
- L[6] =
- C0[GETBYTE(state[2], 3)] ^
- C1[GETBYTE(state[1], 2)] ^
- C2[GETBYTE(state[0], 1)] ^
- C3[GETBYTE(state[7], 0)];
- L[6] = (L[6] >> 32) | (L[6] << 32);
- L[6] ^=
- C0[GETBYTE(state[6], 7)] ^
- C1[GETBYTE(state[5], 6)] ^
- C2[GETBYTE(state[4], 5)] ^
- C3[GETBYTE(state[3], 4)] ^
- K[6];
- L[7] =
- C0[GETBYTE(state[3], 3)] ^
- C1[GETBYTE(state[2], 2)] ^
- C2[GETBYTE(state[1], 1)] ^
- C3[GETBYTE(state[0], 0)];
- L[7] = (L[7] >> 32) | (L[7] << 32);
- L[7] ^=
- C0[GETBYTE(state[7], 7)] ^
- C1[GETBYTE(state[6], 6)] ^
- C2[GETBYTE(state[5], 5)] ^
- C3[GETBYTE(state[4], 4)] ^
- K[7];
- state[0] = L[0];
- state[1] = L[1];
- state[2] = L[2];
- state[3] = L[3];
- state[4] = L[4];
- state[5] = L[5];
- state[6] = L[6];
- state[7] = L[7];
+#define S(i,j) GETBYTE(s[(i+j+1)%8], j)
+#define TS(i) \
+ t = C0[S(i,3)] ^ C1[S(i,2)] ^ C2[S(i,1)] ^ C3[S(i,0)]; \
+ w[i] = (t >> 32) ^ (t << 32) ^ C0[S(i,7)] ^ C1[S(i,6)] ^ C2[S(i,5)] ^ C3[S(i,4)] ^ k[i];
+
+ TS(0); TS(1); TS(2); TS(3); TS(4); TS(5); TS(6); TS(7);
+ s[0] = w[0]; s[1] = w[1]; s[2] = w[2]; s[3] = w[3]; s[4] = w[4]; s[5] = w[5]; s[6] = w[6]; s[7] = w[7];
}
// Apply the rest of the Miyaguchi-Preneel compression function:
- digest[0] ^= state[0];
- digest[1] ^= state[1];
- digest[2] ^= state[2];
- digest[3] ^= state[3];
- digest[4] ^= state[4];
- digest[5] ^= state[5];
- digest[6] ^= state[6];
- digest[7] ^= state[7];
+ digest[0] ^= s[0];
+ digest[1] ^= s[1];
+ digest[2] ^= s[2];
+ digest[3] ^= s[3];
+ digest[4] ^= s[4];
+ digest[5] ^= s[5];
+ digest[6] ^= s[6];
+ digest[7] ^= s[7];
}
NAMESPACE_END