const assert = require('nanoassert') const Chacha20 = require('chacha20-universal') exports.crypto_stream_chacha20_KEYBYTES = 32 exports.crypto_stream_chacha20_NONCEBYTES = 8 exports.crypto_stream_chacha20_MESSAGEBYTES_MAX = Number.MAX_SAFE_INTEGER exports.crypto_stream_chacha20_ietf_KEYBYTES = 32 exports.crypto_stream_chacha20_ietf_NONCEBYTES = 12 exports.crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX = 2 ** 32 exports.crypto_stream_chacha20 = function (c, n, k) { c.fill(0) exports.crypto_stream_chacha20_xor(c, c, n, k) } exports.crypto_stream_chacha20_xor = function (c, m, n, k) { assert(n.byteLength === exports.crypto_stream_chacha20_NONCEBYTES, 'n should be crypto_stream_chacha20_NONCEBYTES') assert(k.byteLength === exports.crypto_stream_chacha20_KEYBYTES, 'k should be crypto_stream_chacha20_KEYBYTES') const xor = new Chacha20(n, k) xor.update(c, m) xor.final() } exports.crypto_stream_chacha20_xor_ic = function (c, m, n, ic, k) { assert(n.byteLength === exports.crypto_stream_chacha20_NONCEBYTES, 'n should be crypto_stream_chacha20_NONCEBYTES') assert(k.byteLength === exports.crypto_stream_chacha20_KEYBYTES, 'k should be crypto_stream_chacha20_KEYBYTES') const xor = new Chacha20(n, k, ic) xor.update(c, m) xor.final() } exports.crypto_stream_chacha20_xor_instance = function (n, k) { assert(n.byteLength === exports.crypto_stream_chacha20_NONCEBYTES, 'n should be crypto_stream_chacha20_NONCEBYTES') assert(k.byteLength === exports.crypto_stream_chacha20_KEYBYTES, 'k should be crypto_stream_chacha20_KEYBYTES') return new Chacha20(n, k) } exports.crypto_stream_chacha20_ietf = function (c, n, k) { c.fill(0) exports.crypto_stream_chacha20_ietf_xor(c, c, n, k) } exports.crypto_stream_chacha20_ietf_xor = function (c, m, n, k) { assert(n.byteLength === exports.crypto_stream_chacha20_ietf_NONCEBYTES, 'n should be crypto_stream_chacha20_ietf_NONCEBYTES') assert(k.byteLength === exports.crypto_stream_chacha20_ietf_KEYBYTES, 'k should be crypto_stream_chacha20_ietf_KEYBYTES') const xor = new Chacha20(n, k) xor.update(c, m) xor.final() } exports.crypto_stream_chacha20_ietf_xor_ic = function (c, m, n, ic, k) { assert(n.byteLength === exports.crypto_stream_chacha20_ietf_NONCEBYTES, 'n should be crypto_stream_chacha20_ietf_NONCEBYTES') assert(k.byteLength === exports.crypto_stream_chacha20_ietf_KEYBYTES, 'k should be crypto_stream_chacha20_ietf_KEYBYTES') const xor = new Chacha20(n, k, ic) xor.update(c, m) xor.final() } exports.crypto_stream_chacha20_ietf_xor_instance = function (n, k) { assert(n.byteLength === exports.crypto_stream_chacha20_ietf_NONCEBYTES, 'n should be crypto_stream_chacha20_ietf_NONCEBYTES') assert(k.byteLength === exports.crypto_stream_chacha20_ietf_KEYBYTES, 'k should be crypto_stream_chacha20_ietf_KEYBYTES') return new Chacha20(n, k) }