85 lines
2.9 KiB
JavaScript
85 lines
2.9 KiB
JavaScript
|
const assert = require('nanoassert')
|
||
|
const Chacha20 = require('chacha20-universal')
|
||
|
|
||
|
if (new Uint16Array([1])[0] !== 1) throw new Error('Big endian architecture is not supported.')
|
||
|
|
||
|
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)
|
||
|
}
|