75 lines
1.7 KiB
JavaScript
75 lines
1.7 KiB
JavaScript
|
/*!
|
||
|
* algorithms/rsa-util.js - RSA Utility Functions
|
||
|
*
|
||
|
* Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
|
||
|
*/
|
||
|
"use strict";
|
||
|
|
||
|
var clone = require("lodash/clone"),
|
||
|
forge = require("../deps/forge.js"),
|
||
|
util = require("../util");
|
||
|
|
||
|
// ### RSA-specific Helpers
|
||
|
function convertToForge(key, isPublic) {
|
||
|
var parts = isPublic ?
|
||
|
["n", "e"] :
|
||
|
["n", "e", "d", "p", "q", "dp", "dq", "qi"];
|
||
|
parts = parts.map(function(f) {
|
||
|
return new forge.jsbn.BigInteger(key[f].toString("hex"), 16);
|
||
|
});
|
||
|
|
||
|
var fn = isPublic ?
|
||
|
forge.pki.rsa.setPublicKey :
|
||
|
forge.pki.rsa.setPrivateKey;
|
||
|
return fn.apply(forge.pki.rsa, parts);
|
||
|
}
|
||
|
|
||
|
function convertToJWK(key, isPublic) {
|
||
|
var result = clone(key);
|
||
|
var parts = isPublic ?
|
||
|
["n", "e"] :
|
||
|
["n", "e", "d", "p", "q", "dp", "dq", "qi"];
|
||
|
parts.forEach(function(f) {
|
||
|
result[f] = util.base64url.encode(result[f]);
|
||
|
});
|
||
|
|
||
|
// remove potentially troublesome properties
|
||
|
delete result.key_ops;
|
||
|
delete result.use;
|
||
|
delete result.alg;
|
||
|
|
||
|
if (isPublic) {
|
||
|
delete result.d;
|
||
|
delete result.p;
|
||
|
delete result.q;
|
||
|
delete result.dp;
|
||
|
delete result.dq;
|
||
|
delete result.qi;
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
function convertToPem(key, isPublic) {
|
||
|
var cacheKey = isPublic ? "__cachedPublicPem" : "__cachedPrivatePem";
|
||
|
if (key[cacheKey]) {
|
||
|
return key[cacheKey];
|
||
|
}
|
||
|
|
||
|
var value;
|
||
|
if (isPublic) {
|
||
|
value = forge.pki.publicKeyToPem(convertToForge(key, isPublic));
|
||
|
} else {
|
||
|
value = forge.pki.privateKeyToPem(convertToForge(key, isPublic));
|
||
|
}
|
||
|
|
||
|
Object.defineProperty(key, cacheKey, { value: value });
|
||
|
return value;
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
convertToForge: convertToForge,
|
||
|
convertToJWK: convertToJWK,
|
||
|
convertToPem: convertToPem
|
||
|
};
|