diff --git a/sw_scripts/additional-scripts.js b/sw_scripts/additional-scripts.js index 60771775f..c8062d658 100644 --- a/sw_scripts/additional-scripts.js +++ b/sw_scripts/additional-scripts.js @@ -1,4 +1,5 @@ -importScripts("./safari-notifications.js"); +importScripts("./safari-notifications.js", "./nacl.js"); +//importScripts("./nacl.js") self.addEventListener("push", function (event) { diff --git a/sw_scripts/nacl.js b/sw_scripts/nacl.js index bad6ddf24..c8d60b607 100644 --- a/sw_scripts/nacl.js +++ b/sw_scripts/nacl.js @@ -1,779 +1,781 @@ -// function vn(x, xi, y, yi, n) { -// var i, 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); -// } - -// 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 = 64, -// crypto_sign_SEEDBYTES = 32, -// crypto_hash_BYTES = 64; - - -// function core_salsa20(o, p, k, c) { -// var j0 = c[0] & 0xff | (c[1] & 0xff) << 8 | (c[2] & 0xff) << 16 | (c[3] & 0xff) << 24, -// j1 = k[0] & 0xff | (k[1] & 0xff) << 8 | (k[2] & 0xff) << 16 | (k[3] & 0xff) << 24, -// j2 = k[4] & 0xff | (k[5] & 0xff) << 8 | (k[6] & 0xff) << 16 | (k[7] & 0xff) << 24, -// j3 = k[8] & 0xff | (k[9] & 0xff) << 8 | (k[10] & 0xff) << 16 | (k[11] & 0xff) << 24, -// j4 = k[12] & 0xff | (k[13] & 0xff) << 8 | (k[14] & 0xff) << 16 | (k[15] & 0xff) << 24, -// j5 = c[4] & 0xff | (c[5] & 0xff) << 8 | (c[6] & 0xff) << 16 | (c[7] & 0xff) << 24, -// j6 = p[0] & 0xff | (p[1] & 0xff) << 8 | (p[2] & 0xff) << 16 | (p[3] & 0xff) << 24, -// j7 = p[4] & 0xff | (p[5] & 0xff) << 8 | (p[6] & 0xff) << 16 | (p[7] & 0xff) << 24, -// j8 = p[8] & 0xff | (p[9] & 0xff) << 8 | (p[10] & 0xff) << 16 | (p[11] & 0xff) << 24, -// j9 = p[12] & 0xff | (p[13] & 0xff) << 8 | (p[14] & 0xff) << 16 | (p[15] & 0xff) << 24, -// j10 = c[8] & 0xff | (c[9] & 0xff) << 8 | (c[10] & 0xff) << 16 | (c[11] & 0xff) << 24, -// j11 = k[16] & 0xff | (k[17] & 0xff) << 8 | (k[18] & 0xff) << 16 | (k[19] & 0xff) << 24, -// j12 = k[20] & 0xff | (k[21] & 0xff) << 8 | (k[22] & 0xff) << 16 | (k[23] & 0xff) << 24, -// j13 = k[24] & 0xff | (k[25] & 0xff) << 8 | (k[26] & 0xff) << 16 | (k[27] & 0xff) << 24, -// j14 = k[28] & 0xff | (k[29] & 0xff) << 8 | (k[30] & 0xff) << 16 | (k[31] & 0xff) << 24, -// j15 = c[12] & 0xff | (c[13] & 0xff) << 8 | (c[14] & 0xff) << 16 | (c[15] & 0xff) << 24; - -// var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, -// x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, -// x15 = j15, u; - -// for (var i = 0; i < 20; i += 2) { -// u = x0 + x12 | 0; -// x4 ^= u << 7 | u >>> (32 - 7); -// u = x4 + x0 | 0; -// x8 ^= u << 9 | u >>> (32 - 9); -// u = x8 + x4 | 0; -// x12 ^= u << 13 | u >>> (32 - 13); -// u = x12 + x8 | 0; -// x0 ^= u << 18 | u >>> (32 - 18); - -// u = x5 + x1 | 0; -// x9 ^= u << 7 | u >>> (32 - 7); -// u = x9 + x5 | 0; -// x13 ^= u << 9 | u >>> (32 - 9); -// u = x13 + x9 | 0; -// x1 ^= u << 13 | u >>> (32 - 13); -// u = x1 + x13 | 0; -// x5 ^= u << 18 | u >>> (32 - 18); - -// u = x10 + x6 | 0; -// x14 ^= u << 7 | u >>> (32 - 7); -// u = x14 + x10 | 0; -// x2 ^= u << 9 | u >>> (32 - 9); -// u = x2 + x14 | 0; -// x6 ^= u << 13 | u >>> (32 - 13); -// u = x6 + x2 | 0; -// x10 ^= u << 18 | u >>> (32 - 18); - -// u = x15 + x11 | 0; -// x3 ^= u << 7 | u >>> (32 - 7); -// u = x3 + x15 | 0; -// x7 ^= u << 9 | u >>> (32 - 9); -// u = x7 + x3 | 0; -// x11 ^= u << 13 | u >>> (32 - 13); -// u = x11 + x7 | 0; -// x15 ^= u << 18 | u >>> (32 - 18); - -// u = x0 + x3 | 0; -// x1 ^= u << 7 | u >>> (32 - 7); -// u = x1 + x0 | 0; -// x2 ^= u << 9 | u >>> (32 - 9); -// u = x2 + x1 | 0; -// x3 ^= u << 13 | u >>> (32 - 13); -// u = x3 + x2 | 0; -// x0 ^= u << 18 | u >>> (32 - 18); - -// u = x5 + x4 | 0; -// x6 ^= u << 7 | u >>> (32 - 7); -// u = x6 + x5 | 0; -// x7 ^= u << 9 | u >>> (32 - 9); -// u = x7 + x6 | 0; -// x4 ^= u << 13 | u >>> (32 - 13); -// u = x4 + x7 | 0; -// x5 ^= u << 18 | u >>> (32 - 18); - -// u = x10 + x9 | 0; -// x11 ^= u << 7 | u >>> (32 - 7); -// u = x11 + x10 | 0; -// x8 ^= u << 9 | u >>> (32 - 9); -// u = x8 + x11 | 0; -// x9 ^= u << 13 | u >>> (32 - 13); -// u = x9 + x8 | 0; -// x10 ^= u << 18 | u >>> (32 - 18); - -// u = x15 + x14 | 0; -// x12 ^= u << 7 | u >>> (32 - 7); -// u = x12 + x15 | 0; -// x13 ^= u << 9 | u >>> (32 - 9); -// u = x13 + x12 | 0; -// x14 ^= u << 13 | u >>> (32 - 13); -// u = x14 + x13 | 0; -// x15 ^= u << 18 | u >>> (32 - 18); -// } -// x0 = x0 + j0 | 0; -// x1 = x1 + j1 | 0; -// x2 = x2 + j2 | 0; -// x3 = x3 + j3 | 0; -// x4 = x4 + j4 | 0; -// x5 = x5 + j5 | 0; -// x6 = x6 + j6 | 0; -// x7 = x7 + j7 | 0; -// x8 = x8 + j8 | 0; -// x9 = x9 + j9 | 0; -// x10 = x10 + j10 | 0; -// x11 = x11 + j11 | 0; -// x12 = x12 + j12 | 0; -// x13 = x13 + j13 | 0; -// x14 = x14 + j14 | 0; -// x15 = x15 + j15 | 0; - -// o[0] = x0 >>> 0 & 0xff; -// o[1] = x0 >>> 8 & 0xff; -// o[2] = x0 >>> 16 & 0xff; -// o[3] = x0 >>> 24 & 0xff; - -// o[4] = x1 >>> 0 & 0xff; -// o[5] = x1 >>> 8 & 0xff; -// o[6] = x1 >>> 16 & 0xff; -// o[7] = x1 >>> 24 & 0xff; - -// o[8] = x2 >>> 0 & 0xff; -// o[9] = x2 >>> 8 & 0xff; -// o[10] = x2 >>> 16 & 0xff; -// o[11] = x2 >>> 24 & 0xff; - -// o[12] = x3 >>> 0 & 0xff; -// o[13] = x3 >>> 8 & 0xff; -// o[14] = x3 >>> 16 & 0xff; -// o[15] = x3 >>> 24 & 0xff; - -// o[16] = x4 >>> 0 & 0xff; -// o[17] = x4 >>> 8 & 0xff; -// o[18] = x4 >>> 16 & 0xff; -// o[19] = x4 >>> 24 & 0xff; - -// o[20] = x5 >>> 0 & 0xff; -// o[21] = x5 >>> 8 & 0xff; -// o[22] = x5 >>> 16 & 0xff; -// o[23] = x5 >>> 24 & 0xff; - -// o[24] = x6 >>> 0 & 0xff; -// o[25] = x6 >>> 8 & 0xff; -// o[26] = x6 >>> 16 & 0xff; -// o[27] = x6 >>> 24 & 0xff; - -// o[28] = x7 >>> 0 & 0xff; -// o[29] = x7 >>> 8 & 0xff; -// o[30] = x7 >>> 16 & 0xff; -// o[31] = x7 >>> 24 & 0xff; - -// o[32] = x8 >>> 0 & 0xff; -// o[33] = x8 >>> 8 & 0xff; -// o[34] = x8 >>> 16 & 0xff; -// o[35] = x8 >>> 24 & 0xff; - -// o[36] = x9 >>> 0 & 0xff; -// o[37] = x9 >>> 8 & 0xff; -// o[38] = x9 >>> 16 & 0xff; -// o[39] = x9 >>> 24 & 0xff; - -// o[40] = x10 >>> 0 & 0xff; -// o[41] = x10 >>> 8 & 0xff; -// o[42] = x10 >>> 16 & 0xff; -// o[43] = x10 >>> 24 & 0xff; - -// o[44] = x11 >>> 0 & 0xff; -// o[45] = x11 >>> 8 & 0xff; -// o[46] = x11 >>> 16 & 0xff; -// o[47] = x11 >>> 24 & 0xff; - -// o[48] = x12 >>> 0 & 0xff; -// o[49] = x12 >>> 8 & 0xff; -// o[50] = x12 >>> 16 & 0xff; -// o[51] = x12 >>> 24 & 0xff; - -// o[52] = x13 >>> 0 & 0xff; -// o[53] = x13 >>> 8 & 0xff; -// o[54] = x13 >>> 16 & 0xff; -// o[55] = x13 >>> 24 & 0xff; - -// o[56] = x14 >>> 0 & 0xff; -// o[57] = x14 >>> 8 & 0xff; -// o[58] = x14 >>> 16 & 0xff; -// o[59] = x14 >>> 24 & 0xff; - -// o[60] = x15 >>> 0 & 0xff; -// o[61] = x15 >>> 8 & 0xff; -// o[62] = x15 >>> 16 & 0xff; -// o[63] = x15 >>> 24 & 0xff; -// } - -// function core_hsalsa20(o, p, k, c) { -// var j0 = c[0] & 0xff | (c[1] & 0xff) << 8 | (c[2] & 0xff) << 16 | (c[3] & 0xff) << 24, -// j1 = k[0] & 0xff | (k[1] & 0xff) << 8 | (k[2] & 0xff) << 16 | (k[3] & 0xff) << 24, -// j2 = k[4] & 0xff | (k[5] & 0xff) << 8 | (k[6] & 0xff) << 16 | (k[7] & 0xff) << 24, -// j3 = k[8] & 0xff | (k[9] & 0xff) << 8 | (k[10] & 0xff) << 16 | (k[11] & 0xff) << 24, -// j4 = k[12] & 0xff | (k[13] & 0xff) << 8 | (k[14] & 0xff) << 16 | (k[15] & 0xff) << 24, -// j5 = c[4] & 0xff | (c[5] & 0xff) << 8 | (c[6] & 0xff) << 16 | (c[7] & 0xff) << 24, -// j6 = p[0] & 0xff | (p[1] & 0xff) << 8 | (p[2] & 0xff) << 16 | (p[3] & 0xff) << 24, -// j7 = p[4] & 0xff | (p[5] & 0xff) << 8 | (p[6] & 0xff) << 16 | (p[7] & 0xff) << 24, -// j8 = p[8] & 0xff | (p[9] & 0xff) << 8 | (p[10] & 0xff) << 16 | (p[11] & 0xff) << 24, -// j9 = p[12] & 0xff | (p[13] & 0xff) << 8 | (p[14] & 0xff) << 16 | (p[15] & 0xff) << 24, -// j10 = c[8] & 0xff | (c[9] & 0xff) << 8 | (c[10] & 0xff) << 16 | (c[11] & 0xff) << 24, -// j11 = k[16] & 0xff | (k[17] & 0xff) << 8 | (k[18] & 0xff) << 16 | (k[19] & 0xff) << 24, -// j12 = k[20] & 0xff | (k[21] & 0xff) << 8 | (k[22] & 0xff) << 16 | (k[23] & 0xff) << 24, -// j13 = k[24] & 0xff | (k[25] & 0xff) << 8 | (k[26] & 0xff) << 16 | (k[27] & 0xff) << 24, -// j14 = k[28] & 0xff | (k[29] & 0xff) << 8 | (k[30] & 0xff) << 16 | (k[31] & 0xff) << 24, -// j15 = c[12] & 0xff | (c[13] & 0xff) << 8 | (c[14] & 0xff) << 16 | (c[15] & 0xff) << 24; - -// var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, -// x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, -// x15 = j15, u; - -// for (var i = 0; i < 20; i += 2) { -// u = x0 + x12 | 0; -// x4 ^= u << 7 | u >>> (32 - 7); -// u = x4 + x0 | 0; -// x8 ^= u << 9 | u >>> (32 - 9); -// u = x8 + x4 | 0; -// x12 ^= u << 13 | u >>> (32 - 13); -// u = x12 + x8 | 0; -// x0 ^= u << 18 | u >>> (32 - 18); - -// u = x5 + x1 | 0; -// x9 ^= u << 7 | u >>> (32 - 7); -// u = x9 + x5 | 0; -// x13 ^= u << 9 | u >>> (32 - 9); -// u = x13 + x9 | 0; -// x1 ^= u << 13 | u >>> (32 - 13); -// u = x1 + x13 | 0; -// x5 ^= u << 18 | u >>> (32 - 18); - -// u = x10 + x6 | 0; -// x14 ^= u << 7 | u >>> (32 - 7); -// u = x14 + x10 | 0; -// x2 ^= u << 9 | u >>> (32 - 9); -// u = x2 + x14 | 0; -// x6 ^= u << 13 | u >>> (32 - 13); -// u = x6 + x2 | 0; -// x10 ^= u << 18 | u >>> (32 - 18); - -// u = x15 + x11 | 0; -// x3 ^= u << 7 | u >>> (32 - 7); -// u = x3 + x15 | 0; -// x7 ^= u << 9 | u >>> (32 - 9); -// u = x7 + x3 | 0; -// x11 ^= u << 13 | u >>> (32 - 13); -// u = x11 + x7 | 0; -// x15 ^= u << 18 | u >>> (32 - 18); - -// u = x0 + x3 | 0; -// x1 ^= u << 7 | u >>> (32 - 7); -// u = x1 + x0 | 0; -// x2 ^= u << 9 | u >>> (32 - 9); -// u = x2 + x1 | 0; -// x3 ^= u << 13 | u >>> (32 - 13); -// u = x3 + x2 | 0; -// x0 ^= u << 18 | u >>> (32 - 18); - -// u = x5 + x4 | 0; -// x6 ^= u << 7 | u >>> (32 - 7); -// u = x6 + x5 | 0; -// x7 ^= u << 9 | u >>> (32 - 9); -// u = x7 + x6 | 0; -// x4 ^= u << 13 | u >>> (32 - 13); -// u = x4 + x7 | 0; -// x5 ^= u << 18 | u >>> (32 - 18); - -// u = x10 + x9 | 0; -// x11 ^= u << 7 | u >>> (32 - 7); -// u = x11 + x10 | 0; -// x8 ^= u << 9 | u >>> (32 - 9); -// u = x8 + x11 | 0; -// x9 ^= u << 13 | u >>> (32 - 13); -// u = x9 + x8 | 0; -// x10 ^= u << 18 | u >>> (32 - 18); - -// u = x15 + x14 | 0; -// x12 ^= u << 7 | u >>> (32 - 7); -// u = x12 + x15 | 0; -// x13 ^= u << 9 | u >>> (32 - 9); -// u = x13 + x12 | 0; -// x14 ^= u << 13 | u >>> (32 - 13); -// u = x14 + x13 | 0; -// x15 ^= u << 18 | u >>> (32 - 18); -// } - -// o[0] = x0 >>> 0 & 0xff; -// o[1] = x0 >>> 8 & 0xff; -// o[2] = x0 >>> 16 & 0xff; -// o[3] = x0 >>> 24 & 0xff; - -// o[4] = x5 >>> 0 & 0xff; -// o[5] = x5 >>> 8 & 0xff; -// o[6] = x5 >>> 16 & 0xff; -// o[7] = x5 >>> 24 & 0xff; - -// o[8] = x10 >>> 0 & 0xff; -// o[9] = x10 >>> 8 & 0xff; -// o[10] = x10 >>> 16 & 0xff; -// o[11] = x10 >>> 24 & 0xff; - -// o[12] = x15 >>> 0 & 0xff; -// o[13] = x15 >>> 8 & 0xff; -// o[14] = x15 >>> 16 & 0xff; -// o[15] = x15 >>> 24 & 0xff; - -// o[16] = x6 >>> 0 & 0xff; -// o[17] = x6 >>> 8 & 0xff; -// o[18] = x6 >>> 16 & 0xff; -// o[19] = x6 >>> 24 & 0xff; - -// o[20] = x7 >>> 0 & 0xff; -// o[21] = x7 >>> 8 & 0xff; -// o[22] = x7 >>> 16 & 0xff; -// o[23] = x7 >>> 24 & 0xff; - -// o[24] = x8 >>> 0 & 0xff; -// o[25] = x8 >>> 8 & 0xff; -// o[26] = x8 >>> 16 & 0xff; -// o[27] = x8 >>> 24 & 0xff; - -// o[28] = x9 >>> 0 & 0xff; -// o[29] = x9 >>> 8 & 0xff; -// o[30] = x9 >>> 16 & 0xff; -// o[31] = x9 >>> 24 & 0xff; -// } - -// function crypto_core_salsa20(out, inp, k, c) { -// core_salsa20(out, inp, k, c); -// } - -// function crypto_core_hsalsa20(out, inp, k, c) { -// core_hsalsa20(out, inp, k, c); -// } - -// var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); -// // "expand 32-byte k" - -// function crypto_stream_salsa20_xor(c, cpos, m, mpos, b, n, k) { -// var z = new Uint8Array(16), x = new Uint8Array(64); -// var u, i; -// 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[mpos + i] ^ x[i]; -// u = 1; -// for (i = 8; i < 16; i++) { -// u = u + (z[i] & 0xff) | 0; -// z[i] = u & 0xff; -// u >>>= 8; -// } -// b -= 64; -// cpos += 64; -// mpos += 64; -// } -// if (b > 0) { -// crypto_core_salsa20(x, z, k, sigma); -// for (i = 0; i < b; i++) c[cpos + i] = m[mpos + i] ^ x[i]; -// } -// return 0; -// } - -// function crypto_stream_salsa20(c, cpos, b, n, k) { -// var z = new Uint8Array(16), x = new Uint8Array(64); -// var u, i; -// 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] = x[i]; -// u = 1; -// for (i = 8; i < 16; i++) { -// u = u + (z[i] & 0xff) | 0; -// z[i] = u & 0xff; -// u >>>= 8; -// } -// b -= 64; -// cpos += 64; -// } -// if (b > 0) { -// crypto_core_salsa20(x, z, k, sigma); -// for (i = 0; i < b; i++) c[cpos + i] = x[i]; -// } -// return 0; -// } - -// var poly1305 = function (key) { -// this.buffer = new Uint8Array(16); -// this.r = new Uint16Array(10); -// this.h = new Uint16Array(10); -// this.pad = new Uint16Array(8); -// this.leftover = 0; -// this.fin = 0; - -// var t0, t1, t2, t3, t4, t5, t6, t7; - -// t0 = key[0] & 0xff | (key[1] & 0xff) << 8; this.r[0] = (t0) & 0x1fff; -// t1 = key[2] & 0xff | (key[3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff; -// t2 = key[4] & 0xff | (key[5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03; -// t3 = key[6] & 0xff | (key[7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff; -// t4 = key[8] & 0xff | (key[9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff; -// this.r[5] = ((t4 >>> 1)) & 0x1ffe; -// t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff; -// t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81; -// t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff; -// this.r[9] = ((t7 >>> 5)) & 0x007f; - -// this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8; -// this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8; -// this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8; -// this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8; -// this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8; -// this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8; -// this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8; -// this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8; -// }; - -// poly1305.prototype.blocks = function (m, mpos, bytes) { -// var hibit = this.fin ? 0 : (1 << 11); -// var t0, t1, t2, t3, t4, t5, t6, t7, c; -// var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9; - -// var h0 = this.h[0], -// h1 = this.h[1], -// h2 = this.h[2], -// h3 = this.h[3], -// h4 = this.h[4], -// h5 = this.h[5], -// h6 = this.h[6], -// h7 = this.h[7], -// h8 = this.h[8], -// h9 = this.h[9]; - -// var r0 = this.r[0], -// r1 = this.r[1], -// r2 = this.r[2], -// r3 = this.r[3], -// r4 = this.r[4], -// r5 = this.r[5], -// r6 = this.r[6], -// r7 = this.r[7], -// r8 = this.r[8], -// r9 = this.r[9]; - -// while (bytes >= 16) { -// t0 = m[mpos + 0] & 0xff | (m[mpos + 1] & 0xff) << 8; h0 += (t0) & 0x1fff; -// t1 = m[mpos + 2] & 0xff | (m[mpos + 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff; -// t2 = m[mpos + 4] & 0xff | (m[mpos + 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff; -// t3 = m[mpos + 6] & 0xff | (m[mpos + 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff; -// t4 = m[mpos + 8] & 0xff | (m[mpos + 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff; -// h5 += ((t4 >>> 1)) & 0x1fff; -// t5 = m[mpos + 10] & 0xff | (m[mpos + 11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff; -// t6 = m[mpos + 12] & 0xff | (m[mpos + 13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff; -// t7 = m[mpos + 14] & 0xff | (m[mpos + 15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff; -// h9 += ((t7 >>> 5)) | hibit; - -// c = 0; - -// d0 = c; -// d0 += h0 * r0; -// d0 += h1 * (5 * r9); -// d0 += h2 * (5 * r8); -// d0 += h3 * (5 * r7); -// d0 += h4 * (5 * r6); -// c = (d0 >>> 13); d0 &= 0x1fff; -// d0 += h5 * (5 * r5); -// d0 += h6 * (5 * r4); -// d0 += h7 * (5 * r3); -// d0 += h8 * (5 * r2); -// d0 += h9 * (5 * r1); -// c += (d0 >>> 13); d0 &= 0x1fff; - -// d1 = c; -// d1 += h0 * r1; -// d1 += h1 * r0; -// d1 += h2 * (5 * r9); -// d1 += h3 * (5 * r8); -// d1 += h4 * (5 * r7); -// c = (d1 >>> 13); d1 &= 0x1fff; -// d1 += h5 * (5 * r6); -// d1 += h6 * (5 * r5); -// d1 += h7 * (5 * r4); -// d1 += h8 * (5 * r3); -// d1 += h9 * (5 * r2); -// c += (d1 >>> 13); d1 &= 0x1fff; - -// d2 = c; -// d2 += h0 * r2; -// d2 += h1 * r1; -// d2 += h2 * r0; -// d2 += h3 * (5 * r9); -// d2 += h4 * (5 * r8); -// c = (d2 >>> 13); d2 &= 0x1fff; -// d2 += h5 * (5 * r7); -// d2 += h6 * (5 * r6); -// d2 += h7 * (5 * r5); -// d2 += h8 * (5 * r4); -// d2 += h9 * (5 * r3); -// c += (d2 >>> 13); d2 &= 0x1fff; - -// d3 = c; -// d3 += h0 * r3; -// d3 += h1 * r2; -// d3 += h2 * r1; -// d3 += h3 * r0; -// d3 += h4 * (5 * r9); -// c = (d3 >>> 13); d3 &= 0x1fff; -// d3 += h5 * (5 * r8); -// d3 += h6 * (5 * r7); -// d3 += h7 * (5 * r6); -// d3 += h8 * (5 * r5); -// d3 += h9 * (5 * r4); -// c += (d3 >>> 13); d3 &= 0x1fff; - -// d4 = c; -// d4 += h0 * r4; -// d4 += h1 * r3; -// d4 += h2 * r2; -// d4 += h3 * r1; -// d4 += h4 * r0; -// c = (d4 >>> 13); d4 &= 0x1fff; -// d4 += h5 * (5 * r9); -// d4 += h6 * (5 * r8); -// d4 += h7 * (5 * r7); -// d4 += h8 * (5 * r6); -// d4 += h9 * (5 * r5); -// c += (d4 >>> 13); d4 &= 0x1fff; - -// d5 = c; -// d5 += h0 * r5; -// d5 += h1 * r4; -// d5 += h2 * r3; -// d5 += h3 * r2; -// d5 += h4 * r1; -// c = (d5 >>> 13); d5 &= 0x1fff; -// d5 += h5 * r0; -// d5 += h6 * (5 * r9); -// d5 += h7 * (5 * r8); -// d5 += h8 * (5 * r7); -// d5 += h9 * (5 * r6); -// c += (d5 >>> 13); d5 &= 0x1fff; - -// d6 = c; -// d6 += h0 * r6; -// d6 += h1 * r5; -// d6 += h2 * r4; -// d6 += h3 * r3; -// d6 += h4 * r2; -// c = (d6 >>> 13); d6 &= 0x1fff; -// d6 += h5 * r1; -// d6 += h6 * r0; -// d6 += h7 * (5 * r9); -// d6 += h8 * (5 * r8); -// d6 += h9 * (5 * r7); -// c += (d6 >>> 13); d6 &= 0x1fff; - -// d7 = c; -// d7 += h0 * r7; -// d7 += h1 * r6; -// d7 += h2 * r5; -// d7 += h3 * r4; -// d7 += h4 * r3; -// c = (d7 >>> 13); d7 &= 0x1fff; -// d7 += h5 * r2; -// d7 += h6 * r1; -// d7 += h7 * r0; -// d7 += h8 * (5 * r9); -// d7 += h9 * (5 * r8); -// c += (d7 >>> 13); d7 &= 0x1fff; - -// d8 = c; -// d8 += h0 * r8; -// d8 += h1 * r7; -// d8 += h2 * r6; -// d8 += h3 * r5; -// d8 += h4 * r4; -// c = (d8 >>> 13); d8 &= 0x1fff; -// d8 += h5 * r3; -// d8 += h6 * r2; -// d8 += h7 * r1; -// d8 += h8 * r0; -// d8 += h9 * (5 * r9); -// c += (d8 >>> 13); d8 &= 0x1fff; - -// d9 = c; -// d9 += h0 * r9; -// d9 += h1 * r8; -// d9 += h2 * r7; -// d9 += h3 * r6; -// d9 += h4 * r5; -// c = (d9 >>> 13); d9 &= 0x1fff; -// d9 += h5 * r4; -// d9 += h6 * r3; -// d9 += h7 * r2; -// d9 += h8 * r1; -// d9 += h9 * r0; -// c += (d9 >>> 13); d9 &= 0x1fff; - -// c = (((c << 2) + c)) | 0; -// c = (c + d0) | 0; -// d0 = c & 0x1fff; -// c = (c >>> 13); -// d1 += c; - -// h0 = d0; -// h1 = d1; -// h2 = d2; -// h3 = d3; -// h4 = d4; -// h5 = d5; -// h6 = d6; -// h7 = d7; -// h8 = d8; -// h9 = d9; - -// mpos += 16; -// bytes -= 16; -// } -// this.h[0] = h0; -// this.h[1] = h1; -// this.h[2] = h2; -// this.h[3] = h3; -// this.h[4] = h4; -// this.h[5] = h5; -// this.h[6] = h6; -// this.h[7] = h7; -// this.h[8] = h8; -// this.h[9] = h9; -// }; - -// poly1305.prototype.finish = function (mac, macpos) { -// var g = new Uint16Array(10); -// var c, mask, f, i; - -// if (this.leftover) { -// i = this.leftover; -// this.buffer[i++] = 1; -// for (; i < 16; i++) this.buffer[i] = 0; -// this.fin = 1; -// this.blocks(this.buffer, 0, 16); -// } - -// c = this.h[1] >>> 13; -// this.h[1] &= 0x1fff; -// for (i = 2; i < 10; i++) { -// this.h[i] += c; -// c = this.h[i] >>> 13; -// this.h[i] &= 0x1fff; -// } -// this.h[0] += (c * 5); -// c = this.h[0] >>> 13; -// this.h[0] &= 0x1fff; -// this.h[1] += c; -// c = this.h[1] >>> 13; -// this.h[1] &= 0x1fff; -// this.h[2] += c; - -// g[0] = this.h[0] + 5; -// c = g[0] >>> 13; -// g[0] &= 0x1fff; -// for (i = 1; i < 10; i++) { -// g[i] = this.h[i] + c; -// c = g[i] >>> 13; -// g[i] &= 0x1fff; -// } -// g[9] -= (1 << 13); - -// mask = (c ^ 1) - 1; -// for (i = 0; i < 10; i++) g[i] &= mask; -// mask = ~mask; -// for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i]; - -// this.h[0] = ((this.h[0]) | (this.h[1] << 13)) & 0xffff; -// this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10)) & 0xffff; -// this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7)) & 0xffff; -// this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4)) & 0xffff; -// this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff; -// this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11)) & 0xffff; -// this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8)) & 0xffff; -// this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5)) & 0xffff; - -// f = this.h[0] + this.pad[0]; -// this.h[0] = f & 0xffff; -// for (i = 1; i < 8; i++) { -// f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0; -// this.h[i] = f & 0xffff; -// } - -// mac[macpos + 0] = (this.h[0] >>> 0) & 0xff; -// mac[macpos + 1] = (this.h[0] >>> 8) & 0xff; -// mac[macpos + 2] = (this.h[1] >>> 0) & 0xff; -// mac[macpos + 3] = (this.h[1] >>> 8) & 0xff; -// mac[macpos + 4] = (this.h[2] >>> 0) & 0xff; -// mac[macpos + 5] = (this.h[2] >>> 8) & 0xff; -// mac[macpos + 6] = (this.h[3] >>> 0) & 0xff; -// mac[macpos + 7] = (this.h[3] >>> 8) & 0xff; -// mac[macpos + 8] = (this.h[4] >>> 0) & 0xff; -// mac[macpos + 9] = (this.h[4] >>> 8) & 0xff; -// mac[macpos + 10] = (this.h[5] >>> 0) & 0xff; -// mac[macpos + 11] = (this.h[5] >>> 8) & 0xff; -// mac[macpos + 12] = (this.h[6] >>> 0) & 0xff; -// mac[macpos + 13] = (this.h[6] >>> 8) & 0xff; -// mac[macpos + 14] = (this.h[7] >>> 0) & 0xff; -// mac[macpos + 15] = (this.h[7] >>> 8) & 0xff; -// }; - -// poly1305.prototype.update = function (m, mpos, bytes) { -// var i, want; - -// if (this.leftover) { -// want = (16 - this.leftover); -// if (want > bytes) -// want = bytes; -// for (i = 0; i < want; i++) -// this.buffer[this.leftover + i] = m[mpos + i]; -// bytes -= want; -// mpos += want; -// this.leftover += want; -// if (this.leftover < 16) -// return; -// this.blocks(this.buffer, 0, 16); -// this.leftover = 0; -// } - -// if (bytes >= 16) { -// want = bytes - (bytes % 16); -// this.blocks(m, mpos, want); -// mpos += want; -// bytes -= want; -// } - -// if (bytes) { -// for (i = 0; i < bytes; i++) -// this.buffer[this.leftover + i] = m[mpos + i]; -// this.leftover += bytes; -// } -// }; - -// 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 vn(x, xi, y, yi, n) { + var i, 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); +} + +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 = 64, + crypto_sign_SEEDBYTES = 32, + crypto_hash_BYTES = 64; + + +function core_salsa20(o, p, k, c) { + var j0 = c[0] & 0xff | (c[1] & 0xff) << 8 | (c[2] & 0xff) << 16 | (c[3] & 0xff) << 24, + j1 = k[0] & 0xff | (k[1] & 0xff) << 8 | (k[2] & 0xff) << 16 | (k[3] & 0xff) << 24, + j2 = k[4] & 0xff | (k[5] & 0xff) << 8 | (k[6] & 0xff) << 16 | (k[7] & 0xff) << 24, + j3 = k[8] & 0xff | (k[9] & 0xff) << 8 | (k[10] & 0xff) << 16 | (k[11] & 0xff) << 24, + j4 = k[12] & 0xff | (k[13] & 0xff) << 8 | (k[14] & 0xff) << 16 | (k[15] & 0xff) << 24, + j5 = c[4] & 0xff | (c[5] & 0xff) << 8 | (c[6] & 0xff) << 16 | (c[7] & 0xff) << 24, + j6 = p[0] & 0xff | (p[1] & 0xff) << 8 | (p[2] & 0xff) << 16 | (p[3] & 0xff) << 24, + j7 = p[4] & 0xff | (p[5] & 0xff) << 8 | (p[6] & 0xff) << 16 | (p[7] & 0xff) << 24, + j8 = p[8] & 0xff | (p[9] & 0xff) << 8 | (p[10] & 0xff) << 16 | (p[11] & 0xff) << 24, + j9 = p[12] & 0xff | (p[13] & 0xff) << 8 | (p[14] & 0xff) << 16 | (p[15] & 0xff) << 24, + j10 = c[8] & 0xff | (c[9] & 0xff) << 8 | (c[10] & 0xff) << 16 | (c[11] & 0xff) << 24, + j11 = k[16] & 0xff | (k[17] & 0xff) << 8 | (k[18] & 0xff) << 16 | (k[19] & 0xff) << 24, + j12 = k[20] & 0xff | (k[21] & 0xff) << 8 | (k[22] & 0xff) << 16 | (k[23] & 0xff) << 24, + j13 = k[24] & 0xff | (k[25] & 0xff) << 8 | (k[26] & 0xff) << 16 | (k[27] & 0xff) << 24, + j14 = k[28] & 0xff | (k[29] & 0xff) << 8 | (k[30] & 0xff) << 16 | (k[31] & 0xff) << 24, + j15 = c[12] & 0xff | (c[13] & 0xff) << 8 | (c[14] & 0xff) << 16 | (c[15] & 0xff) << 24; + + var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, + x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, + x15 = j15, u; + + for (var i = 0; i < 20; i += 2) { + u = x0 + x12 | 0; + x4 ^= u << 7 | u >>> (32 - 7); + u = x4 + x0 | 0; + x8 ^= u << 9 | u >>> (32 - 9); + u = x8 + x4 | 0; + x12 ^= u << 13 | u >>> (32 - 13); + u = x12 + x8 | 0; + x0 ^= u << 18 | u >>> (32 - 18); + + u = x5 + x1 | 0; + x9 ^= u << 7 | u >>> (32 - 7); + u = x9 + x5 | 0; + x13 ^= u << 9 | u >>> (32 - 9); + u = x13 + x9 | 0; + x1 ^= u << 13 | u >>> (32 - 13); + u = x1 + x13 | 0; + x5 ^= u << 18 | u >>> (32 - 18); + + u = x10 + x6 | 0; + x14 ^= u << 7 | u >>> (32 - 7); + u = x14 + x10 | 0; + x2 ^= u << 9 | u >>> (32 - 9); + u = x2 + x14 | 0; + x6 ^= u << 13 | u >>> (32 - 13); + u = x6 + x2 | 0; + x10 ^= u << 18 | u >>> (32 - 18); + + u = x15 + x11 | 0; + x3 ^= u << 7 | u >>> (32 - 7); + u = x3 + x15 | 0; + x7 ^= u << 9 | u >>> (32 - 9); + u = x7 + x3 | 0; + x11 ^= u << 13 | u >>> (32 - 13); + u = x11 + x7 | 0; + x15 ^= u << 18 | u >>> (32 - 18); + + u = x0 + x3 | 0; + x1 ^= u << 7 | u >>> (32 - 7); + u = x1 + x0 | 0; + x2 ^= u << 9 | u >>> (32 - 9); + u = x2 + x1 | 0; + x3 ^= u << 13 | u >>> (32 - 13); + u = x3 + x2 | 0; + x0 ^= u << 18 | u >>> (32 - 18); + + u = x5 + x4 | 0; + x6 ^= u << 7 | u >>> (32 - 7); + u = x6 + x5 | 0; + x7 ^= u << 9 | u >>> (32 - 9); + u = x7 + x6 | 0; + x4 ^= u << 13 | u >>> (32 - 13); + u = x4 + x7 | 0; + x5 ^= u << 18 | u >>> (32 - 18); + + u = x10 + x9 | 0; + x11 ^= u << 7 | u >>> (32 - 7); + u = x11 + x10 | 0; + x8 ^= u << 9 | u >>> (32 - 9); + u = x8 + x11 | 0; + x9 ^= u << 13 | u >>> (32 - 13); + u = x9 + x8 | 0; + x10 ^= u << 18 | u >>> (32 - 18); + + u = x15 + x14 | 0; + x12 ^= u << 7 | u >>> (32 - 7); + u = x12 + x15 | 0; + x13 ^= u << 9 | u >>> (32 - 9); + u = x13 + x12 | 0; + x14 ^= u << 13 | u >>> (32 - 13); + u = x14 + x13 | 0; + x15 ^= u << 18 | u >>> (32 - 18); + } + x0 = x0 + j0 | 0; + x1 = x1 + j1 | 0; + x2 = x2 + j2 | 0; + x3 = x3 + j3 | 0; + x4 = x4 + j4 | 0; + x5 = x5 + j5 | 0; + x6 = x6 + j6 | 0; + x7 = x7 + j7 | 0; + x8 = x8 + j8 | 0; + x9 = x9 + j9 | 0; + x10 = x10 + j10 | 0; + x11 = x11 + j11 | 0; + x12 = x12 + j12 | 0; + x13 = x13 + j13 | 0; + x14 = x14 + j14 | 0; + x15 = x15 + j15 | 0; + + o[0] = x0 >>> 0 & 0xff; + o[1] = x0 >>> 8 & 0xff; + o[2] = x0 >>> 16 & 0xff; + o[3] = x0 >>> 24 & 0xff; + + o[4] = x1 >>> 0 & 0xff; + o[5] = x1 >>> 8 & 0xff; + o[6] = x1 >>> 16 & 0xff; + o[7] = x1 >>> 24 & 0xff; + + o[8] = x2 >>> 0 & 0xff; + o[9] = x2 >>> 8 & 0xff; + o[10] = x2 >>> 16 & 0xff; + o[11] = x2 >>> 24 & 0xff; + + o[12] = x3 >>> 0 & 0xff; + o[13] = x3 >>> 8 & 0xff; + o[14] = x3 >>> 16 & 0xff; + o[15] = x3 >>> 24 & 0xff; + + o[16] = x4 >>> 0 & 0xff; + o[17] = x4 >>> 8 & 0xff; + o[18] = x4 >>> 16 & 0xff; + o[19] = x4 >>> 24 & 0xff; + + o[20] = x5 >>> 0 & 0xff; + o[21] = x5 >>> 8 & 0xff; + o[22] = x5 >>> 16 & 0xff; + o[23] = x5 >>> 24 & 0xff; + + o[24] = x6 >>> 0 & 0xff; + o[25] = x6 >>> 8 & 0xff; + o[26] = x6 >>> 16 & 0xff; + o[27] = x6 >>> 24 & 0xff; + + o[28] = x7 >>> 0 & 0xff; + o[29] = x7 >>> 8 & 0xff; + o[30] = x7 >>> 16 & 0xff; + o[31] = x7 >>> 24 & 0xff; + + o[32] = x8 >>> 0 & 0xff; + o[33] = x8 >>> 8 & 0xff; + o[34] = x8 >>> 16 & 0xff; + o[35] = x8 >>> 24 & 0xff; + + o[36] = x9 >>> 0 & 0xff; + o[37] = x9 >>> 8 & 0xff; + o[38] = x9 >>> 16 & 0xff; + o[39] = x9 >>> 24 & 0xff; + + o[40] = x10 >>> 0 & 0xff; + o[41] = x10 >>> 8 & 0xff; + o[42] = x10 >>> 16 & 0xff; + o[43] = x10 >>> 24 & 0xff; + + o[44] = x11 >>> 0 & 0xff; + o[45] = x11 >>> 8 & 0xff; + o[46] = x11 >>> 16 & 0xff; + o[47] = x11 >>> 24 & 0xff; + + o[48] = x12 >>> 0 & 0xff; + o[49] = x12 >>> 8 & 0xff; + o[50] = x12 >>> 16 & 0xff; + o[51] = x12 >>> 24 & 0xff; + + o[52] = x13 >>> 0 & 0xff; + o[53] = x13 >>> 8 & 0xff; + o[54] = x13 >>> 16 & 0xff; + o[55] = x13 >>> 24 & 0xff; + + o[56] = x14 >>> 0 & 0xff; + o[57] = x14 >>> 8 & 0xff; + o[58] = x14 >>> 16 & 0xff; + o[59] = x14 >>> 24 & 0xff; + + o[60] = x15 >>> 0 & 0xff; + o[61] = x15 >>> 8 & 0xff; + o[62] = x15 >>> 16 & 0xff; + o[63] = x15 >>> 24 & 0xff; +} + +function core_hsalsa20(o, p, k, c) { + var j0 = c[0] & 0xff | (c[1] & 0xff) << 8 | (c[2] & 0xff) << 16 | (c[3] & 0xff) << 24, + j1 = k[0] & 0xff | (k[1] & 0xff) << 8 | (k[2] & 0xff) << 16 | (k[3] & 0xff) << 24, + j2 = k[4] & 0xff | (k[5] & 0xff) << 8 | (k[6] & 0xff) << 16 | (k[7] & 0xff) << 24, + j3 = k[8] & 0xff | (k[9] & 0xff) << 8 | (k[10] & 0xff) << 16 | (k[11] & 0xff) << 24, + j4 = k[12] & 0xff | (k[13] & 0xff) << 8 | (k[14] & 0xff) << 16 | (k[15] & 0xff) << 24, + j5 = c[4] & 0xff | (c[5] & 0xff) << 8 | (c[6] & 0xff) << 16 | (c[7] & 0xff) << 24, + j6 = p[0] & 0xff | (p[1] & 0xff) << 8 | (p[2] & 0xff) << 16 | (p[3] & 0xff) << 24, + j7 = p[4] & 0xff | (p[5] & 0xff) << 8 | (p[6] & 0xff) << 16 | (p[7] & 0xff) << 24, + j8 = p[8] & 0xff | (p[9] & 0xff) << 8 | (p[10] & 0xff) << 16 | (p[11] & 0xff) << 24, + j9 = p[12] & 0xff | (p[13] & 0xff) << 8 | (p[14] & 0xff) << 16 | (p[15] & 0xff) << 24, + j10 = c[8] & 0xff | (c[9] & 0xff) << 8 | (c[10] & 0xff) << 16 | (c[11] & 0xff) << 24, + j11 = k[16] & 0xff | (k[17] & 0xff) << 8 | (k[18] & 0xff) << 16 | (k[19] & 0xff) << 24, + j12 = k[20] & 0xff | (k[21] & 0xff) << 8 | (k[22] & 0xff) << 16 | (k[23] & 0xff) << 24, + j13 = k[24] & 0xff | (k[25] & 0xff) << 8 | (k[26] & 0xff) << 16 | (k[27] & 0xff) << 24, + j14 = k[28] & 0xff | (k[29] & 0xff) << 8 | (k[30] & 0xff) << 16 | (k[31] & 0xff) << 24, + j15 = c[12] & 0xff | (c[13] & 0xff) << 8 | (c[14] & 0xff) << 16 | (c[15] & 0xff) << 24; + + var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, + x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, + x15 = j15, u; + + for (var i = 0; i < 20; i += 2) { + u = x0 + x12 | 0; + x4 ^= u << 7 | u >>> (32 - 7); + u = x4 + x0 | 0; + x8 ^= u << 9 | u >>> (32 - 9); + u = x8 + x4 | 0; + x12 ^= u << 13 | u >>> (32 - 13); + u = x12 + x8 | 0; + x0 ^= u << 18 | u >>> (32 - 18); + + u = x5 + x1 | 0; + x9 ^= u << 7 | u >>> (32 - 7); + u = x9 + x5 | 0; + x13 ^= u << 9 | u >>> (32 - 9); + u = x13 + x9 | 0; + x1 ^= u << 13 | u >>> (32 - 13); + u = x1 + x13 | 0; + x5 ^= u << 18 | u >>> (32 - 18); + + u = x10 + x6 | 0; + x14 ^= u << 7 | u >>> (32 - 7); + u = x14 + x10 | 0; + x2 ^= u << 9 | u >>> (32 - 9); + u = x2 + x14 | 0; + x6 ^= u << 13 | u >>> (32 - 13); + u = x6 + x2 | 0; + x10 ^= u << 18 | u >>> (32 - 18); + + u = x15 + x11 | 0; + x3 ^= u << 7 | u >>> (32 - 7); + u = x3 + x15 | 0; + x7 ^= u << 9 | u >>> (32 - 9); + u = x7 + x3 | 0; + x11 ^= u << 13 | u >>> (32 - 13); + u = x11 + x7 | 0; + x15 ^= u << 18 | u >>> (32 - 18); + + u = x0 + x3 | 0; + x1 ^= u << 7 | u >>> (32 - 7); + u = x1 + x0 | 0; + x2 ^= u << 9 | u >>> (32 - 9); + u = x2 + x1 | 0; + x3 ^= u << 13 | u >>> (32 - 13); + u = x3 + x2 | 0; + x0 ^= u << 18 | u >>> (32 - 18); + + u = x5 + x4 | 0; + x6 ^= u << 7 | u >>> (32 - 7); + u = x6 + x5 | 0; + x7 ^= u << 9 | u >>> (32 - 9); + u = x7 + x6 | 0; + x4 ^= u << 13 | u >>> (32 - 13); + u = x4 + x7 | 0; + x5 ^= u << 18 | u >>> (32 - 18); + + u = x10 + x9 | 0; + x11 ^= u << 7 | u >>> (32 - 7); + u = x11 + x10 | 0; + x8 ^= u << 9 | u >>> (32 - 9); + u = x8 + x11 | 0; + x9 ^= u << 13 | u >>> (32 - 13); + u = x9 + x8 | 0; + x10 ^= u << 18 | u >>> (32 - 18); + + u = x15 + x14 | 0; + x12 ^= u << 7 | u >>> (32 - 7); + u = x12 + x15 | 0; + x13 ^= u << 9 | u >>> (32 - 9); + u = x13 + x12 | 0; + x14 ^= u << 13 | u >>> (32 - 13); + u = x14 + x13 | 0; + x15 ^= u << 18 | u >>> (32 - 18); + } + + o[0] = x0 >>> 0 & 0xff; + o[1] = x0 >>> 8 & 0xff; + o[2] = x0 >>> 16 & 0xff; + o[3] = x0 >>> 24 & 0xff; + + o[4] = x5 >>> 0 & 0xff; + o[5] = x5 >>> 8 & 0xff; + o[6] = x5 >>> 16 & 0xff; + o[7] = x5 >>> 24 & 0xff; + + o[8] = x10 >>> 0 & 0xff; + o[9] = x10 >>> 8 & 0xff; + o[10] = x10 >>> 16 & 0xff; + o[11] = x10 >>> 24 & 0xff; + + o[12] = x15 >>> 0 & 0xff; + o[13] = x15 >>> 8 & 0xff; + o[14] = x15 >>> 16 & 0xff; + o[15] = x15 >>> 24 & 0xff; + + o[16] = x6 >>> 0 & 0xff; + o[17] = x6 >>> 8 & 0xff; + o[18] = x6 >>> 16 & 0xff; + o[19] = x6 >>> 24 & 0xff; + + o[20] = x7 >>> 0 & 0xff; + o[21] = x7 >>> 8 & 0xff; + o[22] = x7 >>> 16 & 0xff; + o[23] = x7 >>> 24 & 0xff; + + o[24] = x8 >>> 0 & 0xff; + o[25] = x8 >>> 8 & 0xff; + o[26] = x8 >>> 16 & 0xff; + o[27] = x8 >>> 24 & 0xff; + + o[28] = x9 >>> 0 & 0xff; + o[29] = x9 >>> 8 & 0xff; + o[30] = x9 >>> 16 & 0xff; + o[31] = x9 >>> 24 & 0xff; +} + +function crypto_core_salsa20(out, inp, k, c) { + core_salsa20(out, inp, k, c); +} + +function crypto_core_hsalsa20(out, inp, k, c) { + core_hsalsa20(out, inp, k, c); +} + +var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); +// "expand 32-byte k" + + +function crypto_stream_salsa20_xor(c, cpos, m, mpos, b, n, k) { + var z = new Uint8Array(16), x = new Uint8Array(64); + var u, i; + 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[mpos + i] ^ x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = u + (z[i] & 0xff) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + mpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x, z, k, sigma); + for (i = 0; i < b; i++) c[cpos + i] = m[mpos + i] ^ x[i]; + } + return 0; +} + + +function crypto_stream_salsa20(c, cpos, b, n, k) { + var z = new Uint8Array(16), x = new Uint8Array(64); + var u, i; + 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] = x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = u + (z[i] & 0xff) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x, z, k, sigma); + for (i = 0; i < b; i++) c[cpos + i] = x[i]; + } + return 0; +} + +var poly1305 = function (key) { + this.buffer = new Uint8Array(16); + this.r = new Uint16Array(10); + this.h = new Uint16Array(10); + this.pad = new Uint16Array(8); + this.leftover = 0; + this.fin = 0; + + var t0, t1, t2, t3, t4, t5, t6, t7; + + t0 = key[0] & 0xff | (key[1] & 0xff) << 8; this.r[0] = (t0) & 0x1fff; + t1 = key[2] & 0xff | (key[3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff; + t2 = key[4] & 0xff | (key[5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03; + t3 = key[6] & 0xff | (key[7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff; + t4 = key[8] & 0xff | (key[9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff; + this.r[5] = ((t4 >>> 1)) & 0x1ffe; + t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff; + t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81; + t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff; + this.r[9] = ((t7 >>> 5)) & 0x007f; + + this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8; + this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8; + this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8; + this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8; + this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8; + this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8; + this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8; + this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8; +}; + +poly1305.prototype.blocks = function (m, mpos, bytes) { + var hibit = this.fin ? 0 : (1 << 11); + var t0, t1, t2, t3, t4, t5, t6, t7, c; + var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9; + + var h0 = this.h[0], + h1 = this.h[1], + h2 = this.h[2], + h3 = this.h[3], + h4 = this.h[4], + h5 = this.h[5], + h6 = this.h[6], + h7 = this.h[7], + h8 = this.h[8], + h9 = this.h[9]; + + var r0 = this.r[0], + r1 = this.r[1], + r2 = this.r[2], + r3 = this.r[3], + r4 = this.r[4], + r5 = this.r[5], + r6 = this.r[6], + r7 = this.r[7], + r8 = this.r[8], + r9 = this.r[9]; + + while (bytes >= 16) { + t0 = m[mpos + 0] & 0xff | (m[mpos + 1] & 0xff) << 8; h0 += (t0) & 0x1fff; + t1 = m[mpos + 2] & 0xff | (m[mpos + 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff; + t2 = m[mpos + 4] & 0xff | (m[mpos + 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff; + t3 = m[mpos + 6] & 0xff | (m[mpos + 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff; + t4 = m[mpos + 8] & 0xff | (m[mpos + 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff; + h5 += ((t4 >>> 1)) & 0x1fff; + t5 = m[mpos + 10] & 0xff | (m[mpos + 11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff; + t6 = m[mpos + 12] & 0xff | (m[mpos + 13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff; + t7 = m[mpos + 14] & 0xff | (m[mpos + 15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff; + h9 += ((t7 >>> 5)) | hibit; + + c = 0; + + d0 = c; + d0 += h0 * r0; + d0 += h1 * (5 * r9); + d0 += h2 * (5 * r8); + d0 += h3 * (5 * r7); + d0 += h4 * (5 * r6); + c = (d0 >>> 13); d0 &= 0x1fff; + d0 += h5 * (5 * r5); + d0 += h6 * (5 * r4); + d0 += h7 * (5 * r3); + d0 += h8 * (5 * r2); + d0 += h9 * (5 * r1); + c += (d0 >>> 13); d0 &= 0x1fff; + + d1 = c; + d1 += h0 * r1; + d1 += h1 * r0; + d1 += h2 * (5 * r9); + d1 += h3 * (5 * r8); + d1 += h4 * (5 * r7); + c = (d1 >>> 13); d1 &= 0x1fff; + d1 += h5 * (5 * r6); + d1 += h6 * (5 * r5); + d1 += h7 * (5 * r4); + d1 += h8 * (5 * r3); + d1 += h9 * (5 * r2); + c += (d1 >>> 13); d1 &= 0x1fff; + + d2 = c; + d2 += h0 * r2; + d2 += h1 * r1; + d2 += h2 * r0; + d2 += h3 * (5 * r9); + d2 += h4 * (5 * r8); + c = (d2 >>> 13); d2 &= 0x1fff; + d2 += h5 * (5 * r7); + d2 += h6 * (5 * r6); + d2 += h7 * (5 * r5); + d2 += h8 * (5 * r4); + d2 += h9 * (5 * r3); + c += (d2 >>> 13); d2 &= 0x1fff; + + d3 = c; + d3 += h0 * r3; + d3 += h1 * r2; + d3 += h2 * r1; + d3 += h3 * r0; + d3 += h4 * (5 * r9); + c = (d3 >>> 13); d3 &= 0x1fff; + d3 += h5 * (5 * r8); + d3 += h6 * (5 * r7); + d3 += h7 * (5 * r6); + d3 += h8 * (5 * r5); + d3 += h9 * (5 * r4); + c += (d3 >>> 13); d3 &= 0x1fff; + + d4 = c; + d4 += h0 * r4; + d4 += h1 * r3; + d4 += h2 * r2; + d4 += h3 * r1; + d4 += h4 * r0; + c = (d4 >>> 13); d4 &= 0x1fff; + d4 += h5 * (5 * r9); + d4 += h6 * (5 * r8); + d4 += h7 * (5 * r7); + d4 += h8 * (5 * r6); + d4 += h9 * (5 * r5); + c += (d4 >>> 13); d4 &= 0x1fff; + + d5 = c; + d5 += h0 * r5; + d5 += h1 * r4; + d5 += h2 * r3; + d5 += h3 * r2; + d5 += h4 * r1; + c = (d5 >>> 13); d5 &= 0x1fff; + d5 += h5 * r0; + d5 += h6 * (5 * r9); + d5 += h7 * (5 * r8); + d5 += h8 * (5 * r7); + d5 += h9 * (5 * r6); + c += (d5 >>> 13); d5 &= 0x1fff; + + d6 = c; + d6 += h0 * r6; + d6 += h1 * r5; + d6 += h2 * r4; + d6 += h3 * r3; + d6 += h4 * r2; + c = (d6 >>> 13); d6 &= 0x1fff; + d6 += h5 * r1; + d6 += h6 * r0; + d6 += h7 * (5 * r9); + d6 += h8 * (5 * r8); + d6 += h9 * (5 * r7); + c += (d6 >>> 13); d6 &= 0x1fff; + + d7 = c; + d7 += h0 * r7; + d7 += h1 * r6; + d7 += h2 * r5; + d7 += h3 * r4; + d7 += h4 * r3; + c = (d7 >>> 13); d7 &= 0x1fff; + d7 += h5 * r2; + d7 += h6 * r1; + d7 += h7 * r0; + d7 += h8 * (5 * r9); + d7 += h9 * (5 * r8); + c += (d7 >>> 13); d7 &= 0x1fff; + + d8 = c; + d8 += h0 * r8; + d8 += h1 * r7; + d8 += h2 * r6; + d8 += h3 * r5; + d8 += h4 * r4; + c = (d8 >>> 13); d8 &= 0x1fff; + d8 += h5 * r3; + d8 += h6 * r2; + d8 += h7 * r1; + d8 += h8 * r0; + d8 += h9 * (5 * r9); + c += (d8 >>> 13); d8 &= 0x1fff; + + d9 = c; + d9 += h0 * r9; + d9 += h1 * r8; + d9 += h2 * r7; + d9 += h3 * r6; + d9 += h4 * r5; + c = (d9 >>> 13); d9 &= 0x1fff; + d9 += h5 * r4; + d9 += h6 * r3; + d9 += h7 * r2; + d9 += h8 * r1; + d9 += h9 * r0; + c += (d9 >>> 13); d9 &= 0x1fff; + + c = (((c << 2) + c)) | 0; + c = (c + d0) | 0; + d0 = c & 0x1fff; + c = (c >>> 13); + d1 += c; + + h0 = d0; + h1 = d1; + h2 = d2; + h3 = d3; + h4 = d4; + h5 = d5; + h6 = d6; + h7 = d7; + h8 = d8; + h9 = d9; + + mpos += 16; + bytes -= 16; + } + this.h[0] = h0; + this.h[1] = h1; + this.h[2] = h2; + this.h[3] = h3; + this.h[4] = h4; + this.h[5] = h5; + this.h[6] = h6; + this.h[7] = h7; + this.h[8] = h8; + this.h[9] = h9; +}; + +poly1305.prototype.finish = function (mac, macpos) { + var g = new Uint16Array(10); + var c, mask, f, i; + + if (this.leftover) { + i = this.leftover; + this.buffer[i++] = 1; + for (; i < 16; i++) this.buffer[i] = 0; + this.fin = 1; + this.blocks(this.buffer, 0, 16); + } + + c = this.h[1] >>> 13; + this.h[1] &= 0x1fff; + for (i = 2; i < 10; i++) { + this.h[i] += c; + c = this.h[i] >>> 13; + this.h[i] &= 0x1fff; + } + this.h[0] += (c * 5); + c = this.h[0] >>> 13; + this.h[0] &= 0x1fff; + this.h[1] += c; + c = this.h[1] >>> 13; + this.h[1] &= 0x1fff; + this.h[2] += c; + + g[0] = this.h[0] + 5; + c = g[0] >>> 13; + g[0] &= 0x1fff; + for (i = 1; i < 10; i++) { + g[i] = this.h[i] + c; + c = g[i] >>> 13; + g[i] &= 0x1fff; + } + g[9] -= (1 << 13); + + mask = (c ^ 1) - 1; + for (i = 0; i < 10; i++) g[i] &= mask; + mask = ~mask; + for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i]; + + this.h[0] = ((this.h[0]) | (this.h[1] << 13)) & 0xffff; + this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10)) & 0xffff; + this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7)) & 0xffff; + this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4)) & 0xffff; + this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff; + this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11)) & 0xffff; + this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8)) & 0xffff; + this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5)) & 0xffff; + + f = this.h[0] + this.pad[0]; + this.h[0] = f & 0xffff; + for (i = 1; i < 8; i++) { + f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0; + this.h[i] = f & 0xffff; + } + + mac[macpos + 0] = (this.h[0] >>> 0) & 0xff; + mac[macpos + 1] = (this.h[0] >>> 8) & 0xff; + mac[macpos + 2] = (this.h[1] >>> 0) & 0xff; + mac[macpos + 3] = (this.h[1] >>> 8) & 0xff; + mac[macpos + 4] = (this.h[2] >>> 0) & 0xff; + mac[macpos + 5] = (this.h[2] >>> 8) & 0xff; + mac[macpos + 6] = (this.h[3] >>> 0) & 0xff; + mac[macpos + 7] = (this.h[3] >>> 8) & 0xff; + mac[macpos + 8] = (this.h[4] >>> 0) & 0xff; + mac[macpos + 9] = (this.h[4] >>> 8) & 0xff; + mac[macpos + 10] = (this.h[5] >>> 0) & 0xff; + mac[macpos + 11] = (this.h[5] >>> 8) & 0xff; + mac[macpos + 12] = (this.h[6] >>> 0) & 0xff; + mac[macpos + 13] = (this.h[6] >>> 8) & 0xff; + mac[macpos + 14] = (this.h[7] >>> 0) & 0xff; + mac[macpos + 15] = (this.h[7] >>> 8) & 0xff; +}; + +poly1305.prototype.update = function (m, mpos, bytes) { + var i, want; + + if (this.leftover) { + want = (16 - this.leftover); + if (want > bytes) + want = bytes; + for (i = 0; i < want; i++) + this.buffer[this.leftover + i] = m[mpos + i]; + bytes -= want; + mpos += want; + this.leftover += want; + if (this.leftover < 16) + return; + this.blocks(this.buffer, 0, 16); + this.leftover = 0; + } + + if (bytes >= 16) { + want = bytes - (bytes % 16); + this.blocks(m, mpos, want); + mpos += want; + bytes -= want; + } + + if (bytes) { + for (i = 0; i < bytes; i++) + this.buffer[this.leftover + i] = m[mpos + i]; + this.leftover += bytes; + } +}; + +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 checkArrayTypes() { @@ -783,77 +785,77 @@ function checkArrayTypes() { } } -// function crypto_stream(c, cpos, d, n, k) { -// var s = new Uint8Array(32); -// crypto_core_hsalsa20(s, n, k, sigma); -// var sn = new Uint8Array(8); -// for (var i = 0; i < 8; i++) sn[i] = n[i + 16]; -// return crypto_stream_salsa20(c, cpos, d, sn, s); -// } - - -// function crypto_stream_xor(c, cpos, m, mpos, d, n, k) { -// var s = new Uint8Array(32); -// crypto_core_hsalsa20(s, n, k, sigma); -// var sn = new Uint8Array(8); -// for (var i = 0; i < 8; i++) sn[i] = n[i + 16]; -// return crypto_stream_salsa20_xor(c, cpos, m, mpos, d, sn, s); -// } - -// function crypto_onetimeauth(out, outpos, m, mpos, n, k) { -// var s = new poly1305(k); -// s.update(m, mpos, n); -// s.finish(out, outpos); -// 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); -// } - -// 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; -// } - -// 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; -// } +function crypto_stream(c, cpos, d, n, k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s, n, k, sigma); + var sn = new Uint8Array(8); + for (var i = 0; i < 8; i++) sn[i] = n[i + 16]; + return crypto_stream_salsa20(c, cpos, d, sn, s); +} + + +function crypto_stream_xor(c, cpos, m, mpos, d, n, k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s, n, k, sigma); + var sn = new Uint8Array(8); + for (var i = 0; i < 8; i++) sn[i] = n[i + 16]; + return crypto_stream_salsa20_xor(c, cpos, m, mpos, d, sn, s); +} + +function crypto_onetimeauth(out, outpos, m, mpos, n, k) { + var s = new poly1305(k); + s.update(m, mpos, n); + s.finish(out, outpos); + 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); +} +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; +} + +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 nacl = {}; 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); + 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); + 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); }; self.secretbox = nacl.secretbox diff --git a/sw_scripts/safari-notifications.js b/sw_scripts/safari-notifications.js index f7645431c..7a6744187 100644 --- a/sw_scripts/safari-notifications.js +++ b/sw_scripts/safari-notifications.js @@ -1,6 +1,4 @@ -importScripts("nacl.js") - function validateBase64(s) { if (!(/^(?:[A-Za-z0-9+\/]{2}[A-Za-z0-9+\/]{2})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/.test(s))) { throw new TypeError('invalid encoding');