UNPKG

tweetnacl-ts

Version:

Port of TweetNaCl cryptographic library to TypeScript (and ES6)

91 lines 2.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var array_1 = require("./array"); var core_1 = require("./core"); var curve25519_1 = require("./curve25519"); var check_1 = require("./check"); function scalarMult(n, p) { check_1.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 = array_1.ByteArray(32 /* GroupElement */); _scalarMult(q, n, p); return q; } exports.scalarMult = scalarMult; function scalarMult_base(n) { check_1.checkArrayTypes(n); if (n.length !== 32 /* Scalar */) throw new Error('bad n size'); var q = array_1.ByteArray(32 /* GroupElement */); _scalarMult_base(q, n); return q; } exports.scalarMult_base = scalarMult_base; // low level function _scalarMult(q, n, p) { var z = array_1.ByteArray(32); var x = array_1.NumArray(80); var a = core_1.gf(); var b = core_1.gf(); var c = core_1.gf(); var d = core_1.gf(); var e = core_1.gf(); var f = core_1.gf(); var r, i; for (i = 0; i < 31; i++) z[i] = n[i]; z[31] = (n[31] & 127) | 64; z[0] &= 248; curve25519_1.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; curve25519_1.sel25519(a, b, r); curve25519_1.sel25519(c, d, r); core_1.A(e, a, c); core_1.Z(a, a, c); core_1.A(c, b, d); core_1.Z(b, b, d); core_1.S(d, e); core_1.S(f, a); core_1.M(a, c, a); core_1.M(c, b, e); core_1.A(e, a, c); core_1.Z(a, a, c); core_1.S(b, a); core_1.Z(c, d, f); core_1.M(a, c, core_1._121665); core_1.A(a, a, d); core_1.M(c, c, a); core_1.M(a, d, f); core_1.M(d, b, x); core_1.S(b, e); curve25519_1.sel25519(a, b, r); curve25519_1.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); curve25519_1.inv25519(x32, x32); core_1.M(x16, x16, x32); curve25519_1.pack25519(q, x16); return 0; } exports._scalarMult = _scalarMult; function _scalarMult_base(q, n) { return _scalarMult(q, n, core_1._9); } exports._scalarMult_base = _scalarMult_base; //# sourceMappingURL=scalarmult.js.map