UNPKG

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.

104 lines (100 loc) 11.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MasseyOmura = void 0; var _registry = require("../curves/registry.js"); var _math = require("../utils/math.js"); 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); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } 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); } /** * Massey-Omura three-pass key exchange protocol over elliptic curves. * * The protocol allows two parties to exchange a secret message (encoded as a * curve point) without sharing a key beforehand. Each party uses only their * own private key; no public keys are ever transmitted. * * Three-pass flow: * 1. Alice encrypts: C₁ = e_A · M * 2. Bob encrypts: C₂ = e_B · C₁ * 3. Alice decrypts: C₃ = e_A⁻¹ · C₂ * 4. Bob decrypts: M = e_B⁻¹ · C₃ * * The protocol works because scalar multiplication on elliptic curves * is commutative: * * e_A · (e_B · M) = e_B · (e_A · M) * * Requirement: gcd(privateKey, n) = 1 so that the modular inverse * e⁻¹ mod n exists. * * Usage: * * const alice = new MasseyOmura(0xA1n, 'secp521r1') * const bob = new MasseyOmura(0xB2n, 'secp521r1') * * const c1 = alice.encrypt(M) // Alice → Bob * const c2 = bob.encrypt(c1) // Bob → Alice * const c3 = alice.decrypt(c2) // Alice → Bob * const plaintext = bob.decrypt(c3) // Bob recovers M */ /** * Massey-Omura three-pass protocol. */ var MasseyOmura = exports.MasseyOmura = /*#__PURE__*/function () { /** * @param {BigInt} privateKey - The private scalar e, must be coprime with n. * @param {string} [curveName='secp521r1'] - Name of the curve. */ function MasseyOmura(privateKey) { var curveName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'secp521r1'; _classCallCheck(this, MasseyOmura); this.privateKey = privateKey; this.curveName = curveName; Object.freeze(this); } return _createClass(MasseyOmura, [{ key: "_curve", get: function get() { return (0, _registry.getCurve)(this.curveName); } /** * Modular inverse of the private key: e⁻¹ mod n. */ }, { key: "_inverseKey", get: function get() { return (0, _math.modInverse)(this.privateKey, this._curve.n); } /** * Encrypt (multiply) a point with the private key. * * C = e · P * * @param {Point} point - A curve point (message or partially encrypted). * @returns {Point} e · point */ }, { key: "encrypt", value: function encrypt(point) { return point.mul(this.privateKey); } /** * Decrypt (multiply) a point with the inverse of the private key. * * P = e⁻¹ · C * * @param {Point} point - A curve point to decrypt. * @returns {Point} e⁻¹ · point */ }, { key: "decrypt", value: function decrypt(point) { return point.mul(this._inverseKey); } }]); }(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVnaXN0cnkiLCJyZXF1aXJlIiwiX21hdGgiLCJfdHlwZW9mIiwibyIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCJfY2xhc3NDYWxsQ2hlY2siLCJhIiwibiIsIlR5cGVFcnJvciIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiZSIsInIiLCJ0IiwibGVuZ3RoIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsImtleSIsIl9jcmVhdGVDbGFzcyIsImkiLCJfdG9QcmltaXRpdmUiLCJ0b1ByaW1pdGl2ZSIsImNhbGwiLCJTdHJpbmciLCJOdW1iZXIiLCJNYXNzZXlPbXVyYSIsImV4cG9ydHMiLCJwcml2YXRlS2V5IiwiY3VydmVOYW1lIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiZnJlZXplIiwiZ2V0IiwiZ2V0Q3VydmUiLCJtb2RJbnZlcnNlIiwiX2N1cnZlIiwidmFsdWUiLCJlbmNyeXB0IiwicG9pbnQiLCJtdWwiLCJkZWNyeXB0IiwiX2ludmVyc2VLZXkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvdG9jb2xzL21hc3NleV9vbXVyYS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1hc3NleS1PbXVyYSB0aHJlZS1wYXNzIGtleSBleGNoYW5nZSBwcm90b2NvbCBvdmVyIGVsbGlwdGljIGN1cnZlcy5cbiAqXG4gKiBUaGUgcHJvdG9jb2wgYWxsb3dzIHR3byBwYXJ0aWVzIHRvIGV4Y2hhbmdlIGEgc2VjcmV0IG1lc3NhZ2UgKGVuY29kZWQgYXMgYVxuICogY3VydmUgcG9pbnQpIHdpdGhvdXQgc2hhcmluZyBhIGtleSBiZWZvcmVoYW5kLiAgRWFjaCBwYXJ0eSB1c2VzIG9ubHkgdGhlaXJcbiAqIG93biBwcml2YXRlIGtleTsgbm8gcHVibGljIGtleXMgYXJlIGV2ZXIgdHJhbnNtaXR0ZWQuXG4gKlxuICogVGhyZWUtcGFzcyBmbG93OlxuICogICAgIDEuIEFsaWNlIGVuY3J5cHRzOiAgIEPigoEgPSBlX0EgwrcgTVxuICogICAgIDIuIEJvYiBlbmNyeXB0czogICAgIEPigoIgPSBlX0IgwrcgQ+KCgVxuICogICAgIDMuIEFsaWNlIGRlY3J5cHRzOiAgIEPigoMgPSBlX0HigbvCuSDCtyBD4oKCXG4gKiAgICAgNC4gQm9iIGRlY3J5cHRzOiAgICAgTSAgPSBlX0LigbvCuSDCtyBD4oKDXG4gKlxuICogVGhlIHByb3RvY29sIHdvcmtzIGJlY2F1c2Ugc2NhbGFyIG11bHRpcGxpY2F0aW9uIG9uIGVsbGlwdGljIGN1cnZlc1xuICogaXMgY29tbXV0YXRpdmU6XG4gKlxuICogICAgIGVfQSDCtyAoZV9CIMK3IE0pID0gZV9CIMK3IChlX0EgwrcgTSlcbiAqXG4gKiBSZXF1aXJlbWVudDogZ2NkKHByaXZhdGVLZXksIG4pID0gMSBzbyB0aGF0IHRoZSBtb2R1bGFyIGludmVyc2VcbiAqIGXigbvCuSBtb2QgbiBleGlzdHMuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogICAgIGNvbnN0IGFsaWNlID0gbmV3IE1hc3NleU9tdXJhKDB4QTFuLCAnc2VjcDUyMXIxJylcbiAqICAgICBjb25zdCBib2IgICA9IG5ldyBNYXNzZXlPbXVyYSgweEIybiwgJ3NlY3A1MjFyMScpXG4gKlxuICogICAgIGNvbnN0IGMxID0gYWxpY2UuZW5jcnlwdChNKSAgICAgICAvLyBBbGljZSDihpIgQm9iXG4gKiAgICAgY29uc3QgYzIgPSBib2IuZW5jcnlwdChjMSkgICAgICAgIC8vIEJvYiDihpIgQWxpY2VcbiAqICAgICBjb25zdCBjMyA9IGFsaWNlLmRlY3J5cHQoYzIpICAgICAgLy8gQWxpY2Ug4oaSIEJvYlxuICogICAgIGNvbnN0IHBsYWludGV4dCA9IGJvYi5kZWNyeXB0KGMzKSAvLyBCb2IgcmVjb3ZlcnMgTVxuICovXG5cbmltcG9ydCB7IGdldEN1cnZlIH0gZnJvbSAnLi4vY3VydmVzL3JlZ2lzdHJ5LmpzJ1xuaW1wb3J0IHsgbW9kSW52ZXJzZSB9IGZyb20gJy4uL3V0aWxzL21hdGguanMnXG5cbi8qKlxuICogTWFzc2V5LU9tdXJhIHRocmVlLXBhc3MgcHJvdG9jb2wuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXNzZXlPbXVyYSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0JpZ0ludH0gcHJpdmF0ZUtleSAgICAgICAgICAtIFRoZSBwcml2YXRlIHNjYWxhciBlLCBtdXN0IGJlIGNvcHJpbWUgd2l0aCBuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2N1cnZlTmFtZT0nc2VjcDUyMXIxJ10gLSBOYW1lIG9mIHRoZSBjdXJ2ZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGVLZXksIGN1cnZlTmFtZSA9ICdzZWNwNTIxcjEnKSB7XG4gICAgdGhpcy5wcml2YXRlS2V5ID0gcHJpdmF0ZUtleVxuICAgIHRoaXMuY3VydmVOYW1lID0gY3VydmVOYW1lXG4gICAgT2JqZWN0LmZyZWV6ZSh0aGlzKVxuICB9XG5cbiAgZ2V0IF9jdXJ2ZSgpIHtcbiAgICByZXR1cm4gZ2V0Q3VydmUodGhpcy5jdXJ2ZU5hbWUpXG4gIH1cblxuICAvKipcbiAgICogTW9kdWxhciBpbnZlcnNlIG9mIHRoZSBwcml2YXRlIGtleTogZeKBu8K5IG1vZCBuLlxuICAgKi9cbiAgZ2V0IF9pbnZlcnNlS2V5KCkge1xuICAgIHJldHVybiBtb2RJbnZlcnNlKHRoaXMucHJpdmF0ZUtleSwgdGhpcy5fY3VydmUubilcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNyeXB0IChtdWx0aXBseSkgYSBwb2ludCB3aXRoIHRoZSBwcml2YXRlIGtleS5cbiAgICpcbiAgICogICAgIEMgPSBlIMK3IFBcbiAgICpcbiAgICogQHBhcmFtIHtQb2ludH0gcG9pbnQgLSBBIGN1cnZlIHBvaW50IChtZXNzYWdlIG9yIHBhcnRpYWxseSBlbmNyeXB0ZWQpLlxuICAgKiBAcmV0dXJucyB7UG9pbnR9IGUgwrcgcG9pbnRcbiAgICovXG4gIGVuY3J5cHQocG9pbnQpIHtcbiAgICByZXR1cm4gcG9pbnQubXVsKHRoaXMucHJpdmF0ZUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNyeXB0IChtdWx0aXBseSkgYSBwb2ludCB3aXRoIHRoZSBpbnZlcnNlIG9mIHRoZSBwcml2YXRlIGtleS5cbiAgICpcbiAgICogICAgIFAgPSBl4oG7wrkgwrcgQ1xuICAgKlxuICAgKiBAcGFyYW0ge1BvaW50fSBwb2ludCAtIEEgY3VydmUgcG9pbnQgdG8gZGVjcnlwdC5cbiAgICogQHJldHVybnMge1BvaW50fSBl4oG7wrkgwrcgcG9pbnRcbiAgICovXG4gIGRlY3J5cHQocG9pbnQpIHtcbiAgICByZXR1cm4gcG9pbnQubXVsKHRoaXMuX2ludmVyc2VLZXkpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBZ0NBLElBQUFBLFNBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUQsT0FBQTtBQUE2QyxTQUFBRSxRQUFBQyxDQUFBLHNDQUFBRCxPQUFBLHdCQUFBRSxNQUFBLHVCQUFBQSxNQUFBLENBQUFDLFFBQUEsYUFBQUYsQ0FBQSxrQkFBQUEsQ0FBQSxnQkFBQUEsQ0FBQSxXQUFBQSxDQUFBLHlCQUFBQyxNQUFBLElBQUFELENBQUEsQ0FBQUcsV0FBQSxLQUFBRixNQUFBLElBQUFELENBQUEsS0FBQUMsTUFBQSxDQUFBRyxTQUFBLHFCQUFBSixDQUFBLEtBQUFELE9BQUEsQ0FBQUMsQ0FBQTtBQUFBLFNBQUFLLGdCQUFBQyxDQUFBLEVBQUFDLENBQUEsVUFBQUQsQ0FBQSxZQUFBQyxDQUFBLGFBQUFDLFNBQUE7QUFBQSxTQUFBQyxrQkFBQUMsQ0FBQSxFQUFBQyxDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBRCxDQUFBLENBQUFFLE1BQUEsRUFBQUQsQ0FBQSxVQUFBWixDQUFBLEdBQUFXLENBQUEsQ0FBQUMsQ0FBQSxHQUFBWixDQUFBLENBQUFjLFVBQUEsR0FBQWQsQ0FBQSxDQUFBYyxVQUFBLFFBQUFkLENBQUEsQ0FBQWUsWUFBQSxrQkFBQWYsQ0FBQSxLQUFB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