{"ast":null,"code":"// Copyright 2018 Joyent, Inc.\nmodule.exports = Key;\n\nvar assert = require('assert-plus');\n\nvar algs = require('./algs');\n\nvar crypto = require('crypto');\n\nvar Fingerprint = require('./fingerprint');\n\nvar Signature = require('./signature');\n\nvar DiffieHellman = require('./dhe').DiffieHellman;\n\nvar errs = require('./errors');\n\nvar utils = require('./utils');\n\nvar PrivateKey = require('./private-key');\n\nvar edCompat;\n\ntry {\n edCompat = require('./ed-compat');\n} catch (e) {\n /* Just continue through, and bail out if we try to use it. */\n}\n\nvar InvalidAlgorithmError = errs.InvalidAlgorithmError;\nvar KeyParseError = errs.KeyParseError;\nvar formats = {};\nformats['auto'] = require('./formats/auto');\nformats['pem'] = require('./formats/pem');\nformats['pkcs1'] = require('./formats/pkcs1');\nformats['pkcs8'] = require('./formats/pkcs8');\nformats['rfc4253'] = require('./formats/rfc4253');\nformats['ssh'] = require('./formats/ssh');\nformats['ssh-private'] = require('./formats/ssh-private');\nformats['openssh'] = formats['ssh-private'];\nformats['dnssec'] = require('./formats/dnssec');\nformats['putty'] = require('./formats/putty');\nformats['ppk'] = formats['putty'];\n\nfunction Key(opts) {\n assert.object(opts, 'options');\n assert.arrayOfObject(opts.parts, 'options.parts');\n assert.string(opts.type, 'options.type');\n assert.optionalString(opts.comment, 'options.comment');\n var algInfo = algs.info[opts.type];\n if (typeof algInfo !== 'object') throw new InvalidAlgorithmError(opts.type);\n var partLookup = {};\n\n for (var i = 0; i < opts.parts.length; ++i) {\n var part = opts.parts[i];\n partLookup[part.name] = part;\n }\n\n this.type = opts.type;\n this.parts = opts.parts;\n this.part = partLookup;\n this.comment = undefined;\n this.source = opts.source;\n /* for speeding up hashing/fingerprint operations */\n\n this._rfc4253Cache = opts._rfc4253Cache;\n this._hashCache = {};\n var sz;\n this.curve = undefined;\n\n if (this.type === 'ecdsa') {\n var curve = this.part.curve.data.toString();\n this.curve = curve;\n sz = algs.curves[curve].size;\n } else if (this.type === 'ed25519' || this.type === 'curve25519') {\n sz = 256;\n this.curve = 'curve25519';\n } else {\n var szPart = this.part[algInfo.sizePart];\n sz = szPart.data.length;\n sz = sz * 8 - utils.countZeros(szPart.data);\n }\n\n this.size = sz;\n}\n\nKey.formats = formats;\n\nKey.prototype.toBuffer = function (format, options) {\n if (format === undefined) format = 'ssh';\n assert.string(format, 'format');\n assert.object(formats[format], 'formats[format]');\n assert.optionalObject(options, 'options');\n\n if (format === 'rfc4253') {\n if (this._rfc4253Cache === undefined) this._rfc4253Cache = formats['rfc4253'].write(this);\n return this._rfc4253Cache;\n }\n\n return formats[format].write(this, options);\n};\n\nKey.prototype.toString = function (format, options) {\n return this.toBuffer(format, options).toString();\n};\n\nKey.prototype.hash = function (algo, type) {\n assert.string(algo, 'algorithm');\n assert.optionalString(type, 'type');\n if (type === undefined) type = 'ssh';\n algo = algo.toLowerCase();\n if (algs.hashAlgs[algo] === undefined) throw new InvalidAlgorithmError(algo);\n var cacheKey = algo + '||' + type;\n if (this._hashCache[cacheKey]) return this._hashCache[cacheKey];\n var buf;\n\n if (type === 'ssh') {\n buf = this.toBuffer('rfc4253');\n } else if (type === 'spki') {\n buf = formats.pkcs8.pkcs8ToBuffer(this);\n } else {\n throw new Error('Hash type ' + type + ' not supported');\n }\n\n var hash = crypto.createHash(algo).update(buf).digest();\n this._hashCache[cacheKey] = hash;\n return hash;\n};\n\nKey.prototype.fingerprint = function (algo, type) {\n if (algo === undefined) algo = 'sha256';\n if (type === undefined) type = 'ssh';\n assert.string(algo, 'algorithm');\n assert.string(type, 'type');\n var opts = {\n type: 'key',\n hash: this.hash(algo, type),\n algorithm: algo,\n hashType: type\n };\n return new Fingerprint(opts);\n};\n\nKey.prototype.defaultHashAlgorithm = function () {\n var hashAlgo = 'sha1';\n if (this.type === 'rsa') hashAlgo = 'sha256';\n if (this.type === 'dsa' && this.size > 1024) hashAlgo = 'sha256';\n if (this.type === 'ed25519') hashAlgo = 'sha512';\n\n if (this.type === 'ecdsa') {\n if (this.size <= 256) hashAlgo = 'sha256';else if (this.size <= 384) hashAlgo = 'sha384';else hashAlgo = 'sha512';\n }\n\n return hashAlgo;\n};\n\nKey.prototype.createVerify = function (hashAlgo) {\n if (hashAlgo === undefined) hashAlgo = this.defaultHashAlgorithm();\n assert.string(hashAlgo, 'hash algorithm');\n /* ED25519 is not supported by OpenSSL, use a javascript impl. */\n\n if (this.type === 'ed25519' && edCompat !== undefined) return new edCompat.Verifier(this, hashAlgo);\n if (this.type === 'curve25519') throw new Error('Curve25519 keys are not suitable for ' + 'signing or verification');\n var v, nm, err;\n\n try {\n nm = hashAlgo.toUpperCase();\n v = crypto.createVerify(nm);\n } catch (e) {\n err = e;\n }\n\n if (v === undefined || err instanceof Error && err.message.match(/Unknown message digest/)) {\n nm = 'RSA-';\n nm += hashAlgo.toUpperCase();\n v = crypto.createVerify(nm);\n }\n\n assert.ok(v, 'failed to create verifier');\n var oldVerify = v.verify.bind(v);\n var key = this.toBuffer('pkcs8');\n var curve = this.curve;\n var self = this;\n\n v.verify = function (signature, fmt) {\n if (Signature.isSignature(signature, [2, 0])) {\n if (signature.type !== self.type) return false;\n if (signature.hashAlgorithm && signature.hashAlgorithm !== hashAlgo) return false;\n if (signature.curve && self.type === 'ecdsa' && signature.curve !== curve) return false;\n return oldVerify(key, signature.toBuffer('asn1'));\n } else if (typeof signature === 'string' || Buffer.isBuffer(signature)) {\n return oldVerify(key, signature, fmt);\n /*\n * Avoid doing this on valid arguments, walking the prototype\n * chain can be quite slow.\n */\n } else if (Signature.isSignature(signature, [1, 0])) {\n throw new Error('signature was created by too old ' + 'a version of sshpk and cannot be verified');\n } else {\n throw new TypeError('signature must be a string, ' + 'Buffer, or Signature object');\n }\n };\n\n return v;\n};\n\nKey.prototype.createDiffieHellman = function () {\n if (this.type === 'rsa') throw new Error('RSA keys do not support Diffie-Hellman');\n return new DiffieHellman(this);\n};\n\nKey.prototype.createDH = Key.prototype.createDiffieHellman;\n\nKey.parse = function (data, format, options) {\n if (typeof data !== 'string') assert.buffer(data, 'data');\n if (format === undefined) format = 'auto';\n assert.string(format, 'format');\n if (typeof options === 'string') options = {\n filename: options\n };\n assert.optionalObject(options, 'options');\n if (options === undefined) options = {};\n assert.optionalString(options.filename, 'options.filename');\n if (options.filename === undefined) options.filename = '(unnamed)';\n assert.object(formats[format], 'formats[format]');\n\n try {\n var k = formats[format].read(data, options);\n if (k instanceof PrivateKey) k = k.toPublic();\n if (!k.comment) k.comment = options.filename;\n return k;\n } catch (e) {\n if (e.name === 'KeyEncryptedError') throw e;\n throw new KeyParseError(options.filename, format, e);\n }\n};\n\nKey.isKey = function (obj, ver) {\n return utils.isCompatible(obj, Key, ver);\n};\n/*\n * API versions for Key:\n * [1,0] -- initial ver, may take Signature for createVerify or may not\n * [1,1] -- added pkcs1, pkcs8 formats\n * [1,2] -- added auto, ssh-private, openssh formats\n * [1,3] -- added defaultHashAlgorithm\n * [1,4] -- added ed support, createDH\n * [1,5] -- first explicitly tagged version\n * [1,6] -- changed ed25519 part names\n * [1,7] -- spki hash types\n */\n\n\nKey.prototype._sshpkApiVersion = [1, 7];\n\nKey._oldVersionDetect = function (obj) {\n assert.func(obj.toBuffer);\n assert.func(obj.fingerprint);\n if (obj.createDH) return [1, 4];\n if (obj.defaultHashAlgorithm) return [1, 3];\n if (obj.formats['auto']) return [1, 2];\n if (obj.formats['pkcs1']) return [1, 1];\n return [1, 0];\n};","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/sshpk/lib/key.js"],"names":["module","exports","Key","assert","require","algs","crypto","Fingerprint","Signature","DiffieHellman","errs","utils","PrivateKey","edCompat","e","InvalidAlgorithmError","KeyParseError","formats","opts","object","arrayOfObject","parts","string","type","optionalString","comment","algInfo","info","partLookup","i","length","part","name","undefined","source","_rfc4253Cache","_hashCache","sz","curve","data","toString","curves","size","szPart","sizePart","countZeros","prototype","toBuffer","format","options","optionalObject","write","hash","algo","toLowerCase","hashAlgs","cacheKey","buf","pkcs8","pkcs8ToBuffer","Error","createHash","update","digest","fingerprint","algorithm","hashType","defaultHashAlgorithm","hashAlgo","createVerify","Verifier","v","nm","err","toUpperCase","message","match","ok","oldVerify","verify","bind","key","self","signature","fmt","isSignature","hashAlgorithm","Buffer","isBuffer","TypeError","createDiffieHellman","createDH","parse","buffer","filename","k","read","toPublic","isKey","obj","ver","isCompatible","_sshpkApiVersion","_oldVersionDetect","func"],"mappings":"AAAA;AAEAA,MAAM,CAACC,OAAP,GAAiBC,GAAjB;;AAEA,IAAIC,MAAM,GAAGC,OAAO,CAAC,aAAD,CAApB;;AACA,IAAIC,IAAI,GAAGD,OAAO,CAAC,QAAD,CAAlB;;AACA,IAAIE,MAAM,GAAGF,OAAO,CAAC,QAAD,CAApB;;AACA,IAAIG,WAAW,GAAGH,OAAO,CAAC,eAAD,CAAzB;;AACA,IAAII,SAAS,GAAGJ,OAAO,CAAC,aAAD,CAAvB;;AACA,IAAIK,aAAa,GAAGL,OAAO,CAAC,OAAD,CAAP,CAAiBK,aAArC;;AACA,IAAIC,IAAI,GAAGN,OAAO,CAAC,UAAD,CAAlB;;AACA,IAAIO,KAAK,GAAGP,OAAO,CAAC,SAAD,CAAnB;;AACA,IAAIQ,UAAU,GAAGR,OAAO,CAAC,eAAD,CAAxB;;AACA,IAAIS,QAAJ;;AAEA,IAAI;AACHA,EAAAA,QAAQ,GAAGT,OAAO,CAAC,aAAD,CAAlB;AACA,CAFD,CAEE,OAAOU,CAAP,EAAU;AACX;AACA;;AAED,IAAIC,qBAAqB,GAAGL,IAAI,CAACK,qBAAjC;AACA,IAAIC,aAAa,GAAGN,IAAI,CAACM,aAAzB;AAEA,IAAIC,OAAO,GAAG,EAAd;AACAA,OAAO,CAAC,MAAD,CAAP,GAAkBb,OAAO,CAAC,gBAAD,CAAzB;AACAa,OAAO,CAAC,KAAD,CAAP,GAAiBb,OAAO,CAAC,eAAD,CAAxB;AACAa,OAAO,CAAC,OAAD,CAAP,GAAmBb,OAAO,CAAC,iBAAD,CAA1B;AACAa,OAAO,CAAC,OAAD,CAAP,GAAmBb,OAAO,CAAC,iBAAD,CAA1B;AACAa,OAAO,CAAC,SAAD,CAAP,GAAqBb,OAAO,CAAC,mBAAD,CAA5B;AACAa,OAAO,CAAC,KAAD,CAAP,GAAiBb,OAAO,CAAC,eAAD,CAAxB;AACAa,OAAO,CAAC,aAAD,CAAP,GAAyBb,OAAO,CAAC,uBAAD,CAAhC;AACAa,OAAO,CAAC,SAAD,CAAP,GAAqBA,OAAO,CAAC,aAAD,CAA5B;AACAA,OAAO,CAAC,QAAD,CAAP,GAAoBb,OAAO,CAAC,kBAAD,CAA3B;AACAa,OAAO,CAAC,OAAD,CAAP,GAAmBb,OAAO,CAAC,iBAAD,CAA1B;AACAa,OAAO,CAAC,KAAD,CAAP,GAAiBA,OAAO,CAAC,OAAD,CAAxB;;AAEA,SAASf,GAAT,CAAagB,IAAb,EAAmB;AAClBf,EAAAA,MAAM,CAACgB,MAAP,CAAcD,IAAd,EAAoB,SAApB;AACAf,EAAAA,MAAM,CAACiB,aAAP,CAAqBF,IAAI,CAACG,KAA1B,EAAiC,eAAjC;AACAlB,EAAAA,MAAM,CAACmB,MAAP,CAAcJ,IAAI,CAACK,IAAnB,EAAyB,cAAzB;AACApB,EAAAA,MAAM,CAACqB,cAAP,CAAsBN,IAAI,CAACO,OAA3B,EAAoC,iBAApC;AAEA,MAAIC,OAAO,GAAGrB,IAAI,CAACsB,IAAL,CAAUT,IAAI,CAACK,IAAf,CAAd;AACA,MAAI,OAAQG,OAAR,KAAqB,QAAzB,EACC,MAAO,IAAIX,qBAAJ,CAA0BG,IAAI,CAACK,IAA/B,CAAP;AAED,MAAIK,UAAU,GAAG,EAAjB;;AACA,OAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGX,IAAI,CAACG,KAAL,CAAWS,MAA/B,EAAuC,EAAED,CAAzC,EAA4C;AAC3C,QAAIE,IAAI,GAAGb,IAAI,CAACG,KAAL,CAAWQ,CAAX,CAAX;AACAD,IAAAA,UAAU,CAACG,IAAI,CAACC,IAAN,CAAV,GAAwBD,IAAxB;AACA;;AAED,OAAKR,IAAL,GAAYL,IAAI,CAACK,IAAjB;AACA,OAAKF,KAAL,GAAaH,IAAI,CAACG,KAAlB;AACA,OAAKU,IAAL,GAAYH,UAAZ;AACA,OAAKH,OAAL,GAAeQ,SAAf;AACA,OAAKC,MAAL,GAAchB,IAAI,CAACgB,MAAnB;AAEA;;AACA,OAAKC,aAAL,GAAqBjB,IAAI,CAACiB,aAA1B;AACA,OAAKC,UAAL,GAAkB,EAAlB;AAEA,MAAIC,EAAJ;AACA,OAAKC,KAAL,GAAaL,SAAb;;AACA,MAAI,KAAKV,IAAL,KAAc,OAAlB,EAA2B;AAC1B,QAAIe,KAAK,GAAG,KAAKP,IAAL,CAAUO,KAAV,CAAgBC,IAAhB,CAAqBC,QAArB,EAAZ;AACA,SAAKF,KAAL,GAAaA,KAAb;AACAD,IAAAA,EAAE,GAAGhC,IAAI,CAACoC,MAAL,CAAYH,KAAZ,EAAmBI,IAAxB;AACA,GAJD,MAIO,IAAI,KAAKnB,IAAL,KAAc,SAAd,IAA2B,KAAKA,IAAL,KAAc,YAA7C,EAA2D;AACjEc,IAAAA,EAAE,GAAG,GAAL;AACA,SAAKC,KAAL,GAAa,YAAb;AACA,GAHM,MAGA;AACN,QAAIK,MAAM,GAAG,KAAKZ,IAAL,CAAUL,OAAO,CAACkB,QAAlB,CAAb;AACAP,IAAAA,EAAE,GAAGM,MAAM,CAACJ,IAAP,CAAYT,MAAjB;AACAO,IAAAA,EAAE,GAAGA,EAAE,GAAG,CAAL,GAAS1B,KAAK,CAACkC,UAAN,CAAiBF,MAAM,CAACJ,IAAxB,CAAd;AACA;;AACD,OAAKG,IAAL,GAAYL,EAAZ;AACA;;AAEDnC,GAAG,CAACe,OAAJ,GAAcA,OAAd;;AAEAf,GAAG,CAAC4C,SAAJ,CAAcC,QAAd,GAAyB,UAAUC,MAAV,EAAkBC,OAAlB,EAA2B;AACnD,MAAID,MAAM,KAAKf,SAAf,EACCe,MAAM,GAAG,KAAT;AACD7C,EAAAA,MAAM,CAACmB,MAAP,CAAc0B,MAAd,EAAsB,QAAtB;AACA7C,EAAAA,MAAM,CAACgB,MAAP,CAAcF,OAAO,CAAC+B,MAAD,CAArB,EAA+B,iBAA/B;AACA7C,EAAAA,MAAM,CAAC+C,cAAP,CAAsBD,OAAtB,EAA+B,SAA/B;;AAEA,MAAID,MAAM,KAAK,SAAf,EAA0B;AACzB,QAAI,KAAKb,aAAL,KAAuBF,SAA3B,EACC,KAAKE,aAAL,GAAqBlB,OAAO,CAAC,SAAD,CAAP,CAAmBkC,KAAnB,CAAyB,IAAzB,CAArB;AACD,WAAQ,KAAKhB,aAAb;AACA;;AAED,SAAQlB,OAAO,CAAC+B,MAAD,CAAP,CAAgBG,KAAhB,CAAsB,IAAtB,EAA4BF,OAA5B,CAAR;AACA,CAdD;;AAgBA/C,GAAG,CAAC4C,SAAJ,CAAcN,QAAd,GAAyB,UAAUQ,MAAV,EAAkBC,OAAlB,EAA2B;AACnD,SAAQ,KAAKF,QAAL,CAAcC,MAAd,EAAsBC,OAAtB,EAA+BT,QAA/B,EAAR;AACA,CAFD;;AAIAtC,GAAG,CAAC4C,SAAJ,CAAcM,IAAd,GAAqB,UAAUC,IAAV,EAAgB9B,IAAhB,EAAsB;AAC1CpB,EAAAA,MAAM,CAACmB,MAAP,CAAc+B,IAAd,EAAoB,WAApB;AACAlD,EAAAA,MAAM,CAACqB,cAAP,CAAsBD,IAAtB,EAA4B,MAA5B;AACA,MAAIA,IAAI,KAAKU,SAAb,EACCV,IAAI,GAAG,KAAP;AACD8B,EAAAA,IAAI,GAAGA,IAAI,CAACC,WAAL,EAAP;AACA,MAAIjD,IAAI,CAACkD,QAAL,CAAcF,IAAd,MAAwBpB,SAA5B,EACC,MAAO,IAAIlB,qBAAJ,CAA0BsC,IAA1B,CAAP;AAED,MAAIG,QAAQ,GAAGH,IAAI,GAAG,IAAP,GAAc9B,IAA7B;AACA,MAAI,KAAKa,UAAL,CAAgBoB,QAAhB,CAAJ,EACC,OAAQ,KAAKpB,UAAL,CAAgBoB,QAAhB,CAAR;AAED,MAAIC,GAAJ;;AACA,MAAIlC,IAAI,KAAK,KAAb,EAAoB;AACnBkC,IAAAA,GAAG,GAAG,KAAKV,QAAL,CAAc,SAAd,CAAN;AACA,GAFD,MAEO,IAAIxB,IAAI,KAAK,MAAb,EAAqB;AAC3BkC,IAAAA,GAAG,GAAGxC,OAAO,CAACyC,KAAR,CAAcC,aAAd,CAA4B,IAA5B,CAAN;AACA,GAFM,MAEA;AACN,UAAO,IAAIC,KAAJ,CAAU,eAAerC,IAAf,GAAsB,gBAAhC,CAAP;AACA;;AACD,MAAI6B,IAAI,GAAG9C,MAAM,CAACuD,UAAP,CAAkBR,IAAlB,EAAwBS,MAAxB,CAA+BL,GAA/B,EAAoCM,MAApC,EAAX;AACA,OAAK3B,UAAL,CAAgBoB,QAAhB,IAA4BJ,IAA5B;AACA,SAAQA,IAAR;AACA,CAxBD;;AA0BAlD,GAAG,CAAC4C,SAAJ,CAAckB,WAAd,GAA4B,UAAUX,IAAV,EAAgB9B,IAAhB,EAAsB;AACjD,MAAI8B,IAAI,KAAKpB,SAAb,EACCoB,IAAI,GAAG,QAAP;AACD,MAAI9B,IAAI,KAAKU,SAAb,EACCV,IAAI,GAAG,KAAP;AACDpB,EAAAA,MAAM,CAACmB,MAAP,CAAc+B,IAAd,EAAoB,WAApB;AACAlD,EAAAA,MAAM,CAACmB,MAAP,CAAcC,IAAd,EAAoB,MAApB;AACA,MAAIL,IAAI,GAAG;AACVK,IAAAA,IAAI,EAAE,KADI;AAEV6B,IAAAA,IAAI,EAAE,KAAKA,IAAL,CAAUC,IAAV,EAAgB9B,IAAhB,CAFI;AAGV0C,IAAAA,SAAS,EAAEZ,IAHD;AAIVa,IAAAA,QAAQ,EAAE3C;AAJA,GAAX;AAMA,SAAQ,IAAIhB,WAAJ,CAAgBW,IAAhB,CAAR;AACA,CAdD;;AAgBAhB,GAAG,CAAC4C,SAAJ,CAAcqB,oBAAd,GAAqC,YAAY;AAChD,MAAIC,QAAQ,GAAG,MAAf;AACA,MAAI,KAAK7C,IAAL,KAAc,KAAlB,EACC6C,QAAQ,GAAG,QAAX;AACD,MAAI,KAAK7C,IAAL,KAAc,KAAd,IAAuB,KAAKmB,IAAL,GAAY,IAAvC,EACC0B,QAAQ,GAAG,QAAX;AACD,MAAI,KAAK7C,IAAL,KAAc,SAAlB,EACC6C,QAAQ,GAAG,QAAX;;AACD,MAAI,KAAK7C,IAAL,KAAc,OAAlB,EAA2B;AAC1B,QAAI,KAAKmB,IAAL,IAAa,GAAjB,EACC0B,QAAQ,GAAG,QAAX,CADD,KAEK,IAAI,KAAK1B,IAAL,IAAa,GAAjB,EACJ0B,QAAQ,GAAG,QAAX,CADI,KAGJA,QAAQ,GAAG,QAAX;AACD;;AACD,SAAQA,QAAR;AACA,CAjBD;;AAmBAlE,GAAG,CAAC4C,SAAJ,CAAcuB,YAAd,GAA6B,UAAUD,QAAV,EAAoB;AAChD,MAAIA,QAAQ,KAAKnC,SAAjB,EACCmC,QAAQ,GAAG,KAAKD,oBAAL,EAAX;AACDhE,EAAAA,MAAM,CAACmB,MAAP,CAAc8C,QAAd,EAAwB,gBAAxB;AAEA;;AACA,MAAI,KAAK7C,IAAL,KAAc,SAAd,IAA2BV,QAAQ,KAAKoB,SAA5C,EACC,OAAQ,IAAIpB,QAAQ,CAACyD,QAAb,CAAsB,IAAtB,EAA4BF,QAA5B,CAAR;AACD,MAAI,KAAK7C,IAAL,KAAc,YAAlB,EACC,MAAO,IAAIqC,KAAJ,CAAU,0CACb,yBADG,CAAP;AAGD,MAAIW,CAAJ,EAAOC,EAAP,EAAWC,GAAX;;AACA,MAAI;AACHD,IAAAA,EAAE,GAAGJ,QAAQ,CAACM,WAAT,EAAL;AACAH,IAAAA,CAAC,GAAGjE,MAAM,CAAC+D,YAAP,CAAoBG,EAApB,CAAJ;AACA,GAHD,CAGE,OAAO1D,CAAP,EAAU;AACX2D,IAAAA,GAAG,GAAG3D,CAAN;AACA;;AACD,MAAIyD,CAAC,KAAKtC,SAAN,IAAoBwC,GAAG,YAAYb,KAAf,IACpBa,GAAG,CAACE,OAAJ,CAAYC,KAAZ,CAAkB,wBAAlB,CADJ,EACkD;AACjDJ,IAAAA,EAAE,GAAG,MAAL;AACAA,IAAAA,EAAE,IAAIJ,QAAQ,CAACM,WAAT,EAAN;AACAH,IAAAA,CAAC,GAAGjE,MAAM,CAAC+D,YAAP,CAAoBG,EAApB,CAAJ;AACA;;AACDrE,EAAAA,MAAM,CAAC0E,EAAP,CAAUN,CAAV,EAAa,2BAAb;AACA,MAAIO,SAAS,GAAGP,CAAC,CAACQ,MAAF,CAASC,IAAT,CAAcT,CAAd,CAAhB;AACA,MAAIU,GAAG,GAAG,KAAKlC,QAAL,CAAc,OAAd,CAAV;AACA,MAAIT,KAAK,GAAG,KAAKA,KAAjB;AACA,MAAI4C,IAAI,GAAG,IAAX;;AACAX,EAAAA,CAAC,CAACQ,MAAF,GAAW,UAAUI,SAAV,EAAqBC,GAArB,EAA0B;AACpC,QAAI5E,SAAS,CAAC6E,WAAV,CAAsBF,SAAtB,EAAiC,CAAC,CAAD,EAAI,CAAJ,CAAjC,CAAJ,EAA8C;AAC7C,UAAIA,SAAS,CAAC5D,IAAV,KAAmB2D,IAAI,CAAC3D,IAA5B,EACC,OAAQ,KAAR;AACD,UAAI4D,SAAS,CAACG,aAAV,IACAH,SAAS,CAACG,aAAV,KAA4BlB,QADhC,EAEC,OAAQ,KAAR;AACD,UAAIe,SAAS,CAAC7C,KAAV,IAAmB4C,IAAI,CAAC3D,IAAL,KAAc,OAAjC,IACA4D,SAAS,CAAC7C,KAAV,KAAoBA,KADxB,EAEC,OAAQ,KAAR;AACD,aAAQwC,SAAS,CAACG,GAAD,EAAME,SAAS,CAACpC,QAAV,CAAmB,MAAnB,CAAN,CAAjB;AAEA,KAXD,MAWO,IAAI,OAAQoC,SAAR,KAAuB,QAAvB,IACPI,MAAM,CAACC,QAAP,CAAgBL,SAAhB,CADG,EACyB;AAC/B,aAAQL,SAAS,CAACG,GAAD,EAAME,SAAN,EAAiBC,GAAjB,CAAjB;AAED;AACF;AACA;AACA;AACG,KARM,MAQA,IAAI5E,SAAS,CAAC6E,WAAV,CAAsBF,SAAtB,EAAiC,CAAC,CAAD,EAAI,CAAJ,CAAjC,CAAJ,EAA8C;AACpD,YAAO,IAAIvB,KAAJ,CAAU,sCACb,2CADG,CAAP;AAGA,KAJM,MAIA;AACN,YAAO,IAAI6B,SAAJ,CAAc,iCACjB,6BADG,CAAP;AAEA;AACD,GA5BD;;AA6BA,SAAQlB,CAAR;AACA,CA5DD;;AA8DArE,GAAG,CAAC4C,SAAJ,CAAc4C,mBAAd,GAAoC,YAAY;AAC/C,MAAI,KAAKnE,IAAL,KAAc,KAAlB,EACC,MAAO,IAAIqC,KAAJ,CAAU,wCAAV,CAAP;AAED,SAAQ,IAAInD,aAAJ,CAAkB,IAAlB,CAAR;AACA,CALD;;AAMAP,GAAG,CAAC4C,SAAJ,CAAc6C,QAAd,GAAyBzF,GAAG,CAAC4C,SAAJ,CAAc4C,mBAAvC;;AAEAxF,GAAG,CAAC0F,KAAJ,GAAY,UAAUrD,IAAV,EAAgBS,MAAhB,EAAwBC,OAAxB,EAAiC;AAC5C,MAAI,OAAQV,IAAR,KAAkB,QAAtB,EACCpC,MAAM,CAAC0F,MAAP,CAActD,IAAd,EAAoB,MAApB;AACD,MAAIS,MAAM,KAAKf,SAAf,EACCe,MAAM,GAAG,MAAT;AACD7C,EAAAA,MAAM,CAACmB,MAAP,CAAc0B,MAAd,EAAsB,QAAtB;AACA,MAAI,OAAQC,OAAR,KAAqB,QAAzB,EACCA,OAAO,GAAG;AAAE6C,IAAAA,QAAQ,EAAE7C;AAAZ,GAAV;AACD9C,EAAAA,MAAM,CAAC+C,cAAP,CAAsBD,OAAtB,EAA+B,SAA/B;AACA,MAAIA,OAAO,KAAKhB,SAAhB,EACCgB,OAAO,GAAG,EAAV;AACD9C,EAAAA,MAAM,CAACqB,cAAP,CAAsByB,OAAO,CAAC6C,QAA9B,EAAwC,kBAAxC;AACA,MAAI7C,OAAO,CAAC6C,QAAR,KAAqB7D,SAAzB,EACCgB,OAAO,CAAC6C,QAAR,GAAmB,WAAnB;AAED3F,EAAAA,MAAM,CAACgB,MAAP,CAAcF,OAAO,CAAC+B,MAAD,CAArB,EAA+B,iBAA/B;;AAEA,MAAI;AACH,QAAI+C,CAAC,GAAG9E,OAAO,CAAC+B,MAAD,CAAP,CAAgBgD,IAAhB,CAAqBzD,IAArB,EAA2BU,OAA3B,CAAR;AACA,QAAI8C,CAAC,YAAYnF,UAAjB,EACCmF,CAAC,GAAGA,CAAC,CAACE,QAAF,EAAJ;AACD,QAAI,CAACF,CAAC,CAACtE,OAAP,EACCsE,CAAC,CAACtE,OAAF,GAAYwB,OAAO,CAAC6C,QAApB;AACD,WAAQC,CAAR;AACA,GAPD,CAOE,OAAOjF,CAAP,EAAU;AACX,QAAIA,CAAC,CAACkB,IAAF,KAAW,mBAAf,EACC,MAAOlB,CAAP;AACD,UAAO,IAAIE,aAAJ,CAAkBiC,OAAO,CAAC6C,QAA1B,EAAoC9C,MAApC,EAA4ClC,CAA5C,CAAP;AACA;AACD,CA7BD;;AA+BAZ,GAAG,CAACgG,KAAJ,GAAY,UAAUC,GAAV,EAAeC,GAAf,EAAoB;AAC/B,SAAQzF,KAAK,CAAC0F,YAAN,CAAmBF,GAAnB,EAAwBjG,GAAxB,EAA6BkG,GAA7B,CAAR;AACA,CAFD;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACAlG,GAAG,CAAC4C,SAAJ,CAAcwD,gBAAd,GAAiC,CAAC,CAAD,EAAI,CAAJ,CAAjC;;AAEApG,GAAG,CAACqG,iBAAJ,GAAwB,UAAUJ,GAAV,EAAe;AACtChG,EAAAA,MAAM,CAACqG,IAAP,CAAYL,GAAG,CAACpD,QAAhB;AACA5C,EAAAA,MAAM,CAACqG,IAAP,CAAYL,GAAG,CAACnC,WAAhB;AACA,MAAImC,GAAG,CAACR,QAAR,EACC,OAAQ,CAAC,CAAD,EAAI,CAAJ,CAAR;AACD,MAAIQ,GAAG,CAAChC,oBAAR,EACC,OAAQ,CAAC,CAAD,EAAI,CAAJ,CAAR;AACD,MAAIgC,GAAG,CAAClF,OAAJ,CAAY,MAAZ,CAAJ,EACC,OAAQ,CAAC,CAAD,EAAI,CAAJ,CAAR;AACD,MAAIkF,GAAG,CAAClF,OAAJ,CAAY,OAAZ,CAAJ,EACC,OAAQ,CAAC,CAAD,EAAI,CAAJ,CAAR;AACD,SAAQ,CAAC,CAAD,EAAI,CAAJ,CAAR;AACA,CAZD","sourcesContent":["// Copyright 2018 Joyent, Inc.\n\nmodule.exports = Key;\n\nvar assert = require('assert-plus');\nvar algs = require('./algs');\nvar crypto = require('crypto');\nvar Fingerprint = require('./fingerprint');\nvar Signature = require('./signature');\nvar DiffieHellman = require('./dhe').DiffieHellman;\nvar errs = require('./errors');\nvar utils = require('./utils');\nvar PrivateKey = require('./private-key');\nvar edCompat;\n\ntry {\n\tedCompat = require('./ed-compat');\n} catch (e) {\n\t/* Just continue through, and bail out if we try to use it. */\n}\n\nvar InvalidAlgorithmError = errs.InvalidAlgorithmError;\nvar KeyParseError = errs.KeyParseError;\n\nvar formats = {};\nformats['auto'] = require('./formats/auto');\nformats['pem'] = require('./formats/pem');\nformats['pkcs1'] = require('./formats/pkcs1');\nformats['pkcs8'] = require('./formats/pkcs8');\nformats['rfc4253'] = require('./formats/rfc4253');\nformats['ssh'] = require('./formats/ssh');\nformats['ssh-private'] = require('./formats/ssh-private');\nformats['openssh'] = formats['ssh-private'];\nformats['dnssec'] = require('./formats/dnssec');\nformats['putty'] = require('./formats/putty');\nformats['ppk'] = formats['putty'];\n\nfunction Key(opts) {\n\tassert.object(opts, 'options');\n\tassert.arrayOfObject(opts.parts, 'options.parts');\n\tassert.string(opts.type, 'options.type');\n\tassert.optionalString(opts.comment, 'options.comment');\n\n\tvar algInfo = algs.info[opts.type];\n\tif (typeof (algInfo) !== 'object')\n\t\tthrow (new InvalidAlgorithmError(opts.type));\n\n\tvar partLookup = {};\n\tfor (var i = 0; i < opts.parts.length; ++i) {\n\t\tvar part = opts.parts[i];\n\t\tpartLookup[part.name] = part;\n\t}\n\n\tthis.type = opts.type;\n\tthis.parts = opts.parts;\n\tthis.part = partLookup;\n\tthis.comment = undefined;\n\tthis.source = opts.source;\n\n\t/* for speeding up hashing/fingerprint operations */\n\tthis._rfc4253Cache = opts._rfc4253Cache;\n\tthis._hashCache = {};\n\n\tvar sz;\n\tthis.curve = undefined;\n\tif (this.type === 'ecdsa') {\n\t\tvar curve = this.part.curve.data.toString();\n\t\tthis.curve = curve;\n\t\tsz = algs.curves[curve].size;\n\t} else if (this.type === 'ed25519' || this.type === 'curve25519') {\n\t\tsz = 256;\n\t\tthis.curve = 'curve25519';\n\t} else {\n\t\tvar szPart = this.part[algInfo.sizePart];\n\t\tsz = szPart.data.length;\n\t\tsz = sz * 8 - utils.countZeros(szPart.data);\n\t}\n\tthis.size = sz;\n}\n\nKey.formats = formats;\n\nKey.prototype.toBuffer = function (format, options) {\n\tif (format === undefined)\n\t\tformat = 'ssh';\n\tassert.string(format, 'format');\n\tassert.object(formats[format], 'formats[format]');\n\tassert.optionalObject(options, 'options');\n\n\tif (format === 'rfc4253') {\n\t\tif (this._rfc4253Cache === undefined)\n\t\t\tthis._rfc4253Cache = formats['rfc4253'].write(this);\n\t\treturn (this._rfc4253Cache);\n\t}\n\n\treturn (formats[format].write(this, options));\n};\n\nKey.prototype.toString = function (format, options) {\n\treturn (this.toBuffer(format, options).toString());\n};\n\nKey.prototype.hash = function (algo, type) {\n\tassert.string(algo, 'algorithm');\n\tassert.optionalString(type, 'type');\n\tif (type === undefined)\n\t\ttype = 'ssh';\n\talgo = algo.toLowerCase();\n\tif (algs.hashAlgs[algo] === undefined)\n\t\tthrow (new InvalidAlgorithmError(algo));\n\n\tvar cacheKey = algo + '||' + type;\n\tif (this._hashCache[cacheKey])\n\t\treturn (this._hashCache[cacheKey]);\n\n\tvar buf;\n\tif (type === 'ssh') {\n\t\tbuf = this.toBuffer('rfc4253');\n\t} else if (type === 'spki') {\n\t\tbuf = formats.pkcs8.pkcs8ToBuffer(this);\n\t} else {\n\t\tthrow (new Error('Hash type ' + type + ' not supported'));\n\t}\n\tvar hash = crypto.createHash(algo).update(buf).digest();\n\tthis._hashCache[cacheKey] = hash;\n\treturn (hash);\n};\n\nKey.prototype.fingerprint = function (algo, type) {\n\tif (algo === undefined)\n\t\talgo = 'sha256';\n\tif (type === undefined)\n\t\ttype = 'ssh';\n\tassert.string(algo, 'algorithm');\n\tassert.string(type, 'type');\n\tvar opts = {\n\t\ttype: 'key',\n\t\thash: this.hash(algo, type),\n\t\talgorithm: algo,\n\t\thashType: type\n\t};\n\treturn (new Fingerprint(opts));\n};\n\nKey.prototype.defaultHashAlgorithm = function () {\n\tvar hashAlgo = 'sha1';\n\tif (this.type === 'rsa')\n\t\thashAlgo = 'sha256';\n\tif (this.type === 'dsa' && this.size > 1024)\n\t\thashAlgo = 'sha256';\n\tif (this.type === 'ed25519')\n\t\thashAlgo = 'sha512';\n\tif (this.type === 'ecdsa') {\n\t\tif (this.size <= 256)\n\t\t\thashAlgo = 'sha256';\n\t\telse if (this.size <= 384)\n\t\t\thashAlgo = 'sha384';\n\t\telse\n\t\t\thashAlgo = 'sha512';\n\t}\n\treturn (hashAlgo);\n};\n\nKey.prototype.createVerify = function (hashAlgo) {\n\tif (hashAlgo === undefined)\n\t\thashAlgo = this.defaultHashAlgorithm();\n\tassert.string(hashAlgo, 'hash algorithm');\n\n\t/* ED25519 is not supported by OpenSSL, use a javascript impl. */\n\tif (this.type === 'ed25519' && edCompat !== undefined)\n\t\treturn (new edCompat.Verifier(this, hashAlgo));\n\tif (this.type === 'curve25519')\n\t\tthrow (new Error('Curve25519 keys are not suitable for ' +\n\t\t 'signing or verification'));\n\n\tvar v, nm, err;\n\ttry {\n\t\tnm = hashAlgo.toUpperCase();\n\t\tv = crypto.createVerify(nm);\n\t} catch (e) {\n\t\terr = e;\n\t}\n\tif (v === undefined || (err instanceof Error &&\n\t err.message.match(/Unknown message digest/))) {\n\t\tnm = 'RSA-';\n\t\tnm += hashAlgo.toUpperCase();\n\t\tv = crypto.createVerify(nm);\n\t}\n\tassert.ok(v, 'failed to create verifier');\n\tvar oldVerify = v.verify.bind(v);\n\tvar key = this.toBuffer('pkcs8');\n\tvar curve = this.curve;\n\tvar self = this;\n\tv.verify = function (signature, fmt) {\n\t\tif (Signature.isSignature(signature, [2, 0])) {\n\t\t\tif (signature.type !== self.type)\n\t\t\t\treturn (false);\n\t\t\tif (signature.hashAlgorithm &&\n\t\t\t signature.hashAlgorithm !== hashAlgo)\n\t\t\t\treturn (false);\n\t\t\tif (signature.curve && self.type === 'ecdsa' &&\n\t\t\t signature.curve !== curve)\n\t\t\t\treturn (false);\n\t\t\treturn (oldVerify(key, signature.toBuffer('asn1')));\n\n\t\t} else if (typeof (signature) === 'string' ||\n\t\t Buffer.isBuffer(signature)) {\n\t\t\treturn (oldVerify(key, signature, fmt));\n\n\t\t/*\n\t\t * Avoid doing this on valid arguments, walking the prototype\n\t\t * chain can be quite slow.\n\t\t */\n\t\t} else if (Signature.isSignature(signature, [1, 0])) {\n\t\t\tthrow (new Error('signature was created by too old ' +\n\t\t\t 'a version of sshpk and cannot be verified'));\n\n\t\t} else {\n\t\t\tthrow (new TypeError('signature must be a string, ' +\n\t\t\t 'Buffer, or Signature object'));\n\t\t}\n\t};\n\treturn (v);\n};\n\nKey.prototype.createDiffieHellman = function () {\n\tif (this.type === 'rsa')\n\t\tthrow (new Error('RSA keys do not support Diffie-Hellman'));\n\n\treturn (new DiffieHellman(this));\n};\nKey.prototype.createDH = Key.prototype.createDiffieHellman;\n\nKey.parse = function (data, format, options) {\n\tif (typeof (data) !== 'string')\n\t\tassert.buffer(data, 'data');\n\tif (format === undefined)\n\t\tformat = 'auto';\n\tassert.string(format, 'format');\n\tif (typeof (options) === 'string')\n\t\toptions = { filename: options };\n\tassert.optionalObject(options, 'options');\n\tif (options === undefined)\n\t\toptions = {};\n\tassert.optionalString(options.filename, 'options.filename');\n\tif (options.filename === undefined)\n\t\toptions.filename = '(unnamed)';\n\n\tassert.object(formats[format], 'formats[format]');\n\n\ttry {\n\t\tvar k = formats[format].read(data, options);\n\t\tif (k instanceof PrivateKey)\n\t\t\tk = k.toPublic();\n\t\tif (!k.comment)\n\t\t\tk.comment = options.filename;\n\t\treturn (k);\n\t} catch (e) {\n\t\tif (e.name === 'KeyEncryptedError')\n\t\t\tthrow (e);\n\t\tthrow (new KeyParseError(options.filename, format, e));\n\t}\n};\n\nKey.isKey = function (obj, ver) {\n\treturn (utils.isCompatible(obj, Key, ver));\n};\n\n/*\n * API versions for Key:\n * [1,0] -- initial ver, may take Signature for createVerify or may not\n * [1,1] -- added pkcs1, pkcs8 formats\n * [1,2] -- added auto, ssh-private, openssh formats\n * [1,3] -- added defaultHashAlgorithm\n * [1,4] -- added ed support, createDH\n * [1,5] -- first explicitly tagged version\n * [1,6] -- changed ed25519 part names\n * [1,7] -- spki hash types\n */\nKey.prototype._sshpkApiVersion = [1, 7];\n\nKey._oldVersionDetect = function (obj) {\n\tassert.func(obj.toBuffer);\n\tassert.func(obj.fingerprint);\n\tif (obj.createDH)\n\t\treturn ([1, 4]);\n\tif (obj.defaultHashAlgorithm)\n\t\treturn ([1, 3]);\n\tif (obj.formats['auto'])\n\t\treturn ([1, 2]);\n\tif (obj.formats['pkcs1'])\n\t\treturn ([1, 1]);\n\treturn ([1, 0]);\n};\n"]},"metadata":{},"sourceType":"script"}