ibctminer
Version:
```js const IntMiner = require('./src'); const Debug = require('./src/log')(); const fs = require('fs'); const COMP = '[SIPC]';
228 lines (208 loc) • 7.18 kB
JavaScript
'use strict';
const ROUND_CONST = new Uint32Array([
0x00000001, 0x00000000, 0x00008082, 0x00000000,
0x0000808a, 0x80000000, 0x80008000, 0x80000000,
0x0000808b, 0x00000000, 0x80000001, 0x00000000,
0x80008081, 0x80000000, 0x00008009, 0x80000000,
0x0000008a, 0x00000000, 0x00000088, 0x00000000,
0x80008009, 0x00000000, 0x8000000a, 0x00000000,
0x8000808b, 0x00000000, 0x0000008b, 0x80000000,
0x00008089, 0x80000000, 0x00008003, 0x80000000,
0x00008002, 0x80000000, 0x00000080, 0x80000000,
0x0000800a, 0x00000000, 0x8000000a, 0x80000000,
0x80008081, 0x80000000, 0x00008080, 0x80000000,
0x80000001, 0x00000000, 0x80008008, 0x80000000
]);
function update(data, s) {
const count = 34;
for (let i = 0; i < count; i++)
s[i] ^= data.readUInt32LE(i * 4);
for (let n = 0; n < 48; n += 2) {
const c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];
const c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];
const c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];
const c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];
const c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];
const c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];
const c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];
const c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];
const c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];
const c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];
const h0 = c8 ^ ((c2 << 1) | (c3 >>> 31));
const l0 = c9 ^ ((c3 << 1) | (c2 >>> 31));
const h1 = c0 ^ ((c4 << 1) | (c5 >>> 31));
const l1 = c1 ^ ((c5 << 1) | (c4 >>> 31));
const h2 = c2 ^ ((c6 << 1) | (c7 >>> 31));
const l2 = c3 ^ ((c7 << 1) | (c6 >>> 31));
const h3 = c4 ^ ((c8 << 1) | (c9 >>> 31));
const l3 = c5 ^ ((c9 << 1) | (c8 >>> 31));
const h4 = c6 ^ ((c0 << 1) | (c1 >>> 31));
const l4 = c7 ^ ((c1 << 1) | (c0 >>> 31));
s[0] ^= h0;
s[1] ^= l0;
s[10] ^= h0;
s[11] ^= l0;
s[20] ^= h0;
s[21] ^= l0;
s[30] ^= h0;
s[31] ^= l0;
s[40] ^= h0;
s[41] ^= l0;
s[2] ^= h1;
s[3] ^= l1;
s[12] ^= h1;
s[13] ^= l1;
s[22] ^= h1;
s[23] ^= l1;
s[32] ^= h1;
s[33] ^= l1;
s[42] ^= h1;
s[43] ^= l1;
s[4] ^= h2;
s[5] ^= l2;
s[14] ^= h2;
s[15] ^= l2;
s[24] ^= h2;
s[25] ^= l2;
s[34] ^= h2;
s[35] ^= l2;
s[44] ^= h2;
s[45] ^= l2;
s[6] ^= h3;
s[7] ^= l3;
s[16] ^= h3;
s[17] ^= l3;
s[26] ^= h3;
s[27] ^= l3;
s[36] ^= h3;
s[37] ^= l3;
s[46] ^= h3;
s[47] ^= l3;
s[8] ^= h4;
s[9] ^= l4;
s[18] ^= h4;
s[19] ^= l4;
s[28] ^= h4;
s[29] ^= l4;
s[38] ^= h4;
s[39] ^= l4;
s[48] ^= h4;
s[49] ^= l4;
const b0 = s[0];
const b1 = s[1];
const b32 = (s[11] << 4) | (s[10] >>> 28);
const b33 = (s[10] << 4) | (s[11] >>> 28);
const b14 = (s[20] << 3) | (s[21] >>> 29);
const b15 = (s[21] << 3) | (s[20] >>> 29);
const b46 = (s[31] << 9) | (s[30] >>> 23);
const b47 = (s[30] << 9) | (s[31] >>> 23);
const b28 = (s[40] << 18) | (s[41] >>> 14);
const b29 = (s[41] << 18) | (s[40] >>> 14);
const b20 = (s[2] << 1) | (s[3] >>> 31);
const b21 = (s[3] << 1) | (s[2] >>> 31);
const b2 = (s[13] << 12) | (s[12] >>> 20);
const b3 = (s[12] << 12) | (s[13] >>> 20);
const b34 = (s[22] << 10) | (s[23] >>> 22);
const b35 = (s[23] << 10) | (s[22] >>> 22);
const b16 = (s[33] << 13) | (s[32] >>> 19);
const b17 = (s[32] << 13) | (s[33] >>> 19);
const b48 = (s[42] << 2) | (s[43] >>> 30);
const b49 = (s[43] << 2) | (s[42] >>> 30);
const b40 = (s[5] << 30) | (s[4] >>> 2);
const b41 = (s[4] << 30) | (s[5] >>> 2);
const b22 = (s[14] << 6) | (s[15] >>> 26);
const b23 = (s[15] << 6) | (s[14] >>> 26);
const b4 = (s[25] << 11) | (s[24] >>> 21);
const b5 = (s[24] << 11) | (s[25] >>> 21);
const b36 = (s[34] << 15) | (s[35] >>> 17);
const b37 = (s[35] << 15) | (s[34] >>> 17);
const b18 = (s[45] << 29) | (s[44] >>> 3);
const b19 = (s[44] << 29) | (s[45] >>> 3);
const b10 = (s[6] << 28) | (s[7] >>> 4);
const b11 = (s[7] << 28) | (s[6] >>> 4);
const b42 = (s[17] << 23) | (s[16] >>> 9);
const b43 = (s[16] << 23) | (s[17] >>> 9);
const b24 = (s[26] << 25) | (s[27] >>> 7);
const b25 = (s[27] << 25) | (s[26] >>> 7);
const b6 = (s[36] << 21) | (s[37] >>> 11);
const b7 = (s[37] << 21) | (s[36] >>> 11);
const b38 = (s[47] << 24) | (s[46] >>> 8);
const b39 = (s[46] << 24) | (s[47] >>> 8);
const b30 = (s[8] << 27) | (s[9] >>> 5);
const b31 = (s[9] << 27) | (s[8] >>> 5);
const b12 = (s[18] << 20) | (s[19] >>> 12);
const b13 = (s[19] << 20) | (s[18] >>> 12);
const b44 = (s[29] << 7) | (s[28] >>> 25);
const b45 = (s[28] << 7) | (s[29] >>> 25);
const b26 = (s[38] << 8) | (s[39] >>> 24);
const b27 = (s[39] << 8) | (s[38] >>> 24);
const b8 = (s[48] << 14) | (s[49] >>> 18);
const b9 = (s[49] << 14) | (s[48] >>> 18);
s[0] = b0 ^ (~b2 & b4);
s[1] = b1 ^ (~b3 & b5);
s[10] = b10 ^ (~b12 & b14);
s[11] = b11 ^ (~b13 & b15);
s[20] = b20 ^ (~b22 & b24);
s[21] = b21 ^ (~b23 & b25);
s[30] = b30 ^ (~b32 & b34);
s[31] = b31 ^ (~b33 & b35);
s[40] = b40 ^ (~b42 & b44);
s[41] = b41 ^ (~b43 & b45);
s[2] = b2 ^ (~b4 & b6);
s[3] = b3 ^ (~b5 & b7);
s[12] = b12 ^ (~b14 & b16);
s[13] = b13 ^ (~b15 & b17);
s[22] = b22 ^ (~b24 & b26);
s[23] = b23 ^ (~b25 & b27);
s[32] = b32 ^ (~b34 & b36);
s[33] = b33 ^ (~b35 & b37);
s[42] = b42 ^ (~b44 & b46);
s[43] = b43 ^ (~b45 & b47);
s[4] = b4 ^ (~b6 & b8);
s[5] = b5 ^ (~b7 & b9);
s[14] = b14 ^ (~b16 & b18);
s[15] = b15 ^ (~b17 & b19);
s[24] = b24 ^ (~b26 & b28);
s[25] = b25 ^ (~b27 & b29);
s[34] = b34 ^ (~b36 & b38);
s[35] = b35 ^ (~b37 & b39);
s[44] = b44 ^ (~b46 & b48);
s[45] = b45 ^ (~b47 & b49);
s[6] = b6 ^ (~b8 & b0);
s[7] = b7 ^ (~b9 & b1);
s[16] = b16 ^ (~b18 & b10);
s[17] = b17 ^ (~b19 & b11);
s[26] = b26 ^ (~b28 & b20);
s[27] = b27 ^ (~b29 & b21);
s[36] = b36 ^ (~b38 & b30);
s[37] = b37 ^ (~b39 & b31);
s[46] = b46 ^ (~b48 & b40);
s[47] = b47 ^ (~b49 & b41);
s[8] = b8 ^ (~b0 & b2);
s[9] = b9 ^ (~b1 & b3);
s[18] = b18 ^ (~b10 & b12);
s[19] = b19 ^ (~b11 & b13);
s[28] = b28 ^ (~b20 & b22);
s[29] = b29 ^ (~b21 & b23);
s[38] = b38 ^ (~b30 & b32);
s[39] = b39 ^ (~b31 & b33);
s[48] = b48 ^ (~b40 & b42);
s[49] = b49 ^ (~b41 & b43);
s[0] ^= ROUND_CONST[n + 0];
s[1] ^= ROUND_CONST[n + 1];
//dump(s, `s:n=${n}`, 4)
}
}
function sha3hns(data) {
const state = new Uint32Array(50);
update(data, state);
const final = Buffer.alloc(136, 0);
final[0] |= 6;
final[135] |= 0x80;
update(final, state);
const out = Buffer.alloc(32);
for (let i = 0; i < 32; i++)
out[i] = state[i >> 2] >> (8 * (i & 3));
return out;
}
module.exports = sha3hns;