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

1 line
19 KiB
JSON

{"ast":null,"code":"// Copyright 2018 Joyent, Inc.\nmodule.exports = Fingerprint;\n\nvar assert = require('assert-plus');\n\nvar Buffer = require('safer-buffer').Buffer;\n\nvar algs = require('./algs');\n\nvar crypto = require('crypto');\n\nvar errs = require('./errors');\n\nvar Key = require('./key');\n\nvar PrivateKey = require('./private-key');\n\nvar Certificate = require('./certificate');\n\nvar utils = require('./utils');\n\nvar FingerprintFormatError = errs.FingerprintFormatError;\nvar InvalidAlgorithmError = errs.InvalidAlgorithmError;\n\nfunction Fingerprint(opts) {\n assert.object(opts, 'options');\n assert.string(opts.type, 'options.type');\n assert.buffer(opts.hash, 'options.hash');\n assert.string(opts.algorithm, 'options.algorithm');\n this.algorithm = opts.algorithm.toLowerCase();\n if (algs.hashAlgs[this.algorithm] !== true) throw new InvalidAlgorithmError(this.algorithm);\n this.hash = opts.hash;\n this.type = opts.type;\n this.hashType = opts.hashType;\n}\n\nFingerprint.prototype.toString = function (format) {\n if (format === undefined) {\n if (this.algorithm === 'md5' || this.hashType === 'spki') format = 'hex';else format = 'base64';\n }\n\n assert.string(format);\n\n switch (format) {\n case 'hex':\n if (this.hashType === 'spki') return this.hash.toString('hex');\n return addColons(this.hash.toString('hex'));\n\n case 'base64':\n if (this.hashType === 'spki') return this.hash.toString('base64');\n return sshBase64Format(this.algorithm, this.hash.toString('base64'));\n\n default:\n throw new FingerprintFormatError(undefined, format);\n }\n};\n\nFingerprint.prototype.matches = function (other) {\n assert.object(other, 'key or certificate');\n\n if (this.type === 'key' && this.hashType !== 'ssh') {\n utils.assertCompatible(other, Key, [1, 7], 'key with spki');\n\n if (PrivateKey.isPrivateKey(other)) {\n utils.assertCompatible(other, PrivateKey, [1, 6], 'privatekey with spki support');\n }\n } else if (this.type === 'key') {\n utils.assertCompatible(other, Key, [1, 0], 'key');\n } else {\n utils.assertCompatible(other, Certificate, [1, 0], 'certificate');\n }\n\n var theirHash = other.hash(this.algorithm, this.hashType);\n var theirHash2 = crypto.createHash(this.algorithm).update(theirHash).digest('base64');\n if (this.hash2 === undefined) this.hash2 = crypto.createHash(this.algorithm).update(this.hash).digest('base64');\n return this.hash2 === theirHash2;\n};\n/*JSSTYLED*/\n\n\nvar base64RE = /^[A-Za-z0-9+\\/=]+$/;\n/*JSSTYLED*/\n\nvar hexRE = /^[a-fA-F0-9]+$/;\n\nFingerprint.parse = function (fp, options) {\n assert.string(fp, 'fingerprint');\n var alg, hash, enAlgs;\n\n if (Array.isArray(options)) {\n enAlgs = options;\n options = {};\n }\n\n assert.optionalObject(options, 'options');\n if (options === undefined) options = {};\n if (options.enAlgs !== undefined) enAlgs = options.enAlgs;\n if (options.algorithms !== undefined) enAlgs = options.algorithms;\n assert.optionalArrayOfString(enAlgs, 'algorithms');\n var hashType = 'ssh';\n if (options.hashType !== undefined) hashType = options.hashType;\n assert.string(hashType, 'options.hashType');\n var parts = fp.split(':');\n\n if (parts.length == 2) {\n alg = parts[0].toLowerCase();\n if (!base64RE.test(parts[1])) throw new FingerprintFormatError(fp);\n\n try {\n hash = Buffer.from(parts[1], 'base64');\n } catch (e) {\n throw new FingerprintFormatError(fp);\n }\n } else if (parts.length > 2) {\n alg = 'md5';\n if (parts[0].toLowerCase() === 'md5') parts = parts.slice(1);\n parts = parts.map(function (p) {\n while (p.length < 2) p = '0' + p;\n\n if (p.length > 2) throw new FingerprintFormatError(fp);\n return p;\n });\n parts = parts.join('');\n if (!hexRE.test(parts) || parts.length % 2 !== 0) throw new FingerprintFormatError(fp);\n\n try {\n hash = Buffer.from(parts, 'hex');\n } catch (e) {\n throw new FingerprintFormatError(fp);\n }\n } else {\n if (hexRE.test(fp)) {\n hash = Buffer.from(fp, 'hex');\n } else if (base64RE.test(fp)) {\n hash = Buffer.from(fp, 'base64');\n } else {\n throw new FingerprintFormatError(fp);\n }\n\n switch (hash.length) {\n case 32:\n alg = 'sha256';\n break;\n\n case 16:\n alg = 'md5';\n break;\n\n case 20:\n alg = 'sha1';\n break;\n\n case 64:\n alg = 'sha512';\n break;\n\n default:\n throw new FingerprintFormatError(fp);\n }\n /* Plain hex/base64: guess it's probably SPKI unless told. */\n\n\n if (options.hashType === undefined) hashType = 'spki';\n }\n\n if (alg === undefined) throw new FingerprintFormatError(fp);\n if (algs.hashAlgs[alg] === undefined) throw new InvalidAlgorithmError(alg);\n\n if (enAlgs !== undefined) {\n enAlgs = enAlgs.map(function (a) {\n return a.toLowerCase();\n });\n if (enAlgs.indexOf(alg) === -1) throw new InvalidAlgorithmError(alg);\n }\n\n return new Fingerprint({\n algorithm: alg,\n hash: hash,\n type: options.type || 'key',\n hashType: hashType\n });\n};\n\nfunction addColons(s) {\n /*JSSTYLED*/\n return s.replace(/(.{2})(?=.)/g, '$1:');\n}\n\nfunction base64Strip(s) {\n /*JSSTYLED*/\n return s.replace(/=*$/, '');\n}\n\nfunction sshBase64Format(alg, h) {\n return alg.toUpperCase() + ':' + base64Strip(h);\n}\n\nFingerprint.isFingerprint = function (obj, ver) {\n return utils.isCompatible(obj, Fingerprint, ver);\n};\n/*\n * API versions for Fingerprint:\n * [1,0] -- initial ver\n * [1,1] -- first tagged ver\n * [1,2] -- hashType and spki support\n */\n\n\nFingerprint.prototype._sshpkApiVersion = [1, 2];\n\nFingerprint._oldVersionDetect = function (obj) {\n assert.func(obj.toString);\n assert.func(obj.matches);\n return [1, 0];\n};","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/sshpk/lib/fingerprint.js"],"names":["module","exports","Fingerprint","assert","require","Buffer","algs","crypto","errs","Key","PrivateKey","Certificate","utils","FingerprintFormatError","InvalidAlgorithmError","opts","object","string","type","buffer","hash","algorithm","toLowerCase","hashAlgs","hashType","prototype","toString","format","undefined","addColons","sshBase64Format","matches","other","assertCompatible","isPrivateKey","theirHash","theirHash2","createHash","update","digest","hash2","base64RE","hexRE","parse","fp","options","alg","enAlgs","Array","isArray","optionalObject","algorithms","optionalArrayOfString","parts","split","length","test","from","e","slice","map","p","join","a","indexOf","s","replace","base64Strip","h","toUpperCase","isFingerprint","obj","ver","isCompatible","_sshpkApiVersion","_oldVersionDetect","func"],"mappings":"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","sourcesContent":["// Copyright 2018 Joyent, Inc.\n\nmodule.exports = Fingerprint;\n\nvar assert = require('assert-plus');\nvar Buffer = require('safer-buffer').Buffer;\nvar algs = require('./algs');\nvar crypto = require('crypto');\nvar errs = require('./errors');\nvar Key = require('./key');\nvar PrivateKey = require('./private-key');\nvar Certificate = require('./certificate');\nvar utils = require('./utils');\n\nvar FingerprintFormatError = errs.FingerprintFormatError;\nvar InvalidAlgorithmError = errs.InvalidAlgorithmError;\n\nfunction Fingerprint(opts) {\n\tassert.object(opts, 'options');\n\tassert.string(opts.type, 'options.type');\n\tassert.buffer(opts.hash, 'options.hash');\n\tassert.string(opts.algorithm, 'options.algorithm');\n\n\tthis.algorithm = opts.algorithm.toLowerCase();\n\tif (algs.hashAlgs[this.algorithm] !== true)\n\t\tthrow (new InvalidAlgorithmError(this.algorithm));\n\n\tthis.hash = opts.hash;\n\tthis.type = opts.type;\n\tthis.hashType = opts.hashType;\n}\n\nFingerprint.prototype.toString = function (format) {\n\tif (format === undefined) {\n\t\tif (this.algorithm === 'md5' || this.hashType === 'spki')\n\t\t\tformat = 'hex';\n\t\telse\n\t\t\tformat = 'base64';\n\t}\n\tassert.string(format);\n\n\tswitch (format) {\n\tcase 'hex':\n\t\tif (this.hashType === 'spki')\n\t\t\treturn (this.hash.toString('hex'));\n\t\treturn (addColons(this.hash.toString('hex')));\n\tcase 'base64':\n\t\tif (this.hashType === 'spki')\n\t\t\treturn (this.hash.toString('base64'));\n\t\treturn (sshBase64Format(this.algorithm,\n\t\t this.hash.toString('base64')));\n\tdefault:\n\t\tthrow (new FingerprintFormatError(undefined, format));\n\t}\n};\n\nFingerprint.prototype.matches = function (other) {\n\tassert.object(other, 'key or certificate');\n\tif (this.type === 'key' && this.hashType !== 'ssh') {\n\t\tutils.assertCompatible(other, Key, [1, 7], 'key with spki');\n\t\tif (PrivateKey.isPrivateKey(other)) {\n\t\t\tutils.assertCompatible(other, PrivateKey, [1, 6],\n\t\t\t 'privatekey with spki support');\n\t\t}\n\t} else if (this.type === 'key') {\n\t\tutils.assertCompatible(other, Key, [1, 0], 'key');\n\t} else {\n\t\tutils.assertCompatible(other, Certificate, [1, 0],\n\t\t 'certificate');\n\t}\n\n\tvar theirHash = other.hash(this.algorithm, this.hashType);\n\tvar theirHash2 = crypto.createHash(this.algorithm).\n\t update(theirHash).digest('base64');\n\n\tif (this.hash2 === undefined)\n\t\tthis.hash2 = crypto.createHash(this.algorithm).\n\t\t update(this.hash).digest('base64');\n\n\treturn (this.hash2 === theirHash2);\n};\n\n/*JSSTYLED*/\nvar base64RE = /^[A-Za-z0-9+\\/=]+$/;\n/*JSSTYLED*/\nvar hexRE = /^[a-fA-F0-9]+$/;\n\nFingerprint.parse = function (fp, options) {\n\tassert.string(fp, 'fingerprint');\n\n\tvar alg, hash, enAlgs;\n\tif (Array.isArray(options)) {\n\t\tenAlgs = options;\n\t\toptions = {};\n\t}\n\tassert.optionalObject(options, 'options');\n\tif (options === undefined)\n\t\toptions = {};\n\tif (options.enAlgs !== undefined)\n\t\tenAlgs = options.enAlgs;\n\tif (options.algorithms !== undefined)\n\t\tenAlgs = options.algorithms;\n\tassert.optionalArrayOfString(enAlgs, 'algorithms');\n\n\tvar hashType = 'ssh';\n\tif (options.hashType !== undefined)\n\t\thashType = options.hashType;\n\tassert.string(hashType, 'options.hashType');\n\n\tvar parts = fp.split(':');\n\tif (parts.length == 2) {\n\t\talg = parts[0].toLowerCase();\n\t\tif (!base64RE.test(parts[1]))\n\t\t\tthrow (new FingerprintFormatError(fp));\n\t\ttry {\n\t\t\thash = Buffer.from(parts[1], 'base64');\n\t\t} catch (e) {\n\t\t\tthrow (new FingerprintFormatError(fp));\n\t\t}\n\t} else if (parts.length > 2) {\n\t\talg = 'md5';\n\t\tif (parts[0].toLowerCase() === 'md5')\n\t\t\tparts = parts.slice(1);\n\t\tparts = parts.map(function (p) {\n\t\t\twhile (p.length < 2)\n\t\t\t\tp = '0' + p;\n\t\t\tif (p.length > 2)\n\t\t\t\tthrow (new FingerprintFormatError(fp));\n\t\t\treturn (p);\n\t\t});\n\t\tparts = parts.join('');\n\t\tif (!hexRE.test(parts) || parts.length % 2 !== 0)\n\t\t\tthrow (new FingerprintFormatError(fp));\n\t\ttry {\n\t\t\thash = Buffer.from(parts, 'hex');\n\t\t} catch (e) {\n\t\t\tthrow (new FingerprintFormatError(fp));\n\t\t}\n\t} else {\n\t\tif (hexRE.test(fp)) {\n\t\t\thash = Buffer.from(fp, 'hex');\n\t\t} else if (base64RE.test(fp)) {\n\t\t\thash = Buffer.from(fp, 'base64');\n\t\t} else {\n\t\t\tthrow (new FingerprintFormatError(fp));\n\t\t}\n\n\t\tswitch (hash.length) {\n\t\tcase 32:\n\t\t\talg = 'sha256';\n\t\t\tbreak;\n\t\tcase 16:\n\t\t\talg = 'md5';\n\t\t\tbreak;\n\t\tcase 20:\n\t\t\talg = 'sha1';\n\t\t\tbreak;\n\t\tcase 64:\n\t\t\talg = 'sha512';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow (new FingerprintFormatError(fp));\n\t\t}\n\n\t\t/* Plain hex/base64: guess it's probably SPKI unless told. */\n\t\tif (options.hashType === undefined)\n\t\t\thashType = 'spki';\n\t}\n\n\tif (alg === undefined)\n\t\tthrow (new FingerprintFormatError(fp));\n\n\tif (algs.hashAlgs[alg] === undefined)\n\t\tthrow (new InvalidAlgorithmError(alg));\n\n\tif (enAlgs !== undefined) {\n\t\tenAlgs = enAlgs.map(function (a) { return a.toLowerCase(); });\n\t\tif (enAlgs.indexOf(alg) === -1)\n\t\t\tthrow (new InvalidAlgorithmError(alg));\n\t}\n\n\treturn (new Fingerprint({\n\t\talgorithm: alg,\n\t\thash: hash,\n\t\ttype: options.type || 'key',\n\t\thashType: hashType\n\t}));\n};\n\nfunction addColons(s) {\n\t/*JSSTYLED*/\n\treturn (s.replace(/(.{2})(?=.)/g, '$1:'));\n}\n\nfunction base64Strip(s) {\n\t/*JSSTYLED*/\n\treturn (s.replace(/=*$/, ''));\n}\n\nfunction sshBase64Format(alg, h) {\n\treturn (alg.toUpperCase() + ':' + base64Strip(h));\n}\n\nFingerprint.isFingerprint = function (obj, ver) {\n\treturn (utils.isCompatible(obj, Fingerprint, ver));\n};\n\n/*\n * API versions for Fingerprint:\n * [1,0] -- initial ver\n * [1,1] -- first tagged ver\n * [1,2] -- hashType and spki support\n */\nFingerprint.prototype._sshpkApiVersion = [1, 2];\n\nFingerprint._oldVersionDetect = function (obj) {\n\tassert.func(obj.toString);\n\tassert.func(obj.matches);\n\treturn ([1, 0]);\n};\n"]},"metadata":{},"sourceType":"script"}