89 lines
2.4 KiB
JavaScript
89 lines
2.4 KiB
JavaScript
|
/*!
|
||
|
* rsa-compat
|
||
|
* Copyright(c) 2016 AJ ONeal <aj@daplie.com> https://daplie.com
|
||
|
* Apache-2.0 OR MIT (and hence also MPL 2.0)
|
||
|
*/
|
||
|
'use strict';
|
||
|
var RSA = {};
|
||
|
var NOBJ = {};
|
||
|
|
||
|
function create(deps) {
|
||
|
var crypto = require('crypto');
|
||
|
|
||
|
deps = deps || {};
|
||
|
deps.NOBJ = {};
|
||
|
deps.RSA = RSA;
|
||
|
|
||
|
RSA.utils = require('./lib/key-utils.js');
|
||
|
|
||
|
RSA.utils._bytesToBuffer = function (bytes) {
|
||
|
var forge = require("node-forge");
|
||
|
return new Buffer(forge.util.bytesToHex(bytes), "hex");
|
||
|
};
|
||
|
RSA._internal = require('./lib/node').create(deps);
|
||
|
|
||
|
RSA.thumbprint = function (jwk) {
|
||
|
jwk = jwk.privateKeyJwk || jwk.publicKeyJwk || jwk;
|
||
|
if (!jwk.e || !jwk.n) {
|
||
|
throw new Error("You must provide an RSA jwk with 'e' and 'n' (the public components)");
|
||
|
}
|
||
|
var input = RSA.utils._bytesToBuffer('{"e":"'+ jwk.e + '","kty":"RSA","n":"'+ jwk.n +'"}');
|
||
|
return RSA.util.b64enc(crypto.createHash('sha256').update(input).digest());
|
||
|
};
|
||
|
|
||
|
RSA.generateKeypair = function (length, exponent, options, cb) {
|
||
|
var keypair = {
|
||
|
privateKeyPem: undefined
|
||
|
, publicKeyPem: undefined
|
||
|
, privateKeyJwk: undefined
|
||
|
, publicKeyJwk: undefined
|
||
|
, _ursa: undefined
|
||
|
, _forge: undefined
|
||
|
};
|
||
|
|
||
|
options = options || NOBJ;
|
||
|
|
||
|
RSA._internal.generateKeypair(length, exponent, options, function (keys) {
|
||
|
if (false !== options.jwk || options.thumbprint) {
|
||
|
keypair.privateKeyJwk = RSA._internal.exportPrivateJwk(keys);
|
||
|
if (options.public) {
|
||
|
keypair.publicKeyJwk = RSA._internal.exportPublicJwk(keys);
|
||
|
/*
|
||
|
return {
|
||
|
kty: keypair.privateKeyJwk.kty
|
||
|
, n: keypair.privateKeyJwk.n
|
||
|
, e: keypair.privateKeyJwk.e
|
||
|
};
|
||
|
*/
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (options.pem) {
|
||
|
keypair.privateKeyPem = RSA._internal.exportPrivatePem(keys);
|
||
|
if (options.public) {
|
||
|
keypair.publicKeyPem = RSA._internal.exportPublicPem(keys);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (options.thumprint) {
|
||
|
keypair.thumbprint = RSA.thumbprint(keypair.privateKeyJwk /*|| keypair.publicKeyJwk*/);
|
||
|
}
|
||
|
|
||
|
if (options.internal) {
|
||
|
//keypair._ursa = undefined;
|
||
|
//keypair._forge = undefined;
|
||
|
keypair._ursa = keys._ursa;
|
||
|
keypair._forge = keys._forge;
|
||
|
}
|
||
|
|
||
|
cb(null, keypair);
|
||
|
return;
|
||
|
});
|
||
|
};
|
||
|
|
||
|
return RSA;
|
||
|
}
|
||
|
|
||
|
module.exports.RSA = create(/*require('./lib/node')*/);
|
||
|
//module.exports.RSA.create = create;
|