trustbroker-client
Version:
Official Client SDK for the TrustBroker Data Exchange Platform.
65 lines • 2.34 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.canonicalizeBody = canonicalizeBody;
exports.toBuffer = toBuffer;
exports.delay = delay;
exports.signPayload = signPayload;
exports.verifySignature = verifySignature;
const crypto_1 = __importDefault(require("crypto"));
/**
* Canonicalizes an object for consistent cryptographic signing.
* Sorts keys recursively to ensure deterministic output.
*/
function canonicalizeBody(data) {
if (data === null || typeof data !== 'object')
return JSON.stringify(data);
if (Array.isArray(data))
return `[${data.map(canonicalizeBody).join(',')}]`;
const sortedKeys = Object.keys(data).sort();
const entries = sortedKeys.map((key) => {
return `"${key}":${canonicalizeBody(data[key])}`;
});
return `{${entries.join(',')}}`;
}
/**
* Convert any payload into a canonical Buffer.
* Uses sorted keys to ensure deterministic signature input.
*/
function toBuffer(payload) {
if (Buffer.isBuffer(payload))
return payload;
if (typeof payload === 'string')
return Buffer.from(payload, 'utf8');
const canonical = canonicalizeBody(payload);
return Buffer.from(canonical, 'utf8');
}
/** Simple async delay helper */
function delay(ms) {
return new Promise((res) => setTimeout(res, ms));
}
/**
* Signs a payload using a private key.
* Returns the Base64-encoded signature.
*/
function signPayload(payload, privateKeyPem) {
const canonical = JSON.stringify(payload, Object.keys(payload).sort());
const signer = crypto_1.default.createSign('RSA-SHA256');
signer.update(canonical);
signer.end();
return signer.sign(privateKeyPem, 'base64');
}
/**
* Verifies a payload's signature using a public key.
*/
function verifySignature(payload, signature, publicKey) {
const canonical = JSON.stringify(payload, Object.keys(payload).sort());
const verifier = crypto_1.default.createVerify('RSA-SHA256');
verifier.update(canonical);
verifier.end();
const publicKeyPem = Buffer.from(publicKey, 'base64').toString('utf8');
return verifier.verify(publicKeyPem, signature, 'base64');
}
//# sourceMappingURL=utilits.js.map