summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Klauer <Andreas.Klauer@metamorpher.de>2017-04-04 18:30:14 +0200
committerBrian Turek <brian.turek@gmail.com>2017-04-04 17:30:14 +0100
commit0bb294c2822dfaeb57cf4bebcaccdafef0f2a476 (patch)
tree15db8e2bd7e19130ce47940dc9a2caeea8a5ea8a
parent8cd60969d6aadc946cfaf6650de4b952a4fb6fa8 (diff)
downloadjsSHA-0bb294c2822dfaeb57cf4bebcaccdafef0f2a476.zip
jsSHA-0bb294c2822dfaeb57cf4bebcaccdafef0f2a476.tar.gz
jsSHA-0bb294c2822dfaeb57cf4bebcaccdafef0f2a476.tar.bz2
SHA3: xor_64(varargs) -> xor_64_2(a,b), xor_64_5(a,b,c,d,e) (#55)
Decompose xor_64(var_args) into xor_64_2(a,b) and xor_64_5(a,b,c,d,e) for speed
-rw-r--r--src/sha_dev.js49
1 files changed, 32 insertions, 17 deletions
diff --git a/src/sha_dev.js b/src/sha_dev.js
index 629b59c..7ab2799 100644
--- a/src/sha_dev.js
+++ b/src/sha_dev.js
@@ -1128,23 +1128,38 @@ var SUPPORTED_ALGS = 8 | 4 | 2 | 1;
}
/**
- * XORs all of the given arguments
+ * XORs two given arguments.
*
* @private
- * @param {...Int_64} var_args The arguments to be XORed
+ * @param {Int_64} a First argument to be XORed
+ * @param {Int_64} b Second argument to be XORed
* @return {Int_64} The XOR of the arguments
*/
- function xor_64(var_args)
+ function xor_64_2(a, b)
{
- /* Use the `arguments` object here, not `var_args` */
- var lowXor = 0, highXor = 0, i;
+ return new Int_64(
+ a.highOrder ^ b.highOrder,
+ a.lowOrder ^ b.lowOrder
+ );
+ }
- for (i = 0; i < arguments.length; i += 1)
- {
- lowXor ^= arguments[i].lowOrder;
- highXor ^= arguments[i].highOrder;
- }
- return new Int_64(highXor, lowXor);
+ /**
+ * XORs five given arguments.
+ *
+ * @private
+ * @param {Int_64} a First argument to be XORed
+ * @param {Int_64} b Second argument to be XORed
+ * @param {Int_64} c Third argument to be XORed
+ * @param {Int_64} d Fourth argument to be XORed
+ * @param {Int_64} e Fifth argument to be XORed
+ * @return {Int_64} The XOR of the arguments
+ */
+ function xor_64_5(a, b, c, d, e)
+ {
+ return new Int_64(
+ a.highOrder ^ b.highOrder ^ c.highOrder ^ d.highOrder ^ e.highOrder,
+ a.lowOrder ^ b.lowOrder ^ c.lowOrder ^ d.lowOrder ^ e.lowOrder
+ );
}
/**
@@ -1696,7 +1711,7 @@ var SUPPORTED_ALGS = 8 | 4 | 2 | 1;
{
for (x = 0; x < block.length; x+=2)
{
- state[(x >>> 1) % 5][((x >>> 1) / 5) | 0] = xor_64(
+ state[(x >>> 1) % 5][((x >>> 1) / 5) | 0] = xor_64_2(
state[(x >>> 1) % 5][((x >>> 1) / 5) | 0],
new Int_64(block[x + 1], block[x])
);
@@ -1713,18 +1728,18 @@ var SUPPORTED_ALGS = 8 | 4 | 2 | 1;
/* Perform theta step */
for (x = 0; x < 5; x += 1)
{
- C[x] = xor_64(state[x][0], state[x][1], state[x][2],
+ C[x] = xor_64_5(state[x][0], state[x][1], state[x][2],
state[x][3], state[x][4]);
}
for (x = 0; x < 5; x += 1)
{
- D[x] = xor_64(C[(x + 4) % 5], rotl_64(C[(x + 1) % 5], 1));
+ D[x] = xor_64_2(C[(x + 4) % 5], rotl_64(C[(x + 1) % 5], 1));
}
for (x = 0; x < 5; x += 1)
{
for (y = 0; y < 5; y += 1)
{
- state[x][y] = xor_64(state[x][y], D[x]);
+ state[x][y] = xor_64_2(state[x][y], D[x]);
}
}
@@ -1745,7 +1760,7 @@ var SUPPORTED_ALGS = 8 | 4 | 2 | 1;
{
for (y = 0; y < 5; y += 1)
{
- state[x][y] = xor_64(
+ state[x][y] = xor_64_2(
B[x][y],
new Int_64(
~(B[(x + 1) % 5][y].highOrder) & B[(x + 2) % 5][y].highOrder,
@@ -1756,7 +1771,7 @@ var SUPPORTED_ALGS = 8 | 4 | 2 | 1;
}
/* Perform iota step */
- state[0][0] = xor_64(state[0][0], rc_sha3[round]);
+ state[0][0] = xor_64_2(state[0][0], rc_sha3[round]);
}
return state;