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.
79 lines (76 loc) • 9.48 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.DiffieHellman = void 0;
var _registry = require("../curves/registry.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); } /**
* Elliptic Curve Diffie-Hellman (ECDH) key exchange protocol.
*
* Protocol:
* 1. Alice computes her public key: H_A = d_A · G
* 2. Bob computes his public key: H_B = d_B · G
* 3. Shared secret: S = d_A · H_B = d_B · H_A = d_A · d_B · G
*
* Security relies on the Elliptic Curve Discrete Logarithm Problem
* (ECDLP): given G and Q = d·G, it is computationally infeasible to
* recover the private scalar d.
*
* Usage:
*
* const alice = new DiffieHellman(0xAn, 'secp256k1')
* const bob = new DiffieHellman(0xBn, 'secp256k1')
*
* const sharedAlice = alice.computeSharedSecret(bob.publicKey)
* const sharedBob = bob.computeSharedSecret(alice.publicKey)
* // sharedAlice.x === sharedBob.x
*/
/**
* Elliptic Curve Diffie-Hellman key exchange.
*/
var DiffieHellman = exports.DiffieHellman = /*#__PURE__*/function () {
/**
* @param {BigInt} privateKey - The private scalar d.
* @param {string} [curveName='secp256k1'] - Name of the curve.
*/
function DiffieHellman(privateKey) {
var curveName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'secp256k1';
_classCallCheck(this, DiffieHellman);
this.privateKey = privateKey;
this.curveName = curveName;
Object.freeze(this);
}
return _createClass(DiffieHellman, [{
key: "_G",
get: function get() {
return (0, _registry.getGenerator)(this.curveName);
}
/**
* Compute the public key: H = d · G.
*/
}, {
key: "publicKey",
get: function get() {
return this._G.mul(this.privateKey);
}
/**
* Compute the shared secret from another party's public key.
*
* S = d · Q_other = d · d_other · G
*
* @param {Point} otherPublicKey - The other party's public key point Q.
* @returns {Point} The shared secret point.
*/
}, {
key: "computeSharedSecret",
value: function computeSharedSecret(otherPublicKey) {
return otherPublicKey.mul(this.privateKey);
}
}]);
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVnaXN0cnkiLCJyZXF1aXJlIiwiX3R5cGVvZiIsIm8iLCJTeW1ib2wiLCJpdGVyYXRvciIsImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwiX2NsYXNzQ2FsbENoZWNrIiwiYSIsIm4iLCJUeXBlRXJyb3IiLCJfZGVmaW5lUHJvcGVydGllcyIsImUiLCJyIiwidCIsImxlbmd0aCIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiX3RvUHJvcGVydHlLZXkiLCJrZXkiLCJfY3JlYXRlQ2xhc3MiLCJpIiwiX3RvUHJpbWl0aXZlIiwidG9QcmltaXRpdmUiLCJjYWxsIiwiU3RyaW5nIiwiTnVtYmVyIiwiRGlmZmllSGVsbG1hbiIsImV4cG9ydHMiLCJwcml2YXRlS2V5IiwiY3VydmVOYW1lIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiZnJlZXplIiwiZ2V0IiwiZ2V0R2VuZXJhdG9yIiwiX0ciLCJtdWwiLCJ2YWx1ZSIsImNvbXB1dGVTaGFyZWRTZWNyZXQiLCJvdGhlclB1YmxpY0tleSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcm90b2NvbHMvZGlmZmllX2hlbGxtYW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbGxpcHRpYyBDdXJ2ZSBEaWZmaWUtSGVsbG1hbiAoRUNESCkga2V5IGV4Y2hhbmdlIHByb3RvY29sLlxuICpcbiAqIFByb3RvY29sOlxuICogICAgIDEuIEFsaWNlIGNvbXB1dGVzIGhlciBwdWJsaWMga2V5OiAgSF9BID0gZF9BIMK3IEdcbiAqICAgICAyLiBCb2IgY29tcHV0ZXMgaGlzIHB1YmxpYyBrZXk6ICAgIEhfQiA9IGRfQiDCtyBHXG4gKiAgICAgMy4gU2hhcmVkIHNlY3JldDogIFMgPSBkX0EgwrcgSF9CID0gZF9CIMK3IEhfQSA9IGRfQSDCtyBkX0IgwrcgR1xuICpcbiAqIFNlY3VyaXR5IHJlbGllcyBvbiB0aGUgRWxsaXB0aWMgQ3VydmUgRGlzY3JldGUgTG9nYXJpdGhtIFByb2JsZW1cbiAqIChFQ0RMUCk6IGdpdmVuIEcgYW5kIFEgPSBkwrdHLCBpdCBpcyBjb21wdXRhdGlvbmFsbHkgaW5mZWFzaWJsZSB0b1xuICogcmVjb3ZlciB0aGUgcHJpdmF0ZSBzY2FsYXIgZC5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiAgICAgY29uc3QgYWxpY2UgPSBuZXcgRGlmZmllSGVsbG1hbigweEFuLCAnc2VjcDI1NmsxJylcbiAqICAgICBjb25zdCBib2IgICA9IG5ldyBEaWZmaWVIZWxsbWFuKDB4Qm4sICdzZWNwMjU2azEnKVxuICpcbiAqICAgICBjb25zdCBzaGFyZWRBbGljZSA9IGFsaWNlLmNvbXB1dGVTaGFyZWRTZWNyZXQoYm9iLnB1YmxpY0tleSlcbiAqICAgICBjb25zdCBzaGFyZWRCb2IgICA9IGJvYi5jb21wdXRlU2hhcmVkU2VjcmV0KGFsaWNlLnB1YmxpY0tleSlcbiAqICAgICAvLyBzaGFyZWRBbGljZS54ID09PSBzaGFyZWRCb2IueFxuICovXG5cbmltcG9ydCB7IGdldEdlbmVyYXRvciB9IGZyb20gJy4uL2N1cnZlcy9yZWdpc3RyeS5qcydcblxuLyoqXG4gKiBFbGxpcHRpYyBDdXJ2ZSBEaWZmaWUtSGVsbG1hbiBrZXkgZXhjaGFuZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBEaWZmaWVIZWxsbWFuIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7QmlnSW50fSBwcml2YXRlS2V5ICAgICAgICAgIC0gVGhlIHByaXZhdGUgc2NhbGFyIGQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbY3VydmVOYW1lPSdzZWNwMjU2azEnXSAtIE5hbWUgb2YgdGhlIGN1cnZlLlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZUtleSwgY3VydmVOYW1lID0gJ3NlY3AyNTZrMScpIHtcbiAgICB0aGlzLnByaXZhdGVLZXkgPSBwcml2YXRlS2V5XG4gICAgdGhpcy5jdXJ2ZU5hbWUgPSBjdXJ2ZU5hbWVcbiAgICBPYmplY3QuZnJlZXplKHRoaXMpXG4gIH1cblxuICBnZXQgX0coKSB7XG4gICAgcmV0dXJuIGdldEdlbmVyYXRvcih0aGlzLmN1cnZlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSBwdWJsaWMga2V5OiBIID0gZCDCtyBHLlxuICAgKi9cbiAgZ2V0IHB1YmxpY0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5fRy5tdWwodGhpcy5wcml2YXRlS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdGhlIHNoYXJlZCBzZWNyZXQgZnJvbSBhbm90aGVyIHBhcnR5J3MgcHVibGljIGtleS5cbiAgICpcbiAgICogICAgIFMgPSBkIMK3IFFfb3RoZXIgPSBkIMK3IGRfb3RoZXIgwrcgR1xuICAgKlxuICAgKiBAcGFyYW0ge1BvaW50fSBvdGhlclB1YmxpY0tleSAtIFRoZSBvdGhlciBwYXJ0eSdzIHB1YmxpYyBrZXkgcG9pbnQgUS5cbiAgICogQHJldHVybnMge1BvaW50fSBUaGUgc2hhcmVkIHNlY3JldCBwb2ludC5cbiAgICovXG4gIGNvbXB1dGVTaGFyZWRTZWNyZXQob3RoZXJQdWJsaWNLZXkpIHtcbiAgICByZXR1cm4gb3RoZXJQdWJsaWNLZXkubXVsKHRoaXMucHJpdmF0ZUtleSlcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFzQkEsSUFBQUEsU0FBQSxHQUFBQyxPQUFBO0FBQW9ELFNBQUFDLFFBQUFDLENBQUEsc0NBQUFELE9BQUEsd0JBQUFFLE1BQUEsdUJBQUFBLE1BQUEsQ0FBQUMsUUFBQSxhQUFBRixDQUFBLGtCQUFBQSxDQUFBLGdCQUFBQSxDQUFBLFdBQUFBLENBQUEseUJBQUFDLE1BQUEsSUFBQUQsQ0FBQSxDQUFBRyxXQUFBLEtBQUFGLE1BQUEsSUFBQUQsQ0FBQSxLQUFBQyxNQUFBLENBQUFHLFNBQUEscUJBQUFKLENBQUEsS0FBQUQsT0FBQSxDQUFBQyxDQUFBO0FBQUEsU0FBQUssZ0JBQUFDLENBQUEsRUFBQUMsQ0FBQSxVQUFBRCxDQUFBLFlBQUFDLENBQUEsYUFBQUMsU0FBQTtBQUFB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