b44f83f0a8
* crypto_stream: signature change needed to modularise * move ed25519 arithmetic to separate module * module: poly1305 * module: crypto_scalarmult * module: crypto_hash * module: crypto_sign * module: crypto_secretbox * move verify functions to crypto_verify module * leftover crypto_stream functions * module: crypto_onetimeauth * module: crypto_box * tidy up * require ed25519.js * update: crypto_hash * add chacha20; align API with PR#21 * update sha512 to wasm module * fix bugs in crypto_sign * be standard * add: crypto_box_seed_keypair; alias crypto_kx methods to crypto_box * scalarmult: import curve methods; be standard * correction: crypto_kx is not actually an alias of crypto_box * export _9 constant field element * add: crypto_box_seed_keypair * removed duplicate module.exports declaraion * declare constants about exports * rename memzero -> sodium-memzero * update sodium_memzero function to arr.fill(0) * tidy: remove legacy functions * added: crypto_aead_chacha20poly1305_ietf methods * listen to linter * add assertions * chacha: readUint32Le generalised for uint8array; aead: standard fix * add null check on ad param * added: sodium_memcmp * export sodium_memcmp * export crypto_verify module * sodium_memcmp returns boolean * added: sodium_is_zero * catch syntax error * throw if crypto_aead cannot validate, fix typo in crypto_verify * move chacha20 alg to external module * use Uint8Arrays instead of buffers * change checks to assertions * bump to chacha 1.0.3 - remove Buffer dependency * reduce code branching, align return values with sodium-native * add sha-wasm deps to package.json * standard fixes * bump chacha20 to 1.0.4: remove Buffer dep * move crypto_hash_sha256 to module to uncouple wasm dependencies * add endian check: all other modules require members of this set * correct filename: crypto_hash_sha256 * export constant: crypto_hash_sha512_BYTES
78 lines
1.7 KiB
JavaScript
78 lines
1.7 KiB
JavaScript
const { _9, _121665, gf, inv25519, pack25519, unpack25519, sel25519, A, M, Z, S } = require('./ed25519.js')
|
|
|
|
var crypto_scalarmult_BYTES = 32
|
|
var crypto_scalarmult_SCALARBYTES = 32
|
|
var crypto_scalarmult_BYTES = 32
|
|
var crypto_scalarmult_SCALARBYTES = 32
|
|
|
|
module.exports = {
|
|
crypto_scalarmult,
|
|
crypto_scalarmult_base,
|
|
crypto_scalarmult_BYTES,
|
|
crypto_scalarmult_SCALARBYTES
|
|
}
|
|
|
|
function crypto_scalarmult (q, n, p) {
|
|
check(q, crypto_scalarmult_BYTES)
|
|
check(n, crypto_scalarmult_SCALARBYTES)
|
|
check(p, crypto_scalarmult_BYTES)
|
|
var z = new Uint8Array(32)
|
|
var x = new Float64Array(80), 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)
|
|
for (i = 0; i < 16; i++) {
|
|
b[i] = x[i]
|
|
d[i] = a[i] = c[i] = 0
|
|
}
|
|
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)
|
|
}
|
|
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]
|
|
}
|
|
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)
|
|
}
|
|
|
|
function check (buf, len) {
|
|
if (!buf || (len && buf.length < len)) throw new Error('Argument must be a buffer' + (len ? ' of length ' + len : ''))
|
|
}
|