Skip to content

Instantly share code, notes, and snippets.

@melvincarvalho
Last active August 29, 2015 14:26
Show Gist options
  • Save melvincarvalho/90c97a8c57e4cac14b5d to your computer and use it in GitHub Desktop.
Save melvincarvalho/90c97a8c57e4cac14b5d to your computer and use it in GitHub Desktop.
convert openssh id_rsa.pub to modulus and exponent
#!/usr/bin/env node
// requires
var forge = require('node-forge');
var fs = require("fs");
// init
var sshpubkey = {};
var pubkey;
// process command line arguments : pubkeyFile
var argv = process.argv;
var pubkeyfile = argv[2];
// get pubkeyfile
var home = process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME'];
if (!pubkeyfile) {
pubkeyfile = home + '/.ssh/id_rsa.pub';
}
console.log('getting public key from : ' + pubkeyfile);
try {
pubkey = fs.readFileSync(pubkeyfile, "utf8");
} catch(e) {
console.log('could not load : ' + pubkeyfile);
process.exit(-1);
}
// get prefix
sshpubkey.prefix = pubkey.toString().split(' ')[0];
sshpubkey.mainkey = pubkey.toString().split(' ')[1];
sshpubkey.keybytes = forge.util.decode64(sshpubkey.mainkey);
sshpubkey.keyhex = forge.util.bytesToHex(sshpubkey.keybytes);
sshpubkey.byteslen = 4;
// type
//
//
sshpubkey.typelenstart = 0;
sshpubkey.typelenend = sshpubkey.typelenstart + sshpubkey.byteslen;
sshpubkey.typelenbytes = sshpubkey.keybytes.slice(sshpubkey.typelenstart, sshpubkey.typelenend);
sshpubkey.typelen = sshpubkey.typelenbytes.charCodeAt(sshpubkey.byteslen-1);
sshpubkey.typestart = sshpubkey.typelenend;
sshpubkey.typeend = sshpubkey.typestart + sshpubkey.typelen;
sshpubkey.typebytes = sshpubkey.keybytes.slice(sshpubkey.typestart, sshpubkey.typeend);
// exponent
//
//
sshpubkey.exponentlenstart = sshpubkey.typeend;
sshpubkey.exponentlenend = sshpubkey.exponentlenstart + sshpubkey.byteslen;
sshpubkey.exponentlenbytes = sshpubkey.keybytes.slice(sshpubkey.exponentlenstart, sshpubkey.exponentlenend);
sshpubkey.exponentlen = sshpubkey.exponentlenbytes.charCodeAt(sshpubkey.byteslen-1);
sshpubkey.exponentstart = sshpubkey.exponentlenend;
sshpubkey.exponentend = sshpubkey.exponentstart + sshpubkey.exponentlen;
sshpubkey.exponentbytes = sshpubkey.keybytes.slice(sshpubkey.exponentstart, sshpubkey.exponentend);
// modulus
//
//
sshpubkey.moduluslenstart = sshpubkey.exponentend;
sshpubkey.moduluslenend = sshpubkey.moduluslenstart + sshpubkey.byteslen;
sshpubkey.moduluslenbytes = sshpubkey.keybytes.slice(sshpubkey.moduluslenstart, sshpubkey.moduluslenend);
sshpubkey.moduluslen = 256*sshpubkey.moduluslenbytes.charCodeAt(sshpubkey.byteslen-2) + sshpubkey.moduluslenbytes.charCodeAt(sshpubkey.byteslen-1);
sshpubkey.modulusstart = sshpubkey.moduluslenend;
sshpubkey.modulusend = sshpubkey.modulusstart + sshpubkey.moduluslen;
sshpubkey.modulusbytes = sshpubkey.keybytes.slice(sshpubkey.modulusstart, sshpubkey.modulusend);
console.log(parseInt(forge.util.bytesToHex(sshpubkey.exponentbytes), 16));
console.log(forge.util.bytesToHex(sshpubkey.modulusbytes));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment