diff --git a/README.md b/README.md index 65662c3..ede700c 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,10 @@ npm install -g ssh-to-jwk ssh-to-jwk ~/.ssh/id_rsa.pub ``` +```bash +ssh-to-jwk ~/.ssh/id_rsa +``` + # Usage You can also use it from JavaScript: @@ -61,10 +65,13 @@ You can also use it from JavaScript: ```js var fs = require('fs'); var sshtojwk = require('ssh-to-jwk'); +var ssh; -var pub = fs.readFileSync("./id_rsa.pub"); -var ssh = sshtojwk.parse({ pub: pub }); +ssh = sshtojwk.parse({ pub: fs.readFileSync("./id_rsa.pub") }); +console.info(ssh.jwk); +// For OpenSSH PEMs only, use Rasha for standard RSA or Eckles for standard EC +ssh = sshtojwk.parse({ pem: fs.readFileSync("./id_rsa") }); console.info(ssh.jwk); ``` diff --git a/bin/ssh-to-jwk.js b/bin/ssh-to-jwk.js index be056c2..de3aea3 100755 --- a/bin/ssh-to-jwk.js +++ b/bin/ssh-to-jwk.js @@ -6,17 +6,27 @@ var path = require('path'); var sshtojwk = require('../index.js'); var pubfile = process.argv[2]; +var pub = process.argv[3]; if (!pubfile) { pubfile = path.join(require('os').homedir(), '.ssh/id_rsa.pub'); } var buf = fs.readFileSync(pubfile); -var pub = buf.toString('ascii'); -var ssh = sshtojwk.parse({ pub: pub }); +var txt = buf.toString('ascii'); +var opts = { public: 'public' === pub }; +var ssh; + +if ('-' === txt[0]) { + opts.pem = txt; +} else { + opts.pub = txt; +} + +ssh = sshtojwk.parse(opts); // Finally! https://superuser.com/a/714195 -sshtojwk.fingerprint({ pub: pub }).then(function (fingerprint) { +sshtojwk.fingerprint(ssh).then(function (fingerprint) { console.warn('The key fingerprint is:\n' + fingerprint + ' ' + ssh.comment); console.info(JSON.stringify(ssh.jwk, null, 2)); }); diff --git a/lib/ssh-parser.js b/lib/ssh-parser.js index 3c18dfd..a9e464f 100644 --- a/lib/ssh-parser.js +++ b/lib/ssh-parser.js @@ -5,7 +5,7 @@ var Enc = require('./encoding.js'); var PEM = require('./pem.js'); SSH.parse = function (opts) { - var pub = opts.pub || opts; + var pub = opts.pem || opts.pub || opts; var ssh = SSH.parseBlock(pub); if ('OPENSSH PRIVATE KEY' === ssh.type) { ssh = SSH.parsePrivateElements(ssh); @@ -57,6 +57,7 @@ SSH.parsePrivateElements = function (ssh) { var index = 0; var padlen = 0; var len; + var pub; // The last byte will be either // * a non-printable pad character @@ -91,6 +92,7 @@ SSH.parsePrivateElements = function (ssh) { len = dv.getUint32(index, false); // throw away public key (it's in the private key) index += 4 + len; + pub = ssh.bytes.slice(index - len, index); // length of dummy checksum + private key + padding len = dv.getUint32(index, false) - padlen; @@ -105,6 +107,7 @@ SSH.parsePrivateElements = function (ssh) { // comment will exist, even if it's an empty string ssh.comment = Enc.bufToBin(ssh.elements.pop()); + ssh.bytes = pub; return ssh; }; SSH.parseElements = function (buf) { diff --git a/package.json b/package.json index 4833e7a..2d1c2a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ssh-to-jwk", - "version": "1.2.0", + "version": "1.2.1", "description": "💯 SSH to JWK in a lightweight, zero-dependency library.", "homepage": "https://git.coolaj86.com/coolaj86/ssh-to-jwk.js", "main": "index.js",