1 line
11 KiB
JSON
1 line
11 KiB
JSON
{"ast":null,"code":"// Copyright 2015 Joyent, Inc.\nmodule.exports = {\n read: read,\n write: write\n};\n\nvar assert = require('assert-plus');\n\nvar Buffer = require('safer-buffer').Buffer;\n\nvar rfc4253 = require('./rfc4253');\n\nvar utils = require('../utils');\n\nvar Key = require('../key');\n\nvar PrivateKey = require('../private-key');\n\nvar sshpriv = require('./ssh-private');\n/*JSSTYLED*/\n\n\nvar SSHKEY_RE = /^([a-z0-9-]+)[ \\t]+([a-zA-Z0-9+\\/]+[=]*)([ \\t]+([^ \\t][^\\n]*[\\n]*)?)?$/;\n/*JSSTYLED*/\n\nvar SSHKEY_RE2 = /^([a-z0-9-]+)[ \\t\\n]+([a-zA-Z0-9+\\/][a-zA-Z0-9+\\/ \\t\\n=]*)([^a-zA-Z0-9+\\/ \\t\\n=].*)?$/;\n\nfunction read(buf, options) {\n if (typeof buf !== 'string') {\n assert.buffer(buf, 'buf');\n buf = buf.toString('ascii');\n }\n\n var trimmed = buf.trim().replace(/[\\\\\\r]/g, '');\n var m = trimmed.match(SSHKEY_RE);\n if (!m) m = trimmed.match(SSHKEY_RE2);\n assert.ok(m, 'key must match regex');\n var type = rfc4253.algToKeyType(m[1]);\n var kbuf = Buffer.from(m[2], 'base64');\n /*\n * This is a bit tricky. If we managed to parse the key and locate the\n * key comment with the regex, then do a non-partial read and assert\n * that we have consumed all bytes. If we couldn't locate the key\n * comment, though, there may be whitespace shenanigans going on that\n * have conjoined the comment to the rest of the key. We do a partial\n * read in this case to try to make the best out of a sorry situation.\n */\n\n var key;\n var ret = {};\n\n if (m[4]) {\n try {\n key = rfc4253.read(kbuf);\n } catch (e) {\n m = trimmed.match(SSHKEY_RE2);\n assert.ok(m, 'key must match regex');\n kbuf = Buffer.from(m[2], 'base64');\n key = rfc4253.readInternal(ret, 'public', kbuf);\n }\n } else {\n key = rfc4253.readInternal(ret, 'public', kbuf);\n }\n\n assert.strictEqual(type, key.type);\n\n if (m[4] && m[4].length > 0) {\n key.comment = m[4];\n } else if (ret.consumed) {\n /*\n * Now the magic: trying to recover the key comment when it's\n * gotten conjoined to the key or otherwise shenanigan'd.\n *\n * Work out how much base64 we used, then drop all non-base64\n * chars from the beginning up to this point in the the string.\n * Then offset in this and try to make up for missing = chars.\n */\n var data = m[2] + (m[3] ? m[3] : '');\n var realOffset = Math.ceil(ret.consumed / 3) * 4;\n data = data.slice(0, realOffset - 2).\n /*JSSTYLED*/\n replace(/[^a-zA-Z0-9+\\/=]/g, '') + data.slice(realOffset - 2);\n var padding = ret.consumed % 3;\n if (padding > 0 && data.slice(realOffset - 1, realOffset) !== '=') realOffset--;\n\n while (data.slice(realOffset, realOffset + 1) === '=') realOffset++;\n /* Finally, grab what we think is the comment & clean it up. */\n\n\n var trailer = data.slice(realOffset);\n trailer = trailer.replace(/[\\r\\n]/g, ' ').replace(/^\\s+/, '');\n if (trailer.match(/^[a-zA-Z0-9]/)) key.comment = trailer;\n }\n\n return key;\n}\n\nfunction write(key, options) {\n assert.object(key);\n if (!Key.isKey(key)) throw new Error('Must be a public key');\n var parts = [];\n var alg = rfc4253.keyTypeToAlg(key);\n parts.push(alg);\n var buf = rfc4253.write(key);\n parts.push(buf.toString('base64'));\n if (key.comment) parts.push(key.comment);\n return Buffer.from(parts.join(' '));\n}","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/sshpk/lib/formats/ssh.js"],"names":["module","exports","read","write","assert","require","Buffer","rfc4253","utils","Key","PrivateKey","sshpriv","SSHKEY_RE","SSHKEY_RE2","buf","options","buffer","toString","trimmed","trim","replace","m","match","ok","type","algToKeyType","kbuf","from","key","ret","e","readInternal","strictEqual","length","comment","consumed","data","realOffset","Math","ceil","slice","padding","trailer","object","isKey","Error","parts","alg","keyTypeToAlg","push","join"],"mappings":"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","sourcesContent":["// Copyright 2015 Joyent, Inc.\n\nmodule.exports = {\n\tread: read,\n\twrite: write\n};\n\nvar assert = require('assert-plus');\nvar Buffer = require('safer-buffer').Buffer;\nvar rfc4253 = require('./rfc4253');\nvar utils = require('../utils');\nvar Key = require('../key');\nvar PrivateKey = require('../private-key');\n\nvar sshpriv = require('./ssh-private');\n\n/*JSSTYLED*/\nvar SSHKEY_RE = /^([a-z0-9-]+)[ \\t]+([a-zA-Z0-9+\\/]+[=]*)([ \\t]+([^ \\t][^\\n]*[\\n]*)?)?$/;\n/*JSSTYLED*/\nvar SSHKEY_RE2 = /^([a-z0-9-]+)[ \\t\\n]+([a-zA-Z0-9+\\/][a-zA-Z0-9+\\/ \\t\\n=]*)([^a-zA-Z0-9+\\/ \\t\\n=].*)?$/;\n\nfunction read(buf, options) {\n\tif (typeof (buf) !== 'string') {\n\t\tassert.buffer(buf, 'buf');\n\t\tbuf = buf.toString('ascii');\n\t}\n\n\tvar trimmed = buf.trim().replace(/[\\\\\\r]/g, '');\n\tvar m = trimmed.match(SSHKEY_RE);\n\tif (!m)\n\t\tm = trimmed.match(SSHKEY_RE2);\n\tassert.ok(m, 'key must match regex');\n\n\tvar type = rfc4253.algToKeyType(m[1]);\n\tvar kbuf = Buffer.from(m[2], 'base64');\n\n\t/*\n\t * This is a bit tricky. If we managed to parse the key and locate the\n\t * key comment with the regex, then do a non-partial read and assert\n\t * that we have consumed all bytes. If we couldn't locate the key\n\t * comment, though, there may be whitespace shenanigans going on that\n\t * have conjoined the comment to the rest of the key. We do a partial\n\t * read in this case to try to make the best out of a sorry situation.\n\t */\n\tvar key;\n\tvar ret = {};\n\tif (m[4]) {\n\t\ttry {\n\t\t\tkey = rfc4253.read(kbuf);\n\n\t\t} catch (e) {\n\t\t\tm = trimmed.match(SSHKEY_RE2);\n\t\t\tassert.ok(m, 'key must match regex');\n\t\t\tkbuf = Buffer.from(m[2], 'base64');\n\t\t\tkey = rfc4253.readInternal(ret, 'public', kbuf);\n\t\t}\n\t} else {\n\t\tkey = rfc4253.readInternal(ret, 'public', kbuf);\n\t}\n\n\tassert.strictEqual(type, key.type);\n\n\tif (m[4] && m[4].length > 0) {\n\t\tkey.comment = m[4];\n\n\t} else if (ret.consumed) {\n\t\t/*\n\t\t * Now the magic: trying to recover the key comment when it's\n\t\t * gotten conjoined to the key or otherwise shenanigan'd.\n\t\t *\n\t\t * Work out how much base64 we used, then drop all non-base64\n\t\t * chars from the beginning up to this point in the the string.\n\t\t * Then offset in this and try to make up for missing = chars.\n\t\t */\n\t\tvar data = m[2] + (m[3] ? m[3] : '');\n\t\tvar realOffset = Math.ceil(ret.consumed / 3) * 4;\n\t\tdata = data.slice(0, realOffset - 2). /*JSSTYLED*/\n\t\t replace(/[^a-zA-Z0-9+\\/=]/g, '') +\n\t\t data.slice(realOffset - 2);\n\n\t\tvar padding = ret.consumed % 3;\n\t\tif (padding > 0 &&\n\t\t data.slice(realOffset - 1, realOffset) !== '=')\n\t\t\trealOffset--;\n\t\twhile (data.slice(realOffset, realOffset + 1) === '=')\n\t\t\trealOffset++;\n\n\t\t/* Finally, grab what we think is the comment & clean it up. */\n\t\tvar trailer = data.slice(realOffset);\n\t\ttrailer = trailer.replace(/[\\r\\n]/g, ' ').\n\t\t replace(/^\\s+/, '');\n\t\tif (trailer.match(/^[a-zA-Z0-9]/))\n\t\t\tkey.comment = trailer;\n\t}\n\n\treturn (key);\n}\n\nfunction write(key, options) {\n\tassert.object(key);\n\tif (!Key.isKey(key))\n\t\tthrow (new Error('Must be a public key'));\n\n\tvar parts = [];\n\tvar alg = rfc4253.keyTypeToAlg(key);\n\tparts.push(alg);\n\n\tvar buf = rfc4253.write(key);\n\tparts.push(buf.toString('base64'));\n\n\tif (key.comment)\n\t\tparts.push(key.comment);\n\n\treturn (Buffer.from(parts.join(' ')));\n}\n"]},"metadata":{},"sourceType":"script"} |