Files
portfolio/node_modules/.cache/babel-loader/9fde255dae1a6fc0c2044f3fc1cb3092.json
2021-09-20 16:54:47 -04:00

1 line
39 KiB
JSON

{"ast":null,"code":"// Copyright 2017 Joyent, Inc.\nmodule.exports = {\n DiffieHellman: DiffieHellman,\n generateECDSA: generateECDSA,\n generateED25519: generateED25519\n};\n\nvar assert = require('assert-plus');\n\nvar crypto = require('crypto');\n\nvar Buffer = require('safer-buffer').Buffer;\n\nvar algs = require('./algs');\n\nvar utils = require('./utils');\n\nvar nacl = require('tweetnacl');\n\nvar Key = require('./key');\n\nvar PrivateKey = require('./private-key');\n\nvar CRYPTO_HAVE_ECDH = crypto.createECDH !== undefined;\n\nvar ecdh = require('ecc-jsbn');\n\nvar ec = require('ecc-jsbn/lib/ec');\n\nvar jsbn = require('jsbn').BigInteger;\n\nfunction DiffieHellman(key) {\n utils.assertCompatible(key, Key, [1, 4], 'key');\n this._isPriv = PrivateKey.isPrivateKey(key, [1, 3]);\n this._algo = key.type;\n this._curve = key.curve;\n this._key = key;\n\n if (key.type === 'dsa') {\n if (!CRYPTO_HAVE_ECDH) {\n throw new Error('Due to bugs in the node 0.10 ' + 'crypto API, node 0.12.x or later is required ' + 'to use DH');\n }\n\n this._dh = crypto.createDiffieHellman(key.part.p.data, undefined, key.part.g.data, undefined);\n this._p = key.part.p;\n this._g = key.part.g;\n if (this._isPriv) this._dh.setPrivateKey(key.part.x.data);\n\n this._dh.setPublicKey(key.part.y.data);\n } else if (key.type === 'ecdsa') {\n if (!CRYPTO_HAVE_ECDH) {\n this._ecParams = new X9ECParameters(this._curve);\n\n if (this._isPriv) {\n this._priv = new ECPrivate(this._ecParams, key.part.d.data);\n }\n\n return;\n }\n\n var curve = {\n 'nistp256': 'prime256v1',\n 'nistp384': 'secp384r1',\n 'nistp521': 'secp521r1'\n }[key.curve];\n this._dh = crypto.createECDH(curve);\n\n if (typeof this._dh !== 'object' || typeof this._dh.setPrivateKey !== 'function') {\n CRYPTO_HAVE_ECDH = false;\n DiffieHellman.call(this, key);\n return;\n }\n\n if (this._isPriv) this._dh.setPrivateKey(key.part.d.data);\n\n this._dh.setPublicKey(key.part.Q.data);\n } else if (key.type === 'curve25519') {\n if (this._isPriv) {\n utils.assertCompatible(key, PrivateKey, [1, 5], 'key');\n this._priv = key.part.k.data;\n }\n } else {\n throw new Error('DH not supported for ' + key.type + ' keys');\n }\n}\n\nDiffieHellman.prototype.getPublicKey = function () {\n if (this._isPriv) return this._key.toPublic();\n return this._key;\n};\n\nDiffieHellman.prototype.getPrivateKey = function () {\n if (this._isPriv) return this._key;else return undefined;\n};\n\nDiffieHellman.prototype.getKey = DiffieHellman.prototype.getPrivateKey;\n\nDiffieHellman.prototype._keyCheck = function (pk, isPub) {\n assert.object(pk, 'key');\n if (!isPub) utils.assertCompatible(pk, PrivateKey, [1, 3], 'key');\n utils.assertCompatible(pk, Key, [1, 4], 'key');\n\n if (pk.type !== this._algo) {\n throw new Error('A ' + pk.type + ' key cannot be used in ' + this._algo + ' Diffie-Hellman');\n }\n\n if (pk.curve !== this._curve) {\n throw new Error('A key from the ' + pk.curve + ' curve ' + 'cannot be used with a ' + this._curve + ' Diffie-Hellman');\n }\n\n if (pk.type === 'dsa') {\n assert.deepEqual(pk.part.p, this._p, 'DSA key prime does not match');\n assert.deepEqual(pk.part.g, this._g, 'DSA key generator does not match');\n }\n};\n\nDiffieHellman.prototype.setKey = function (pk) {\n this._keyCheck(pk);\n\n if (pk.type === 'dsa') {\n this._dh.setPrivateKey(pk.part.x.data);\n\n this._dh.setPublicKey(pk.part.y.data);\n } else if (pk.type === 'ecdsa') {\n if (CRYPTO_HAVE_ECDH) {\n this._dh.setPrivateKey(pk.part.d.data);\n\n this._dh.setPublicKey(pk.part.Q.data);\n } else {\n this._priv = new ECPrivate(this._ecParams, pk.part.d.data);\n }\n } else if (pk.type === 'curve25519') {\n var k = pk.part.k;\n if (!pk.part.k) k = pk.part.r;\n this._priv = k.data;\n if (this._priv[0] === 0x00) this._priv = this._priv.slice(1);\n this._priv = this._priv.slice(0, 32);\n }\n\n this._key = pk;\n this._isPriv = true;\n};\n\nDiffieHellman.prototype.setPrivateKey = DiffieHellman.prototype.setKey;\n\nDiffieHellman.prototype.computeSecret = function (otherpk) {\n this._keyCheck(otherpk, true);\n\n if (!this._isPriv) throw new Error('DH exchange has not been initialized with ' + 'a private key yet');\n var pub;\n\n if (this._algo === 'dsa') {\n return this._dh.computeSecret(otherpk.part.y.data);\n } else if (this._algo === 'ecdsa') {\n if (CRYPTO_HAVE_ECDH) {\n return this._dh.computeSecret(otherpk.part.Q.data);\n } else {\n pub = new ECPublic(this._ecParams, otherpk.part.Q.data);\n return this._priv.deriveSharedSecret(pub);\n }\n } else if (this._algo === 'curve25519') {\n pub = otherpk.part.A.data;\n\n while (pub[0] === 0x00 && pub.length > 32) pub = pub.slice(1);\n\n var priv = this._priv;\n assert.strictEqual(pub.length, 32);\n assert.strictEqual(priv.length, 32);\n var secret = nacl.box.before(new Uint8Array(pub), new Uint8Array(priv));\n return Buffer.from(secret);\n }\n\n throw new Error('Invalid algorithm: ' + this._algo);\n};\n\nDiffieHellman.prototype.generateKey = function () {\n var parts = [];\n var priv, pub;\n\n if (this._algo === 'dsa') {\n this._dh.generateKeys();\n\n parts.push({\n name: 'p',\n data: this._p.data\n });\n parts.push({\n name: 'q',\n data: this._key.part.q.data\n });\n parts.push({\n name: 'g',\n data: this._g.data\n });\n parts.push({\n name: 'y',\n data: this._dh.getPublicKey()\n });\n parts.push({\n name: 'x',\n data: this._dh.getPrivateKey()\n });\n this._key = new PrivateKey({\n type: 'dsa',\n parts: parts\n });\n this._isPriv = true;\n return this._key;\n } else if (this._algo === 'ecdsa') {\n if (CRYPTO_HAVE_ECDH) {\n this._dh.generateKeys();\n\n parts.push({\n name: 'curve',\n data: Buffer.from(this._curve)\n });\n parts.push({\n name: 'Q',\n data: this._dh.getPublicKey()\n });\n parts.push({\n name: 'd',\n data: this._dh.getPrivateKey()\n });\n this._key = new PrivateKey({\n type: 'ecdsa',\n curve: this._curve,\n parts: parts\n });\n this._isPriv = true;\n return this._key;\n } else {\n var n = this._ecParams.getN();\n\n var r = new jsbn(crypto.randomBytes(n.bitLength()));\n var n1 = n.subtract(jsbn.ONE);\n priv = r.mod(n1).add(jsbn.ONE);\n pub = this._ecParams.getG().multiply(priv);\n priv = Buffer.from(priv.toByteArray());\n pub = Buffer.from(this._ecParams.getCurve().encodePointHex(pub), 'hex');\n this._priv = new ECPrivate(this._ecParams, priv);\n parts.push({\n name: 'curve',\n data: Buffer.from(this._curve)\n });\n parts.push({\n name: 'Q',\n data: pub\n });\n parts.push({\n name: 'd',\n data: priv\n });\n this._key = new PrivateKey({\n type: 'ecdsa',\n curve: this._curve,\n parts: parts\n });\n this._isPriv = true;\n return this._key;\n }\n } else if (this._algo === 'curve25519') {\n var pair = nacl.box.keyPair();\n priv = Buffer.from(pair.secretKey);\n pub = Buffer.from(pair.publicKey);\n priv = Buffer.concat([priv, pub]);\n assert.strictEqual(priv.length, 64);\n assert.strictEqual(pub.length, 32);\n parts.push({\n name: 'A',\n data: pub\n });\n parts.push({\n name: 'k',\n data: priv\n });\n this._key = new PrivateKey({\n type: 'curve25519',\n parts: parts\n });\n this._isPriv = true;\n return this._key;\n }\n\n throw new Error('Invalid algorithm: ' + this._algo);\n};\n\nDiffieHellman.prototype.generateKeys = DiffieHellman.prototype.generateKey;\n/* These are helpers for using ecc-jsbn (for node 0.10 compatibility). */\n\nfunction X9ECParameters(name) {\n var params = algs.curves[name];\n assert.object(params);\n var p = new jsbn(params.p);\n var a = new jsbn(params.a);\n var b = new jsbn(params.b);\n var n = new jsbn(params.n);\n var h = jsbn.ONE;\n var curve = new ec.ECCurveFp(p, a, b);\n var G = curve.decodePointHex(params.G.toString('hex'));\n this.curve = curve;\n this.g = G;\n this.n = n;\n this.h = h;\n}\n\nX9ECParameters.prototype.getCurve = function () {\n return this.curve;\n};\n\nX9ECParameters.prototype.getG = function () {\n return this.g;\n};\n\nX9ECParameters.prototype.getN = function () {\n return this.n;\n};\n\nX9ECParameters.prototype.getH = function () {\n return this.h;\n};\n\nfunction ECPublic(params, buffer) {\n this._params = params;\n if (buffer[0] === 0x00) buffer = buffer.slice(1);\n this._pub = params.getCurve().decodePointHex(buffer.toString('hex'));\n}\n\nfunction ECPrivate(params, buffer) {\n this._params = params;\n this._priv = new jsbn(utils.mpNormalize(buffer));\n}\n\nECPrivate.prototype.deriveSharedSecret = function (pubKey) {\n assert.ok(pubKey instanceof ECPublic);\n\n var S = pubKey._pub.multiply(this._priv);\n\n return Buffer.from(S.getX().toBigInteger().toByteArray());\n};\n\nfunction generateED25519() {\n var pair = nacl.sign.keyPair();\n var priv = Buffer.from(pair.secretKey);\n var pub = Buffer.from(pair.publicKey);\n assert.strictEqual(priv.length, 64);\n assert.strictEqual(pub.length, 32);\n var parts = [];\n parts.push({\n name: 'A',\n data: pub\n });\n parts.push({\n name: 'k',\n data: priv.slice(0, 32)\n });\n var key = new PrivateKey({\n type: 'ed25519',\n parts: parts\n });\n return key;\n}\n/* Generates a new ECDSA private key on a given curve. */\n\n\nfunction generateECDSA(curve) {\n var parts = [];\n var key;\n\n if (CRYPTO_HAVE_ECDH) {\n /*\n * Node crypto doesn't expose key generation directly, but the\n * ECDH instances can generate keys. It turns out this just\n * calls into the OpenSSL generic key generator, and we can\n * read its output happily without doing an actual DH. So we\n * use that here.\n */\n var osCurve = {\n 'nistp256': 'prime256v1',\n 'nistp384': 'secp384r1',\n 'nistp521': 'secp521r1'\n }[curve];\n var dh = crypto.createECDH(osCurve);\n dh.generateKeys();\n parts.push({\n name: 'curve',\n data: Buffer.from(curve)\n });\n parts.push({\n name: 'Q',\n data: dh.getPublicKey()\n });\n parts.push({\n name: 'd',\n data: dh.getPrivateKey()\n });\n key = new PrivateKey({\n type: 'ecdsa',\n curve: curve,\n parts: parts\n });\n return key;\n } else {\n var ecParams = new X9ECParameters(curve);\n /* This algorithm taken from FIPS PUB 186-4 (section B.4.1) */\n\n var n = ecParams.getN();\n /*\n * The crypto.randomBytes() function can only give us whole\n * bytes, so taking a nod from X9.62, we round up.\n */\n\n var cByteLen = Math.ceil((n.bitLength() + 64) / 8);\n var c = new jsbn(crypto.randomBytes(cByteLen));\n var n1 = n.subtract(jsbn.ONE);\n var priv = c.mod(n1).add(jsbn.ONE);\n var pub = ecParams.getG().multiply(priv);\n priv = Buffer.from(priv.toByteArray());\n pub = Buffer.from(ecParams.getCurve().encodePointHex(pub), 'hex');\n parts.push({\n name: 'curve',\n data: Buffer.from(curve)\n });\n parts.push({\n name: 'Q',\n data: pub\n });\n parts.push({\n name: 'd',\n data: priv\n });\n key = new PrivateKey({\n type: 'ecdsa',\n curve: curve,\n parts: parts\n });\n return key;\n }\n}","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/sshpk/lib/dhe.js"],"names":["module","exports","DiffieHellman","generateECDSA","generateED25519","assert","require","crypto","Buffer","algs","utils","nacl","Key","PrivateKey","CRYPTO_HAVE_ECDH","createECDH","undefined","ecdh","ec","jsbn","BigInteger","key","assertCompatible","_isPriv","isPrivateKey","_algo","type","_curve","curve","_key","Error","_dh","createDiffieHellman","part","p","data","g","_p","_g","setPrivateKey","x","setPublicKey","y","_ecParams","X9ECParameters","_priv","ECPrivate","d","call","Q","k","prototype","getPublicKey","toPublic","getPrivateKey","getKey","_keyCheck","pk","isPub","object","deepEqual","setKey","r","slice","computeSecret","otherpk","pub","ECPublic","deriveSharedSecret","A","length","priv","strictEqual","secret","box","before","Uint8Array","from","generateKey","parts","generateKeys","push","name","q","n","getN","randomBytes","bitLength","n1","subtract","ONE","mod","add","getG","multiply","toByteArray","getCurve","encodePointHex","pair","keyPair","secretKey","publicKey","concat","params","curves","a","b","h","ECCurveFp","G","decodePointHex","toString","getH","buffer","_params","_pub","mpNormalize","pubKey","ok","S","getX","toBigInteger","sign","osCurve","dh","ecParams","cByteLen","Math","ceil","c"],"mappings":"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","sourcesContent":["// Copyright 2017 Joyent, Inc.\n\nmodule.exports = {\n\tDiffieHellman: DiffieHellman,\n\tgenerateECDSA: generateECDSA,\n\tgenerateED25519: generateED25519\n};\n\nvar assert = require('assert-plus');\nvar crypto = require('crypto');\nvar Buffer = require('safer-buffer').Buffer;\nvar algs = require('./algs');\nvar utils = require('./utils');\nvar nacl = require('tweetnacl');\n\nvar Key = require('./key');\nvar PrivateKey = require('./private-key');\n\nvar CRYPTO_HAVE_ECDH = (crypto.createECDH !== undefined);\n\nvar ecdh = require('ecc-jsbn');\nvar ec = require('ecc-jsbn/lib/ec');\nvar jsbn = require('jsbn').BigInteger;\n\nfunction DiffieHellman(key) {\n\tutils.assertCompatible(key, Key, [1, 4], 'key');\n\tthis._isPriv = PrivateKey.isPrivateKey(key, [1, 3]);\n\tthis._algo = key.type;\n\tthis._curve = key.curve;\n\tthis._key = key;\n\tif (key.type === 'dsa') {\n\t\tif (!CRYPTO_HAVE_ECDH) {\n\t\t\tthrow (new Error('Due to bugs in the node 0.10 ' +\n\t\t\t 'crypto API, node 0.12.x or later is required ' +\n\t\t\t 'to use DH'));\n\t\t}\n\t\tthis._dh = crypto.createDiffieHellman(\n\t\t key.part.p.data, undefined,\n\t\t key.part.g.data, undefined);\n\t\tthis._p = key.part.p;\n\t\tthis._g = key.part.g;\n\t\tif (this._isPriv)\n\t\t\tthis._dh.setPrivateKey(key.part.x.data);\n\t\tthis._dh.setPublicKey(key.part.y.data);\n\n\t} else if (key.type === 'ecdsa') {\n\t\tif (!CRYPTO_HAVE_ECDH) {\n\t\t\tthis._ecParams = new X9ECParameters(this._curve);\n\n\t\t\tif (this._isPriv) {\n\t\t\t\tthis._priv = new ECPrivate(\n\t\t\t\t this._ecParams, key.part.d.data);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tvar curve = {\n\t\t\t'nistp256': 'prime256v1',\n\t\t\t'nistp384': 'secp384r1',\n\t\t\t'nistp521': 'secp521r1'\n\t\t}[key.curve];\n\t\tthis._dh = crypto.createECDH(curve);\n\t\tif (typeof (this._dh) !== 'object' ||\n\t\t typeof (this._dh.setPrivateKey) !== 'function') {\n\t\t\tCRYPTO_HAVE_ECDH = false;\n\t\t\tDiffieHellman.call(this, key);\n\t\t\treturn;\n\t\t}\n\t\tif (this._isPriv)\n\t\t\tthis._dh.setPrivateKey(key.part.d.data);\n\t\tthis._dh.setPublicKey(key.part.Q.data);\n\n\t} else if (key.type === 'curve25519') {\n\t\tif (this._isPriv) {\n\t\t\tutils.assertCompatible(key, PrivateKey, [1, 5], 'key');\n\t\t\tthis._priv = key.part.k.data;\n\t\t}\n\n\t} else {\n\t\tthrow (new Error('DH not supported for ' + key.type + ' keys'));\n\t}\n}\n\nDiffieHellman.prototype.getPublicKey = function () {\n\tif (this._isPriv)\n\t\treturn (this._key.toPublic());\n\treturn (this._key);\n};\n\nDiffieHellman.prototype.getPrivateKey = function () {\n\tif (this._isPriv)\n\t\treturn (this._key);\n\telse\n\t\treturn (undefined);\n};\nDiffieHellman.prototype.getKey = DiffieHellman.prototype.getPrivateKey;\n\nDiffieHellman.prototype._keyCheck = function (pk, isPub) {\n\tassert.object(pk, 'key');\n\tif (!isPub)\n\t\tutils.assertCompatible(pk, PrivateKey, [1, 3], 'key');\n\tutils.assertCompatible(pk, Key, [1, 4], 'key');\n\n\tif (pk.type !== this._algo) {\n\t\tthrow (new Error('A ' + pk.type + ' key cannot be used in ' +\n\t\t this._algo + ' Diffie-Hellman'));\n\t}\n\n\tif (pk.curve !== this._curve) {\n\t\tthrow (new Error('A key from the ' + pk.curve + ' curve ' +\n\t\t 'cannot be used with a ' + this._curve +\n\t\t ' Diffie-Hellman'));\n\t}\n\n\tif (pk.type === 'dsa') {\n\t\tassert.deepEqual(pk.part.p, this._p,\n\t\t 'DSA key prime does not match');\n\t\tassert.deepEqual(pk.part.g, this._g,\n\t\t 'DSA key generator does not match');\n\t}\n};\n\nDiffieHellman.prototype.setKey = function (pk) {\n\tthis._keyCheck(pk);\n\n\tif (pk.type === 'dsa') {\n\t\tthis._dh.setPrivateKey(pk.part.x.data);\n\t\tthis._dh.setPublicKey(pk.part.y.data);\n\n\t} else if (pk.type === 'ecdsa') {\n\t\tif (CRYPTO_HAVE_ECDH) {\n\t\t\tthis._dh.setPrivateKey(pk.part.d.data);\n\t\t\tthis._dh.setPublicKey(pk.part.Q.data);\n\t\t} else {\n\t\t\tthis._priv = new ECPrivate(\n\t\t\t this._ecParams, pk.part.d.data);\n\t\t}\n\n\t} else if (pk.type === 'curve25519') {\n\t\tvar k = pk.part.k;\n\t\tif (!pk.part.k)\n\t\t\tk = pk.part.r;\n\t\tthis._priv = k.data;\n\t\tif (this._priv[0] === 0x00)\n\t\t\tthis._priv = this._priv.slice(1);\n\t\tthis._priv = this._priv.slice(0, 32);\n\t}\n\tthis._key = pk;\n\tthis._isPriv = true;\n};\nDiffieHellman.prototype.setPrivateKey = DiffieHellman.prototype.setKey;\n\nDiffieHellman.prototype.computeSecret = function (otherpk) {\n\tthis._keyCheck(otherpk, true);\n\tif (!this._isPriv)\n\t\tthrow (new Error('DH exchange has not been initialized with ' +\n\t\t 'a private key yet'));\n\n\tvar pub;\n\tif (this._algo === 'dsa') {\n\t\treturn (this._dh.computeSecret(\n\t\t otherpk.part.y.data));\n\n\t} else if (this._algo === 'ecdsa') {\n\t\tif (CRYPTO_HAVE_ECDH) {\n\t\t\treturn (this._dh.computeSecret(\n\t\t\t otherpk.part.Q.data));\n\t\t} else {\n\t\t\tpub = new ECPublic(\n\t\t\t this._ecParams, otherpk.part.Q.data);\n\t\t\treturn (this._priv.deriveSharedSecret(pub));\n\t\t}\n\n\t} else if (this._algo === 'curve25519') {\n\t\tpub = otherpk.part.A.data;\n\t\twhile (pub[0] === 0x00 && pub.length > 32)\n\t\t\tpub = pub.slice(1);\n\t\tvar priv = this._priv;\n\t\tassert.strictEqual(pub.length, 32);\n\t\tassert.strictEqual(priv.length, 32);\n\n\t\tvar secret = nacl.box.before(new Uint8Array(pub),\n\t\t new Uint8Array(priv));\n\n\t\treturn (Buffer.from(secret));\n\t}\n\n\tthrow (new Error('Invalid algorithm: ' + this._algo));\n};\n\nDiffieHellman.prototype.generateKey = function () {\n\tvar parts = [];\n\tvar priv, pub;\n\tif (this._algo === 'dsa') {\n\t\tthis._dh.generateKeys();\n\n\t\tparts.push({name: 'p', data: this._p.data});\n\t\tparts.push({name: 'q', data: this._key.part.q.data});\n\t\tparts.push({name: 'g', data: this._g.data});\n\t\tparts.push({name: 'y', data: this._dh.getPublicKey()});\n\t\tparts.push({name: 'x', data: this._dh.getPrivateKey()});\n\t\tthis._key = new PrivateKey({\n\t\t\ttype: 'dsa',\n\t\t\tparts: parts\n\t\t});\n\t\tthis._isPriv = true;\n\t\treturn (this._key);\n\n\t} else if (this._algo === 'ecdsa') {\n\t\tif (CRYPTO_HAVE_ECDH) {\n\t\t\tthis._dh.generateKeys();\n\n\t\t\tparts.push({name: 'curve',\n\t\t\t data: Buffer.from(this._curve)});\n\t\t\tparts.push({name: 'Q', data: this._dh.getPublicKey()});\n\t\t\tparts.push({name: 'd', data: this._dh.getPrivateKey()});\n\t\t\tthis._key = new PrivateKey({\n\t\t\t\ttype: 'ecdsa',\n\t\t\t\tcurve: this._curve,\n\t\t\t\tparts: parts\n\t\t\t});\n\t\t\tthis._isPriv = true;\n\t\t\treturn (this._key);\n\n\t\t} else {\n\t\t\tvar n = this._ecParams.getN();\n\t\t\tvar r = new jsbn(crypto.randomBytes(n.bitLength()));\n\t\t\tvar n1 = n.subtract(jsbn.ONE);\n\t\t\tpriv = r.mod(n1).add(jsbn.ONE);\n\t\t\tpub = this._ecParams.getG().multiply(priv);\n\n\t\t\tpriv = Buffer.from(priv.toByteArray());\n\t\t\tpub = Buffer.from(this._ecParams.getCurve().\n\t\t\t encodePointHex(pub), 'hex');\n\n\t\t\tthis._priv = new ECPrivate(this._ecParams, priv);\n\n\t\t\tparts.push({name: 'curve',\n\t\t\t data: Buffer.from(this._curve)});\n\t\t\tparts.push({name: 'Q', data: pub});\n\t\t\tparts.push({name: 'd', data: priv});\n\n\t\t\tthis._key = new PrivateKey({\n\t\t\t\ttype: 'ecdsa',\n\t\t\t\tcurve: this._curve,\n\t\t\t\tparts: parts\n\t\t\t});\n\t\t\tthis._isPriv = true;\n\t\t\treturn (this._key);\n\t\t}\n\n\t} else if (this._algo === 'curve25519') {\n\t\tvar pair = nacl.box.keyPair();\n\t\tpriv = Buffer.from(pair.secretKey);\n\t\tpub = Buffer.from(pair.publicKey);\n\t\tpriv = Buffer.concat([priv, pub]);\n\t\tassert.strictEqual(priv.length, 64);\n\t\tassert.strictEqual(pub.length, 32);\n\n\t\tparts.push({name: 'A', data: pub});\n\t\tparts.push({name: 'k', data: priv});\n\t\tthis._key = new PrivateKey({\n\t\t\ttype: 'curve25519',\n\t\t\tparts: parts\n\t\t});\n\t\tthis._isPriv = true;\n\t\treturn (this._key);\n\t}\n\n\tthrow (new Error('Invalid algorithm: ' + this._algo));\n};\nDiffieHellman.prototype.generateKeys = DiffieHellman.prototype.generateKey;\n\n/* These are helpers for using ecc-jsbn (for node 0.10 compatibility). */\n\nfunction X9ECParameters(name) {\n\tvar params = algs.curves[name];\n\tassert.object(params);\n\n\tvar p = new jsbn(params.p);\n\tvar a = new jsbn(params.a);\n\tvar b = new jsbn(params.b);\n\tvar n = new jsbn(params.n);\n\tvar h = jsbn.ONE;\n\tvar curve = new ec.ECCurveFp(p, a, b);\n\tvar G = curve.decodePointHex(params.G.toString('hex'));\n\n\tthis.curve = curve;\n\tthis.g = G;\n\tthis.n = n;\n\tthis.h = h;\n}\nX9ECParameters.prototype.getCurve = function () { return (this.curve); };\nX9ECParameters.prototype.getG = function () { return (this.g); };\nX9ECParameters.prototype.getN = function () { return (this.n); };\nX9ECParameters.prototype.getH = function () { return (this.h); };\n\nfunction ECPublic(params, buffer) {\n\tthis._params = params;\n\tif (buffer[0] === 0x00)\n\t\tbuffer = buffer.slice(1);\n\tthis._pub = params.getCurve().decodePointHex(buffer.toString('hex'));\n}\n\nfunction ECPrivate(params, buffer) {\n\tthis._params = params;\n\tthis._priv = new jsbn(utils.mpNormalize(buffer));\n}\nECPrivate.prototype.deriveSharedSecret = function (pubKey) {\n\tassert.ok(pubKey instanceof ECPublic);\n\tvar S = pubKey._pub.multiply(this._priv);\n\treturn (Buffer.from(S.getX().toBigInteger().toByteArray()));\n};\n\nfunction generateED25519() {\n\tvar pair = nacl.sign.keyPair();\n\tvar priv = Buffer.from(pair.secretKey);\n\tvar pub = Buffer.from(pair.publicKey);\n\tassert.strictEqual(priv.length, 64);\n\tassert.strictEqual(pub.length, 32);\n\n\tvar parts = [];\n\tparts.push({name: 'A', data: pub});\n\tparts.push({name: 'k', data: priv.slice(0, 32)});\n\tvar key = new PrivateKey({\n\t\ttype: 'ed25519',\n\t\tparts: parts\n\t});\n\treturn (key);\n}\n\n/* Generates a new ECDSA private key on a given curve. */\nfunction generateECDSA(curve) {\n\tvar parts = [];\n\tvar key;\n\n\tif (CRYPTO_HAVE_ECDH) {\n\t\t/*\n\t\t * Node crypto doesn't expose key generation directly, but the\n\t\t * ECDH instances can generate keys. It turns out this just\n\t\t * calls into the OpenSSL generic key generator, and we can\n\t\t * read its output happily without doing an actual DH. So we\n\t\t * use that here.\n\t\t */\n\t\tvar osCurve = {\n\t\t\t'nistp256': 'prime256v1',\n\t\t\t'nistp384': 'secp384r1',\n\t\t\t'nistp521': 'secp521r1'\n\t\t}[curve];\n\n\t\tvar dh = crypto.createECDH(osCurve);\n\t\tdh.generateKeys();\n\n\t\tparts.push({name: 'curve',\n\t\t data: Buffer.from(curve)});\n\t\tparts.push({name: 'Q', data: dh.getPublicKey()});\n\t\tparts.push({name: 'd', data: dh.getPrivateKey()});\n\n\t\tkey = new PrivateKey({\n\t\t\ttype: 'ecdsa',\n\t\t\tcurve: curve,\n\t\t\tparts: parts\n\t\t});\n\t\treturn (key);\n\t} else {\n\n\t\tvar ecParams = new X9ECParameters(curve);\n\n\t\t/* This algorithm taken from FIPS PUB 186-4 (section B.4.1) */\n\t\tvar n = ecParams.getN();\n\t\t/*\n\t\t * The crypto.randomBytes() function can only give us whole\n\t\t * bytes, so taking a nod from X9.62, we round up.\n\t\t */\n\t\tvar cByteLen = Math.ceil((n.bitLength() + 64) / 8);\n\t\tvar c = new jsbn(crypto.randomBytes(cByteLen));\n\n\t\tvar n1 = n.subtract(jsbn.ONE);\n\t\tvar priv = c.mod(n1).add(jsbn.ONE);\n\t\tvar pub = ecParams.getG().multiply(priv);\n\n\t\tpriv = Buffer.from(priv.toByteArray());\n\t\tpub = Buffer.from(ecParams.getCurve().\n\t\t encodePointHex(pub), 'hex');\n\n\t\tparts.push({name: 'curve', data: Buffer.from(curve)});\n\t\tparts.push({name: 'Q', data: pub});\n\t\tparts.push({name: 'd', data: priv});\n\n\t\tkey = new PrivateKey({\n\t\t\ttype: 'ecdsa',\n\t\t\tcurve: curve,\n\t\t\tparts: parts\n\t\t});\n\t\treturn (key);\n\t}\n}\n"]},"metadata":{},"sourceType":"script"}