{"ast":null,"code":"// Copyright 2017 Joyent, Inc.\nmodule.exports = Identity;\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 errs = require('./errors');\n\nvar util = require('util');\n\nvar utils = require('./utils');\n\nvar asn1 = require('asn1');\n\nvar Buffer = require('safer-buffer').Buffer;\n/*JSSTYLED*/\n\n\nvar DNS_NAME_RE = /^([*]|[a-z0-9][a-z0-9\\-]{0,62})(?:\\.([*]|[a-z0-9][a-z0-9\\-]{0,62}))*$/i;\nvar oids = {};\noids.cn = '2.5.4.3';\noids.o = '2.5.4.10';\noids.ou = '2.5.4.11';\noids.l = '2.5.4.7';\noids.s = '2.5.4.8';\noids.c = '2.5.4.6';\noids.sn = '2.5.4.4';\noids.postalCode = '2.5.4.17';\noids.serialNumber = '2.5.4.5';\noids.street = '2.5.4.9';\noids.x500UniqueIdentifier = '2.5.4.45';\noids.role = '2.5.4.72';\noids.telephoneNumber = '2.5.4.20';\noids.description = '2.5.4.13';\noids.dc = '0.9.2342.19200300.100.1.25';\noids.uid = '0.9.2342.19200300.100.1.1';\noids.mail = '0.9.2342.19200300.100.1.3';\noids.title = '2.5.4.12';\noids.gn = '2.5.4.42';\noids.initials = '2.5.4.43';\noids.pseudonym = '2.5.4.65';\noids.emailAddress = '1.2.840.113549.1.9.1';\nvar unoids = {};\nObject.keys(oids).forEach(function (k) {\n unoids[oids[k]] = k;\n});\n\nfunction Identity(opts) {\n var self = this;\n assert.object(opts, 'options');\n assert.arrayOfObject(opts.components, 'options.components');\n this.components = opts.components;\n this.componentLookup = {};\n this.components.forEach(function (c) {\n if (c.name && !c.oid) c.oid = oids[c.name];\n if (c.oid && !c.name) c.name = unoids[c.oid];\n if (self.componentLookup[c.name] === undefined) self.componentLookup[c.name] = [];\n self.componentLookup[c.name].push(c);\n });\n\n if (this.componentLookup.cn && this.componentLookup.cn.length > 0) {\n this.cn = this.componentLookup.cn[0].value;\n }\n\n assert.optionalString(opts.type, 'options.type');\n\n if (opts.type === undefined) {\n if (this.components.length === 1 && this.componentLookup.cn && this.componentLookup.cn.length === 1 && this.componentLookup.cn[0].value.match(DNS_NAME_RE)) {\n this.type = 'host';\n this.hostname = this.componentLookup.cn[0].value;\n } else if (this.componentLookup.dc && this.components.length === this.componentLookup.dc.length) {\n this.type = 'host';\n this.hostname = this.componentLookup.dc.map(function (c) {\n return c.value;\n }).join('.');\n } else if (this.componentLookup.uid && this.components.length === this.componentLookup.uid.length) {\n this.type = 'user';\n this.uid = this.componentLookup.uid[0].value;\n } else if (this.componentLookup.cn && this.componentLookup.cn.length === 1 && this.componentLookup.cn[0].value.match(DNS_NAME_RE)) {\n this.type = 'host';\n this.hostname = this.componentLookup.cn[0].value;\n } else if (this.componentLookup.uid && this.componentLookup.uid.length === 1) {\n this.type = 'user';\n this.uid = this.componentLookup.uid[0].value;\n } else if (this.componentLookup.mail && this.componentLookup.mail.length === 1) {\n this.type = 'email';\n this.email = this.componentLookup.mail[0].value;\n } else if (this.componentLookup.cn && this.componentLookup.cn.length === 1) {\n this.type = 'user';\n this.uid = this.componentLookup.cn[0].value;\n } else {\n this.type = 'unknown';\n }\n } else {\n this.type = opts.type;\n if (this.type === 'host') this.hostname = opts.hostname;else if (this.type === 'user') this.uid = opts.uid;else if (this.type === 'email') this.email = opts.email;else throw new Error('Unknown type ' + this.type);\n }\n}\n\nIdentity.prototype.toString = function () {\n return this.components.map(function (c) {\n var n = c.name.toUpperCase();\n /*JSSTYLED*/\n\n n = n.replace(/=/g, '\\\\=');\n var v = c.value;\n /*JSSTYLED*/\n\n v = v.replace(/,/g, '\\\\,');\n return n + '=' + v;\n }).join(', ');\n};\n\nIdentity.prototype.get = function (name, asArray) {\n assert.string(name, 'name');\n var arr = this.componentLookup[name];\n if (arr === undefined || arr.length === 0) return undefined;\n if (!asArray && arr.length > 1) throw new Error('Multiple values for attribute ' + name);\n if (!asArray) return arr[0].value;\n return arr.map(function (c) {\n return c.value;\n });\n};\n\nIdentity.prototype.toArray = function (idx) {\n return this.components.map(function (c) {\n return {\n name: c.name,\n value: c.value\n };\n });\n};\n/*\n * These are from X.680 -- PrintableString allowed chars are in section 37.4\n * table 8. Spec for IA5Strings is \"1,6 + SPACE + DEL\" where 1 refers to\n * ISO IR #001 (standard ASCII control characters) and 6 refers to ISO IR #006\n * (the basic ASCII character set).\n */\n\n/* JSSTYLED */\n\n\nvar NOT_PRINTABLE = /[^a-zA-Z0-9 '(),+.\\/:=?-]/;\n/* JSSTYLED */\n\nvar NOT_IA5 = /[^\\x00-\\x7f]/;\n\nIdentity.prototype.toAsn1 = function (der, tag) {\n der.startSequence(tag);\n this.components.forEach(function (c) {\n der.startSequence(asn1.Ber.Constructor | asn1.Ber.Set);\n der.startSequence();\n der.writeOID(c.oid);\n /*\n * If we fit in a PrintableString, use that. Otherwise use an\n * IA5String or UTF8String.\n *\n * If this identity was parsed from a DN, use the ASN.1 types\n * from the original representation (otherwise this might not\n * be a full match for the original in some validators).\n */\n\n if (c.asn1type === asn1.Ber.Utf8String || c.value.match(NOT_IA5)) {\n var v = Buffer.from(c.value, 'utf8');\n der.writeBuffer(v, asn1.Ber.Utf8String);\n } else if (c.asn1type === asn1.Ber.IA5String || c.value.match(NOT_PRINTABLE)) {\n der.writeString(c.value, asn1.Ber.IA5String);\n } else {\n var type = asn1.Ber.PrintableString;\n if (c.asn1type !== undefined) type = c.asn1type;\n der.writeString(c.value, type);\n }\n\n der.endSequence();\n der.endSequence();\n });\n der.endSequence();\n};\n\nfunction globMatch(a, b) {\n if (a === '**' || b === '**') return true;\n var aParts = a.split('.');\n var bParts = b.split('.');\n if (aParts.length !== bParts.length) return false;\n\n for (var i = 0; i < aParts.length; ++i) {\n if (aParts[i] === '*' || bParts[i] === '*') continue;\n if (aParts[i] !== bParts[i]) return false;\n }\n\n return true;\n}\n\nIdentity.prototype.equals = function (other) {\n if (!Identity.isIdentity(other, [1, 0])) return false;\n if (other.components.length !== this.components.length) return false;\n\n for (var i = 0; i < this.components.length; ++i) {\n if (this.components[i].oid !== other.components[i].oid) return false;\n\n if (!globMatch(this.components[i].value, other.components[i].value)) {\n return false;\n }\n }\n\n return true;\n};\n\nIdentity.forHost = function (hostname) {\n assert.string(hostname, 'hostname');\n return new Identity({\n type: 'host',\n hostname: hostname,\n components: [{\n name: 'cn',\n value: hostname\n }]\n });\n};\n\nIdentity.forUser = function (uid) {\n assert.string(uid, 'uid');\n return new Identity({\n type: 'user',\n uid: uid,\n components: [{\n name: 'uid',\n value: uid\n }]\n });\n};\n\nIdentity.forEmail = function (email) {\n assert.string(email, 'email');\n return new Identity({\n type: 'email',\n email: email,\n components: [{\n name: 'mail',\n value: email\n }]\n });\n};\n\nIdentity.parseDN = function (dn) {\n assert.string(dn, 'dn');\n var parts = [''];\n var idx = 0;\n var rem = dn;\n\n while (rem.length > 0) {\n var m;\n /*JSSTYLED*/\n\n if ((m = /^,/.exec(rem)) !== null) {\n parts[++idx] = '';\n rem = rem.slice(m[0].length);\n /*JSSTYLED*/\n } else if ((m = /^\\\\,/.exec(rem)) !== null) {\n parts[idx] += ',';\n rem = rem.slice(m[0].length);\n /*JSSTYLED*/\n } else if ((m = /^\\\\./.exec(rem)) !== null) {\n parts[idx] += m[0];\n rem = rem.slice(m[0].length);\n /*JSSTYLED*/\n } else if ((m = /^[^\\\\,]+/.exec(rem)) !== null) {\n parts[idx] += m[0];\n rem = rem.slice(m[0].length);\n } else {\n throw new Error('Failed to parse DN');\n }\n }\n\n var cmps = parts.map(function (c) {\n c = c.trim();\n var eqPos = c.indexOf('=');\n\n while (eqPos > 0 && c.charAt(eqPos - 1) === '\\\\') eqPos = c.indexOf('=', eqPos + 1);\n\n if (eqPos === -1) {\n throw new Error('Failed to parse DN');\n }\n /*JSSTYLED*/\n\n\n var name = c.slice(0, eqPos).toLowerCase().replace(/\\\\=/g, '=');\n var value = c.slice(eqPos + 1);\n return {\n name: name,\n value: value\n };\n });\n return new Identity({\n components: cmps\n });\n};\n\nIdentity.fromArray = function (components) {\n assert.arrayOfObject(components, 'components');\n components.forEach(function (cmp) {\n assert.object(cmp, 'component');\n assert.string(cmp.name, 'component.name');\n\n if (!Buffer.isBuffer(cmp.value) && !(typeof cmp.value === 'string')) {\n throw new Error('Invalid component value');\n }\n });\n return new Identity({\n components: components\n });\n};\n\nIdentity.parseAsn1 = function (der, top) {\n var components = [];\n der.readSequence(top);\n var end = der.offset + der.length;\n\n while (der.offset < end) {\n der.readSequence(asn1.Ber.Constructor | asn1.Ber.Set);\n var after = der.offset + der.length;\n der.readSequence();\n var oid = der.readOID();\n var type = der.peek();\n var value;\n\n switch (type) {\n case asn1.Ber.PrintableString:\n case asn1.Ber.IA5String:\n case asn1.Ber.OctetString:\n case asn1.Ber.T61String:\n value = der.readString(type);\n break;\n\n case asn1.Ber.Utf8String:\n value = der.readString(type, true);\n value = value.toString('utf8');\n break;\n\n case asn1.Ber.CharacterString:\n case asn1.Ber.BMPString:\n value = der.readString(type, true);\n value = value.toString('utf16le');\n break;\n\n default:\n throw new Error('Unknown asn1 type ' + type);\n }\n\n components.push({\n oid: oid,\n asn1type: type,\n value: value\n });\n der._offset = after;\n }\n\n der._offset = end;\n return new Identity({\n components: components\n });\n};\n\nIdentity.isIdentity = function (obj, ver) {\n return utils.isCompatible(obj, Identity, ver);\n};\n/*\n * API versions for Identity:\n * [1,0] -- initial ver\n */\n\n\nIdentity.prototype._sshpkApiVersion = [1, 0];\n\nIdentity._oldVersionDetect = function (obj) {\n return [1, 0];\n};","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/sshpk/lib/identity.js"],"names":["module","exports","Identity","assert","require","algs","crypto","Fingerprint","Signature","errs","util","utils","asn1","Buffer","DNS_NAME_RE","oids","cn","o","ou","l","s","c","sn","postalCode","serialNumber","street","x500UniqueIdentifier","role","telephoneNumber","description","dc","uid","mail","title","gn","initials","pseudonym","emailAddress","unoids","Object","keys","forEach","k","opts","self","object","arrayOfObject","components","componentLookup","name","oid","undefined","push","length","value","optionalString","type","match","hostname","map","join","email","Error","prototype","toString","n","toUpperCase","replace","v","get","asArray","string","arr","toArray","idx","NOT_PRINTABLE","NOT_IA5","toAsn1","der","tag","startSequence","Ber","Constructor","Set","writeOID","asn1type","Utf8String","from","writeBuffer","IA5String","writeString","PrintableString","endSequence","globMatch","a","b","aParts","split","bParts","i","equals","other","isIdentity","forHost","forUser","forEmail","parseDN","dn","parts","rem","m","exec","slice","cmps","trim","eqPos","indexOf","charAt","toLowerCase","fromArray","cmp","isBuffer","parseAsn1","top","readSequence","end","offset","after","readOID","peek","OctetString","T61String","readString","CharacterString","BMPString","_offset","obj","ver","isCompatible","_sshpkApiVersion","_oldVersionDetect"],"mappings":"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","sourcesContent":["// Copyright 2017 Joyent, Inc.\n\nmodule.exports = Identity;\n\nvar assert = require('assert-plus');\nvar algs = require('./algs');\nvar crypto = require('crypto');\nvar Fingerprint = require('./fingerprint');\nvar Signature = require('./signature');\nvar errs = require('./errors');\nvar util = require('util');\nvar utils = require('./utils');\nvar asn1 = require('asn1');\nvar Buffer = require('safer-buffer').Buffer;\n\n/*JSSTYLED*/\nvar DNS_NAME_RE = /^([*]|[a-z0-9][a-z0-9\\-]{0,62})(?:\\.([*]|[a-z0-9][a-z0-9\\-]{0,62}))*$/i;\n\nvar oids = {};\noids.cn = '2.5.4.3';\noids.o = '2.5.4.10';\noids.ou = '2.5.4.11';\noids.l = '2.5.4.7';\noids.s = '2.5.4.8';\noids.c = '2.5.4.6';\noids.sn = '2.5.4.4';\noids.postalCode = '2.5.4.17';\noids.serialNumber = '2.5.4.5';\noids.street = '2.5.4.9';\noids.x500UniqueIdentifier = '2.5.4.45';\noids.role = '2.5.4.72';\noids.telephoneNumber = '2.5.4.20';\noids.description = '2.5.4.13';\noids.dc = '0.9.2342.19200300.100.1.25';\noids.uid = '0.9.2342.19200300.100.1.1';\noids.mail = '0.9.2342.19200300.100.1.3';\noids.title = '2.5.4.12';\noids.gn = '2.5.4.42';\noids.initials = '2.5.4.43';\noids.pseudonym = '2.5.4.65';\noids.emailAddress = '1.2.840.113549.1.9.1';\n\nvar unoids = {};\nObject.keys(oids).forEach(function (k) {\n\tunoids[oids[k]] = k;\n});\n\nfunction Identity(opts) {\n\tvar self = this;\n\tassert.object(opts, 'options');\n\tassert.arrayOfObject(opts.components, 'options.components');\n\tthis.components = opts.components;\n\tthis.componentLookup = {};\n\tthis.components.forEach(function (c) {\n\t\tif (c.name && !c.oid)\n\t\t\tc.oid = oids[c.name];\n\t\tif (c.oid && !c.name)\n\t\t\tc.name = unoids[c.oid];\n\t\tif (self.componentLookup[c.name] === undefined)\n\t\t\tself.componentLookup[c.name] = [];\n\t\tself.componentLookup[c.name].push(c);\n\t});\n\tif (this.componentLookup.cn && this.componentLookup.cn.length > 0) {\n\t\tthis.cn = this.componentLookup.cn[0].value;\n\t}\n\tassert.optionalString(opts.type, 'options.type');\n\tif (opts.type === undefined) {\n\t\tif (this.components.length === 1 &&\n\t\t this.componentLookup.cn &&\n\t\t this.componentLookup.cn.length === 1 &&\n\t\t this.componentLookup.cn[0].value.match(DNS_NAME_RE)) {\n\t\t\tthis.type = 'host';\n\t\t\tthis.hostname = this.componentLookup.cn[0].value;\n\n\t\t} else if (this.componentLookup.dc &&\n\t\t this.components.length === this.componentLookup.dc.length) {\n\t\t\tthis.type = 'host';\n\t\t\tthis.hostname = this.componentLookup.dc.map(\n\t\t\t function (c) {\n\t\t\t\treturn (c.value);\n\t\t\t}).join('.');\n\n\t\t} else if (this.componentLookup.uid &&\n\t\t this.components.length ===\n\t\t this.componentLookup.uid.length) {\n\t\t\tthis.type = 'user';\n\t\t\tthis.uid = this.componentLookup.uid[0].value;\n\n\t\t} else if (this.componentLookup.cn &&\n\t\t this.componentLookup.cn.length === 1 &&\n\t\t this.componentLookup.cn[0].value.match(DNS_NAME_RE)) {\n\t\t\tthis.type = 'host';\n\t\t\tthis.hostname = this.componentLookup.cn[0].value;\n\n\t\t} else if (this.componentLookup.uid &&\n\t\t this.componentLookup.uid.length === 1) {\n\t\t\tthis.type = 'user';\n\t\t\tthis.uid = this.componentLookup.uid[0].value;\n\n\t\t} else if (this.componentLookup.mail &&\n\t\t this.componentLookup.mail.length === 1) {\n\t\t\tthis.type = 'email';\n\t\t\tthis.email = this.componentLookup.mail[0].value;\n\n\t\t} else if (this.componentLookup.cn &&\n\t\t this.componentLookup.cn.length === 1) {\n\t\t\tthis.type = 'user';\n\t\t\tthis.uid = this.componentLookup.cn[0].value;\n\n\t\t} else {\n\t\t\tthis.type = 'unknown';\n\t\t}\n\t} else {\n\t\tthis.type = opts.type;\n\t\tif (this.type === 'host')\n\t\t\tthis.hostname = opts.hostname;\n\t\telse if (this.type === 'user')\n\t\t\tthis.uid = opts.uid;\n\t\telse if (this.type === 'email')\n\t\t\tthis.email = opts.email;\n\t\telse\n\t\t\tthrow (new Error('Unknown type ' + this.type));\n\t}\n}\n\nIdentity.prototype.toString = function () {\n\treturn (this.components.map(function (c) {\n\t\tvar n = c.name.toUpperCase();\n\t\t/*JSSTYLED*/\n\t\tn = n.replace(/=/g, '\\\\=');\n\t\tvar v = c.value;\n\t\t/*JSSTYLED*/\n\t\tv = v.replace(/,/g, '\\\\,');\n\t\treturn (n + '=' + v);\n\t}).join(', '));\n};\n\nIdentity.prototype.get = function (name, asArray) {\n\tassert.string(name, 'name');\n\tvar arr = this.componentLookup[name];\n\tif (arr === undefined || arr.length === 0)\n\t\treturn (undefined);\n\tif (!asArray && arr.length > 1)\n\t\tthrow (new Error('Multiple values for attribute ' + name));\n\tif (!asArray)\n\t\treturn (arr[0].value);\n\treturn (arr.map(function (c) {\n\t\treturn (c.value);\n\t}));\n};\n\nIdentity.prototype.toArray = function (idx) {\n\treturn (this.components.map(function (c) {\n\t\treturn ({\n\t\t\tname: c.name,\n\t\t\tvalue: c.value\n\t\t});\n\t}));\n};\n\n/*\n * These are from X.680 -- PrintableString allowed chars are in section 37.4\n * table 8. Spec for IA5Strings is \"1,6 + SPACE + DEL\" where 1 refers to\n * ISO IR #001 (standard ASCII control characters) and 6 refers to ISO IR #006\n * (the basic ASCII character set).\n */\n/* JSSTYLED */\nvar NOT_PRINTABLE = /[^a-zA-Z0-9 '(),+.\\/:=?-]/;\n/* JSSTYLED */\nvar NOT_IA5 = /[^\\x00-\\x7f]/;\n\nIdentity.prototype.toAsn1 = function (der, tag) {\n\tder.startSequence(tag);\n\tthis.components.forEach(function (c) {\n\t\tder.startSequence(asn1.Ber.Constructor | asn1.Ber.Set);\n\t\tder.startSequence();\n\t\tder.writeOID(c.oid);\n\t\t/*\n\t\t * If we fit in a PrintableString, use that. Otherwise use an\n\t\t * IA5String or UTF8String.\n\t\t *\n\t\t * If this identity was parsed from a DN, use the ASN.1 types\n\t\t * from the original representation (otherwise this might not\n\t\t * be a full match for the original in some validators).\n\t\t */\n\t\tif (c.asn1type === asn1.Ber.Utf8String ||\n\t\t c.value.match(NOT_IA5)) {\n\t\t\tvar v = Buffer.from(c.value, 'utf8');\n\t\t\tder.writeBuffer(v, asn1.Ber.Utf8String);\n\n\t\t} else if (c.asn1type === asn1.Ber.IA5String ||\n\t\t c.value.match(NOT_PRINTABLE)) {\n\t\t\tder.writeString(c.value, asn1.Ber.IA5String);\n\n\t\t} else {\n\t\t\tvar type = asn1.Ber.PrintableString;\n\t\t\tif (c.asn1type !== undefined)\n\t\t\t\ttype = c.asn1type;\n\t\t\tder.writeString(c.value, type);\n\t\t}\n\t\tder.endSequence();\n\t\tder.endSequence();\n\t});\n\tder.endSequence();\n};\n\nfunction globMatch(a, b) {\n\tif (a === '**' || b === '**')\n\t\treturn (true);\n\tvar aParts = a.split('.');\n\tvar bParts = b.split('.');\n\tif (aParts.length !== bParts.length)\n\t\treturn (false);\n\tfor (var i = 0; i < aParts.length; ++i) {\n\t\tif (aParts[i] === '*' || bParts[i] === '*')\n\t\t\tcontinue;\n\t\tif (aParts[i] !== bParts[i])\n\t\t\treturn (false);\n\t}\n\treturn (true);\n}\n\nIdentity.prototype.equals = function (other) {\n\tif (!Identity.isIdentity(other, [1, 0]))\n\t\treturn (false);\n\tif (other.components.length !== this.components.length)\n\t\treturn (false);\n\tfor (var i = 0; i < this.components.length; ++i) {\n\t\tif (this.components[i].oid !== other.components[i].oid)\n\t\t\treturn (false);\n\t\tif (!globMatch(this.components[i].value,\n\t\t other.components[i].value)) {\n\t\t\treturn (false);\n\t\t}\n\t}\n\treturn (true);\n};\n\nIdentity.forHost = function (hostname) {\n\tassert.string(hostname, 'hostname');\n\treturn (new Identity({\n\t\ttype: 'host',\n\t\thostname: hostname,\n\t\tcomponents: [ { name: 'cn', value: hostname } ]\n\t}));\n};\n\nIdentity.forUser = function (uid) {\n\tassert.string(uid, 'uid');\n\treturn (new Identity({\n\t\ttype: 'user',\n\t\tuid: uid,\n\t\tcomponents: [ { name: 'uid', value: uid } ]\n\t}));\n};\n\nIdentity.forEmail = function (email) {\n\tassert.string(email, 'email');\n\treturn (new Identity({\n\t\ttype: 'email',\n\t\temail: email,\n\t\tcomponents: [ { name: 'mail', value: email } ]\n\t}));\n};\n\nIdentity.parseDN = function (dn) {\n\tassert.string(dn, 'dn');\n\tvar parts = [''];\n\tvar idx = 0;\n\tvar rem = dn;\n\twhile (rem.length > 0) {\n\t\tvar m;\n\t\t/*JSSTYLED*/\n\t\tif ((m = /^,/.exec(rem)) !== null) {\n\t\t\tparts[++idx] = '';\n\t\t\trem = rem.slice(m[0].length);\n\t\t/*JSSTYLED*/\n\t\t} else if ((m = /^\\\\,/.exec(rem)) !== null) {\n\t\t\tparts[idx] += ',';\n\t\t\trem = rem.slice(m[0].length);\n\t\t/*JSSTYLED*/\n\t\t} else if ((m = /^\\\\./.exec(rem)) !== null) {\n\t\t\tparts[idx] += m[0];\n\t\t\trem = rem.slice(m[0].length);\n\t\t/*JSSTYLED*/\n\t\t} else if ((m = /^[^\\\\,]+/.exec(rem)) !== null) {\n\t\t\tparts[idx] += m[0];\n\t\t\trem = rem.slice(m[0].length);\n\t\t} else {\n\t\t\tthrow (new Error('Failed to parse DN'));\n\t\t}\n\t}\n\tvar cmps = parts.map(function (c) {\n\t\tc = c.trim();\n\t\tvar eqPos = c.indexOf('=');\n\t\twhile (eqPos > 0 && c.charAt(eqPos - 1) === '\\\\')\n\t\t\teqPos = c.indexOf('=', eqPos + 1);\n\t\tif (eqPos === -1) {\n\t\t\tthrow (new Error('Failed to parse DN'));\n\t\t}\n\t\t/*JSSTYLED*/\n\t\tvar name = c.slice(0, eqPos).toLowerCase().replace(/\\\\=/g, '=');\n\t\tvar value = c.slice(eqPos + 1);\n\t\treturn ({ name: name, value: value });\n\t});\n\treturn (new Identity({ components: cmps }));\n};\n\nIdentity.fromArray = function (components) {\n\tassert.arrayOfObject(components, 'components');\n\tcomponents.forEach(function (cmp) {\n\t\tassert.object(cmp, 'component');\n\t\tassert.string(cmp.name, 'component.name');\n\t\tif (!Buffer.isBuffer(cmp.value) &&\n\t\t !(typeof (cmp.value) === 'string')) {\n\t\t\tthrow (new Error('Invalid component value'));\n\t\t}\n\t});\n\treturn (new Identity({ components: components }));\n};\n\nIdentity.parseAsn1 = function (der, top) {\n\tvar components = [];\n\tder.readSequence(top);\n\tvar end = der.offset + der.length;\n\twhile (der.offset < end) {\n\t\tder.readSequence(asn1.Ber.Constructor | asn1.Ber.Set);\n\t\tvar after = der.offset + der.length;\n\t\tder.readSequence();\n\t\tvar oid = der.readOID();\n\t\tvar type = der.peek();\n\t\tvar value;\n\t\tswitch (type) {\n\t\tcase asn1.Ber.PrintableString:\n\t\tcase asn1.Ber.IA5String:\n\t\tcase asn1.Ber.OctetString:\n\t\tcase asn1.Ber.T61String:\n\t\t\tvalue = der.readString(type);\n\t\t\tbreak;\n\t\tcase asn1.Ber.Utf8String:\n\t\t\tvalue = der.readString(type, true);\n\t\t\tvalue = value.toString('utf8');\n\t\t\tbreak;\n\t\tcase asn1.Ber.CharacterString:\n\t\tcase asn1.Ber.BMPString:\n\t\t\tvalue = der.readString(type, true);\n\t\t\tvalue = value.toString('utf16le');\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow (new Error('Unknown asn1 type ' + type));\n\t\t}\n\t\tcomponents.push({ oid: oid, asn1type: type, value: value });\n\t\tder._offset = after;\n\t}\n\tder._offset = end;\n\treturn (new Identity({\n\t\tcomponents: components\n\t}));\n};\n\nIdentity.isIdentity = function (obj, ver) {\n\treturn (utils.isCompatible(obj, Identity, ver));\n};\n\n/*\n * API versions for Identity:\n * [1,0] -- initial ver\n */\nIdentity.prototype._sshpkApiVersion = [1, 0];\n\nIdentity._oldVersionDetect = function (obj) {\n\treturn ([1, 0]);\n};\n"]},"metadata":{},"sourceType":"script"}