UNPKG

tweetnacl-ts

Version:

Port of TweetNaCl cryptographic library to TypeScript (and ES6)

85 lines 2.16 kB
import { ByteArray, NumArray } from './array'; import { gf, _9, _121665, A, Z, M, S } from './core'; import { sel25519, inv25519, pack25519, unpack25519 } from './curve25519'; import { checkArrayTypes } from './check'; export function scalarMult(n, p) { checkArrayTypes(n, p); if (n.length !== 32 /* Scalar */) throw new Error('bad n size'); if (p.length !== 32 /* GroupElement */) throw new Error('bad p size'); var q = ByteArray(32 /* GroupElement */); _scalarMult(q, n, p); return q; } export function scalarMult_base(n) { checkArrayTypes(n); if (n.length !== 32 /* Scalar */) throw new Error('bad n size'); var q = ByteArray(32 /* GroupElement */); _scalarMult_base(q, n); return q; } // low level export function _scalarMult(q, n, p) { var z = ByteArray(32); var x = NumArray(80); var a = gf(); var b = gf(); var c = gf(); var d = gf(); var e = gf(); var f = gf(); var r, i; 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; } export function _scalarMult_base(q, n) { return _scalarMult(q, n, _9); } //# sourceMappingURL=scalarmult.js.map