{"version":3,"sources":["jsdelivr-header.js","/npm/ec-key@0.0.6/src/ec-key.js"],"names":[],"mappings":"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","file":"/npm/ec-key@0.0.6/src/ec-key.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/ec-key@0.0.6/src/ec-key.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\n\nconst crypto = require('crypto');\nconst asn = require('asn1.js');\n\nfunction isString(value) {\n  return typeof value === 'string'\n}\n\n/* ========================================================================== *\n * From RFC-4492 (Appendix A) Equivalent Curves (Informative)                 *\n * ========================================================================== *\n *                                                                            *\n * +------------------------------------------------------------------------+ *\n * |                         Curve names chosen by                          | *\n * |                   different standards organizations                    | *\n * +-----------+------------+------------+------------+---------------------+ *\n * |   SECG    | ANSI X9.62 |    NIST    |  OpenSSL   |      ASN.1 OID      | *\n * +-----------+------------+------------+------------+---------------------+ *\n * | secp256r1 | prime256v1 | NIST P-256 | prime256v1 | 1.2.840.10045.3.1.7 | *\n * | secp256k1 |            |            | secp256k1  | 1.3.132.0.10        | *\n * | secp384r1 |            | NIST P-384 | secp384r1  | 1.3.132.0.34        | *\n * | secp521r1 |            | NIST P-521 | secp521r1  | 1.3.132.0.35        | *\n * +-----------+------------+------------+------------+---------------------+ *\n * ========================================================================== */\n\n/* Byte lengths for validation */\nconst lengths = {\n  prime256v1 : Math.ceil(256 / 8),\n   secp256k1 : Math.ceil(256 / 8),\n   secp384r1 : Math.ceil(384 / 8),\n   secp521r1 : Math.ceil(521 / 8)\n};\n\n/* JWK curve names */\nconst jwkCurves = {\n  prime256v1 : 'P-256',\n   secp256k1 : 'P-256K', /* NOT A STANDARD NAME: See the README.md file */\n   secp384r1 : 'P-384',\n   secp521r1 : 'P-521'\n};\n\n/* OpenSSL curve names */\nconst curves = {\n 'P-256'  : 'prime256v1',\n 'P-256K' : 'secp256k1', /* NOT A STANDARD NAME: See the README.md file */\n 'P-384'  : 'secp384r1',\n 'P-521'  : 'secp521r1'\n};\n\n/* ========================================================================== *\n * ASN.1                                                                      *\n * ========================================================================== */\n\nconst ASN1ECRfc5915Key = asn.define('Rfc5915Key', function() {\n  this.seq().obj(\n    this.key('version').int(),\n    this.key('privateKey').octstr(),\n    this.key('parameters').optional().explicit(0).objid({\n      '1 2 840 10045 3 1 7' : 'prime256v1',\n      '1 3 132 0 10'        : 'secp256k1',\n      '1 3 132 0 34'        : 'secp384r1',\n      '1 3 132 0 35'        : 'secp521r1'\n    }),\n    this.key('publicKey').optional().explicit(1).bitstr()\n  );\n});\n\n/* ========================================================================== */\n\nconst ASN1ECPkcs8Key = asn.define('Pkcs8Key', function() {\n  this.seq().obj(\n    this.key('version').int(),\n    this.key('algorithmIdentifier').seq().obj(\n      this.key('privateKeyType').objid({\n        '1 2 840 10045 2 1': 'EC'\n      }),\n      this.key('parameters').objid({\n        '1 2 840 10045 3 1 7' : 'prime256v1',\n        '1 3 132 0 10'        : 'secp256k1',\n        '1 3 132 0 34'        : 'secp384r1',\n        '1 3 132 0 35'        : 'secp521r1'\n      })\n    ),\n    this.key('privateKey').octstr()\n  );\n});\n\n/* ========================================================================== */\n\nconst ASN1ECSpkiKey = asn.define('SpkiKey', function() {\n  this.seq().obj(\n    this.key('algorithmIdentifier').seq().obj(\n      this.key('publicKeyType').objid({\n        '1 2 840 10045 2 1': 'EC'\n      }),\n      this.key('parameters').objid({\n        '1 2 840 10045 3 1 7' : 'prime256v1',\n        '1 3 132 0 10'        : 'secp256k1',\n        '1 3 132 0 34'        : 'secp384r1',\n        '1 3 132 0 35'        : 'secp521r1'\n      })\n    ),\n    this.key('publicKey').bitstr()\n  );\n});\n\n/* ========================================================================== *\n * ASN.1 PARSING                                                              *\n * ========================================================================== */\n\n/* Parse a public key buffer, split X and Y */\nfunction parsePublicKeyBuffer(curve, buffer) {\n  var bytes = lengths[curve];\n  if (buffer[0] == 4) {\n    if (buffer.length != ((bytes * 2) + 1)) throw new TypeError('Invalid uncompressed key size');\n    return {\n      c: curve,\n      x: buffer.slice(1, bytes + 1),\n      y: buffer.slice(bytes + 1),\n    }\n  } else {\n    throw new TypeError(\"Compressed key unsupported\");\n  }\n}\n\n/* Parse PKCS8 from RFC 5208 */\nfunction parsePkcs8(buffer) {\n  var key = ASN1ECPkcs8Key.decode(buffer, 'der');\n  var privateKeyWrapper = ASN1ECRfc5915Key.decode(key.privateKey, 'der');\n  var curve = key.algorithmIdentifier.parameters;\n  var bytes = lengths[curve];\n\n  var privateKey = privateKeyWrapper.privateKey;\n  if (privateKey.length > bytes) {\n    throw new TypeError('Invalid private key size: expected ' + bytes + ' gotten ' + privateKey.length);\n  }\n\n  var components = parsePublicKeyBuffer(curve, privateKeyWrapper.publicKey.data);\n  components.d = privateKey;\n  return components;\n}\n\n/* Parse EC from RFC 5915 */\nfunction parseRfc5915(buffer) {\n  var key = ASN1ECRfc5915Key.decode(buffer, 'der');\n  var bytes = lengths[key.parameters];\n\n  var privateKey = key.privateKey;\n  if (privateKey.length > bytes) {\n    throw new TypeError('Invalid private key size: expected ' + bytes + ' gotten ' + privateKey.length);\n  }\n\n  var components = parsePublicKeyBuffer(key.parameters, key.publicKey.data);\n  components.d = privateKey;\n  return components;\n}\n\n/* Parse SPKI from RFC 5280 */\nfunction parseSpki(buffer) {\n  var key = ASN1ECSpkiKey.decode(buffer, 'der');\n  return parsePublicKeyBuffer(key.algorithmIdentifier.parameters, key.publicKey.data);\n}\n\n/* ========================================================================== *\n * PEM PARSING                                                                *\n * ========================================================================== */\n\nconst pemRfc5915RE = /-+BEGIN EC PRIVATE KEY-+([\\s\\S]+)-+END EC PRIVATE KEY-+/m;\nconst pemPkcs8RE   = /-+BEGIN PRIVATE KEY-+([\\s\\S]*)-+END PRIVATE KEY-+/m;\nconst pemSpkiRE    = /-+BEGIN PUBLIC KEY-+([\\s\\S]*)-+END PUBLIC KEY-+/m;\n\nfunction parsePem(pem) {\n  if (! isString(pem)) throw new TypeError(\"PEM must be a string\");\n\n  var match = null;\n  if (match = pem.match(pemRfc5915RE)) {\n    var buffer = Buffer.from(match[1].replace(/[\\s-]/mg, ''), 'base64');\n    return parseRfc5915(buffer);\n\n  } else if (match = pem.match(pemPkcs8RE)) {\n    var buffer = Buffer.from(match[1].replace(/[\\s-]/mg, ''), 'base64');\n    return parsePkcs8(buffer);\n\n  } else if (match = pem.match(pemSpkiRE)) {\n    var buffer = Buffer.from(match[1].replace(/[\\s-]/mg, ''), 'base64');\n    return parseSpki(buffer);\n\n  } else {\n    console.log(pem);\n    throw new TypeError('Unrecognized PEM key structure');\n  }\n}\n\n/* ========================================================================== *\n * CLASS DEFINITION                                                           *\n * ========================================================================== */\n\nfunction ECKey(key, format) {\n  if (!(this instanceof ECKey)) return new ECKey(key, format);\n\n  var curve, d, x, y;\n\n  if (! format) format = 'pem';\n\n  // BUFFER KEYS: either in \"pkcs8\" or \"spki\" format (base64) or \"pem\" (ascii)\n  if (Buffer.isBuffer(key)) {\n\n    if (format == 'pem') {\n      var k = parsePem(key.toString('ascii'));\n      curve = k.c;\n      x = k.x;\n      y = k.y;\n      d = k.d;\n\n    } else if ((format == \"pkcs8\") || (format == \"rfc5208\")) {\n      var k = parsePkcs8(key);\n      curve = k.c;\n      x = k.x;\n      y = k.y;\n      d = k.d;\n\n\n    } else if ((format == \"spki\") || (format == \"rfc5280\")) {\n      var k = parseSpki(key);\n      curve = k.c;\n      x = k.x;\n      y = k.y;\n      d = k.d;\n\n    } else {\n      throw new TypeError(\"Unknown format for EC Key \\\"\" + format + \"\\\"\");\n    }\n  }\n\n  // STRING KEYS: base64 all the time, but also allowed in PEM\n  else if (isString(key)) {\n\n    if (format == 'pem') {\n      var k = parsePem(key);\n      curve = k.c;\n      x = k.x;\n      y = k.y;\n      d = k.d;\n\n    } else if ((format == \"pkcs8\") || (format == \"rfc5208\")) {\n      var k = parsePkcs8(Buffer.from(key, 'base64'));\n      curve = k.c;\n      x = k.x;\n      y = k.y;\n      d = k.d;\n\n\n    } else if ((format == \"spki\") || (format == \"rfc5280\")) {\n      var k = parseSpki(Buffer.from(key, 'base64'));\n      curve = k.c;\n      x = k.x;\n      y = k.y;\n      d = k.d;\n\n    } else {\n      throw new TypeError(\"Unknown format for EC Key \\\"\" + format + \"\\\"\");\n    }\n  }\n\n  // OBJECT KEY: needs to contain \"(curve|crv)\", \"(d|privateKey)\" if it's a\n  // private key and \"(publicKey|x,y)\" always required (both for priv and pub)\n  else if (key && (typeof key === 'object')) {\n\n   // Curves\n    if (isString(key.curve)) {\n      curve = key.curve;\n    } else if (isString(key.crv)) {\n      curve = curves[key.crv] || key.crv;\n    }\n\n    // Private key or \"d\"\n    if (Buffer.isBuffer(key.privateKey)) {\n      d = key.privateKey;\n    } else if (isString(key.privateKey)) {\n      d = Buffer.from(key.privateKey, 'base64');\n    } else if (Buffer.isBuffer(key.d)) {\n      d = key.d;\n    } else if (isString(key.d)) {\n      d = Buffer.from(key.d, 'base64');\n    }\n\n    // Public key, or x and y\n    if (Buffer.isBuffer(key.publicKey)) {\n      var k = parsePublicKeyBuffer(curve, key.publicKey);\n      x = k.x;\n      y = k.y;\n\n    } else if (isString(key.publicKey)) {\n      var k = parsePublicKeyBuffer(curve, Buffer.from(key.publicKey, 'base64'));\n      x = k.x;\n      y = k.y;\n\n    } else {\n      // Need to get x and y\n      if (Buffer.isBuffer(key.x)) {\n        x = key.x;\n      } else if (isString(key.x)) {\n        x = Buffer.from(key.x, 'base64');\n      }\n\n      if (Buffer.isBuffer(key.y)) {\n        y = key.y;\n      } else if (isString(key.y)) {\n        y = Buffer.from(key.y, 'base64');\n      }\n    }\n\n  } else {\n    throw new TypeError('Unrecognized format for EC key');\n  }\n\n  // Validate curve, d, x and y\n  if (! curve) throw new TypeError(\"EC Key curve not specified\");\n  if ((! x) || (! y)) throw new TypeError(\"Public EC Key point unavailable\");\n\n  var length = lengths[curve];\n  if (! length) throw new TypeError(\"EC Key curve \\\"\" + curve + \"\\\" invalid\");\n  if (x.length != length) throw new TypeError(\"Public EC Key point X of wrong length\");\n  if (y.length != length) throw new TypeError(\"Public EC Key point Y of wrong length\");\n  if (d && (y.length != length)) throw new TypeError(\"Private EC Key of wrong length\");\n\n  // Define our properties\n  Object.defineProperties(this, {\n    'curve': {\n      enumerable: true,\n      configurable: false,\n      value: curve\n    },\n    'isPrivateECKey': {\n      enumerable: true,\n      configurable: false,\n      value: (d != null)\n    },\n    'x': {\n      enumerable: true,\n      configurable: false,\n      get: function() {\n        return Buffer.from(x)\n      }\n    },\n    'y': {\n      enumerable: true,\n      configurable: false,\n      get: function() {\n        return Buffer.from(y)\n      }\n    },\n\n    // \"non-enumerable\"\n    'jsonCurve': {\n      enumerable: false,\n      configurable: false,\n      value: jwkCurves[curve]\n    },\n    'publicCodePoint': {\n      enumerable: false,\n      configurable: false,\n      get: function() {\n        return Buffer.concat([Buffer.from([0x04]), x, y]);\n      }\n    }\n  });\n\n  // The \"d\" (private key) is optional\n  if (d) Object.defineProperty(this, 'd', {\n    enumerable: true,\n    configurable: false,\n    get: function() {\n      return Buffer.from(d)\n    }\n  });\n}\n\nECKey.createECKey = function(curve) {\n  if (!curve) curve = 'prime256v1';\n  if (curves[curve]) curve = curves[curve];\n  if (!jwkCurves[curve]) throw new TypeError(\"Invalid/unknown curve \\\"\" + curve + \"\\\"\");\n\n  var ecdh = crypto.createECDH(curve);\n\n  ecdh.generateKeys();\n  return new ECKey({\n    privateKey: ecdh.getPrivateKey(),\n    publicKey: ecdh.getPublicKey(),\n    curve: curve\n  });\n}\n\n/* ========================================================================== *\n * ECDH/SIGNING/VALIDATION                                                    *\n * ========================================================================== */\n\nECKey.prototype.computeSecret = function computeSecret(key) {\n  return this.createECDH().computeSecret(key);\n}\n\nECKey.prototype.createECDH = function createECDH() {\n  if (this.isPrivateECKey) {\n    var ecdh = crypto.createECDH(this.curve);\n    ecdh.setPublicKey(this.publicCodePoint);\n    ecdh.setPrivateKey(this.d);\n\n    var ecdhComputeSecret = ecdh.computeSecret;\n    ecdh.computeSecret = function(key) {\n      if (key instanceof ECKey) {\n        return ecdhComputeSecret.call(ecdh, key.publicCodePoint);\n      } else {\n        return ecdhComputeSecret.apply(ecdh, arguments);\n      }\n    }\n    return ecdh;\n  } else {\n    throw new Error('Can only create ECDH from private keys');\n  }\n}\n\nECKey.prototype.createSign = function createSign(hash) {\n  if (! this.isPrivateECKey) throw new Error(\"EC Private Key needed to sign\");\n  var sign = crypto.createSign('RSA-' + hash); // RSA works with EC keys, too\n  var signFunction = sign.sign;\n  var self = this;\n  sign.sign = function(format) {\n    return signFunction.call(sign, self.toString(\"pem\"), format);\n  }\n  return sign;\n}\n\nECKey.prototype.createVerify = function createVerify(hash) {\n  var verify = crypto.createVerify('RSA-' + hash); // RSA works with EC keys, too\n  var verifyFunction = verify.verify;\n  var key = this.isPrivateECKey ? this.asPublicECKey() : this;\n  verify.verify = function(signature, format) {\n    return verifyFunction.call(verify, key.toString(\"pem\"), signature, format);\n  }\n  return verify;\n}\n\nECKey.prototype.asPublicECKey = function asPublicECKey() {\n  if (! this.isPrivateECKey) return this;\n  return new ECKey({\n    curve: this.curve,\n    x: this.x,\n    y: this.y\n  });\n}\n\n\n/* ========================================================================== *\n * CONVERSION                                                                 *\n * ========================================================================== */\n\nECKey.prototype.toBuffer = function toBuffer(format) {\n  if (! format) format = 'pem';\n\n  // Simple PEM conversion, wrapping the string in the buffer\n  if (format == 'pem') return Buffer.from(this.toString('pem'), 'ascii');\n\n  if (this.isPrivateECKey) {\n    // Strip leading zeroes from private key\n    var d = this.d;\n    while (d[0] == 0) d = d.slice(1);\n\n    // Known formats: \"pkcs8\" (default), \"pem\", \"openssl\"\n    if ((format == \"pkcs8\") || (format == \"rfc5208\")) {\n\n      // Encode in PKCS8\n      return ASN1ECPkcs8Key.encode({\n        version: 0,\n        algorithmIdentifier: {\n          privateKeyType: 'EC',\n          parameters: this.curve,\n        },\n        // Private key is RFC5915 minus curve\n        privateKey: ASN1ECRfc5915Key.encode({\n          version: 1,\n          privateKey: d,\n          publicKey: { data: this.publicCodePoint }\n        }, 'der')\n      }, 'der');\n\n    } else if (format == \"rfc5915\") {\n\n      // Simply encode in ASN.1\n      return ASN1ECRfc5915Key.encode({\n        version: 1,\n        privateKey: d,\n        parameters: this.curve,\n        publicKey: { data: this.publicCodePoint }\n      }, 'der');\n\n    } else {\n      throw new TypeError(\"Unknown format for private key \\\"\" + format + \"\\\"\");\n    }\n\n  } else {\n\n    if ((format == \"spki\") || (format == \"rfc5280\")) {\n      return ASN1ECSpkiKey.encode({\n        algorithmIdentifier: {\n          publicKeyType: 'EC',\n          parameters: this.curve\n        },\n        publicKey: { data: this.publicCodePoint }\n      }, 'der');\n\n    } else {\n      throw new TypeError(\"Unknown format for public key \\\"\" + format + \"\\\"\");\n    }\n  }\n}\n\nECKey.prototype.toString = function toString(format) {\n  if (! format) format = \"pem\";\n\n  if (this.isPrivateECKey) {\n    if (format == \"pem\") { // pkcs8, wrapped\n      return '-----BEGIN PRIVATE KEY-----\\n'\n           + this.toBuffer('pkcs8').toString('base64').match(/.{1,64}/g).join('\\n')\n           + '\\n-----END PRIVATE KEY-----\\n';\n\n    } else if (format == \"rfc5915\") { // rfc5915, wrapped\n      return '-----BEGIN EC PRIVATE KEY-----\\n'\n           + this.toBuffer('rfc5915').toString('base64').match(/.{1,64}/g).join('\\n')\n           + '\\n-----END EC PRIVATE KEY-----\\n';\n\n    } else if ((format == \"pkcs8\") || (format == \"rfc5208\")) {\n      return this.toBuffer('pkcs8').toString('base64');\n\n    } else if ((format == \"spki\") || (format == \"rfc5280\")) {\n      return this.toBuffer('spki').toString('base64');\n\n    } else {\n      throw new TypeError(\"Unknown format for private key \\\"\" + format + \"\\\"\");\n    }\n\n  } else {\n    if (format == \"pem\") {\n      return '-----BEGIN PUBLIC KEY-----\\n'\n           + this.toBuffer('spki').toString('base64').match(/.{1,64}/g).join('\\n')\n           + '\\n-----END PUBLIC KEY-----\\n';\n\n    } else if ((format == \"spki\") || (format == \"rfc5280\")) {\n      return this.toBuffer('spki').toString('base64');\n\n    } else {\n      throw new TypeError(\"Unknown format for public key \\\"\" + format + \"\\\"\");\n    }\n  }\n}\n\nECKey.prototype.toJSON = function toJSON() {\n  function urlsafe(buffer) {\n    return buffer.toString('base64')\n                 .replace(/\\+/g, '-')\n                 .replace(/\\//g, '_')\n                 .replace(/=/g,   '');\n  }\n\n  var jwk = {\n    kty: \"EC\",\n    crv: jwkCurves[this.curve],\n    x: urlsafe(this.x),\n    y: urlsafe(this.y),\n  };\n\n  var d = this.d;\n  if (d) {\n    var bytes = lengths[this.curve];\n    if (d.length < bytes) {\n      var remaining = bytes - d.length;\n      d = Buffer.concat([Buffer.alloc(remaining).fill(0), d]);\n    }\n    jwk.d = urlsafe(d);\n  }\n\n  return jwk;\n}\n\n\n/* ========================================================================== *\n * EXPORTS                                                                    *\n * ========================================================================== */\n\nexports = module.exports = ECKey;\n"]}