UNPKG

xsalsa20-csprng

Version:
1 lines 27.1 kB
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["// TODO: Web assembly is more advantageous for large inputs. Creating a web\n// assembly version.\n//\n// benchmark with 4B input, 300000 iterations:\n// xsalsa20: 98.654ms\n// wasm: 139.835ms\n//\n// benchmark with 4096B input, 30000 iterations:\n// xsalsa20: 804.314ms\n// wasm: 325.942ms\n//\n// benchmark with 41943040B input, 3 iterations:\n// xsalsa20: 828.65ms\n// wasm: 332.185ms\n\n// IE11 support\ndeclare global {\n interface WindowOrWorkerGlobalScope {\n readonly msCrypto: Crypto;\n }\n}\n\nexport default class XSalsa20CSPRNG {\n private xsalsa: XSalsa20GeneratorInt32;\n\n constructor() {\n const buf = new Uint8Array(24 + 32);\n\n // IE11 does support web workers but Web Crypto API is not available inside\n // Web Workers. So we just use window.crypto instead of globalThis.crypto\n //\n // IE11 does not support `globalThis`. So `window.msCrypto` should come\n // first.\n const crypto =\n typeof window !== \"undefined\" ? window.msCrypto || window.crypto : globalThis.crypto;\n crypto.getRandomValues(buf);\n\n const nonce = buf.slice(0, 24);\n const key = buf.slice(24);\n this.xsalsa = xsalsa20GeneratorInt32(nonce, key);\n }\n\n static of(nonce: Uint8Array, key: Uint8Array): XSalsa20CSPRNG {\n const self = Object.create(XSalsa20CSPRNG.prototype);\n self.xsalsa = xsalsa20GeneratorInt32(nonce, key);\n return self;\n }\n\n randomInt32(): number {\n return this.xsalsa.next().value;\n }\n\n randomUint32(): number {\n return this.xsalsa.next().value + 2 ** 31;\n }\n\n uniformInt(exclusive_upper_bound: number): number {\n if (exclusive_upper_bound < 2) return 0;\n\n const min = 2 ** 32 % exclusive_upper_bound;\n let r: number;\n do {\n r = this.randomUint32();\n } while (r < min);\n return r % exclusive_upper_bound;\n }\n}\n\ntype XSalsa20Generator = Generator<Uint8Array, never, undefined>;\nfunction* xsalsa20Generator(nonce: Uint8Array, key: Uint8Array): XSalsa20Generator {\n const s = new Uint8Array(32);\n const z = new Uint8Array(16);\n // prettier-ignore\n const SIGMA = new Uint8Array([\n 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x33,\n 0x32, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x20, 0x6b,\n ])\n\n core_hsalsa20(s, nonce, key, SIGMA);\n for (let i = 0; i < 8; i++) z[i] = nonce[i + 16];\n\n while (true) {\n const output = new Uint8Array(64);\n core_salsa20(output, z, s, SIGMA);\n yield output;\n\n let u = 1;\n for (let i = 8; i < 16; i++) {\n u += (z[i] & 0xff) | 0;\n z[i] = u & 0xff;\n u >>>= 8;\n }\n }\n}\n\ntype XSalsa20GeneratorInt32 = Generator<number, never, undefined>;\nfunction* xsalsa20GeneratorInt32(nonce: Uint8Array, key: Uint8Array): XSalsa20GeneratorInt32 {\n const generator = xsalsa20Generator(nonce, key);\n\n while (true) {\n const b = generator.next().value;\n // prettier-ignore\n yield* [\n b[ 0] | b[ 1] << 8 | b[ 2] << 16 | b[ 3] << 24,\n b[ 4] | b[ 5] << 8 | b[ 6] << 16 | b[ 7] << 24,\n b[ 8] | b[ 9] << 8 | b[10] << 16 | b[11] << 24,\n b[12] | b[13] << 8 | b[14] << 16 | b[15] << 24,\n b[16] | b[17] << 8 | b[18] << 16 | b[19] << 24,\n b[20] | b[21] << 8 | b[22] << 16 | b[23] << 24,\n b[24] | b[25] << 8 | b[26] << 16 | b[27] << 24,\n b[28] | b[29] << 8 | b[30] << 16 | b[31] << 24,\n b[32] | b[33] << 8 | b[34] << 16 | b[35] << 24,\n b[36] | b[37] << 8 | b[38] << 16 | b[39] << 24,\n b[40] | b[41] << 8 | b[42] << 16 | b[43] << 24,\n b[44] | b[45] << 8 | b[46] << 16 | b[47] << 24,\n b[48] | b[49] << 8 | b[50] << 16 | b[51] << 24,\n b[52] | b[53] << 8 | b[54] << 16 | b[55] << 24,\n b[56] | b[57] << 8 | b[58] << 16 | b[59] << 24,\n b[60] | b[61] << 8 | b[62] << 16 | b[63] << 24,\n ]\n }\n}\n\nexport class XSalsa20 {\n private xsalsa: XSalsa20Generator;\n private buffer: Uint8Array;\n\n constructor(nonce: Uint8Array, key: Uint8Array) {\n // Check parameter\n if (nonce.length !== 24) throw new Error(\"nonce must be 24 bytes\");\n if (key.length !== 32) throw new Error(\"key must be 32 bytes\");\n\n // Initialize\n this.xsalsa = xsalsa20Generator(nonce, key);\n this.buffer = new Uint8Array(0);\n }\n\n stream(length: number): Uint8Array {\n let output: Uint8Array;\n let counter: number;\n\n const bufLength = this.buffer.length;\n if (bufLength > 0) {\n if (length < bufLength) {\n output = this.buffer.slice(0, length);\n this.buffer = this.buffer.slice(length);\n return output;\n } else if (length === bufLength) {\n output = this.buffer;\n this.buffer = new Uint8Array(0);\n return output;\n } else {\n output = new Uint8Array(length);\n output.set(this.buffer);\n counter = bufLength;\n\n this.buffer = new Uint8Array(0);\n }\n } else {\n output = new Uint8Array(length);\n counter = 0;\n }\n\n while (length - counter >= 64) {\n output.set(this.xsalsa.next().value, counter);\n counter += 64;\n }\n const remain = length - counter;\n if (remain > 0) {\n const buffer = this.xsalsa.next().value;\n output.set(buffer.slice(0, remain), counter);\n this.buffer = buffer.slice(remain);\n }\n\n return output;\n }\n\n update(input: Uint8Array, output: Uint8Array = new Uint8Array(input.length)): Uint8Array {\n const stream = this.stream(input.length);\n for (let i = 0; i < input.length; ++i) output[i] = input[i] ^ stream[i];\n\n // Return\n return output;\n }\n}\n\n// below methods are ported from tweet nacl\nfunction core_salsa20(o: Uint8Array, p: Uint8Array, k: Uint8Array, c: Uint8Array): void {\n // prettier-ignore\n const\n j0 = c[ 0] | (c[ 1] << 8) | (c[ 2] << 16) | (c[ 3] << 24),\n j1 = k[ 0] | (k[ 1] << 8) | (k[ 2] << 16) | (k[ 3] << 24),\n j2 = k[ 4] | (k[ 5] << 8) | (k[ 6] << 16) | (k[ 7] << 24),\n j3 = k[ 8] | (k[ 9] << 8) | (k[10] << 16) | (k[11] << 24),\n j4 = k[12] | (k[13] << 8) | (k[14] << 16) | (k[15] << 24),\n j5 = c[ 4] | (c[ 5] << 8) | (c[ 6] << 16) | (c[ 7] << 24),\n j6 = p[ 0] | (p[ 1] << 8) | (p[ 2] << 16) | (p[ 3] << 24),\n j7 = p[ 4] | (p[ 5] << 8) | (p[ 6] << 16) | (p[ 7] << 24),\n j8 = p[ 8] | (p[ 9] << 8) | (p[10] << 16) | (p[11] << 24),\n j9 = p[12] | (p[13] << 8) | (p[14] << 16) | (p[15] << 24),\n j10 = c[ 8] | (c[ 9] << 8) | (c[10] << 16) | (c[11] << 24),\n j11 = k[16] | (k[17] << 8) | (k[18] << 16) | (k[19] << 24),\n j12 = k[20] | (k[21] << 8) | (k[22] << 16) | (k[23] << 24),\n j13 = k[24] | (k[25] << 8) | (k[26] << 16) | (k[27] << 24),\n j14 = k[28] | (k[29] << 8) | (k[30] << 16) | (k[31] << 24),\n j15 = c[12] | (c[13] << 8) | (c[14] << 16) | (c[15] << 24)\n\n // prettier-ignore\n let x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n x15 = j15, u: number\n\n for (let i = 0; i < 20; i += 2) {\n u = (x0 + x12) | 0;\n x4 ^= (u << 7) | (u >>> 25);\n u = (x4 + x0) | 0;\n x8 ^= (u << 9) | (u >>> 23);\n u = (x8 + x4) | 0;\n x12 ^= (u << 13) | (u >>> 19);\n u = (x12 + x8) | 0;\n x0 ^= (u << 18) | (u >>> 14);\n\n u = (x5 + x1) | 0;\n x9 ^= (u << 7) | (u >>> 25);\n u = (x9 + x5) | 0;\n x13 ^= (u << 9) | (u >>> 23);\n u = (x13 + x9) | 0;\n x1 ^= (u << 13) | (u >>> 19);\n u = (x1 + x13) | 0;\n x5 ^= (u << 18) | (u >>> 14);\n\n u = (x10 + x6) | 0;\n x14 ^= (u << 7) | (u >>> 25);\n u = (x14 + x10) | 0;\n x2 ^= (u << 9) | (u >>> 23);\n u = (x2 + x14) | 0;\n x6 ^= (u << 13) | (u >>> 19);\n u = (x6 + x2) | 0;\n x10 ^= (u << 18) | (u >>> 14);\n\n u = (x15 + x11) | 0;\n x3 ^= (u << 7) | (u >>> 25);\n u = (x3 + x15) | 0;\n x7 ^= (u << 9) | (u >>> 23);\n u = (x7 + x3) | 0;\n x11 ^= (u << 13) | (u >>> 19);\n u = (x11 + x7) | 0;\n x15 ^= (u << 18) | (u >>> 14);\n\n u = (x0 + x3) | 0;\n x1 ^= (u << 7) | (u >>> 25);\n u = (x1 + x0) | 0;\n x2 ^= (u << 9) | (u >>> 23);\n u = (x2 + x1) | 0;\n x3 ^= (u << 13) | (u >>> 19);\n u = (x3 + x2) | 0;\n x0 ^= (u << 18) | (u >>> 14);\n\n u = (x5 + x4) | 0;\n x6 ^= (u << 7) | (u >>> 25);\n u = (x6 + x5) | 0;\n x7 ^= (u << 9) | (u >>> 23);\n u = (x7 + x6) | 0;\n x4 ^= (u << 13) | (u >>> 19);\n u = (x4 + x7) | 0;\n x5 ^= (u << 18) | (u >>> 14);\n\n u = (x10 + x9) | 0;\n x11 ^= (u << 7) | (u >>> 25);\n u = (x11 + x10) | 0;\n x8 ^= (u << 9) | (u >>> 23);\n u = (x8 + x11) | 0;\n x9 ^= (u << 13) | (u >>> 19);\n u = (x9 + x8) | 0;\n x10 ^= (u << 18) | (u >>> 14);\n\n u = (x15 + x14) | 0;\n x12 ^= (u << 7) | (u >>> 25);\n u = (x12 + x15) | 0;\n x13 ^= (u << 9) | (u >>> 23);\n u = (x13 + x12) | 0;\n x14 ^= (u << 13) | (u >>> 19);\n u = (x14 + x13) | 0;\n x15 ^= (u << 18) | (u >>> 14);\n }\n x0 = (x0 + j0) | 0;\n x1 = (x1 + j1) | 0;\n x2 = (x2 + j2) | 0;\n x3 = (x3 + j3) | 0;\n x4 = (x4 + j4) | 0;\n x5 = (x5 + j5) | 0;\n x6 = (x6 + j6) | 0;\n x7 = (x7 + j7) | 0;\n x8 = (x8 + j8) | 0;\n x9 = (x9 + j9) | 0;\n x10 = (x10 + j10) | 0;\n x11 = (x11 + j11) | 0;\n x12 = (x12 + j12) | 0;\n x13 = (x13 + j13) | 0;\n x14 = (x14 + j14) | 0;\n x15 = (x15 + j15) | 0;\n\n o[0] = (x0 >>> 0) & 0xff;\n o[1] = (x0 >>> 8) & 0xff;\n o[2] = (x0 >>> 16) & 0xff;\n o[3] = (x0 >>> 24) & 0xff;\n\n o[4] = (x1 >>> 0) & 0xff;\n o[5] = (x1 >>> 8) & 0xff;\n o[6] = (x1 >>> 16) & 0xff;\n o[7] = (x1 >>> 24) & 0xff;\n\n o[8] = (x2 >>> 0) & 0xff;\n o[9] = (x2 >>> 8) & 0xff;\n o[10] = (x2 >>> 16) & 0xff;\n o[11] = (x2 >>> 24) & 0xff;\n\n o[12] = (x3 >>> 0) & 0xff;\n o[13] = (x3 >>> 8) & 0xff;\n o[14] = (x3 >>> 16) & 0xff;\n o[15] = (x3 >>> 24) & 0xff;\n\n o[16] = (x4 >>> 0) & 0xff;\n o[17] = (x4 >>> 8) & 0xff;\n o[18] = (x4 >>> 16) & 0xff;\n o[19] = (x4 >>> 24) & 0xff;\n\n o[20] = (x5 >>> 0) & 0xff;\n o[21] = (x5 >>> 8) & 0xff;\n o[22] = (x5 >>> 16) & 0xff;\n o[23] = (x5 >>> 24) & 0xff;\n\n o[24] = (x6 >>> 0) & 0xff;\n o[25] = (x6 >>> 8) & 0xff;\n o[26] = (x6 >>> 16) & 0xff;\n o[27] = (x6 >>> 24) & 0xff;\n\n o[28] = (x7 >>> 0) & 0xff;\n o[29] = (x7 >>> 8) & 0xff;\n o[30] = (x7 >>> 16) & 0xff;\n o[31] = (x7 >>> 24) & 0xff;\n\n o[32] = (x8 >>> 0) & 0xff;\n o[33] = (x8 >>> 8) & 0xff;\n o[34] = (x8 >>> 16) & 0xff;\n o[35] = (x8 >>> 24) & 0xff;\n\n o[36] = (x9 >>> 0) & 0xff;\n o[37] = (x9 >>> 8) & 0xff;\n o[38] = (x9 >>> 16) & 0xff;\n o[39] = (x9 >>> 24) & 0xff;\n\n o[40] = (x10 >>> 0) & 0xff;\n o[41] = (x10 >>> 8) & 0xff;\n o[42] = (x10 >>> 16) & 0xff;\n o[43] = (x10 >>> 24) & 0xff;\n\n o[44] = (x11 >>> 0) & 0xff;\n o[45] = (x11 >>> 8) & 0xff;\n o[46] = (x11 >>> 16) & 0xff;\n o[47] = (x11 >>> 24) & 0xff;\n\n o[48] = (x12 >>> 0) & 0xff;\n o[49] = (x12 >>> 8) & 0xff;\n o[50] = (x12 >>> 16) & 0xff;\n o[51] = (x12 >>> 24) & 0xff;\n\n o[52] = (x13 >>> 0) & 0xff;\n o[53] = (x13 >>> 8) & 0xff;\n o[54] = (x13 >>> 16) & 0xff;\n o[55] = (x13 >>> 24) & 0xff;\n\n o[56] = (x14 >>> 0) & 0xff;\n o[57] = (x14 >>> 8) & 0xff;\n o[58] = (x14 >>> 16) & 0xff;\n o[59] = (x14 >>> 24) & 0xff;\n\n o[60] = (x15 >>> 0) & 0xff;\n o[61] = (x15 >>> 8) & 0xff;\n o[62] = (x15 >>> 16) & 0xff;\n o[63] = (x15 >>> 24) & 0xff;\n}\n\nfunction core_hsalsa20(o: Uint8Array, p: Uint8Array, k: Uint8Array, c: Uint8Array): void {\n // prettier-ignore\n const\n j0 = c[ 0] | (c[ 1] << 8) | (c[ 2] << 16) | (c[ 3] << 24),\n j1 = k[ 0] | (k[ 1] << 8) | (k[ 2] << 16) | (k[ 3] << 24),\n j2 = k[ 4] | (k[ 5] << 8) | (k[ 6] << 16) | (k[ 7] << 24),\n j3 = k[ 8] | (k[ 9] << 8) | (k[10] << 16) | (k[11] << 24),\n j4 = k[12] | (k[13] << 8) | (k[14] << 16) | (k[15] << 24),\n j5 = c[ 4] | (c[ 5] << 8) | (c[ 6] << 16) | (c[ 7] << 24),\n j6 = p[ 0] | (p[ 1] << 8) | (p[ 2] << 16) | (p[ 3] << 24),\n j7 = p[ 4] | (p[ 5] << 8) | (p[ 6] << 16) | (p[ 7] << 24),\n j8 = p[ 8] | (p[ 9] << 8) | (p[10] << 16) | (p[11] << 24),\n j9 = p[12] | (p[13] << 8) | (p[14] << 16) | (p[15] << 24),\n j10 = c[ 8] | (c[ 9] << 8) | (c[10] << 16) | (c[11] << 24),\n j11 = k[16] | (k[17] << 8) | (k[18] << 16) | (k[19] << 24),\n j12 = k[20] | (k[21] << 8) | (k[22] << 16) | (k[23] << 24),\n j13 = k[24] | (k[25] << 8) | (k[26] << 16) | (k[27] << 24),\n j14 = k[28] | (k[29] << 8) | (k[30] << 16) | (k[31] << 24),\n j15 = c[12] | (c[13] << 8) | (c[14] << 16) | (c[15] << 24)\n\n // prettier-ignore\n let x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n x15 = j15, u: number\n\n for (let i = 0; i < 20; i += 2) {\n u = (x0 + x12) | 0;\n x4 ^= (u << 7) | (u >>> 25);\n u = (x4 + x0) | 0;\n x8 ^= (u << 9) | (u >>> 23);\n u = (x8 + x4) | 0;\n x12 ^= (u << 13) | (u >>> 19);\n u = (x12 + x8) | 0;\n x0 ^= (u << 18) | (u >>> 14);\n\n u = (x5 + x1) | 0;\n x9 ^= (u << 7) | (u >>> 25);\n u = (x9 + x5) | 0;\n x13 ^= (u << 9) | (u >>> 23);\n u = (x13 + x9) | 0;\n x1 ^= (u << 13) | (u >>> 19);\n u = (x1 + x13) | 0;\n x5 ^= (u << 18) | (u >>> 14);\n\n u = (x10 + x6) | 0;\n x14 ^= (u << 7) | (u >>> 25);\n u = (x14 + x10) | 0;\n x2 ^= (u << 9) | (u >>> 23);\n u = (x2 + x14) | 0;\n x6 ^= (u << 13) | (u >>> 19);\n u = (x6 + x2) | 0;\n x10 ^= (u << 18) | (u >>> 14);\n\n u = (x15 + x11) | 0;\n x3 ^= (u << 7) | (u >>> 25);\n u = (x3 + x15) | 0;\n x7 ^= (u << 9) | (u >>> 23);\n u = (x7 + x3) | 0;\n x11 ^= (u << 13) | (u >>> 19);\n u = (x11 + x7) | 0;\n x15 ^= (u << 18) | (u >>> 14);\n\n u = (x0 + x3) | 0;\n x1 ^= (u << 7) | (u >>> 25);\n u = (x1 + x0) | 0;\n x2 ^= (u << 9) | (u >>> 23);\n u = (x2 + x1) | 0;\n x3 ^= (u << 13) | (u >>> 19);\n u = (x3 + x2) | 0;\n x0 ^= (u << 18) | (u >>> 14);\n\n u = (x5 + x4) | 0;\n x6 ^= (u << 7) | (u >>> 25);\n u = (x6 + x5) | 0;\n x7 ^= (u << 9) | (u >>> 23);\n u = (x7 + x6) | 0;\n x4 ^= (u << 13) | (u >>> 19);\n u = (x4 + x7) | 0;\n x5 ^= (u << 18) | (u >>> 14);\n\n u = (x10 + x9) | 0;\n x11 ^= (u << 7) | (u >>> 25);\n u = (x11 + x10) | 0;\n x8 ^= (u << 9) | (u >>> 23);\n u = (x8 + x11) | 0;\n x9 ^= (u << 13) | (u >>> 19);\n u = (x9 + x8) | 0;\n x10 ^= (u << 18) | (u >>> 14);\n\n u = (x15 + x14) | 0;\n x12 ^= (u << 7) | (u >>> 25);\n u = (x12 + x15) | 0;\n x13 ^= (u << 9) | (u >>> 23);\n u = (x13 + x12) | 0;\n x14 ^= (u << 13) | (u >>> 19);\n u = (x14 + x13) | 0;\n x15 ^= (u << 18) | (u >>> 14);\n }\n\n o[0] = (x0 >>> 0) & 0xff;\n o[1] = (x0 >>> 8) & 0xff;\n o[2] = (x0 >>> 16) & 0xff;\n o[3] = (x0 >>> 24) & 0xff;\n\n o[4] = (x5 >>> 0) & 0xff;\n o[5] = (x5 >>> 8) & 0xff;\n o[6] = (x5 >>> 16) & 0xff;\n o[7] = (x5 >>> 24) & 0xff;\n\n o[8] = (x10 >>> 0) & 0xff;\n o[9] = (x10 >>> 8) & 0xff;\n o[10] = (x10 >>> 16) & 0xff;\n o[11] = (x10 >>> 24) & 0xff;\n\n o[12] = (x15 >>> 0) & 0xff;\n o[13] = (x15 >>> 8) & 0xff;\n o[14] = (x15 >>> 16) & 0xff;\n o[15] = (x15 >>> 24) & 0xff;\n\n o[16] = (x6 >>> 0) & 0xff;\n o[17] = (x6 >>> 8) & 0xff;\n o[18] = (x6 >>> 16) & 0xff;\n o[19] = (x6 >>> 24) & 0xff;\n\n o[20] = (x7 >>> 0) & 0xff;\n o[21] = (x7 >>> 8) & 0xff;\n o[22] = (x7 >>> 16) & 0xff;\n o[23] = (x7 >>> 24) & 0xff;\n\n o[24] = (x8 >>> 0) & 0xff;\n o[25] = (x8 >>> 8) & 0xff;\n o[26] = (x8 >>> 16) & 0xff;\n o[27] = (x8 >>> 24) & 0xff;\n\n o[28] = (x9 >>> 0) & 0xff;\n o[29] = (x9 >>> 8) & 0xff;\n o[30] = (x9 >>> 16) & 0xff;\n o[31] = (x9 >>> 24) & 0xff;\n}\n"],"mappings":"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"}