'use strict'; var ursa = require('ursa'); function notToJson() { return undefined; } var ursac = module.exports = { // // to components // _privateJwkToComponents: function (jwk) { var components = []; [ 'n', 'e', 'p', 'q', 'dp', 'dq', 'qi', 'd' ].forEach(function (key) { components.push(new Buffer(jwk[key], 'base64')); }); return components; } , _publicJwkToComponents: function (jwk) { var components = []; [ 'n', 'e' ].forEach(function (key) { components.push(new Buffer(jwk[key], 'base64')); }); return components; } // // Generate New Keypair // , generateKeypair: function (bitlen, exp, options, cb) { var keypair = ursa.generatePrivateKey(bitlen || 2048, exp || 65537); keypair.toJSON = notToJson; cb(null, { _ursa: keypair }); } // // Export Public / Private PEMs // , exportPrivateKeyPem: function (keypair) { if (keypair.privateKeyPem) { return keypair.privateKeyPem; } if (keypair._ursa) { return keypair._ursa.toPrivatePem().toString('ascii'); } if (keypair.privateKeyJwk) { keypair._ursa = ursa.createPrivateKeyFromComponents.apply( ursa , ursac._privateJwkToComponents(keypair.privateKeyJwk) ); keypair._ursa.toJSON = notToJson; return keypair._ursa.toPrivatePem().toString('ascii'); } throw new Error("None of privateKeyPem, _ursa, or privateKeyJwk found. No way to export private key PEM"); } , exportPublicKeyPem: function (keypair) { if (keypair.publicKeyPem) { return keypair.publicKeyPem; } if (keypair._ursa || keypair._ursaPublic) { return (keypair._ursa || keypair._ursaPublic).toPublicPem().toString('ascii'); } if (keypair.publicKeyJwk) { keypair._ursaPublic = ursa.createPublicKeyFromComponents.apply( ursa , ursac._publicJwkToComponents(keypair.publicKeyJwk) ); keypair._ursaPublic.toJSON = notToJson; return keypair._ursa.toPublicPem().toString('ascii'); } if (keypair.privateKeyJwk) { keypair._ursa = ursa.createPrivateKeyFromComponents.apply( ursa , ursac._privateJwkToComponents(keypair.privateKeyJwk) ); keypair._ursa.toJSON = notToJson; return keypair._ursa.toPublicPem().toString('ascii'); } if (keypair.privateKeyPem) { keypair._ursa = ursa.createPrivateKey(keypair.privateKeyPem); keypair._ursa.toJSON = notToJson; return keypair._ursa.toPublicPem().toString('ascii'); } throw new Error("None of publicKeyPem, _ursa, publicKeyJwk, privateKeyPem, or privateKeyJwk found. No way to export public key PEM"); } //, exportPrivateKeyJwk: NOT IMPLEMENTED HERE //, exportPublicKeyJwk: NOT IMPLEMENTED HERE };