@meeco/cryppo
Version:
In-browser encryption and decryption. Clone of Ruby Cryppo
50 lines • 2.17 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.signWithPrivateKey = signWithPrivateKey;
exports.loadRsaSignature = loadRsaSignature;
exports.verifyWithPublicKey = verifyWithPublicKey;
const node_forge_1 = __importDefault(require("node-forge"));
const util_js_1 = require("../util.js");
const { md, pki } = node_forge_1.default;
function signWithPrivateKey(privateKeyPem, data) {
const mdDigest = md.sha256.create();
const key = pki.privateKeyFromPem(privateKeyPem);
mdDigest.update((0, util_js_1.bytesToBinaryString)(data));
const signature = key.sign(mdDigest);
const keySize = (0, util_js_1.keyLengthFromPrivateKeyPem)(privateKeyPem);
const serialized = `Sign.Rsa${keySize}.${(0, util_js_1.encodeSafe64)(signature)}.${(0, util_js_1.encodeSafe64)((0, util_js_1.bytesToBinaryString)(data))}`;
return {
signature,
data,
keySize,
serialized,
};
}
function loadRsaSignature(serializedPayload) {
const decomposedPayload = serializedPayload.split('.');
const [signed, signingStrategy, encodedSignature, encodedData] = decomposedPayload;
const regex = /Rsa\d{1,4}/g;
if (signed === 'Sign' && regex.test(signingStrategy)) {
const bits = parseInt(signingStrategy.replace('Rsa', ''), 10);
const data = (0, util_js_1.decodeSafe64)(encodedData);
return {
serialized: serializedPayload,
signature: (0, util_js_1.decodeSafe64)(encodedSignature),
data: (0, util_js_1.binaryStringToBytes)(data),
keySize: bits,
};
}
else {
throw new Error('String is not a serialized RSA signature');
}
}
function verifyWithPublicKey(publicKeyPem, signatureObj) {
const key = pki.publicKeyFromPem(publicKeyPem);
const mdDigest = md.sha256.create();
mdDigest.update((0, util_js_1.bytesToBinaryString)(signatureObj.data));
return key.verify(mdDigest.digest().bytes(), signatureObj.signature);
}
//# sourceMappingURL=rsa-signature.js.map