Comparing version 2.2.1 to 2.3.0
@@ -8,17 +8,17 @@ // BLAKE.js v1.0.1 | ||
var ERROR_MSG_INPUT = 'Input must be an string, Buffer or Uint8Array' | ||
var ERROR_MSG_INPUT = 'Input must be an string, Buffer or Uint8Array'; | ||
// For convenience, let people hash a string, not just a Uint8Array | ||
function normalizeInput(input) { | ||
var ret | ||
var ret; | ||
if (input instanceof Uint8Array) { | ||
ret = input | ||
ret = input; | ||
/*} else if (input instanceof Buffer) { | ||
ret = new Uint8Array(input) | ||
} else if (typeof (input) === 'string') { | ||
} else if (typeof (input) === 'string') { | ||
ret = new Uint8Array(new Buffer(input, 'utf8'))*/ | ||
} else { | ||
throw new Error(ERROR_MSG_INPUT) | ||
throw new Error(ERROR_MSG_INPUT); | ||
} | ||
return ret | ||
return ret; | ||
} | ||
@@ -29,7 +29,5 @@ | ||
function toHex(bytes) { | ||
return Array.prototype.map | ||
.call(bytes, function(n) { | ||
return (n < 16 ? '0' : '') + n.toString(16) | ||
}) | ||
.join('') | ||
return Array.prototype.map.call(bytes, function (n) { | ||
return (n < 16 ? '0' : '') + n.toString(16); | ||
}).join(''); | ||
} | ||
@@ -39,3 +37,3 @@ | ||
function uint32ToHex(val) { | ||
return (0x100000000 + val).toString(16).substring(1) | ||
return (0x100000000 + val).toString(16).substring(1); | ||
} | ||
@@ -47,9 +45,9 @@ | ||
function ADD64AA(v, a, b) { | ||
var o0 = v[a] + v[b] | ||
var o1 = v[a + 1] + v[b + 1] | ||
var o0 = v[a] + v[b]; | ||
var o1 = v[a + 1] + v[b + 1]; | ||
if (o0 >= 0x100000000) { | ||
o1++ | ||
o1++; | ||
} | ||
v[a] = o0 | ||
v[a + 1] = o1 | ||
v[a] = o0; | ||
v[a + 1] = o1; | ||
} | ||
@@ -61,12 +59,12 @@ | ||
function ADD64AC(v, a, b0, b1) { | ||
var o0 = v[a] + b0 | ||
var o0 = v[a] + b0; | ||
if (b0 < 0) { | ||
o0 += 0x100000000 | ||
o0 += 0x100000000; | ||
} | ||
var o1 = v[a + 1] + b1 | ||
var o1 = v[a + 1] + b1; | ||
if (o0 >= 0x100000000) { | ||
o1++ | ||
o1++; | ||
} | ||
v[a] = o0 | ||
v[a + 1] = o1 | ||
v[a] = o0; | ||
v[a + 1] = o1; | ||
} | ||
@@ -76,3 +74,3 @@ | ||
function B2B_GET32(arr, i) { | ||
return arr[i] ^ (arr[i + 1] << 8) ^ (arr[i + 2] << 16) ^ (arr[i + 3] << 24) | ||
return arr[i] ^ arr[i + 1] << 8 ^ arr[i + 2] << 16 ^ arr[i + 3] << 24; | ||
} | ||
@@ -83,256 +81,46 @@ | ||
function B2B_G(a, b, c, d, ix, iy) { | ||
var x0 = m[ix] | ||
var x1 = m[ix + 1] | ||
var y0 = m[iy] | ||
var y1 = m[iy + 1] | ||
var x0 = m[ix]; | ||
var x1 = m[ix + 1]; | ||
var y0 = m[iy]; | ||
var y1 = m[iy + 1]; | ||
ADD64AA(v, a, b) // v[a,a+1] += v[b,b+1] ... in JS we must store a uint64 as two uint32s | ||
ADD64AC(v, a, x0, x1) // v[a, a+1] += x ... x0 is the low 32 bits of x, x1 is the high 32 bits | ||
ADD64AA(v, a, b); // v[a,a+1] += v[b,b+1] ... in JS we must store a uint64 as two uint32s | ||
ADD64AC(v, a, x0, x1); // v[a, a+1] += x ... x0 is the low 32 bits of x, x1 is the high 32 bits | ||
// v[d,d+1] = (v[d,d+1] xor v[a,a+1]) rotated to the right by 32 bits | ||
var xor0 = v[d] ^ v[a] | ||
var xor1 = v[d + 1] ^ v[a + 1] | ||
v[d] = xor1 | ||
v[d + 1] = xor0 | ||
var xor0 = v[d] ^ v[a]; | ||
var xor1 = v[d + 1] ^ v[a + 1]; | ||
v[d] = xor1; | ||
v[d + 1] = xor0; | ||
ADD64AA(v, c, d) | ||
ADD64AA(v, c, d); | ||
// v[b,b+1] = (v[b,b+1] xor v[c,c+1]) rotated right by 24 bits | ||
xor0 = v[b] ^ v[c] | ||
xor1 = v[b + 1] ^ v[c + 1] | ||
v[b] = (xor0 >>> 24) ^ (xor1 << 8) | ||
v[b + 1] = (xor1 >>> 24) ^ (xor0 << 8) | ||
xor0 = v[b] ^ v[c]; | ||
xor1 = v[b + 1] ^ v[c + 1]; | ||
v[b] = xor0 >>> 24 ^ xor1 << 8; | ||
v[b + 1] = xor1 >>> 24 ^ xor0 << 8; | ||
ADD64AA(v, a, b) | ||
ADD64AC(v, a, y0, y1) | ||
ADD64AA(v, a, b); | ||
ADD64AC(v, a, y0, y1); | ||
// v[d,d+1] = (v[d,d+1] xor v[a,a+1]) rotated right by 16 bits | ||
xor0 = v[d] ^ v[a] | ||
xor1 = v[d + 1] ^ v[a + 1] | ||
v[d] = (xor0 >>> 16) ^ (xor1 << 16) | ||
v[d + 1] = (xor1 >>> 16) ^ (xor0 << 16) | ||
xor0 = v[d] ^ v[a]; | ||
xor1 = v[d + 1] ^ v[a + 1]; | ||
v[d] = xor0 >>> 16 ^ xor1 << 16; | ||
v[d + 1] = xor1 >>> 16 ^ xor0 << 16; | ||
ADD64AA(v, c, d) | ||
ADD64AA(v, c, d); | ||
// v[b,b+1] = (v[b,b+1] xor v[c,c+1]) rotated right by 63 bits | ||
xor0 = v[b] ^ v[c] | ||
xor1 = v[b + 1] ^ v[c + 1] | ||
v[b] = (xor1 >>> 31) ^ (xor0 << 1) | ||
v[b + 1] = (xor0 >>> 31) ^ (xor1 << 1) | ||
xor0 = v[b] ^ v[c]; | ||
xor1 = v[b + 1] ^ v[c + 1]; | ||
v[b] = xor1 >>> 31 ^ xor0 << 1; | ||
v[b + 1] = xor0 >>> 31 ^ xor1 << 1; | ||
} | ||
// Initialization Vector | ||
var BLAKE2B_IV32 = new Uint32Array([ | ||
0xf3bcc908, | ||
0x6a09e667, | ||
0x84caa73b, | ||
0xbb67ae85, | ||
0xfe94f82b, | ||
0x3c6ef372, | ||
0x5f1d36f1, | ||
0xa54ff53a, | ||
0xade682d1, | ||
0x510e527f, | ||
0x2b3e6c1f, | ||
0x9b05688c, | ||
0xfb41bd6b, | ||
0x1f83d9ab, | ||
0x137e2179, | ||
0x5be0cd19 | ||
]) | ||
var BLAKE2B_IV32 = new Uint32Array([0xf3bcc908, 0x6a09e667, 0x84caa73b, 0xbb67ae85, 0xfe94f82b, 0x3c6ef372, 0x5f1d36f1, 0xa54ff53a, 0xade682d1, 0x510e527f, 0x2b3e6c1f, 0x9b05688c, 0xfb41bd6b, 0x1f83d9ab, 0x137e2179, 0x5be0cd19]); | ||
var SIGMA8 = [ | ||
0, | ||
1, | ||
2, | ||
3, | ||
4, | ||
5, | ||
6, | ||
7, | ||
8, | ||
9, | ||
10, | ||
11, | ||
12, | ||
13, | ||
14, | ||
15, | ||
14, | ||
10, | ||
4, | ||
8, | ||
9, | ||
15, | ||
13, | ||
6, | ||
1, | ||
12, | ||
0, | ||
2, | ||
11, | ||
7, | ||
5, | ||
3, | ||
11, | ||
8, | ||
12, | ||
0, | ||
5, | ||
2, | ||
15, | ||
13, | ||
10, | ||
14, | ||
3, | ||
6, | ||
7, | ||
1, | ||
9, | ||
4, | ||
7, | ||
9, | ||
3, | ||
1, | ||
13, | ||
12, | ||
11, | ||
14, | ||
2, | ||
6, | ||
5, | ||
10, | ||
4, | ||
0, | ||
15, | ||
8, | ||
9, | ||
0, | ||
5, | ||
7, | ||
2, | ||
4, | ||
10, | ||
15, | ||
14, | ||
1, | ||
11, | ||
12, | ||
6, | ||
8, | ||
3, | ||
13, | ||
2, | ||
12, | ||
6, | ||
10, | ||
0, | ||
11, | ||
8, | ||
3, | ||
4, | ||
13, | ||
7, | ||
5, | ||
15, | ||
14, | ||
1, | ||
9, | ||
12, | ||
5, | ||
1, | ||
15, | ||
14, | ||
13, | ||
4, | ||
10, | ||
0, | ||
7, | ||
6, | ||
3, | ||
9, | ||
2, | ||
8, | ||
11, | ||
13, | ||
11, | ||
7, | ||
14, | ||
12, | ||
1, | ||
3, | ||
9, | ||
5, | ||
0, | ||
15, | ||
4, | ||
8, | ||
6, | ||
2, | ||
10, | ||
6, | ||
15, | ||
14, | ||
9, | ||
11, | ||
3, | ||
0, | ||
8, | ||
12, | ||
2, | ||
13, | ||
7, | ||
1, | ||
4, | ||
10, | ||
5, | ||
10, | ||
2, | ||
8, | ||
4, | ||
7, | ||
6, | ||
1, | ||
5, | ||
15, | ||
11, | ||
9, | ||
14, | ||
3, | ||
12, | ||
13, | ||
0, | ||
0, | ||
1, | ||
2, | ||
3, | ||
4, | ||
5, | ||
6, | ||
7, | ||
8, | ||
9, | ||
10, | ||
11, | ||
12, | ||
13, | ||
14, | ||
15, | ||
14, | ||
10, | ||
4, | ||
8, | ||
9, | ||
15, | ||
13, | ||
6, | ||
1, | ||
12, | ||
0, | ||
2, | ||
11, | ||
7, | ||
5, | ||
3 | ||
] | ||
var SIGMA8 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3, 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4, 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8, 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13, 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9, 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11, 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10, 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5, 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3]; | ||
@@ -342,24 +130,22 @@ // These are offsets into a uint64 buffer. | ||
// because this is Javascript and we don't have uint64s | ||
var SIGMA82 = new Uint8Array( | ||
SIGMA8.map(function(x) { | ||
return x * 2 | ||
}) | ||
) | ||
var SIGMA82 = new Uint8Array(SIGMA8.map(function (x) { | ||
return x * 2; | ||
})); | ||
// Compression function. 'last' flag indicates last block. | ||
// Note we're representing 16 uint64s as 32 uint32s | ||
var v = new Uint32Array(32) | ||
var m = new Uint32Array(32) | ||
var v = new Uint32Array(32); | ||
var m = new Uint32Array(32); | ||
function blake2bCompress(ctx, last) { | ||
var i = 0 | ||
var i = 0; | ||
// init work variables | ||
for (i = 0; i < 16; i++) { | ||
v[i] = ctx.h[i] | ||
v[i + 16] = BLAKE2B_IV32[i] | ||
v[i] = ctx.h[i]; | ||
v[i + 16] = BLAKE2B_IV32[i]; | ||
} | ||
// low 64 bits of offset | ||
v[24] = v[24] ^ ctx.t | ||
v[25] = v[25] ^ (ctx.t / 0x100000000) | ||
v[24] = v[24] ^ ctx.t; | ||
v[25] = v[25] ^ ctx.t / 0x100000000; | ||
// high 64 bits not supported, offset may not be higher than 2**53-1 | ||
@@ -369,4 +155,4 @@ | ||
if (last) { | ||
v[28] = ~v[28] | ||
v[29] = ~v[29] | ||
v[28] = ~v[28]; | ||
v[29] = ~v[29]; | ||
} | ||
@@ -376,3 +162,3 @@ | ||
for (i = 0; i < 32; i++) { | ||
m[i] = B2B_GET32(ctx.b, 4 * i) | ||
m[i] = B2B_GET32(ctx.b, 4 * i); | ||
} | ||
@@ -386,10 +172,10 @@ | ||
// util.debugPrint(' (i=' + (i < 10 ? ' ' : '') + i + ') v[16]', v, 64) | ||
B2B_G(0, 8, 16, 24, SIGMA82[i * 16 + 0], SIGMA82[i * 16 + 1]) | ||
B2B_G(2, 10, 18, 26, SIGMA82[i * 16 + 2], SIGMA82[i * 16 + 3]) | ||
B2B_G(4, 12, 20, 28, SIGMA82[i * 16 + 4], SIGMA82[i * 16 + 5]) | ||
B2B_G(6, 14, 22, 30, SIGMA82[i * 16 + 6], SIGMA82[i * 16 + 7]) | ||
B2B_G(0, 10, 20, 30, SIGMA82[i * 16 + 8], SIGMA82[i * 16 + 9]) | ||
B2B_G(2, 12, 22, 24, SIGMA82[i * 16 + 10], SIGMA82[i * 16 + 11]) | ||
B2B_G(4, 14, 16, 26, SIGMA82[i * 16 + 12], SIGMA82[i * 16 + 13]) | ||
B2B_G(6, 8, 18, 28, SIGMA82[i * 16 + 14], SIGMA82[i * 16 + 15]) | ||
B2B_G(0, 8, 16, 24, SIGMA82[i * 16 + 0], SIGMA82[i * 16 + 1]); | ||
B2B_G(2, 10, 18, 26, SIGMA82[i * 16 + 2], SIGMA82[i * 16 + 3]); | ||
B2B_G(4, 12, 20, 28, SIGMA82[i * 16 + 4], SIGMA82[i * 16 + 5]); | ||
B2B_G(6, 14, 22, 30, SIGMA82[i * 16 + 6], SIGMA82[i * 16 + 7]); | ||
B2B_G(0, 10, 20, 30, SIGMA82[i * 16 + 8], SIGMA82[i * 16 + 9]); | ||
B2B_G(2, 12, 22, 24, SIGMA82[i * 16 + 10], SIGMA82[i * 16 + 11]); | ||
B2B_G(4, 14, 16, 26, SIGMA82[i * 16 + 12], SIGMA82[i * 16 + 13]); | ||
B2B_G(6, 8, 18, 28, SIGMA82[i * 16 + 14], SIGMA82[i * 16 + 15]); | ||
} | ||
@@ -399,3 +185,3 @@ // util.debugPrint(' (i=12) v[16]', v, 64) | ||
for (i = 0; i < 16; i++) { | ||
ctx.h[i] = ctx.h[i] ^ v[i] ^ v[i + 16] | ||
ctx.h[i] = ctx.h[i] ^ v[i] ^ v[i + 16]; | ||
} | ||
@@ -410,6 +196,6 @@ // util.debugPrint('h[8]', ctx.h, 64) | ||
if (outlen === 0 || outlen > 64) { | ||
throw new Error('Illegal output length, expected 0 < length <= 64') | ||
throw new Error('Illegal output length, expected 0 < length <= 64'); | ||
} | ||
if (key && key.length > 64) { | ||
throw new Error('Illegal key, expected Uint8Array with 0 < length <= 64') | ||
throw new Error('Illegal key, expected Uint8Array with 0 < length <= 64'); | ||
} | ||
@@ -424,19 +210,19 @@ | ||
outlen: outlen // output length in bytes | ||
} | ||
// initialize hash state | ||
for (var i = 0; i < 16; i++) { | ||
ctx.h[i] = BLAKE2B_IV32[i] | ||
// initialize hash state | ||
};for (var i = 0; i < 16; i++) { | ||
ctx.h[i] = BLAKE2B_IV32[i]; | ||
} | ||
var keylen = key ? key.length : 0 | ||
ctx.h[0] ^= 0x01010000 ^ (keylen << 8) ^ outlen | ||
var keylen = key ? key.length : 0; | ||
ctx.h[0] ^= 0x01010000 ^ keylen << 8 ^ outlen; | ||
// key the hash, if applicable | ||
if (key) { | ||
blake2bUpdate(ctx, key) | ||
blake2bUpdate(ctx, key); | ||
// at the end | ||
ctx.c = 128 | ||
ctx.c = 128; | ||
} | ||
return ctx | ||
return ctx; | ||
} | ||
@@ -450,7 +236,7 @@ | ||
// buffer full ? | ||
ctx.t += ctx.c // add counters | ||
blake2bCompress(ctx, false) // compress (not last) | ||
ctx.c = 0 // counter to zero | ||
ctx.t += ctx.c; // add counters | ||
blake2bCompress(ctx, false); // compress (not last) | ||
ctx.c = 0; // counter to zero | ||
} | ||
ctx.b[ctx.c++] = input[i] | ||
ctx.b[ctx.c++] = input[i]; | ||
} | ||
@@ -462,16 +248,16 @@ } | ||
function blake2bFinal(ctx) { | ||
ctx.t += ctx.c // mark last block offset | ||
ctx.t += ctx.c; // mark last block offset | ||
while (ctx.c < 128) { | ||
// fill up with zeros | ||
ctx.b[ctx.c++] = 0 | ||
ctx.b[ctx.c++] = 0; | ||
} | ||
blake2bCompress(ctx, true) // final block flag = 1 | ||
blake2bCompress(ctx, true); // final block flag = 1 | ||
// little endian convert and store | ||
var out = new Uint8Array(ctx.outlen) | ||
var out = new Uint8Array(ctx.outlen); | ||
for (var i = 0; i < ctx.outlen; i++) { | ||
out[i] = ctx.h[i >> 2] >> (8 * (i & 3)) | ||
out[i] = ctx.h[i >> 2] >> 8 * (i & 3); | ||
} | ||
return out | ||
return out; | ||
} | ||
@@ -489,9 +275,9 @@ | ||
// preprocess inputs | ||
outlen = outlen || 64 | ||
input = normalizeInput(input) | ||
outlen = outlen || 64; | ||
input = normalizeInput(input); | ||
// do the math | ||
var ctx = blake2bInit(outlen, key) | ||
blake2bUpdate(ctx, input) | ||
return blake2bFinal(ctx) | ||
var ctx = blake2bInit(outlen, key); | ||
blake2bUpdate(ctx, input); | ||
return blake2bFinal(ctx); | ||
} | ||
@@ -508,6 +294,6 @@ | ||
function blake2bHex(input, key, outlen) { | ||
var output = blake2b(input, key, outlen) | ||
return toHex(output) | ||
var output = blake2b(input, key, outlen); | ||
return toHex(output); | ||
} | ||
module.exports = {blake2b, blake2bInit, blake2bUpdate, blake2bFinal} | ||
module.exports = { blake2b, blake2bInit, blake2bUpdate, blake2bFinal }; |
@@ -1,3 +0,3 @@ | ||
const {blake2bInit, blake2bUpdate, blake2bFinal} = require('./blake2b') | ||
const nacl = {} | ||
const { blake2bInit, blake2bUpdate, blake2bFinal } = require('./blake2b'); | ||
const nacl = {}; | ||
@@ -10,138 +10,53 @@ // Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. | ||
var u64 = function(h, l) { | ||
this.hi = h | (0 >>> 0) | ||
this.lo = l | (0 >>> 0) | ||
} | ||
var gf = function(init) { | ||
var u64 = function (h, l) { | ||
this.hi = h | 0 >>> 0; | ||
this.lo = l | 0 >>> 0; | ||
}; | ||
var gf = function (init) { | ||
var i, | ||
r = new Float64Array(16) | ||
if (init) for (i = 0; i < init.length; i++) r[i] = init[i] | ||
return r | ||
} | ||
r = new Float64Array(16); | ||
if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; | ||
return r; | ||
}; | ||
// Pluggable, initialized in high-level API below. | ||
var randombytes = function(/* x, n */) { | ||
throw new Error('no PRNG') | ||
} | ||
var randombytes = function () /* x, n */{ | ||
throw new Error('no PRNG'); | ||
}; | ||
var _0 = new Uint8Array(16) | ||
var _9 = new Uint8Array(32) | ||
_9[0] = 9 | ||
var _0 = new Uint8Array(16); | ||
var _9 = new Uint8Array(32); | ||
_9[0] = 9; | ||
var gf0 = gf(), | ||
gf1 = gf([1]), | ||
_121665 = gf([0xdb41, 1]), | ||
D = gf([ | ||
0x78a3, | ||
0x1359, | ||
0x4dca, | ||
0x75eb, | ||
0xd8ab, | ||
0x4141, | ||
0x0a4d, | ||
0x0070, | ||
0xe898, | ||
0x7779, | ||
0x4079, | ||
0x8cc7, | ||
0xfe73, | ||
0x2b6f, | ||
0x6cee, | ||
0x5203 | ||
]), | ||
D2 = gf([ | ||
0xf159, | ||
0x26b2, | ||
0x9b94, | ||
0xebd6, | ||
0xb156, | ||
0x8283, | ||
0x149a, | ||
0x00e0, | ||
0xd130, | ||
0xeef3, | ||
0x80f2, | ||
0x198e, | ||
0xfce7, | ||
0x56df, | ||
0xd9dc, | ||
0x2406 | ||
]), | ||
X = gf([ | ||
0xd51a, | ||
0x8f25, | ||
0x2d60, | ||
0xc956, | ||
0xa7b2, | ||
0x9525, | ||
0xc760, | ||
0x692c, | ||
0xdc5c, | ||
0xfdd6, | ||
0xe231, | ||
0xc0a4, | ||
0x53fe, | ||
0xcd6e, | ||
0x36d3, | ||
0x2169 | ||
]), | ||
Y = gf([ | ||
0x6658, | ||
0x6666, | ||
0x6666, | ||
0x6666, | ||
0x6666, | ||
0x6666, | ||
0x6666, | ||
0x6666, | ||
0x6666, | ||
0x6666, | ||
0x6666, | ||
0x6666, | ||
0x6666, | ||
0x6666, | ||
0x6666, | ||
0x6666 | ||
]), | ||
I = gf([ | ||
0xa0b0, | ||
0x4a0e, | ||
0x1b27, | ||
0xc4ee, | ||
0xe478, | ||
0xad2f, | ||
0x1806, | ||
0x2f43, | ||
0xd7a7, | ||
0x3dfb, | ||
0x0099, | ||
0x2b4d, | ||
0xdf0b, | ||
0x4fc1, | ||
0x2480, | ||
0x2b83 | ||
]) | ||
gf1 = gf([1]), | ||
_121665 = gf([0xdb41, 1]), | ||
D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), | ||
D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), | ||
X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), | ||
Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), | ||
I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); | ||
function L32(x, c) { | ||
return (x << c) | (x >>> (32 - c)) | ||
return x << c | x >>> 32 - c; | ||
} | ||
function ld32(x, i) { | ||
var u = x[i + 3] & 0xff | ||
u = (u << 8) | (x[i + 2] & 0xff) | ||
u = (u << 8) | (x[i + 1] & 0xff) | ||
return (u << 8) | (x[i + 0] & 0xff) | ||
var u = x[i + 3] & 0xff; | ||
u = u << 8 | x[i + 2] & 0xff; | ||
u = u << 8 | x[i + 1] & 0xff; | ||
return u << 8 | x[i + 0] & 0xff; | ||
} | ||
function dl64(x, i) { | ||
var h = (x[i] << 24) | (x[i + 1] << 16) | (x[i + 2] << 8) | x[i + 3] | ||
var l = (x[i + 4] << 24) | (x[i + 5] << 16) | (x[i + 6] << 8) | x[i + 7] | ||
return new u64(h, l) | ||
var h = x[i] << 24 | x[i + 1] << 16 | x[i + 2] << 8 | x[i + 3]; | ||
var l = x[i + 4] << 24 | x[i + 5] << 16 | x[i + 6] << 8 | x[i + 7]; | ||
return new u64(h, l); | ||
} | ||
function st32(x, j, u) { | ||
var i | ||
var i; | ||
for (i = 0; i < 4; i++) { | ||
x[j + i] = u & 255 | ||
u >>>= 8 | ||
x[j + i] = u & 255; | ||
u >>>= 8; | ||
} | ||
@@ -151,10 +66,10 @@ } | ||
function ts64(x, i, u) { | ||
x[i] = (u.hi >> 24) & 0xff | ||
x[i + 1] = (u.hi >> 16) & 0xff | ||
x[i + 2] = (u.hi >> 8) & 0xff | ||
x[i + 3] = u.hi & 0xff | ||
x[i + 4] = (u.lo >> 24) & 0xff | ||
x[i + 5] = (u.lo >> 16) & 0xff | ||
x[i + 6] = (u.lo >> 8) & 0xff | ||
x[i + 7] = u.lo & 0xff | ||
x[i] = u.hi >> 24 & 0xff; | ||
x[i + 1] = u.hi >> 16 & 0xff; | ||
x[i + 2] = u.hi >> 8 & 0xff; | ||
x[i + 3] = u.hi & 0xff; | ||
x[i + 4] = u.lo >> 24 & 0xff; | ||
x[i + 5] = u.lo >> 16 & 0xff; | ||
x[i + 6] = u.lo >> 8 & 0xff; | ||
x[i + 7] = u.lo & 0xff; | ||
} | ||
@@ -164,13 +79,13 @@ | ||
var i, | ||
d = 0 | ||
for (i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i] | ||
return (1 & ((d - 1) >>> 8)) - 1 | ||
d = 0; | ||
for (i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i]; | ||
return (1 & d - 1 >>> 8) - 1; | ||
} | ||
function crypto_verify_16(x, xi, y, yi) { | ||
return vn(x, xi, y, yi, 16) | ||
return vn(x, xi, y, yi, 16); | ||
} | ||
function crypto_verify_32(x, xi, y, yi) { | ||
return vn(x, xi, y, yi, 32) | ||
return vn(x, xi, y, yi, 32); | ||
} | ||
@@ -180,40 +95,40 @@ | ||
var w = new Uint32Array(16), | ||
x = new Uint32Array(16), | ||
y = new Uint32Array(16), | ||
t = new Uint32Array(4) | ||
var i, j, m | ||
x = new Uint32Array(16), | ||
y = new Uint32Array(16), | ||
t = new Uint32Array(4); | ||
var i, j, m; | ||
for (i = 0; i < 4; i++) { | ||
x[5 * i] = ld32(c, 4 * i) | ||
x[1 + i] = ld32(k, 4 * i) | ||
x[6 + i] = ld32(inp, 4 * i) | ||
x[11 + i] = ld32(k, 16 + 4 * i) | ||
x[5 * i] = ld32(c, 4 * i); | ||
x[1 + i] = ld32(k, 4 * i); | ||
x[6 + i] = ld32(inp, 4 * i); | ||
x[11 + i] = ld32(k, 16 + 4 * i); | ||
} | ||
for (i = 0; i < 16; i++) y[i] = x[i] | ||
for (i = 0; i < 16; i++) y[i] = x[i]; | ||
for (i = 0; i < 20; i++) { | ||
for (j = 0; j < 4; j++) { | ||
for (m = 0; m < 4; m++) t[m] = x[(5 * j + 4 * m) % 16] | ||
t[1] ^= L32((t[0] + t[3]) | 0, 7) | ||
t[2] ^= L32((t[1] + t[0]) | 0, 9) | ||
t[3] ^= L32((t[2] + t[1]) | 0, 13) | ||
t[0] ^= L32((t[3] + t[2]) | 0, 18) | ||
for (m = 0; m < 4; m++) w[4 * j + (j + m) % 4] = t[m] | ||
for (m = 0; m < 4; m++) t[m] = x[(5 * j + 4 * m) % 16]; | ||
t[1] ^= L32(t[0] + t[3] | 0, 7); | ||
t[2] ^= L32(t[1] + t[0] | 0, 9); | ||
t[3] ^= L32(t[2] + t[1] | 0, 13); | ||
t[0] ^= L32(t[3] + t[2] | 0, 18); | ||
for (m = 0; m < 4; m++) w[4 * j + (j + m) % 4] = t[m]; | ||
} | ||
for (m = 0; m < 16; m++) x[m] = w[m] | ||
for (m = 0; m < 16; m++) x[m] = w[m]; | ||
} | ||
if (h) { | ||
for (i = 0; i < 16; i++) x[i] = (x[i] + y[i]) | 0 | ||
for (i = 0; i < 16; i++) x[i] = x[i] + y[i] | 0; | ||
for (i = 0; i < 4; i++) { | ||
x[5 * i] = (x[5 * i] - ld32(c, 4 * i)) | 0 | ||
x[6 + i] = (x[6 + i] - ld32(inp, 4 * i)) | 0 | ||
x[5 * i] = x[5 * i] - ld32(c, 4 * i) | 0; | ||
x[6 + i] = x[6 + i] - ld32(inp, 4 * i) | 0; | ||
} | ||
for (i = 0; i < 4; i++) { | ||
st32(out, 4 * i, x[5 * i]) | ||
st32(out, 16 + 4 * i, x[6 + i]) | ||
st32(out, 4 * i, x[5 * i]); | ||
st32(out, 16 + 4 * i, x[6 + i]); | ||
} | ||
} else { | ||
for (i = 0; i < 16; i++) st32(out, 4 * i, (x[i] + y[i]) | 0) | ||
for (i = 0; i < 16; i++) st32(out, 4 * i, x[i] + y[i] | 0); | ||
} | ||
@@ -223,29 +138,12 @@ } | ||
function crypto_core_salsa20(out, inp, k, c) { | ||
core(out, inp, k, c, false) | ||
return 0 | ||
core(out, inp, k, c, false); | ||
return 0; | ||
} | ||
function crypto_core_hsalsa20(out, inp, k, c) { | ||
core(out, inp, k, c, true) | ||
return 0 | ||
core(out, inp, k, c, true); | ||
return 0; | ||
} | ||
var sigma = new Uint8Array([ | ||
101, | ||
120, | ||
112, | ||
97, | ||
110, | ||
100, | ||
32, | ||
51, | ||
50, | ||
45, | ||
98, | ||
121, | ||
116, | ||
101, | ||
32, | ||
107 | ||
]) | ||
var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); | ||
// "expand 32-byte k" | ||
@@ -255,41 +153,41 @@ | ||
var z = new Uint8Array(16), | ||
x = new Uint8Array(64) | ||
var u, i | ||
if (!b) return 0 | ||
for (i = 0; i < 16; i++) z[i] = 0 | ||
for (i = 0; i < 8; i++) z[i] = n[i] | ||
x = new Uint8Array(64); | ||
var u, i; | ||
if (!b) return 0; | ||
for (i = 0; i < 16; i++) z[i] = 0; | ||
for (i = 0; i < 8; i++) z[i] = n[i]; | ||
while (b >= 64) { | ||
crypto_core_salsa20(x, z, k, sigma) | ||
for (i = 0; i < 64; i++) c[cpos + i] = (m ? m[mpos + i] : 0) ^ x[i] | ||
u = 1 | ||
crypto_core_salsa20(x, z, k, sigma); | ||
for (i = 0; i < 64; i++) c[cpos + i] = (m ? m[mpos + i] : 0) ^ x[i]; | ||
u = 1; | ||
for (i = 8; i < 16; i++) { | ||
u = (u + (z[i] & 0xff)) | 0 | ||
z[i] = u & 0xff | ||
u >>>= 8 | ||
u = u + (z[i] & 0xff) | 0; | ||
z[i] = u & 0xff; | ||
u >>>= 8; | ||
} | ||
b -= 64 | ||
cpos += 64 | ||
if (m) mpos += 64 | ||
b -= 64; | ||
cpos += 64; | ||
if (m) mpos += 64; | ||
} | ||
if (b > 0) { | ||
crypto_core_salsa20(x, z, k, sigma) | ||
for (i = 0; i < b; i++) c[cpos + i] = (m ? m[mpos + i] : 0) ^ x[i] | ||
crypto_core_salsa20(x, z, k, sigma); | ||
for (i = 0; i < b; i++) c[cpos + i] = (m ? m[mpos + i] : 0) ^ x[i]; | ||
} | ||
return 0 | ||
return 0; | ||
} | ||
function crypto_stream_salsa20(c, cpos, d, n, k) { | ||
return crypto_stream_salsa20_xor(c, cpos, null, 0, d, n, k) | ||
return crypto_stream_salsa20_xor(c, cpos, null, 0, d, n, k); | ||
} | ||
function crypto_stream(c, cpos, d, n, k) { | ||
var s = new Uint8Array(32) | ||
crypto_core_hsalsa20(s, n, k, sigma) | ||
return crypto_stream_salsa20(c, cpos, d, n.subarray(16), s) | ||
var s = new Uint8Array(32); | ||
crypto_core_hsalsa20(s, n, k, sigma); | ||
return crypto_stream_salsa20(c, cpos, d, n.subarray(16), s); | ||
} | ||
function crypto_stream_xor(c, cpos, m, mpos, d, n, k) { | ||
var s = new Uint8Array(32) | ||
crypto_core_hsalsa20(s, n, k, sigma) | ||
return crypto_stream_salsa20_xor(c, cpos, m, mpos, d, n.subarray(16), s) | ||
var s = new Uint8Array(32); | ||
crypto_core_hsalsa20(s, n, k, sigma); | ||
return crypto_stream_salsa20_xor(c, cpos, m, mpos, d, n.subarray(16), s); | ||
} | ||
@@ -299,132 +197,110 @@ | ||
var j, | ||
u = 0 | ||
u = 0; | ||
for (j = 0; j < 17; j++) { | ||
u = (u + ((h[j] + c[j]) | 0)) | 0 | ||
h[j] = u & 255 | ||
u >>>= 8 | ||
u = u + (h[j] + c[j] | 0) | 0; | ||
h[j] = u & 255; | ||
u >>>= 8; | ||
} | ||
} | ||
var minusp = new Uint32Array([ | ||
5, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
252 | ||
]) | ||
var minusp = new Uint32Array([5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252]); | ||
function crypto_onetimeauth(out, outpos, m, mpos, n, k) { | ||
var s, i, j, u | ||
var s, i, j, u; | ||
var x = new Uint32Array(17), | ||
r = new Uint32Array(17), | ||
h = new Uint32Array(17), | ||
c = new Uint32Array(17), | ||
g = new Uint32Array(17) | ||
for (j = 0; j < 17; j++) r[j] = h[j] = 0 | ||
for (j = 0; j < 16; j++) r[j] = k[j] | ||
r[3] &= 15 | ||
r[4] &= 252 | ||
r[7] &= 15 | ||
r[8] &= 252 | ||
r[11] &= 15 | ||
r[12] &= 252 | ||
r[15] &= 15 | ||
r = new Uint32Array(17), | ||
h = new Uint32Array(17), | ||
c = new Uint32Array(17), | ||
g = new Uint32Array(17); | ||
for (j = 0; j < 17; j++) r[j] = h[j] = 0; | ||
for (j = 0; j < 16; j++) r[j] = k[j]; | ||
r[3] &= 15; | ||
r[4] &= 252; | ||
r[7] &= 15; | ||
r[8] &= 252; | ||
r[11] &= 15; | ||
r[12] &= 252; | ||
r[15] &= 15; | ||
while (n > 0) { | ||
for (j = 0; j < 17; j++) c[j] = 0 | ||
for (j = 0; j < 16 && j < n; ++j) c[j] = m[mpos + j] | ||
c[j] = 1 | ||
mpos += j | ||
n -= j | ||
add1305(h, c) | ||
for (j = 0; j < 17; j++) c[j] = 0; | ||
for (j = 0; j < 16 && j < n; ++j) c[j] = m[mpos + j]; | ||
c[j] = 1; | ||
mpos += j; | ||
n -= j; | ||
add1305(h, c); | ||
for (i = 0; i < 17; i++) { | ||
x[i] = 0 | ||
for (j = 0; j < 17; j++) | ||
x[i] = | ||
(x[i] + h[j] * (j <= i ? r[i - j] : (320 * r[i + 17 - j]) | 0)) | | ||
0 | | ||
0 | ||
x[i] = 0; | ||
for (j = 0; j < 17; j++) x[i] = x[i] + h[j] * (j <= i ? r[i - j] : 320 * r[i + 17 - j] | 0) | 0 | 0; | ||
} | ||
for (i = 0; i < 17; i++) h[i] = x[i] | ||
u = 0 | ||
for (i = 0; i < 17; i++) h[i] = x[i]; | ||
u = 0; | ||
for (j = 0; j < 16; j++) { | ||
u = (u + h[j]) | 0 | ||
h[j] = u & 255 | ||
u >>>= 8 | ||
u = u + h[j] | 0; | ||
h[j] = u & 255; | ||
u >>>= 8; | ||
} | ||
u = (u + h[16]) | 0 | ||
h[16] = u & 3 | ||
u = (5 * (u >>> 2)) | 0 | ||
u = u + h[16] | 0; | ||
h[16] = u & 3; | ||
u = 5 * (u >>> 2) | 0; | ||
for (j = 0; j < 16; j++) { | ||
u = (u + h[j]) | 0 | ||
h[j] = u & 255 | ||
u >>>= 8 | ||
u = u + h[j] | 0; | ||
h[j] = u & 255; | ||
u >>>= 8; | ||
} | ||
u = (u + h[16]) | 0 | ||
h[16] = u | ||
u = u + h[16] | 0; | ||
h[16] = u; | ||
} | ||
for (j = 0; j < 17; j++) g[j] = h[j] | ||
add1305(h, minusp) | ||
s = -(h[16] >>> 7) | 0 | ||
for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]) | ||
for (j = 0; j < 17; j++) g[j] = h[j]; | ||
add1305(h, minusp); | ||
s = -(h[16] >>> 7) | 0; | ||
for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]); | ||
for (j = 0; j < 16; j++) c[j] = k[j + 16] | ||
c[16] = 0 | ||
add1305(h, c) | ||
for (j = 0; j < 16; j++) out[outpos + j] = h[j] | ||
return 0 | ||
for (j = 0; j < 16; j++) c[j] = k[j + 16]; | ||
c[16] = 0; | ||
add1305(h, c); | ||
for (j = 0; j < 16; j++) out[outpos + j] = h[j]; | ||
return 0; | ||
} | ||
function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { | ||
var x = new Uint8Array(16) | ||
crypto_onetimeauth(x, 0, m, mpos, n, k) | ||
return crypto_verify_16(h, hpos, x, 0) | ||
var x = new Uint8Array(16); | ||
crypto_onetimeauth(x, 0, m, mpos, n, k); | ||
return crypto_verify_16(h, hpos, x, 0); | ||
} | ||
function crypto_secretbox(c, m, d, n, k) { | ||
var i | ||
if (d < 32) return -1 | ||
crypto_stream_xor(c, 0, m, 0, d, n, k) | ||
crypto_onetimeauth(c, 16, c, 32, d - 32, c) | ||
for (i = 0; i < 16; i++) c[i] = 0 | ||
return 0 | ||
var i; | ||
if (d < 32) return -1; | ||
crypto_stream_xor(c, 0, m, 0, d, n, k); | ||
crypto_onetimeauth(c, 16, c, 32, d - 32, c); | ||
for (i = 0; i < 16; i++) c[i] = 0; | ||
return 0; | ||
} | ||
function crypto_secretbox_open(m, c, d, n, k) { | ||
var i | ||
var x = new Uint8Array(32) | ||
if (d < 32) return -1 | ||
crypto_stream(x, 0, 32, n, k) | ||
if (crypto_onetimeauth_verify(c, 16, c, 32, d - 32, x) !== 0) return -1 | ||
crypto_stream_xor(m, 0, c, 0, d, n, k) | ||
for (i = 0; i < 32; i++) m[i] = 0 | ||
return 0 | ||
var i; | ||
var x = new Uint8Array(32); | ||
if (d < 32) return -1; | ||
crypto_stream(x, 0, 32, n, k); | ||
if (crypto_onetimeauth_verify(c, 16, c, 32, d - 32, x) !== 0) return -1; | ||
crypto_stream_xor(m, 0, c, 0, d, n, k); | ||
for (i = 0; i < 32; i++) m[i] = 0; | ||
return 0; | ||
} | ||
function set25519(r, a) { | ||
var i | ||
for (i = 0; i < 16; i++) r[i] = a[i] | 0 | ||
var i; | ||
for (i = 0; i < 16; i++) r[i] = a[i] | 0; | ||
} | ||
function car25519(o) { | ||
var c | ||
var i | ||
var c; | ||
var i; | ||
for (i = 0; i < 16; i++) { | ||
o[i] += 65536 | ||
c = Math.floor(o[i] / 65536) | ||
o[(i + 1) * (i < 15 ? 1 : 0)] += c - 1 + 37 * (c - 1) * (i === 15 ? 1 : 0) | ||
o[i] -= c * 65536 | ||
o[i] += 65536; | ||
c = Math.floor(o[i] / 65536); | ||
o[(i + 1) * (i < 15 ? 1 : 0)] += c - 1 + 37 * (c - 1) * (i === 15 ? 1 : 0); | ||
o[i] -= c * 65536; | ||
} | ||
@@ -435,7 +311,7 @@ } | ||
var t, | ||
c = ~(b - 1) | ||
c = ~(b - 1); | ||
for (var i = 0; i < 16; i++) { | ||
t = c & (p[i] ^ q[i]) | ||
p[i] ^= t | ||
q[i] ^= t | ||
t = c & (p[i] ^ q[i]); | ||
p[i] ^= t; | ||
q[i] ^= t; | ||
} | ||
@@ -445,23 +321,23 @@ } | ||
function pack25519(o, n) { | ||
var i, j, b | ||
var i, j, b; | ||
var m = gf(), | ||
t = gf() | ||
for (i = 0; i < 16; i++) t[i] = n[i] | ||
car25519(t) | ||
car25519(t) | ||
car25519(t) | ||
t = gf(); | ||
for (i = 0; i < 16; i++) t[i] = n[i]; | ||
car25519(t); | ||
car25519(t); | ||
car25519(t); | ||
for (j = 0; j < 2; j++) { | ||
m[0] = t[0] - 0xffed | ||
m[0] = t[0] - 0xffed; | ||
for (i = 1; i < 15; i++) { | ||
m[i] = t[i] - 0xffff - ((m[i - 1] >> 16) & 1) | ||
m[i - 1] &= 0xffff | ||
m[i] = t[i] - 0xffff - (m[i - 1] >> 16 & 1); | ||
m[i - 1] &= 0xffff; | ||
} | ||
m[15] = t[15] - 0x7fff - ((m[14] >> 16) & 1) | ||
b = (m[15] >> 16) & 1 | ||
m[14] &= 0xffff | ||
sel25519(t, m, 1 - b) | ||
m[15] = t[15] - 0x7fff - (m[14] >> 16 & 1); | ||
b = m[15] >> 16 & 1; | ||
m[14] &= 0xffff; | ||
sel25519(t, m, 1 - b); | ||
} | ||
for (i = 0; i < 16; i++) { | ||
o[2 * i] = t[i] & 0xff | ||
o[2 * i + 1] = t[i] >> 8 | ||
o[2 * i] = t[i] & 0xff; | ||
o[2 * i + 1] = t[i] >> 8; | ||
} | ||
@@ -472,28 +348,28 @@ } | ||
var c = new Uint8Array(32), | ||
d = new Uint8Array(32) | ||
pack25519(c, a) | ||
pack25519(d, b) | ||
return crypto_verify_32(c, 0, d, 0) | ||
d = new Uint8Array(32); | ||
pack25519(c, a); | ||
pack25519(d, b); | ||
return crypto_verify_32(c, 0, d, 0); | ||
} | ||
function par25519(a) { | ||
var d = new Uint8Array(32) | ||
pack25519(d, a) | ||
return d[0] & 1 | ||
var d = new Uint8Array(32); | ||
pack25519(d, a); | ||
return d[0] & 1; | ||
} | ||
function unpack25519(o, n) { | ||
var i | ||
for (i = 0; i < 16; i++) o[i] = n[2 * i] + (n[2 * i + 1] << 8) | ||
o[15] &= 0x7fff | ||
var i; | ||
for (i = 0; i < 16; i++) o[i] = n[2 * i] + (n[2 * i + 1] << 8); | ||
o[15] &= 0x7fff; | ||
} | ||
function A(o, a, b) { | ||
var i | ||
for (i = 0; i < 16; i++) o[i] = (a[i] + b[i]) | 0 | ||
var i; | ||
for (i = 0; i < 16; i++) o[i] = a[i] + b[i] | 0; | ||
} | ||
function Z(o, a, b) { | ||
var i | ||
for (i = 0; i < 16; i++) o[i] = (a[i] - b[i]) | 0 | ||
var i; | ||
for (i = 0; i < 16; i++) o[i] = a[i] - b[i] | 0; | ||
} | ||
@@ -503,131 +379,131 @@ | ||
var i, | ||
j, | ||
t = new Float64Array(31) | ||
for (i = 0; i < 31; i++) t[i] = 0 | ||
j, | ||
t = new Float64Array(31); | ||
for (i = 0; i < 31; i++) t[i] = 0; | ||
for (i = 0; i < 16; i++) { | ||
for (j = 0; j < 16; j++) { | ||
t[i + j] += a[i] * b[j] | ||
t[i + j] += a[i] * b[j]; | ||
} | ||
} | ||
for (i = 0; i < 15; i++) { | ||
t[i] += 38 * t[i + 16] | ||
t[i] += 38 * t[i + 16]; | ||
} | ||
for (i = 0; i < 16; i++) o[i] = t[i] | ||
car25519(o) | ||
car25519(o) | ||
for (i = 0; i < 16; i++) o[i] = t[i]; | ||
car25519(o); | ||
car25519(o); | ||
} | ||
function S(o, a) { | ||
M(o, a, a) | ||
M(o, a, a); | ||
} | ||
function inv25519(o, i) { | ||
var c = gf() | ||
var a | ||
for (a = 0; a < 16; a++) c[a] = i[a] | ||
var c = gf(); | ||
var a; | ||
for (a = 0; a < 16; a++) c[a] = i[a]; | ||
for (a = 253; a >= 0; a--) { | ||
S(c, c) | ||
if (a !== 2 && a !== 4) M(c, c, i) | ||
S(c, c); | ||
if (a !== 2 && a !== 4) M(c, c, i); | ||
} | ||
for (a = 0; a < 16; a++) o[a] = c[a] | ||
for (a = 0; a < 16; a++) o[a] = c[a]; | ||
} | ||
function pow2523(o, i) { | ||
var c = gf() | ||
var a | ||
for (a = 0; a < 16; a++) c[a] = i[a] | ||
var c = gf(); | ||
var a; | ||
for (a = 0; a < 16; a++) c[a] = i[a]; | ||
for (a = 250; a >= 0; a--) { | ||
S(c, c) | ||
if (a !== 1) M(c, c, i) | ||
S(c, c); | ||
if (a !== 1) M(c, c, i); | ||
} | ||
for (a = 0; a < 16; a++) o[a] = c[a] | ||
for (a = 0; a < 16; a++) o[a] = c[a]; | ||
} | ||
function crypto_scalarmult(q, n, p) { | ||
var z = new Uint8Array(32) | ||
var z = new Uint8Array(32); | ||
var x = new Float64Array(80), | ||
r, | ||
i | ||
r, | ||
i; | ||
var a = gf(), | ||
b = gf(), | ||
c = gf(), | ||
d = gf(), | ||
e = gf(), | ||
f = gf() | ||
for (i = 0; i < 31; i++) z[i] = n[i] | ||
z[31] = (n[31] & 127) | 64 | ||
z[0] &= 248 | ||
unpack25519(x, p) | ||
b = gf(), | ||
c = gf(), | ||
d = gf(), | ||
e = gf(), | ||
f = gf(); | ||
for (i = 0; i < 31; i++) z[i] = n[i]; | ||
z[31] = n[31] & 127 | 64; | ||
z[0] &= 248; | ||
unpack25519(x, p); | ||
for (i = 0; i < 16; i++) { | ||
b[i] = x[i] | ||
d[i] = a[i] = c[i] = 0 | ||
b[i] = x[i]; | ||
d[i] = a[i] = c[i] = 0; | ||
} | ||
a[0] = d[0] = 1 | ||
a[0] = d[0] = 1; | ||
for (i = 254; i >= 0; --i) { | ||
r = (z[i >>> 3] >>> (i & 7)) & 1 | ||
sel25519(a, b, r) | ||
sel25519(c, d, r) | ||
A(e, a, c) | ||
Z(a, a, c) | ||
A(c, b, d) | ||
Z(b, b, d) | ||
S(d, e) | ||
S(f, a) | ||
M(a, c, a) | ||
M(c, b, e) | ||
A(e, a, c) | ||
Z(a, a, c) | ||
S(b, a) | ||
Z(c, d, f) | ||
M(a, c, _121665) | ||
A(a, a, d) | ||
M(c, c, a) | ||
M(a, d, f) | ||
M(d, b, x) | ||
S(b, e) | ||
sel25519(a, b, r) | ||
sel25519(c, d, r) | ||
r = z[i >>> 3] >>> (i & 7) & 1; | ||
sel25519(a, b, r); | ||
sel25519(c, d, r); | ||
A(e, a, c); | ||
Z(a, a, c); | ||
A(c, b, d); | ||
Z(b, b, d); | ||
S(d, e); | ||
S(f, a); | ||
M(a, c, a); | ||
M(c, b, e); | ||
A(e, a, c); | ||
Z(a, a, c); | ||
S(b, a); | ||
Z(c, d, f); | ||
M(a, c, _121665); | ||
A(a, a, d); | ||
M(c, c, a); | ||
M(a, d, f); | ||
M(d, b, x); | ||
S(b, e); | ||
sel25519(a, b, r); | ||
sel25519(c, d, r); | ||
} | ||
for (i = 0; i < 16; i++) { | ||
x[i + 16] = a[i] | ||
x[i + 32] = c[i] | ||
x[i + 48] = b[i] | ||
x[i + 64] = d[i] | ||
x[i + 16] = a[i]; | ||
x[i + 32] = c[i]; | ||
x[i + 48] = b[i]; | ||
x[i + 64] = d[i]; | ||
} | ||
var x32 = x.subarray(32) | ||
var x16 = x.subarray(16) | ||
inv25519(x32, x32) | ||
M(x16, x16, x32) | ||
pack25519(q, x16) | ||
return 0 | ||
var x32 = x.subarray(32); | ||
var x16 = x.subarray(16); | ||
inv25519(x32, x32); | ||
M(x16, x16, x32); | ||
pack25519(q, x16); | ||
return 0; | ||
} | ||
function crypto_scalarmult_base(q, n) { | ||
return crypto_scalarmult(q, n, _9) | ||
return crypto_scalarmult(q, n, _9); | ||
} | ||
function crypto_box_keypair(y, x) { | ||
randombytes(x, 32) | ||
return crypto_scalarmult_base(y, x) | ||
randombytes(x, 32); | ||
return crypto_scalarmult_base(y, x); | ||
} | ||
function crypto_box_beforenm(k, y, x) { | ||
var s = new Uint8Array(32) | ||
crypto_scalarmult(s, x, y) | ||
return crypto_core_hsalsa20(k, _0, s, sigma) | ||
var s = new Uint8Array(32); | ||
crypto_scalarmult(s, x, y); | ||
return crypto_core_hsalsa20(k, _0, s, sigma); | ||
} | ||
var crypto_box_afternm = crypto_secretbox | ||
var crypto_box_open_afternm = crypto_secretbox_open | ||
var crypto_box_afternm = crypto_secretbox; | ||
var crypto_box_open_afternm = crypto_secretbox_open; | ||
function crypto_box(c, m, d, n, y, x) { | ||
var k = new Uint8Array(32) | ||
crypto_box_beforenm(k, y, x) | ||
return crypto_box_afternm(c, m, d, n, k) | ||
var k = new Uint8Array(32); | ||
crypto_box_beforenm(k, y, x); | ||
return crypto_box_afternm(c, m, d, n, k); | ||
} | ||
function crypto_box_open(m, c, d, n, y, x) { | ||
var k = new Uint8Array(32) | ||
crypto_box_beforenm(k, y, x) | ||
return crypto_box_open_afternm(m, c, d, n, k) | ||
var k = new Uint8Array(32); | ||
crypto_box_beforenm(k, y, x); | ||
return crypto_box_open_afternm(m, c, d, n, k); | ||
} | ||
@@ -637,27 +513,27 @@ | ||
var a = 0, | ||
b = 0, | ||
c = 0, | ||
d = 0, | ||
m16 = 65535, | ||
l, | ||
h, | ||
i | ||
b = 0, | ||
c = 0, | ||
d = 0, | ||
m16 = 65535, | ||
l, | ||
h, | ||
i; | ||
for (i = 0; i < arguments.length; i++) { | ||
l = arguments[i].lo | ||
h = arguments[i].hi | ||
a += l & m16 | ||
b += l >>> 16 | ||
c += h & m16 | ||
d += h >>> 16 | ||
l = arguments[i].lo; | ||
h = arguments[i].hi; | ||
a += l & m16; | ||
b += l >>> 16; | ||
c += h & m16; | ||
d += h >>> 16; | ||
} | ||
b += a >>> 16 | ||
c += b >>> 16 | ||
d += c >>> 16 | ||
b += a >>> 16; | ||
c += b >>> 16; | ||
d += c >>> 16; | ||
return new u64((c & m16) | (d << 16), (a & m16) | (b << 16)) | ||
return new u64(c & m16 | d << 16, a & m16 | b << 16); | ||
} | ||
function shr64(x, c) { | ||
return new u64(x.hi >>> c, (x.lo >>> c) | (x.hi << (32 - c))) | ||
return new u64(x.hi >>> c, x.lo >>> c | x.hi << 32 - c); | ||
} | ||
@@ -667,9 +543,9 @@ | ||
var l = 0, | ||
h = 0, | ||
i | ||
h = 0, | ||
i; | ||
for (i = 0; i < arguments.length; i++) { | ||
l ^= arguments[i].lo | ||
h ^= arguments[i].hi | ||
l ^= arguments[i].lo; | ||
h ^= arguments[i].hi; | ||
} | ||
return new u64(h, l) | ||
return new u64(h, l); | ||
} | ||
@@ -679,150 +555,64 @@ | ||
var h, | ||
l, | ||
c1 = 32 - c | ||
l, | ||
c1 = 32 - c; | ||
if (c < 32) { | ||
h = (x.hi >>> c) | (x.lo << c1) | ||
l = (x.lo >>> c) | (x.hi << c1) | ||
h = x.hi >>> c | x.lo << c1; | ||
l = x.lo >>> c | x.hi << c1; | ||
} else if (c < 64) { | ||
h = (x.lo >>> c) | (x.hi << c1) | ||
l = (x.hi >>> c) | (x.lo << c1) | ||
h = x.lo >>> c | x.hi << c1; | ||
l = x.hi >>> c | x.lo << c1; | ||
} | ||
return new u64(h, l) | ||
return new u64(h, l); | ||
} | ||
function Ch(x, y, z) { | ||
var h = (x.hi & y.hi) ^ (~x.hi & z.hi), | ||
l = (x.lo & y.lo) ^ (~x.lo & z.lo) | ||
return new u64(h, l) | ||
var h = x.hi & y.hi ^ ~x.hi & z.hi, | ||
l = x.lo & y.lo ^ ~x.lo & z.lo; | ||
return new u64(h, l); | ||
} | ||
function Maj(x, y, z) { | ||
var h = (x.hi & y.hi) ^ (x.hi & z.hi) ^ (y.hi & z.hi), | ||
l = (x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo) | ||
return new u64(h, l) | ||
var h = x.hi & y.hi ^ x.hi & z.hi ^ y.hi & z.hi, | ||
l = x.lo & y.lo ^ x.lo & z.lo ^ y.lo & z.lo; | ||
return new u64(h, l); | ||
} | ||
function Sigma0(x) { | ||
return xor64(R(x, 28), R(x, 34), R(x, 39)) | ||
return xor64(R(x, 28), R(x, 34), R(x, 39)); | ||
} | ||
function Sigma1(x) { | ||
return xor64(R(x, 14), R(x, 18), R(x, 41)) | ||
return xor64(R(x, 14), R(x, 18), R(x, 41)); | ||
} | ||
function sigma0(x) { | ||
return xor64(R(x, 1), R(x, 8), shr64(x, 7)) | ||
return xor64(R(x, 1), R(x, 8), shr64(x, 7)); | ||
} | ||
function sigma1(x) { | ||
return xor64(R(x, 19), R(x, 61), shr64(x, 6)) | ||
return xor64(R(x, 19), R(x, 61), shr64(x, 6)); | ||
} | ||
var K = [ | ||
new u64(0x428a2f98, 0xd728ae22), | ||
new u64(0x71374491, 0x23ef65cd), | ||
new u64(0xb5c0fbcf, 0xec4d3b2f), | ||
new u64(0xe9b5dba5, 0x8189dbbc), | ||
new u64(0x3956c25b, 0xf348b538), | ||
new u64(0x59f111f1, 0xb605d019), | ||
new u64(0x923f82a4, 0xaf194f9b), | ||
new u64(0xab1c5ed5, 0xda6d8118), | ||
new u64(0xd807aa98, 0xa3030242), | ||
new u64(0x12835b01, 0x45706fbe), | ||
new u64(0x243185be, 0x4ee4b28c), | ||
new u64(0x550c7dc3, 0xd5ffb4e2), | ||
new u64(0x72be5d74, 0xf27b896f), | ||
new u64(0x80deb1fe, 0x3b1696b1), | ||
new u64(0x9bdc06a7, 0x25c71235), | ||
new u64(0xc19bf174, 0xcf692694), | ||
new u64(0xe49b69c1, 0x9ef14ad2), | ||
new u64(0xefbe4786, 0x384f25e3), | ||
new u64(0x0fc19dc6, 0x8b8cd5b5), | ||
new u64(0x240ca1cc, 0x77ac9c65), | ||
new u64(0x2de92c6f, 0x592b0275), | ||
new u64(0x4a7484aa, 0x6ea6e483), | ||
new u64(0x5cb0a9dc, 0xbd41fbd4), | ||
new u64(0x76f988da, 0x831153b5), | ||
new u64(0x983e5152, 0xee66dfab), | ||
new u64(0xa831c66d, 0x2db43210), | ||
new u64(0xb00327c8, 0x98fb213f), | ||
new u64(0xbf597fc7, 0xbeef0ee4), | ||
new u64(0xc6e00bf3, 0x3da88fc2), | ||
new u64(0xd5a79147, 0x930aa725), | ||
new u64(0x06ca6351, 0xe003826f), | ||
new u64(0x14292967, 0x0a0e6e70), | ||
new u64(0x27b70a85, 0x46d22ffc), | ||
new u64(0x2e1b2138, 0x5c26c926), | ||
new u64(0x4d2c6dfc, 0x5ac42aed), | ||
new u64(0x53380d13, 0x9d95b3df), | ||
new u64(0x650a7354, 0x8baf63de), | ||
new u64(0x766a0abb, 0x3c77b2a8), | ||
new u64(0x81c2c92e, 0x47edaee6), | ||
new u64(0x92722c85, 0x1482353b), | ||
new u64(0xa2bfe8a1, 0x4cf10364), | ||
new u64(0xa81a664b, 0xbc423001), | ||
new u64(0xc24b8b70, 0xd0f89791), | ||
new u64(0xc76c51a3, 0x0654be30), | ||
new u64(0xd192e819, 0xd6ef5218), | ||
new u64(0xd6990624, 0x5565a910), | ||
new u64(0xf40e3585, 0x5771202a), | ||
new u64(0x106aa070, 0x32bbd1b8), | ||
new u64(0x19a4c116, 0xb8d2d0c8), | ||
new u64(0x1e376c08, 0x5141ab53), | ||
new u64(0x2748774c, 0xdf8eeb99), | ||
new u64(0x34b0bcb5, 0xe19b48a8), | ||
new u64(0x391c0cb3, 0xc5c95a63), | ||
new u64(0x4ed8aa4a, 0xe3418acb), | ||
new u64(0x5b9cca4f, 0x7763e373), | ||
new u64(0x682e6ff3, 0xd6b2b8a3), | ||
new u64(0x748f82ee, 0x5defb2fc), | ||
new u64(0x78a5636f, 0x43172f60), | ||
new u64(0x84c87814, 0xa1f0ab72), | ||
new u64(0x8cc70208, 0x1a6439ec), | ||
new u64(0x90befffa, 0x23631e28), | ||
new u64(0xa4506ceb, 0xde82bde9), | ||
new u64(0xbef9a3f7, 0xb2c67915), | ||
new u64(0xc67178f2, 0xe372532b), | ||
new u64(0xca273ece, 0xea26619c), | ||
new u64(0xd186b8c7, 0x21c0c207), | ||
new u64(0xeada7dd6, 0xcde0eb1e), | ||
new u64(0xf57d4f7f, 0xee6ed178), | ||
new u64(0x06f067aa, 0x72176fba), | ||
new u64(0x0a637dc5, 0xa2c898a6), | ||
new u64(0x113f9804, 0xbef90dae), | ||
new u64(0x1b710b35, 0x131c471b), | ||
new u64(0x28db77f5, 0x23047d84), | ||
new u64(0x32caab7b, 0x40c72493), | ||
new u64(0x3c9ebe0a, 0x15c9bebc), | ||
new u64(0x431d67c4, 0x9c100d4c), | ||
new u64(0x4cc5d4be, 0xcb3e42b6), | ||
new u64(0x597f299c, 0xfc657e2a), | ||
new u64(0x5fcb6fab, 0x3ad6faec), | ||
new u64(0x6c44198c, 0x4a475817) | ||
] | ||
var K = [new u64(0x428a2f98, 0xd728ae22), new u64(0x71374491, 0x23ef65cd), new u64(0xb5c0fbcf, 0xec4d3b2f), new u64(0xe9b5dba5, 0x8189dbbc), new u64(0x3956c25b, 0xf348b538), new u64(0x59f111f1, 0xb605d019), new u64(0x923f82a4, 0xaf194f9b), new u64(0xab1c5ed5, 0xda6d8118), new u64(0xd807aa98, 0xa3030242), new u64(0x12835b01, 0x45706fbe), new u64(0x243185be, 0x4ee4b28c), new u64(0x550c7dc3, 0xd5ffb4e2), new u64(0x72be5d74, 0xf27b896f), new u64(0x80deb1fe, 0x3b1696b1), new u64(0x9bdc06a7, 0x25c71235), new u64(0xc19bf174, 0xcf692694), new u64(0xe49b69c1, 0x9ef14ad2), new u64(0xefbe4786, 0x384f25e3), new u64(0x0fc19dc6, 0x8b8cd5b5), new u64(0x240ca1cc, 0x77ac9c65), new u64(0x2de92c6f, 0x592b0275), new u64(0x4a7484aa, 0x6ea6e483), new u64(0x5cb0a9dc, 0xbd41fbd4), new u64(0x76f988da, 0x831153b5), new u64(0x983e5152, 0xee66dfab), new u64(0xa831c66d, 0x2db43210), new u64(0xb00327c8, 0x98fb213f), new u64(0xbf597fc7, 0xbeef0ee4), new u64(0xc6e00bf3, 0x3da88fc2), new u64(0xd5a79147, 0x930aa725), new u64(0x06ca6351, 0xe003826f), new u64(0x14292967, 0x0a0e6e70), new u64(0x27b70a85, 0x46d22ffc), new u64(0x2e1b2138, 0x5c26c926), new u64(0x4d2c6dfc, 0x5ac42aed), new u64(0x53380d13, 0x9d95b3df), new u64(0x650a7354, 0x8baf63de), new u64(0x766a0abb, 0x3c77b2a8), new u64(0x81c2c92e, 0x47edaee6), new u64(0x92722c85, 0x1482353b), new u64(0xa2bfe8a1, 0x4cf10364), new u64(0xa81a664b, 0xbc423001), new u64(0xc24b8b70, 0xd0f89791), new u64(0xc76c51a3, 0x0654be30), new u64(0xd192e819, 0xd6ef5218), new u64(0xd6990624, 0x5565a910), new u64(0xf40e3585, 0x5771202a), new u64(0x106aa070, 0x32bbd1b8), new u64(0x19a4c116, 0xb8d2d0c8), new u64(0x1e376c08, 0x5141ab53), new u64(0x2748774c, 0xdf8eeb99), new u64(0x34b0bcb5, 0xe19b48a8), new u64(0x391c0cb3, 0xc5c95a63), new u64(0x4ed8aa4a, 0xe3418acb), new u64(0x5b9cca4f, 0x7763e373), new u64(0x682e6ff3, 0xd6b2b8a3), new u64(0x748f82ee, 0x5defb2fc), new u64(0x78a5636f, 0x43172f60), new u64(0x84c87814, 0xa1f0ab72), new u64(0x8cc70208, 0x1a6439ec), new u64(0x90befffa, 0x23631e28), new u64(0xa4506ceb, 0xde82bde9), new u64(0xbef9a3f7, 0xb2c67915), new u64(0xc67178f2, 0xe372532b), new u64(0xca273ece, 0xea26619c), new u64(0xd186b8c7, 0x21c0c207), new u64(0xeada7dd6, 0xcde0eb1e), new u64(0xf57d4f7f, 0xee6ed178), new u64(0x06f067aa, 0x72176fba), new u64(0x0a637dc5, 0xa2c898a6), new u64(0x113f9804, 0xbef90dae), new u64(0x1b710b35, 0x131c471b), new u64(0x28db77f5, 0x23047d84), new u64(0x32caab7b, 0x40c72493), new u64(0x3c9ebe0a, 0x15c9bebc), new u64(0x431d67c4, 0x9c100d4c), new u64(0x4cc5d4be, 0xcb3e42b6), new u64(0x597f299c, 0xfc657e2a), new u64(0x5fcb6fab, 0x3ad6faec), new u64(0x6c44198c, 0x4a475817)]; | ||
function crypto_hashblocks(x, m, n) { | ||
var z = [], | ||
b = [], | ||
a = [], | ||
w = [], | ||
t, | ||
i, | ||
j | ||
b = [], | ||
a = [], | ||
w = [], | ||
t, | ||
i, | ||
j; | ||
for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8 * i) | ||
for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8 * i); | ||
var pos = 0 | ||
var pos = 0; | ||
while (n >= 128) { | ||
for (i = 0; i < 16; i++) w[i] = dl64(m, 8 * i + pos) | ||
for (i = 0; i < 16; i++) w[i] = dl64(m, 8 * i + pos); | ||
for (i = 0; i < 80; i++) { | ||
for (j = 0; j < 8; j++) b[j] = a[j] | ||
t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i % 16]) | ||
b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2])) | ||
b[3] = add64(b[3], t) | ||
for (j = 0; j < 8; j++) a[(j + 1) % 8] = b[j] | ||
for (j = 0; j < 8; j++) b[j] = a[j]; | ||
t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i % 16]); | ||
b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2])); | ||
b[3] = add64(b[3], t); | ||
for (j = 0; j < 8; j++) a[(j + 1) % 8] = b[j]; | ||
if (i % 16 === 15) { | ||
for (j = 0; j < 16; j++) { | ||
w[j] = add64( | ||
w[j], | ||
w[(j + 9) % 16], | ||
sigma0(w[(j + 1) % 16]), | ||
sigma1(w[(j + 14) % 16]) | ||
) | ||
w[j] = add64(w[j], w[(j + 9) % 16], sigma0(w[(j + 1) % 16]), sigma1(w[(j + 14) % 16])); | ||
} | ||
@@ -833,104 +623,39 @@ } | ||
for (i = 0; i < 8; i++) { | ||
a[i] = add64(a[i], z[i]) | ||
z[i] = a[i] | ||
a[i] = add64(a[i], z[i]); | ||
z[i] = a[i]; | ||
} | ||
pos += 128 | ||
n -= 128 | ||
pos += 128; | ||
n -= 128; | ||
} | ||
for (i = 0; i < 8; i++) ts64(x, 8 * i, z[i]) | ||
return n | ||
for (i = 0; i < 8; i++) ts64(x, 8 * i, z[i]); | ||
return n; | ||
} | ||
var iv = new Uint8Array([ | ||
0x6a, | ||
0x09, | ||
0xe6, | ||
0x67, | ||
0xf3, | ||
0xbc, | ||
0xc9, | ||
0x08, | ||
0xbb, | ||
0x67, | ||
0xae, | ||
0x85, | ||
0x84, | ||
0xca, | ||
0xa7, | ||
0x3b, | ||
0x3c, | ||
0x6e, | ||
0xf3, | ||
0x72, | ||
0xfe, | ||
0x94, | ||
0xf8, | ||
0x2b, | ||
0xa5, | ||
0x4f, | ||
0xf5, | ||
0x3a, | ||
0x5f, | ||
0x1d, | ||
0x36, | ||
0xf1, | ||
0x51, | ||
0x0e, | ||
0x52, | ||
0x7f, | ||
0xad, | ||
0xe6, | ||
0x82, | ||
0xd1, | ||
0x9b, | ||
0x05, | ||
0x68, | ||
0x8c, | ||
0x2b, | ||
0x3e, | ||
0x6c, | ||
0x1f, | ||
0x1f, | ||
0x83, | ||
0xd9, | ||
0xab, | ||
0xfb, | ||
0x41, | ||
0xbd, | ||
0x6b, | ||
0x5b, | ||
0xe0, | ||
0xcd, | ||
0x19, | ||
0x13, | ||
0x7e, | ||
0x21, | ||
0x79 | ||
]) | ||
var iv = new Uint8Array([0x6a, 0x09, 0xe6, 0x67, 0xf3, 0xbc, 0xc9, 0x08, 0xbb, 0x67, 0xae, 0x85, 0x84, 0xca, 0xa7, 0x3b, 0x3c, 0x6e, 0xf3, 0x72, 0xfe, 0x94, 0xf8, 0x2b, 0xa5, 0x4f, 0xf5, 0x3a, 0x5f, 0x1d, 0x36, 0xf1, 0x51, 0x0e, 0x52, 0x7f, 0xad, 0xe6, 0x82, 0xd1, 0x9b, 0x05, 0x68, 0x8c, 0x2b, 0x3e, 0x6c, 0x1f, 0x1f, 0x83, 0xd9, 0xab, 0xfb, 0x41, 0xbd, 0x6b, 0x5b, 0xe0, 0xcd, 0x19, 0x13, 0x7e, 0x21, 0x79]); | ||
function crypto_hash(out, m, n) { | ||
var h = new Uint8Array(64), | ||
x = new Uint8Array(256) | ||
x = new Uint8Array(256); | ||
var i, | ||
b = n | ||
b = n; | ||
for (i = 0; i < 64; i++) h[i] = iv[i] | ||
for (i = 0; i < 64; i++) h[i] = iv[i]; | ||
crypto_hashblocks(h, m, n) | ||
n %= 128 | ||
crypto_hashblocks(h, m, n); | ||
n %= 128; | ||
for (i = 0; i < 256; i++) x[i] = 0 | ||
for (i = 0; i < n; i++) x[i] = m[b - n + i] | ||
x[n] = 128 | ||
for (i = 0; i < 256; i++) x[i] = 0; | ||
for (i = 0; i < n; i++) x[i] = m[b - n + i]; | ||
x[n] = 128; | ||
n = 256 - 128 * (n < 112 ? 1 : 0) | ||
x[n - 9] = 0 | ||
ts64(x, n - 8, new u64((b / 0x20000000) | 0, b << 3)) | ||
crypto_hashblocks(h, x, n) | ||
n = 256 - 128 * (n < 112 ? 1 : 0); | ||
x[n - 9] = 0; | ||
ts64(x, n - 8, new u64(b / 0x20000000 | 0, b << 3)); | ||
crypto_hashblocks(h, x, n); | ||
for (i = 0; i < 64; i++) out[i] = h[i] | ||
for (i = 0; i < 64; i++) out[i] = h[i]; | ||
return 0 | ||
return 0; | ||
} | ||
@@ -940,36 +665,36 @@ | ||
var a = gf(), | ||
b = gf(), | ||
c = gf(), | ||
d = gf(), | ||
e = gf(), | ||
f = gf(), | ||
g = gf(), | ||
h = gf(), | ||
t = gf() | ||
b = gf(), | ||
c = gf(), | ||
d = gf(), | ||
e = gf(), | ||
f = gf(), | ||
g = gf(), | ||
h = gf(), | ||
t = gf(); | ||
Z(a, p[1], p[0]) | ||
Z(t, q[1], q[0]) | ||
M(a, a, t) | ||
A(b, p[0], p[1]) | ||
A(t, q[0], q[1]) | ||
M(b, b, t) | ||
M(c, p[3], q[3]) | ||
M(c, c, D2) | ||
M(d, p[2], q[2]) | ||
A(d, d, d) | ||
Z(e, b, a) | ||
Z(f, d, c) | ||
A(g, d, c) | ||
A(h, b, a) | ||
Z(a, p[1], p[0]); | ||
Z(t, q[1], q[0]); | ||
M(a, a, t); | ||
A(b, p[0], p[1]); | ||
A(t, q[0], q[1]); | ||
M(b, b, t); | ||
M(c, p[3], q[3]); | ||
M(c, c, D2); | ||
M(d, p[2], q[2]); | ||
A(d, d, d); | ||
Z(e, b, a); | ||
Z(f, d, c); | ||
A(g, d, c); | ||
A(h, b, a); | ||
M(p[0], e, f) | ||
M(p[1], h, g) | ||
M(p[2], g, f) | ||
M(p[3], e, h) | ||
M(p[0], e, f); | ||
M(p[1], h, g); | ||
M(p[2], g, f); | ||
M(p[3], e, h); | ||
} | ||
function cswap(p, q, b) { | ||
var i | ||
var i; | ||
for (i = 0; i < 4; i++) { | ||
sel25519(p[i], q[i], b) | ||
sel25519(p[i], q[i], b); | ||
} | ||
@@ -980,23 +705,23 @@ } | ||
var tx = gf(), | ||
ty = gf(), | ||
zi = gf() | ||
inv25519(zi, p[2]) | ||
M(tx, p[0], zi) | ||
M(ty, p[1], zi) | ||
pack25519(r, ty) | ||
r[31] ^= par25519(tx) << 7 | ||
ty = gf(), | ||
zi = gf(); | ||
inv25519(zi, p[2]); | ||
M(tx, p[0], zi); | ||
M(ty, p[1], zi); | ||
pack25519(r, ty); | ||
r[31] ^= par25519(tx) << 7; | ||
} | ||
function scalarmult(p, q, s) { | ||
var b, i | ||
set25519(p[0], gf0) | ||
set25519(p[1], gf1) | ||
set25519(p[2], gf1) | ||
set25519(p[3], gf0) | ||
var b, i; | ||
set25519(p[0], gf0); | ||
set25519(p[1], gf1); | ||
set25519(p[2], gf1); | ||
set25519(p[3], gf0); | ||
for (i = 255; i >= 0; --i) { | ||
b = (s[(i / 8) | 0] >> (i & 7)) & 1 | ||
cswap(p, q, b) | ||
add(q, p) | ||
add(p, p) | ||
cswap(p, q, b) | ||
b = s[i / 8 | 0] >> (i & 7) & 1; | ||
cswap(p, q, b); | ||
add(q, p); | ||
add(p, p); | ||
cswap(p, q, b); | ||
} | ||
@@ -1006,106 +731,73 @@ } | ||
function scalarbase(p, s) { | ||
var q = [gf(), gf(), gf(), gf()] | ||
set25519(q[0], X) | ||
set25519(q[1], Y) | ||
set25519(q[2], gf1) | ||
M(q[3], X, Y) | ||
scalarmult(p, q, s) | ||
var q = [gf(), gf(), gf(), gf()]; | ||
set25519(q[0], X); | ||
set25519(q[1], Y); | ||
set25519(q[2], gf1); | ||
M(q[3], X, Y); | ||
scalarmult(p, q, s); | ||
} | ||
function crypto_sign_keypair(pk, sk, seeded) { | ||
var d = new Uint8Array(64) | ||
var p = [gf(), gf(), gf(), gf()] | ||
var i | ||
var d = new Uint8Array(64); | ||
var p = [gf(), gf(), gf(), gf()]; | ||
var i; | ||
if (!seeded) randombytes(sk, 32) | ||
if (!seeded) randombytes(sk, 32); | ||
var context = blake2bInit(64) | ||
blake2bUpdate(context, sk) | ||
d = blake2bFinal(context) | ||
var context = blake2bInit(64); | ||
blake2bUpdate(context, sk); | ||
d = blake2bFinal(context); | ||
d[0] &= 248 | ||
d[31] &= 127 | ||
d[31] |= 64 | ||
d[0] &= 248; | ||
d[31] &= 127; | ||
d[31] |= 64; | ||
scalarbase(p, d) | ||
pack(pk, p) | ||
scalarbase(p, d); | ||
pack(pk, p); | ||
return 0 | ||
return 0; | ||
} | ||
function derivePublicFromSecret(sk) { | ||
var d = new Uint8Array(64) | ||
var p = [gf(), gf(), gf(), gf()] | ||
var i | ||
var pk = new Uint8Array(32) | ||
var context = blake2bInit(64) | ||
blake2bUpdate(context, sk) | ||
d = blake2bFinal(context) | ||
var d = new Uint8Array(64); | ||
var p = [gf(), gf(), gf(), gf()]; | ||
var i; | ||
var pk = new Uint8Array(32); | ||
var context = blake2bInit(64); | ||
blake2bUpdate(context, sk); | ||
d = blake2bFinal(context); | ||
d[0] &= 248 | ||
d[31] &= 127 | ||
d[31] |= 64 | ||
d[0] &= 248; | ||
d[31] &= 127; | ||
d[31] |= 64; | ||
scalarbase(p, d) | ||
pack(pk, p) | ||
return pk | ||
scalarbase(p, d); | ||
pack(pk, p); | ||
return pk; | ||
} | ||
var L = new Float64Array([ | ||
0xed, | ||
0xd3, | ||
0xf5, | ||
0x5c, | ||
0x1a, | ||
0x63, | ||
0x12, | ||
0x58, | ||
0xd6, | ||
0x9c, | ||
0xf7, | ||
0xa2, | ||
0xde, | ||
0xf9, | ||
0xde, | ||
0x14, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0, | ||
0x10 | ||
]) | ||
var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); | ||
function modL(r, x) { | ||
var carry, i, j, k | ||
var carry, i, j, k; | ||
for (i = 63; i >= 32; --i) { | ||
carry = 0 | ||
carry = 0; | ||
for (j = i - 32, k = i - 12; j < k; ++j) { | ||
x[j] += carry - 16 * x[i] * L[j - (i - 32)] | ||
carry = (x[j] + 128) >> 8 | ||
x[j] -= carry * 256 | ||
x[j] += carry - 16 * x[i] * L[j - (i - 32)]; | ||
carry = x[j] + 128 >> 8; | ||
x[j] -= carry * 256; | ||
} | ||
x[j] += carry | ||
x[i] = 0 | ||
x[j] += carry; | ||
x[i] = 0; | ||
} | ||
carry = 0 | ||
carry = 0; | ||
for (j = 0; j < 32; j++) { | ||
x[j] += carry - (x[31] >> 4) * L[j] | ||
carry = x[j] >> 8 | ||
x[j] &= 255 | ||
x[j] += carry - (x[31] >> 4) * L[j]; | ||
carry = x[j] >> 8; | ||
x[j] &= 255; | ||
} | ||
for (j = 0; j < 32; j++) x[j] -= carry * L[j] | ||
for (j = 0; j < 32; j++) x[j] -= carry * L[j]; | ||
for (i = 0; i < 32; i++) { | ||
x[i + 1] += x[i] >> 8 | ||
r[i] = x[i] & 255 | ||
x[i + 1] += x[i] >> 8; | ||
r[i] = x[i] & 255; | ||
} | ||
@@ -1116,6 +808,6 @@ } | ||
var x = new Float64Array(64), | ||
i | ||
for (i = 0; i < 64; i++) x[i] = r[i] | ||
for (i = 0; i < 64; i++) r[i] = 0 | ||
modL(r, x) | ||
i; | ||
for (i = 0; i < 64; i++) x[i] = r[i]; | ||
for (i = 0; i < 64; i++) r[i] = 0; | ||
modL(r, x); | ||
} | ||
@@ -1126,48 +818,48 @@ | ||
var d = new Uint8Array(64), | ||
h = new Uint8Array(64), | ||
r = new Uint8Array(64) | ||
h = new Uint8Array(64), | ||
r = new Uint8Array(64); | ||
var i, | ||
j, | ||
x = new Float64Array(64) | ||
var p = [gf(), gf(), gf(), gf()] | ||
j, | ||
x = new Float64Array(64); | ||
var p = [gf(), gf(), gf(), gf()]; | ||
var pk = derivePublicFromSecret(sk) | ||
var pk = derivePublicFromSecret(sk); | ||
var context = blake2bInit(64, null) | ||
blake2bUpdate(context, sk) | ||
d = blake2bFinal(context) | ||
d[0] &= 248 | ||
d[31] &= 127 | ||
d[31] |= 64 | ||
var context = blake2bInit(64, null); | ||
blake2bUpdate(context, sk); | ||
d = blake2bFinal(context); | ||
d[0] &= 248; | ||
d[31] &= 127; | ||
d[31] |= 64; | ||
var smlen = n + 64 | ||
for (i = 0; i < n; i++) sm[64 + i] = m[i] | ||
for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i] | ||
var smlen = n + 64; | ||
for (i = 0; i < n; i++) sm[64 + i] = m[i]; | ||
for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; | ||
context = blake2bInit(64, null) | ||
blake2bUpdate(context, sm.subarray(32)) | ||
r = blake2bFinal(context) | ||
context = blake2bInit(64, null); | ||
blake2bUpdate(context, sm.subarray(32)); | ||
r = blake2bFinal(context); | ||
reduce(r) | ||
scalarbase(p, r) | ||
pack(sm, p) | ||
reduce(r); | ||
scalarbase(p, r); | ||
pack(sm, p); | ||
for (i = 32; i < 64; i++) sm[i] = pk[i - 32] | ||
for (i = 32; i < 64; i++) sm[i] = pk[i - 32]; | ||
context = blake2bInit(64, null) | ||
blake2bUpdate(context, sm) | ||
h = blake2bFinal(context) | ||
context = blake2bInit(64, null); | ||
blake2bUpdate(context, sm); | ||
h = blake2bFinal(context); | ||
reduce(h) | ||
reduce(h); | ||
for (i = 0; i < 64; i++) x[i] = 0 | ||
for (i = 0; i < 32; i++) x[i] = r[i] | ||
for (i = 0; i < 64; i++) x[i] = 0; | ||
for (i = 0; i < 32; i++) x[i] = r[i]; | ||
for (i = 0; i < 32; i++) { | ||
for (j = 0; j < 32; j++) { | ||
x[i + j] += h[i] * d[j] | ||
x[i + j] += h[i] * d[j]; | ||
} | ||
} | ||
modL(sm.subarray(32), x) | ||
return smlen | ||
modL(sm.subarray(32), x); | ||
return smlen; | ||
} | ||
@@ -1177,97 +869,97 @@ | ||
var t = gf(), | ||
chk = gf(), | ||
num = gf(), | ||
den = gf(), | ||
den2 = gf(), | ||
den4 = gf(), | ||
den6 = gf() | ||
chk = gf(), | ||
num = gf(), | ||
den = gf(), | ||
den2 = gf(), | ||
den4 = gf(), | ||
den6 = gf(); | ||
set25519(r[2], gf1) | ||
unpack25519(r[1], p) | ||
S(num, r[1]) | ||
M(den, num, D) | ||
Z(num, num, r[2]) | ||
A(den, r[2], den) | ||
set25519(r[2], gf1); | ||
unpack25519(r[1], p); | ||
S(num, r[1]); | ||
M(den, num, D); | ||
Z(num, num, r[2]); | ||
A(den, r[2], den); | ||
S(den2, den) | ||
S(den4, den2) | ||
M(den6, den4, den2) | ||
M(t, den6, num) | ||
M(t, t, den) | ||
S(den2, den); | ||
S(den4, den2); | ||
M(den6, den4, den2); | ||
M(t, den6, num); | ||
M(t, t, den); | ||
pow2523(t, t) | ||
M(t, t, num) | ||
M(t, t, den) | ||
M(t, t, den) | ||
M(r[0], t, den) | ||
pow2523(t, t); | ||
M(t, t, num); | ||
M(t, t, den); | ||
M(t, t, den); | ||
M(r[0], t, den); | ||
S(chk, r[0]) | ||
M(chk, chk, den) | ||
if (neq25519(chk, num)) M(r[0], r[0], I) | ||
S(chk, r[0]); | ||
M(chk, chk, den); | ||
if (neq25519(chk, num)) M(r[0], r[0], I); | ||
S(chk, r[0]) | ||
M(chk, chk, den) | ||
if (neq25519(chk, num)) return -1 | ||
S(chk, r[0]); | ||
M(chk, chk, den); | ||
if (neq25519(chk, num)) return -1; | ||
if (par25519(r[0]) === p[31] >> 7) Z(r[0], gf0, r[0]) | ||
if (par25519(r[0]) === p[31] >> 7) Z(r[0], gf0, r[0]); | ||
M(r[3], r[0], r[1]) | ||
return 0 | ||
M(r[3], r[0], r[1]); | ||
return 0; | ||
} | ||
function crypto_sign_open(m, sm, n, pk) { | ||
var i, mlen | ||
var i, mlen; | ||
var t = new Uint8Array(32), | ||
h = new Uint8Array(64) | ||
h = new Uint8Array(64); | ||
var p = [gf(), gf(), gf(), gf()], | ||
q = [gf(), gf(), gf(), gf()] | ||
q = [gf(), gf(), gf(), gf()]; | ||
mlen = -1 | ||
if (n < 64) return -1 | ||
mlen = -1; | ||
if (n < 64) return -1; | ||
if (unpackneg(q, pk)) return -1 | ||
if (unpackneg(q, pk)) return -1; | ||
for (i = 0; i < n; i++) m[i] = sm[i] | ||
for (i = 0; i < 32; i++) m[i + 32] = pk[i] | ||
for (i = 0; i < n; i++) m[i] = sm[i]; | ||
for (i = 0; i < 32; i++) m[i + 32] = pk[i]; | ||
//crypto_hash(h, m, n); | ||
context = blake2bInit(64, null) | ||
blake2bUpdate(context, m) | ||
h = blake2bFinal(context) | ||
context = blake2bInit(64, null); | ||
blake2bUpdate(context, m); | ||
h = blake2bFinal(context); | ||
reduce(h) | ||
scalarmult(p, q, h) | ||
reduce(h); | ||
scalarmult(p, q, h); | ||
scalarbase(q, sm.subarray(32)) | ||
add(p, q) | ||
pack(t, p) | ||
scalarbase(q, sm.subarray(32)); | ||
add(p, q); | ||
pack(t, p); | ||
n -= 64 | ||
n -= 64; | ||
if (crypto_verify_32(sm, 0, t, 0)) { | ||
for (i = 0; i < n; i++) m[i] = 0 | ||
return -1 | ||
for (i = 0; i < n; i++) m[i] = 0; | ||
return -1; | ||
} | ||
for (i = 0; i < n; i++) m[i] = sm[i + 64] | ||
mlen = n | ||
return mlen | ||
for (i = 0; i < n; i++) m[i] = sm[i + 64]; | ||
mlen = n; | ||
return mlen; | ||
} | ||
var crypto_secretbox_KEYBYTES = 32, | ||
crypto_secretbox_NONCEBYTES = 24, | ||
crypto_secretbox_ZEROBYTES = 32, | ||
crypto_secretbox_BOXZEROBYTES = 16, | ||
crypto_scalarmult_BYTES = 32, | ||
crypto_scalarmult_SCALARBYTES = 32, | ||
crypto_box_PUBLICKEYBYTES = 32, | ||
crypto_box_SECRETKEYBYTES = 32, | ||
crypto_box_BEFORENMBYTES = 32, | ||
crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, | ||
crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, | ||
crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, | ||
crypto_sign_BYTES = 64, | ||
crypto_sign_PUBLICKEYBYTES = 32, | ||
crypto_sign_SECRETKEYBYTES = 32, | ||
crypto_sign_SEEDBYTES = 32, | ||
crypto_hash_BYTES = 64 | ||
crypto_secretbox_NONCEBYTES = 24, | ||
crypto_secretbox_ZEROBYTES = 32, | ||
crypto_secretbox_BOXZEROBYTES = 16, | ||
crypto_scalarmult_BYTES = 32, | ||
crypto_scalarmult_SCALARBYTES = 32, | ||
crypto_box_PUBLICKEYBYTES = 32, | ||
crypto_box_SECRETKEYBYTES = 32, | ||
crypto_box_BEFORENMBYTES = 32, | ||
crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, | ||
crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, | ||
crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, | ||
crypto_sign_BYTES = 64, | ||
crypto_sign_PUBLICKEYBYTES = 32, | ||
crypto_sign_SECRETKEYBYTES = 32, | ||
crypto_sign_SEEDBYTES = 32, | ||
crypto_hash_BYTES = 64; | ||
@@ -1315,17 +1007,13 @@ nacl.lowlevel = { | ||
crypto_hash_BYTES: crypto_hash_BYTES | ||
} | ||
/* High-level API */ | ||
/* High-level API */ | ||
function checkLengths(k, n) { | ||
if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size') | ||
if (n.length !== crypto_secretbox_NONCEBYTES) | ||
throw new Error('bad nonce size') | ||
};function checkLengths(k, n) { | ||
if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); | ||
if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); | ||
} | ||
function checkBoxLengths(pk, sk) { | ||
if (pk.length !== crypto_box_PUBLICKEYBYTES) | ||
throw new Error('bad public key size') | ||
if (sk.length !== crypto_box_SECRETKEYBYTES) | ||
throw new Error('bad secret key size') | ||
if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); | ||
if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); | ||
} | ||
@@ -1335,4 +1023,3 @@ | ||
for (var i = 0; i < arguments.length; i++) { | ||
if (!(arguments[i] instanceof Uint8Array)) | ||
throw new TypeError('unexpected type, use Uint8Array') | ||
if (!(arguments[i] instanceof Uint8Array)) throw new TypeError('unexpected type, use Uint8Array'); | ||
} | ||
@@ -1342,224 +1029,216 @@ } | ||
function cleanup(arr) { | ||
for (var i = 0; i < arr.length; i++) arr[i] = 0 | ||
for (var i = 0; i < arr.length; i++) arr[i] = 0; | ||
} | ||
nacl.randomBytes = function(n) { | ||
var b = new Uint8Array(n) | ||
randombytes(b, n) | ||
return b | ||
} | ||
nacl.randomBytes = function (n) { | ||
var b = new Uint8Array(n); | ||
randombytes(b, n); | ||
return b; | ||
}; | ||
nacl.secretbox = function(msg, nonce, key) { | ||
checkArrayTypes(msg, nonce, key) | ||
checkLengths(key, nonce) | ||
var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length) | ||
var c = new Uint8Array(m.length) | ||
for (var i = 0; i < msg.length; i++) | ||
m[i + crypto_secretbox_ZEROBYTES] = msg[i] | ||
crypto_secretbox(c, m, m.length, nonce, key) | ||
return c.subarray(crypto_secretbox_BOXZEROBYTES) | ||
} | ||
nacl.secretbox = function (msg, nonce, key) { | ||
checkArrayTypes(msg, nonce, key); | ||
checkLengths(key, nonce); | ||
var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); | ||
var c = new Uint8Array(m.length); | ||
for (var i = 0; i < msg.length; i++) m[i + crypto_secretbox_ZEROBYTES] = msg[i]; | ||
crypto_secretbox(c, m, m.length, nonce, key); | ||
return c.subarray(crypto_secretbox_BOXZEROBYTES); | ||
}; | ||
nacl.secretbox.open = function(box, nonce, key) { | ||
checkArrayTypes(box, nonce, key) | ||
checkLengths(key, nonce) | ||
var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length) | ||
var m = new Uint8Array(c.length) | ||
for (var i = 0; i < box.length; i++) | ||
c[i + crypto_secretbox_BOXZEROBYTES] = box[i] | ||
if (c.length < 32) return null | ||
if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return null | ||
return m.subarray(crypto_secretbox_ZEROBYTES) | ||
} | ||
nacl.secretbox.open = function (box, nonce, key) { | ||
checkArrayTypes(box, nonce, key); | ||
checkLengths(key, nonce); | ||
var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); | ||
var m = new Uint8Array(c.length); | ||
for (var i = 0; i < box.length; i++) c[i + crypto_secretbox_BOXZEROBYTES] = box[i]; | ||
if (c.length < 32) return null; | ||
if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return null; | ||
return m.subarray(crypto_secretbox_ZEROBYTES); | ||
}; | ||
nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES | ||
nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES | ||
nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES | ||
nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; | ||
nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; | ||
nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; | ||
nacl.scalarMult = function(n, p) { | ||
checkArrayTypes(n, p) | ||
if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size') | ||
if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size') | ||
var q = new Uint8Array(crypto_scalarmult_BYTES) | ||
crypto_scalarmult(q, n, p) | ||
return q | ||
} | ||
nacl.scalarMult = function (n, p) { | ||
checkArrayTypes(n, p); | ||
if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); | ||
if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); | ||
var q = new Uint8Array(crypto_scalarmult_BYTES); | ||
crypto_scalarmult(q, n, p); | ||
return q; | ||
}; | ||
nacl.scalarMult.base = function(n) { | ||
checkArrayTypes(n) | ||
if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size') | ||
var q = new Uint8Array(crypto_scalarmult_BYTES) | ||
crypto_scalarmult_base(q, n) | ||
return q | ||
} | ||
nacl.scalarMult.base = function (n) { | ||
checkArrayTypes(n); | ||
if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); | ||
var q = new Uint8Array(crypto_scalarmult_BYTES); | ||
crypto_scalarmult_base(q, n); | ||
return q; | ||
}; | ||
nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES | ||
nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES | ||
nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; | ||
nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; | ||
nacl.box = function(msg, nonce, publicKey, secretKey) { | ||
var k = nacl.box.before(publicKey, secretKey) | ||
return nacl.secretbox(msg, nonce, k) | ||
} | ||
nacl.box = function (msg, nonce, publicKey, secretKey) { | ||
var k = nacl.box.before(publicKey, secretKey); | ||
return nacl.secretbox(msg, nonce, k); | ||
}; | ||
nacl.box.before = function(publicKey, secretKey) { | ||
checkArrayTypes(publicKey, secretKey) | ||
checkBoxLengths(publicKey, secretKey) | ||
var k = new Uint8Array(crypto_box_BEFORENMBYTES) | ||
crypto_box_beforenm(k, publicKey, secretKey) | ||
return k | ||
} | ||
nacl.box.before = function (publicKey, secretKey) { | ||
checkArrayTypes(publicKey, secretKey); | ||
checkBoxLengths(publicKey, secretKey); | ||
var k = new Uint8Array(crypto_box_BEFORENMBYTES); | ||
crypto_box_beforenm(k, publicKey, secretKey); | ||
return k; | ||
}; | ||
nacl.box.after = nacl.secretbox | ||
nacl.box.after = nacl.secretbox; | ||
nacl.box.open = function(msg, nonce, publicKey, secretKey) { | ||
var k = nacl.box.before(publicKey, secretKey) | ||
return nacl.secretbox.open(msg, nonce, k) | ||
} | ||
nacl.box.open = function (msg, nonce, publicKey, secretKey) { | ||
var k = nacl.box.before(publicKey, secretKey); | ||
return nacl.secretbox.open(msg, nonce, k); | ||
}; | ||
nacl.box.open.after = nacl.secretbox.open | ||
nacl.box.open.after = nacl.secretbox.open; | ||
nacl.box.keyPair = function() { | ||
var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES) | ||
var sk = new Uint8Array(crypto_box_SECRETKEYBYTES) | ||
crypto_box_keypair(pk, sk) | ||
return {publicKey: pk, secretKey: sk} | ||
} | ||
nacl.box.keyPair = function () { | ||
var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); | ||
var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); | ||
crypto_box_keypair(pk, sk); | ||
return { publicKey: pk, secretKey: sk }; | ||
}; | ||
nacl.box.keyPair.fromSecretKey = function(secretKey) { | ||
checkArrayTypes(secretKey) | ||
if (secretKey.length !== crypto_box_SECRETKEYBYTES) | ||
throw new Error('bad secret key size') | ||
var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES) | ||
crypto_scalarmult_base(pk, secretKey) | ||
return {publicKey: pk, secretKey: new Uint8Array(secretKey)} | ||
} | ||
nacl.box.keyPair.fromSecretKey = function (secretKey) { | ||
checkArrayTypes(secretKey); | ||
if (secretKey.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); | ||
var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); | ||
crypto_scalarmult_base(pk, secretKey); | ||
return { publicKey: pk, secretKey: new Uint8Array(secretKey) }; | ||
}; | ||
nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES | ||
nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES | ||
nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES | ||
nacl.box.nonceLength = crypto_box_NONCEBYTES | ||
nacl.box.overheadLength = nacl.secretbox.overheadLength | ||
nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; | ||
nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; | ||
nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; | ||
nacl.box.nonceLength = crypto_box_NONCEBYTES; | ||
nacl.box.overheadLength = nacl.secretbox.overheadLength; | ||
nacl.sign = function(msg, secretKey) { | ||
checkArrayTypes(msg, secretKey) | ||
if (secretKey.length !== crypto_sign_SECRETKEYBYTES) | ||
throw new Error('bad secret key size') | ||
var signedMsg = new Uint8Array(crypto_sign_BYTES + msg.length) | ||
crypto_sign(signedMsg, msg, msg.length, secretKey) | ||
return signedMsg | ||
} | ||
nacl.sign = function (msg, secretKey) { | ||
checkArrayTypes(msg, secretKey); | ||
if (secretKey.length !== crypto_sign_SECRETKEYBYTES) throw new Error('bad secret key size'); | ||
var signedMsg = new Uint8Array(crypto_sign_BYTES + msg.length); | ||
crypto_sign(signedMsg, msg, msg.length, secretKey); | ||
return signedMsg; | ||
}; | ||
nacl.sign.open = function(signedMsg, publicKey) { | ||
checkArrayTypes(signedMsg, publicKey) | ||
if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) | ||
throw new Error('bad public key size') | ||
var tmp = new Uint8Array(signedMsg.length) | ||
var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey) | ||
if (mlen < 0) return null | ||
var m = new Uint8Array(mlen) | ||
for (var i = 0; i < m.length; i++) m[i] = tmp[i] | ||
return m | ||
} | ||
nacl.sign.open = function (signedMsg, publicKey) { | ||
checkArrayTypes(signedMsg, publicKey); | ||
if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) throw new Error('bad public key size'); | ||
var tmp = new Uint8Array(signedMsg.length); | ||
var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); | ||
if (mlen < 0) return null; | ||
var m = new Uint8Array(mlen); | ||
for (var i = 0; i < m.length; i++) m[i] = tmp[i]; | ||
return m; | ||
}; | ||
nacl.sign.detached = function(msg, secretKey) { | ||
var signedMsg = nacl.sign(msg, secretKey) | ||
var sig = new Uint8Array(crypto_sign_BYTES) | ||
for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i] | ||
return sig | ||
} | ||
nacl.sign.detached = function (msg, secretKey) { | ||
var signedMsg = nacl.sign(msg, secretKey); | ||
var sig = new Uint8Array(crypto_sign_BYTES); | ||
for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; | ||
return sig; | ||
}; | ||
nacl.sign.detached.verify = function(msg, sig, publicKey) { | ||
checkArrayTypes(msg, sig, publicKey) | ||
if (sig.length !== crypto_sign_BYTES) throw new Error('bad signature size') | ||
if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) | ||
throw new Error('bad public key size') | ||
var sm = new Uint8Array(crypto_sign_BYTES + msg.length) | ||
var m = new Uint8Array(crypto_sign_BYTES + msg.length) | ||
var i | ||
for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i] | ||
for (i = 0; i < msg.length; i++) sm[i + crypto_sign_BYTES] = msg[i] | ||
return crypto_sign_open(m, sm, sm.length, publicKey) >= 0 | ||
} | ||
nacl.sign.detached.verify = function (msg, sig, publicKey) { | ||
checkArrayTypes(msg, sig, publicKey); | ||
if (sig.length !== crypto_sign_BYTES) throw new Error('bad signature size'); | ||
if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) throw new Error('bad public key size'); | ||
var sm = new Uint8Array(crypto_sign_BYTES + msg.length); | ||
var m = new Uint8Array(crypto_sign_BYTES + msg.length); | ||
var i; | ||
for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; | ||
for (i = 0; i < msg.length; i++) sm[i + crypto_sign_BYTES] = msg[i]; | ||
return crypto_sign_open(m, sm, sm.length, publicKey) >= 0; | ||
}; | ||
nacl.sign.keyPair = function() { | ||
var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES) | ||
var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES) | ||
crypto_sign_keypair(pk, sk) | ||
return {publicKey: pk, secretKey: sk} | ||
} | ||
nacl.sign.keyPair = function () { | ||
var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); | ||
var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); | ||
crypto_sign_keypair(pk, sk); | ||
return { publicKey: pk, secretKey: sk }; | ||
}; | ||
nacl.sign.keyPair.fromSecretKey = function(secretKey) { | ||
checkArrayTypes(secretKey) | ||
if (secretKey.length !== crypto_sign_SECRETKEYBYTES) | ||
throw new Error('bad secret key size') | ||
var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES) | ||
pk = derivePublicFromSecret(secretKey) | ||
return {publicKey: pk, secretKey: new Uint8Array(secretKey)} | ||
} | ||
nacl.sign.keyPair.fromSecretKey = function (secretKey) { | ||
checkArrayTypes(secretKey); | ||
if (secretKey.length !== crypto_sign_SECRETKEYBYTES) throw new Error('bad secret key size'); | ||
var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); | ||
pk = derivePublicFromSecret(secretKey); | ||
return { publicKey: pk, secretKey: new Uint8Array(secretKey) }; | ||
}; | ||
nacl.sign.keyPair.fromSeed = function(seed) { | ||
checkArrayTypes(seed) | ||
if (seed.length !== crypto_sign_SEEDBYTES) throw new Error('bad seed size') | ||
var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES) | ||
var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES) | ||
for (var i = 0; i < 32; i++) sk[i] = seed[i] | ||
crypto_sign_keypair(pk, sk, true) | ||
return {publicKey: pk, secretKey: sk} | ||
} | ||
nacl.sign.keyPair.fromSeed = function (seed) { | ||
checkArrayTypes(seed); | ||
if (seed.length !== crypto_sign_SEEDBYTES) throw new Error('bad seed size'); | ||
var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); | ||
var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); | ||
for (var i = 0; i < 32; i++) sk[i] = seed[i]; | ||
crypto_sign_keypair(pk, sk, true); | ||
return { publicKey: pk, secretKey: sk }; | ||
}; | ||
nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES | ||
nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES | ||
nacl.sign.seedLength = crypto_sign_SEEDBYTES | ||
nacl.sign.signatureLength = crypto_sign_BYTES | ||
nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; | ||
nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; | ||
nacl.sign.seedLength = crypto_sign_SEEDBYTES; | ||
nacl.sign.signatureLength = crypto_sign_BYTES; | ||
nacl.hash = function(msg) { | ||
checkArrayTypes(msg) | ||
var h = new Uint8Array(crypto_hash_BYTES) | ||
crypto_hash(h, msg, msg.length) | ||
return h | ||
} | ||
nacl.hash = function (msg) { | ||
checkArrayTypes(msg); | ||
var h = new Uint8Array(crypto_hash_BYTES); | ||
crypto_hash(h, msg, msg.length); | ||
return h; | ||
}; | ||
nacl.hash.hashLength = crypto_hash_BYTES | ||
nacl.hash.hashLength = crypto_hash_BYTES; | ||
nacl.verify = function(x, y) { | ||
checkArrayTypes(x, y) | ||
nacl.verify = function (x, y) { | ||
checkArrayTypes(x, y); | ||
// Zero length arguments are considered not equal. | ||
if (x.length === 0 || y.length === 0) return false | ||
if (x.length !== y.length) return false | ||
return vn(x, 0, y, 0, x.length) === 0 ? true : false | ||
} | ||
if (x.length === 0 || y.length === 0) return false; | ||
if (x.length !== y.length) return false; | ||
return vn(x, 0, y, 0, x.length) === 0 ? true : false; | ||
}; | ||
nacl.setPRNG = function(fn) { | ||
randombytes = fn | ||
} | ||
;(function() { | ||
nacl.setPRNG = function (fn) { | ||
randombytes = fn; | ||
};(function () { | ||
// Initialize PRNG if environment provides CSPRNG. | ||
// If not, methods calling randombytes will throw. | ||
var crypto = typeof self !== 'undefined' ? self.crypto || self.msCrypto : null | ||
var crypto = typeof self !== 'undefined' ? self.crypto || self.msCrypto : null; | ||
if (crypto && crypto.getRandomValues) { | ||
// Browsers. | ||
var QUOTA = 65536 | ||
nacl.setPRNG(function(x, n) { | ||
var QUOTA = 65536; | ||
nacl.setPRNG(function (x, n) { | ||
var i, | ||
v = new Uint8Array(n) | ||
v = new Uint8Array(n); | ||
for (i = 0; i < n; i += QUOTA) { | ||
crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))) | ||
crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); | ||
} | ||
for (i = 0; i < n; i++) x[i] = v[i] | ||
cleanup(v) | ||
}) | ||
for (i = 0; i < n; i++) x[i] = v[i]; | ||
cleanup(v); | ||
}); | ||
} else if (typeof require !== 'undefined') { | ||
// Node.js. | ||
crypto = require('crypto') | ||
crypto = require('crypto'); | ||
if (crypto && crypto.randomBytes) { | ||
nacl.setPRNG(function(x, n) { | ||
nacl.setPRNG(function (x, n) { | ||
var i, | ||
v = crypto.randomBytes(n) | ||
for (i = 0; i < n; i++) x[i] = v[i] | ||
cleanup(v) | ||
}) | ||
v = crypto.randomBytes(n); | ||
for (i = 0; i < n; i++) x[i] = v[i]; | ||
cleanup(v); | ||
}); | ||
} | ||
} | ||
})() | ||
})(); | ||
module.exports = nacl | ||
module.exports = nacl; |
@@ -1,6 +0,6 @@ | ||
const {Buffer} = require('buffer') | ||
const { Buffer } = require('buffer'); | ||
/* Utility functions exported as static functions on NanoNode class */ | ||
const {blake2b, blake2bInit, blake2bUpdate, blake2bFinal} = require('./blake2b') | ||
const nacl = require('./nacl') | ||
const { blake2b, blake2bInit, blake2bUpdate, blake2bFinal } = require('./blake2b'); | ||
const nacl = require('./nacl'); | ||
/* | ||
@@ -34,95 +34,92 @@ BSD 3-Clause License | ||
function uint8_uint4(uint8) { | ||
var length = uint8.length | ||
var uint4 = new Uint8Array(length * 2) | ||
var length = uint8.length; | ||
var uint4 = new Uint8Array(length * 2); | ||
for (let i = 0; i < length; i++) { | ||
uint4[i * 2] = (uint8[i] / 16) | 0 | ||
uint4[i * 2 + 1] = uint8[i] % 16 | ||
uint4[i * 2] = uint8[i] / 16 | 0; | ||
uint4[i * 2 + 1] = uint8[i] % 16; | ||
} | ||
return uint4 | ||
return uint4; | ||
} | ||
function uint4_uint8(uint4) { | ||
var length = uint4.length / 2 | ||
var uint8 = new Uint8Array(length) | ||
for (let i = 0; i < length; i++) | ||
uint8[i] = uint4[i * 2] * 16 + uint4[i * 2 + 1] | ||
return uint8 | ||
var length = uint4.length / 2; | ||
var uint8 = new Uint8Array(length); | ||
for (let i = 0; i < length; i++) uint8[i] = uint4[i * 2] * 16 + uint4[i * 2 + 1]; | ||
return uint8; | ||
} | ||
function uint4_uint5(uint4) { | ||
var length = uint4.length / 5 * 4 | ||
var uint5 = new Uint8Array(length) | ||
var length = uint4.length / 5 * 4; | ||
var uint5 = new Uint8Array(length); | ||
for (let i = 1; i <= length; i++) { | ||
let n = i - 1 | ||
let m = i % 4 | ||
let z = n + (i - m) / 4 | ||
let right = uint4[z] << m | ||
let left | ||
if ((length - i) % 4 === 0) left = uint4[z - 1] << 4 | ||
else left = uint4[z + 1] >> (4 - m) | ||
uint5[n] = (left + right) % 32 | ||
let n = i - 1; | ||
let m = i % 4; | ||
let z = n + (i - m) / 4; | ||
let right = uint4[z] << m; | ||
let left; | ||
if ((length - i) % 4 === 0) left = uint4[z - 1] << 4;else left = uint4[z + 1] >> 4 - m; | ||
uint5[n] = (left + right) % 32; | ||
} | ||
return uint5 | ||
return uint5; | ||
} | ||
function uint5_uint4(uint5) { | ||
var length = uint5.length / 4 * 5 | ||
var uint4 = new Uint8Array(length) | ||
var length = uint5.length / 4 * 5; | ||
var uint4 = new Uint8Array(length); | ||
for (let i = 1; i <= length; i++) { | ||
let n = i - 1 | ||
let m = i % 5 | ||
let z = n - (i - m) / 5 | ||
let right = uint5[z - 1] << (5 - m) | ||
let left = uint5[z] >> m | ||
uint4[n] = (left + right) % 16 | ||
let n = i - 1; | ||
let m = i % 5; | ||
let z = n - (i - m) / 5; | ||
let right = uint5[z - 1] << 5 - m; | ||
let left = uint5[z] >> m; | ||
uint4[n] = (left + right) % 16; | ||
} | ||
return uint4 | ||
return uint4; | ||
} | ||
function string_uint5(string) { | ||
var letter_list = (letter_list = '13456789abcdefghijkmnopqrstuwxyz'.split('')) | ||
var length = string.length | ||
var string_array = string.split('') | ||
var uint5 = new Uint8Array(length) | ||
for (let i = 0; i < length; i++) | ||
uint5[i] = letter_list.indexOf(string_array[i]) | ||
return uint5 | ||
var letter_list = letter_list = '13456789abcdefghijkmnopqrstuwxyz'.split(''); | ||
var length = string.length; | ||
var string_array = string.split(''); | ||
var uint5 = new Uint8Array(length); | ||
for (let i = 0; i < length; i++) uint5[i] = letter_list.indexOf(string_array[i]); | ||
return uint5; | ||
} | ||
function uint5_string(uint5) { | ||
var letter_list = (letter_list = '13456789abcdefghijkmnopqrstuwxyz'.split('')) | ||
var string = '' | ||
for (let i = 0; i < uint5.length; i++) string += letter_list[uint5[i]] | ||
return string | ||
var letter_list = letter_list = '13456789abcdefghijkmnopqrstuwxyz'.split(''); | ||
var string = ''; | ||
for (let i = 0; i < uint5.length; i++) string += letter_list[uint5[i]]; | ||
return string; | ||
} | ||
function hex_uint8(hex) { | ||
var length = (hex.length / 2) | 0 | ||
var uint8 = new Uint8Array(length) | ||
for (let i = 0; i < length; i++) uint8[i] = parseInt(hex.substr(i * 2, 2), 16) | ||
return uint8 | ||
var length = hex.length / 2 | 0; | ||
var uint8 = new Uint8Array(length); | ||
for (let i = 0; i < length; i++) uint8[i] = parseInt(hex.substr(i * 2, 2), 16); | ||
return uint8; | ||
} | ||
function hex_uint4(hex) { | ||
var length = hex.length | ||
var uint4 = new Uint8Array(length) | ||
for (let i = 0; i < length; i++) uint4[i] = parseInt(hex.substr(i, 1), 16) | ||
return uint4 | ||
var length = hex.length; | ||
var uint4 = new Uint8Array(length); | ||
for (let i = 0; i < length; i++) uint4[i] = parseInt(hex.substr(i, 1), 16); | ||
return uint4; | ||
} | ||
function uint8_hex(uint8) { | ||
var hex = '' | ||
var hex = ''; | ||
for (let i = 0; i < uint8.length; i++) { | ||
aux = uint8[i].toString(16).toUpperCase() | ||
if (aux.length === 1) aux = '0' + aux | ||
hex += aux | ||
aux = '' | ||
aux = uint8[i].toString(16).toUpperCase(); | ||
if (aux.length === 1) aux = '0' + aux; | ||
hex += aux; | ||
aux = ''; | ||
} | ||
return hex | ||
return hex; | ||
} | ||
function uint4_hex(uint4) { | ||
var hex = '' | ||
for (let i = 0; i < uint4.length; i++) hex += uint4[i].toString(16) | ||
return hex | ||
var hex = ''; | ||
for (let i = 0; i < uint4.length; i++) hex += uint4[i].toString(16); | ||
return hex; | ||
} | ||
@@ -132,40 +129,36 @@ | ||
for (let i = 0; i < array1.length; i++) { | ||
if (array1[i] !== array2[i]) return false | ||
if (array1[i] !== array2[i]) return false; | ||
} | ||
return true | ||
return true; | ||
} | ||
function array_crop(array) { | ||
var length = array.length - 1 | ||
var cropped_array = new Uint8Array(length) | ||
for (let i = 0; i < length; i++) cropped_array[i] = array[i + 1] | ||
return cropped_array | ||
var length = array.length - 1; | ||
var cropped_array = new Uint8Array(length); | ||
for (let i = 0; i < length; i++) cropped_array[i] = array[i + 1]; | ||
return cropped_array; | ||
} | ||
exports.keyFromAccount = function(account) { | ||
exports.keyFromAccount = function (account) { | ||
if (/^xrb_[13][13456789abcdefghijkmnopqrstuwxyz]{59}$/.test(account)) { | ||
var account_crop = account.substring(4, 64) | ||
var key_uint4 = array_crop( | ||
uint5_uint4(string_uint5(account_crop.substring(0, 52))) | ||
) | ||
var hash_uint4 = uint5_uint4(string_uint5(account_crop.substring(52, 60))) | ||
var key_array = uint4_uint8(key_uint4) | ||
var blake_hash = blake2b(key_array, null, 5).reverse() | ||
var account_crop = account.substring(4, 64); | ||
var key_uint4 = array_crop(uint5_uint4(string_uint5(account_crop.substring(0, 52)))); | ||
var hash_uint4 = uint5_uint4(string_uint5(account_crop.substring(52, 60))); | ||
var key_array = uint4_uint8(key_uint4); | ||
var blake_hash = blake2b(key_array, null, 5).reverse(); | ||
if (equal_arrays(hash_uint4, uint8_uint4(blake_hash))) { | ||
var key = uint4_hex(key_uint4) | ||
return key | ||
} else throw new Error('invalid_checksum') | ||
var key = uint4_hex(key_uint4); | ||
return key; | ||
} else throw new Error('invalid_checksum'); | ||
} | ||
throw new Error('invalid_account') | ||
} | ||
throw new Error('invalid_account'); | ||
}; | ||
exports.accountFromKey = function(hex) { | ||
var checksum = '' | ||
var key_bytes = uint4_uint8(hex_uint4(hex)) | ||
var checksum = uint5_string( | ||
uint4_uint5(uint8_uint4(blake2b(key_bytes, null, 5).reverse())) | ||
) | ||
var c_account = uint5_string(uint4_uint5(hex_uint4('0' + hex))) | ||
return 'xrb_' + c_account + checksum | ||
} | ||
exports.accountFromKey = function (hex) { | ||
var checksum = ''; | ||
var key_bytes = uint4_uint8(hex_uint4(hex)); | ||
var checksum = uint5_string(uint4_uint5(uint8_uint4(blake2b(key_bytes, null, 5).reverse()))); | ||
var c_account = uint5_string(uint4_uint5(hex_uint4('0' + hex))); | ||
return 'xrb_' + c_account + checksum; | ||
}; | ||
@@ -178,19 +171,15 @@ /* | ||
*/ | ||
exports.deterministicKey = function(seed, accountIndex) { | ||
const context = blake2bInit(32) | ||
exports.deterministicKey = function (seed, accountIndex) { | ||
const context = blake2bInit(32); | ||
const indexBuffer = Buffer.alloc(4) | ||
indexBuffer.writeInt32BE(accountIndex) | ||
const indexBuffer = Buffer.alloc(4); | ||
indexBuffer.writeInt32BE(accountIndex); | ||
if (typeof seed === 'string' && /^[A-Fa-f0-9]{64}$/.test(seed)) | ||
seed = Buffer.from(seed, hex) | ||
else if (!(seed instanceof Buffer)) throw new Error('invalid_seed') | ||
if (typeof seed === 'string' && /^[A-Fa-f0-9]{64}$/.test(seed)) seed = Buffer.from(seed, hex);else if (!(seed instanceof Buffer)) throw new Error('invalid_seed'); | ||
blake2bUpdate(context, seed) | ||
blake2bUpdate(context, indexBuffer) | ||
blake2bUpdate(context, seed); | ||
blake2bUpdate(context, indexBuffer); | ||
const privKey = Buffer.from(blake2bFinal(context)) | ||
const pubKeyHex = Buffer.from( | ||
nacl.sign.keyPair.fromSecretKey(privKey).publicKey | ||
).toString('hex') | ||
const privKey = Buffer.from(blake2bFinal(context)); | ||
const pubKeyHex = Buffer.from(nacl.sign.keyPair.fromSecretKey(privKey).publicKey).toString('hex'); | ||
return { | ||
@@ -200,10 +189,8 @@ privateKey: privKey.toString('hex'), | ||
address: exports.accountFromKey(pubKeyHex) | ||
} | ||
} | ||
}; | ||
}; | ||
exports.accountPair = function(privKeyString) { | ||
const privKey = Buffer.from(privKeyString, 'hex') | ||
const pubKeyHex = Buffer.from( | ||
nacl.sign.keyPair.fromSecretKey(privKey).publicKey | ||
).toString('hex') | ||
exports.accountPair = function (privKeyString) { | ||
const privKey = Buffer.from(privKeyString, 'hex'); | ||
const pubKeyHex = Buffer.from(nacl.sign.keyPair.fromSecretKey(privKey).publicKey).toString('hex'); | ||
return { | ||
@@ -213,3 +200,3 @@ privateKey: privKey.toString('hex'), | ||
address: exports.accountFromKey(pubKeyHex) | ||
} | ||
} | ||
}; | ||
}; |
{ | ||
"name": "nanode", | ||
"version": "2.2.1", | ||
"description": | ||
"Dead simple, promise-based client for interacting and building services on top of the NANO network.", | ||
"version": "2.3.0", | ||
"description": "Dead simple, promise-based client for interacting and building services on top of the NANO network.", | ||
"main": "./dist/index.js", | ||
@@ -11,3 +10,3 @@ "types": "./dist/index.d.ts", | ||
"test": "echo \"Error: no test specified\" && exit 1", | ||
"prepublish": "tsc && copyfiles util/*.js dist" | ||
"prepublish": "tsc && babel util --out-dir dist/util" | ||
}, | ||
@@ -30,2 +29,3 @@ "repository": { | ||
"@types/node": "9.4.6", | ||
"babel-cli": "6.26.0", | ||
"babel-core": "^6.26.0", | ||
@@ -32,0 +32,0 @@ "babel-loader": "^7.1.2", |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
763501
10
6224