js-ecutils
Version:
JavaScript Library for Elliptic Curve Cryptography: key exchanges (Diffie-Hellman, Massey-Omura), ECDSA signatures, and Koblitz encoding. Suitable for crypto education and secure systems.
81 lines (78 loc) • 11 kB
JavaScript
;
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CurveParams = exports.CoordinateSystem = void 0;
var _math = require("../utils/math.js");
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } /**
* Elliptic curve parameters and coordinate system definitions.
*/
/**
* Coordinate system used for internal arithmetic.
*
* Two systems are supported:
*
* - **AFFINE** — points are (x, y). Each operation requires one modular
* inversion, which is simple but relatively slow.
*
* - **JACOBIAN** — points are (X, Y, Z) with x = X/Z², y = Y/Z³.
* Avoids inversions during addition/doubling (~3x faster for scalar
* multiplication) at the cost of a single inversion when converting
* back to affine form.
*/
var CoordinateSystem = exports.CoordinateSystem = Object.freeze({
AFFINE: 'AFFINE',
JACOBIAN: 'JACOBIAN'
});
/**
* Immutable parameters defining an elliptic curve y² = x³ + ax + b (mod p).
*
* A valid (non-singular) elliptic curve requires a non-zero discriminant:
*
* Δ = -16(4a³ + 27b²) ≠ 0 (mod p)
*
* This is verified automatically at construction time; attempting to
* create a CurveParams with 4a³ + 27b² ≡ 0 (mod p) throws an Error.
*
* For cryptographic security the group order n should be at
* least 2¹⁶⁰ (see NIST SP 800-57). This library does not
* enforce a minimum order so that small "toy" curves can be used
* for educational purposes.
*
* @param {Object} params
* @param {BigInt} params.p - Prime order of the finite field.
* @param {BigInt} params.a - Coefficient 'a' in the curve equation.
* @param {BigInt} params.b - Coefficient 'b' in the curve equation.
* @param {BigInt} params.n - Order of the generator point.
* @param {BigInt} [params.h=1n] - Cofactor.
* @param {string} [params.coord='JACOBIAN'] - Coordinate system for internal computations.
*/
var CurveParams = exports.CurveParams = /*#__PURE__*/_createClass(function CurveParams(_ref) {
var p = _ref.p,
a = _ref.a,
b = _ref.b,
n = _ref.n,
_ref$h = _ref.h,
h = _ref$h === void 0 ? 1n : _ref$h,
_ref$coord = _ref.coord,
coord = _ref$coord === void 0 ? CoordinateSystem.JACOBIAN : _ref$coord;
_classCallCheck(this, CurveParams);
this.p = p;
this.a = a;
this.b = b;
this.n = n;
this.h = h;
this.coord = coord;
// Validate non-singular: 4a³ + 27b² ≠ 0 (mod p)
var discriminant = (4n * (0, _math.modPow)(a, 3n, p) + 27n * (0, _math.modPow)(b, 2n, p)) % p;
if (discriminant === 0n) {
throw new Error("Singular curve: 4a\xB3 + 27b\xB2 \u2261 0 (mod p) for a=".concat(a, ", b=").concat(b, ", p=").concat(p, ". ") + 'The discriminant must be non-zero for a valid elliptic curve.');
}
Object.freeze(this);
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0aCIsInJlcXVpcmUiLCJfZGVmaW5lUHJvcGVydGllcyIsImUiLCJyIiwidCIsImxlbmd0aCIsIm8iLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsIl90b1Byb3BlcnR5S2V5Iiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwicHJvdG90eXBlIiwiaSIsIl90b1ByaW1pdGl2ZSIsIl90eXBlb2YiLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsImNhbGwiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJfY2xhc3NDYWxsQ2hlY2siLCJhIiwibiIsIkNvb3JkaW5hdGVTeXN0ZW0iLCJleHBvcnRzIiwiZnJlZXplIiwiQUZGSU5FIiwiSkFDT0JJQU4iLCJDdXJ2ZVBhcmFtcyIsIl9yZWYiLCJwIiwiYiIsIl9yZWYkaCIsImgiLCJfcmVmJGNvb3JkIiwiY29vcmQiLCJkaXNjcmltaW5hbnQiLCJtb2RQb3ciLCJFcnJvciIsImNvbmNhdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL2N1cnZlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRWxsaXB0aWMgY3VydmUgcGFyYW1ldGVycyBhbmQgY29vcmRpbmF0ZSBzeXN0ZW0gZGVmaW5pdGlvbnMuXG4gKi9cblxuaW1wb3J0IHsgbW9kUG93IH0gZnJvbSAnLi4vdXRpbHMvbWF0aC5qcydcblxuLyoqXG4gKiBDb29yZGluYXRlIHN5c3RlbSB1c2VkIGZvciBpbnRlcm5hbCBhcml0aG1ldGljLlxuICpcbiAqIFR3byBzeXN0ZW1zIGFyZSBzdXBwb3J0ZWQ6XG4gKlxuICogLSAqKkFGRklORSoqIOKAlCBwb2ludHMgYXJlICh4LCB5KS4gIEVhY2ggb3BlcmF0aW9uIHJlcXVpcmVzIG9uZSBtb2R1bGFyXG4gKiAgIGludmVyc2lvbiwgd2hpY2ggaXMgc2ltcGxlIGJ1dCByZWxhdGl2ZWx5IHNsb3cuXG4gKlxuICogLSAqKkpBQ09CSUFOKiog4oCUIHBvaW50cyBhcmUgKFgsIFksIFopIHdpdGggeCA9IFgvWsKyLCB5ID0gWS9awrMuXG4gKiAgIEF2b2lkcyBpbnZlcnNpb25zIGR1cmluZyBhZGRpdGlvbi9kb3VibGluZyAofjN4IGZhc3RlciBmb3Igc2NhbGFyXG4gKiAgIG11bHRpcGxpY2F0aW9uKSBhdCB0aGUgY29zdCBvZiBhIHNpbmdsZSBpbnZlcnNpb24gd2hlbiBjb252ZXJ0aW5nXG4gKiAgIGJhY2sgdG8gYWZmaW5lIGZvcm0uXG4gKi9cbmV4cG9ydCBjb25zdCBDb29yZGluYXRlU3lzdGVtID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEFGRklORTogJ0FGRklORScsXG4gIEpBQ09CSUFOOiAnSkFDT0JJQU4nLFxufSlcblxuLyoqXG4gKiBJbW11dGFibGUgcGFyYW1ldGVycyBkZWZpbmluZyBhbiBlbGxpcHRpYyBjdXJ2ZSB5wrIgPSB4wrMgKyBheCArIGIgKG1vZCBwKS5cbiAqXG4gKiBBIHZhbGlkIChub24tc2luZ3VsYXIpIGVsbGlwdGljIGN1cnZlIHJlcXVpcmVzIGEgbm9uLXplcm8gZGlzY3JpbWluYW50OlxuICpcbiAqICAgICDOlCA9IC0xNig0YcKzICsgMjdiwrIpIOKJoCAwICAobW9kIHApXG4gKlxuICogVGhpcyBpcyB2ZXJpZmllZCBhdXRvbWF0aWNhbGx5IGF0IGNvbnN0cnVjdGlvbiB0aW1lOyBhdHRlbXB0aW5nIHRvXG4gKiBjcmVhdGUgYSBDdXJ2ZVBhcmFtcyB3aXRoIDRhwrMgKyAyN2LCsiDiiaEgMCAobW9kIHApIHRocm93cyBhbiBFcnJvci5cbiAqXG4gKiBGb3IgY3J5cHRvZ3JhcGhpYyBzZWN1cml0eSB0aGUgZ3JvdXAgb3JkZXIgbiBzaG91bGQgYmUgYXRcbiAqIGxlYXN0IDLCueKBtuKBsCAoc2VlIE5JU1QgU1AgODAwLTU3KS4gIFRoaXMgbGlicmFyeSBkb2VzIG5vdFxuICogZW5mb3JjZSBhIG1pbmltdW0gb3JkZXIgc28gdGhhdCBzbWFsbCBcInRveVwiIGN1cnZlcyBjYW4gYmUgdXNlZFxuICogZm9yIGVkdWNhdGlvbmFsIHB1cnBvc2VzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7QmlnSW50fSBwYXJhbXMucCAgICAgLSBQcmltZSBvcmRlciBvZiB0aGUgZmluaXRlIGZpZWxkLlxuICogQHBhcmFtIHtCaWdJbnR9IHBhcmFtcy5hICAgICAtIENvZWZmaWNpZW50ICdhJyBpbiB0aGUgY3VydmUgZXF1YXRpb24uXG4gKiBAcGFyYW0ge0JpZ0ludH0gcGFyYW1zLmIgICAgIC0gQ29lZmZpY2llbnQgJ2InIGluIHRoZSBjdXJ2ZSBlcXVhdGlvbi5cbiAqIEBwYXJhbSB7QmlnSW50fSBwYXJhbXMubiAgICAgLSBPcmRlciBvZiB0aGUgZ2VuZXJhdG9yIHBvaW50LlxuICogQHBhcmFtIHtCaWdJbnR9IFtwYXJhbXMuaD0xbl0gICAgICAgICAgIC0gQ29mYWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy5jb29yZD0nSkFDT0JJQU4nXSAtIENvb3JkaW5hdGUgc3lzdGVtIGZvciBpbnRlcm5hbCBjb21wdXRhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDdXJ2ZVBhcmFtcyB7XG4gIGNvbnN0cnVjdG9yKHsgcCwgYSwgYiwgbiwgaCA9IDFuLCBjb29yZCA9IENvb3JkaW5hdGVTeXN0ZW0uSkFDT0JJQU4gfSkge1xuICAgIHRoaXMucCA9IHBcbiAgICB0aGlzLmEgPSBhXG4gICAgdGhpcy5iID0gYlxuICAgIHRoaXMubiA9IG5cbiAgICB0aGlzLmggPSBoXG4gICAgdGhpcy5jb29yZCA9IGNvb3JkXG5cbiAgICAvLyBWYWxpZGF0ZSBub24tc2luZ3VsYXI6IDRhwrMgKyAyN2LCsiDiiaAgMCAobW9kIHApXG4gICAgY29uc3QgZGlzY3JpbWluYW50ID0gKDRuICogbW9kUG93KGEsIDNuLCBwKSArIDI3biAqIG1vZFBvdyhiLCAybiwgcCkpICUgcFxuICAgIGlmIChkaXNjcmltaW5hbnQgPT09IDBuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTaW5ndWxhciBjdXJ2ZTogNGHCsyArIDI3YsKyIOKJoSAwIChtb2QgcCkgZm9yIGE9JHthfSwgYj0ke2J9LCBwPSR7cH0uIGAgK1xuICAgICAgICAgICdUaGUgZGlzY3JpbWluYW50IG11c3QgYmUgbm9uLXplcm8gZm9yIGEgdmFsaWQgZWxsaXB0aWMgY3VydmUuJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICBPYmplY3QuZnJlZXplKHRoaXMpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUlBLElBQUFBLEtBQUEsR0FBQUMsT0FBQTtBQUF5QyxTQUFBQyxrQkFBQUMsQ0FBQSxFQUFBQyxDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBRCxDQUFBLENBQUFFLE1BQUEsRUFBQUQsQ0FBQSxVQUFBRSxDQUFBLEdBQUFILENBQUEsQ0FBQUMsQ0FBQSxHQUFBRSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxDQUFBQyxVQUFBLFFBQUFELENBQUEsQ0FBQUUsWUFBQSxrQkFBQUYsQ0FBQSxLQUFBQSxDQUFBLENBQUFHLFFBQUEsUUFBQUMsTUFBQSxDQUFBQyxjQUFBLENBQUFULENBQUEsRUFBQVUsY0FBQSxDQUFBTixDQUFBLENBQUFPLEdBQUEsR0FBQVAsQ0FBQTtBQUFBLFNBQUFRLGFBQUFaLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFdBQUFELENBQUEsSUFBQUYsaUJBQUEsQ0FBQUMsQ0FBQSxDQUFBYSxTQUFBLEVBQUFaLENBQUEsR0FBQUMsQ0FBQSxJQUFBSCxpQkFBQSxDQUFBQyxDQUFBLEVBQUFFLENBQUEsR0FBQU0sTUFBQSxDQUFBQyxjQUFBLENBQUFULENBQUEsaUJBQUFPLFFBQUEsU0FBQVAsQ0FBQTtBQUFBLFNBQUFVLGVBQUFSLENBQUEsUUFBQVksQ0FBQSxHQUFBQyxZQUFBLENBQUFiLENBQUEsZ0NBQUFjLE9BQUEsQ0FBQUYsQ0FBQSxJQUFBQSxDQUFBLEdBQUFBLENBQUE7QUFBQSxTQUFBQyxhQUFBYixDQUFBLEVBQUFELENBQUEsb0JB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