@ltonetwork/http-message-signatures
Version:
Implementation of the IETF HTTP Message Signatures draft standard
61 lines • 2.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseSignatureInputHeader = parseSignatureInputHeader;
exports.parseAcceptSignatureHeader = parseAcceptSignatureHeader;
exports.parseSignatureHeader = parseSignatureHeader;
const base64_1 = require("./base64");
function parseEntry(headerName, entry) {
const [key, value] = entry.split('=');
if (value === undefined)
return [key.trim(), true];
if (value.match(/^".*"$/))
return [key.trim(), value.slice(1, -1)];
if (value.match(/^\d+$/))
return [key.trim(), parseInt(value)];
if (value.match(/^\(.*\)$/)) {
const arr = value
.slice(1, -1)
.split(/\s+/)
.map((entry) => { var _a, _b; return (_b = (_a = entry.match(/^"(.*)"$/)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : parseInt(entry); });
if (arr.some((value) => typeof value === 'number' && isNaN(value))) {
throw new Error(`Invalid ${headerName} header. Invalid value ${key}=${value}`);
}
return [key.trim(), arr];
}
throw new Error(`Invalid ${headerName} header. Invalid value ${key}=${value}`);
}
function parseParametersHeader(name, header) {
const entries = header
.toString()
.match(/(?:[^;"]+|"[^"]+")+/g)
.map((entry) => parseEntry(name, entry.trim()));
const componentsIndex = entries.findIndex(([, value]) => Array.isArray(value));
if (componentsIndex === -1)
throw new Error(`Invalid ${name} header. Missing components`);
const [[key, components]] = entries.splice(componentsIndex, 1);
if (entries.some(([, value]) => Array.isArray(value))) {
throw new Error(`Multiple signatures is not supported`);
}
const parameters = Object.fromEntries(entries);
if (typeof parameters.created === 'number')
parameters.created = new Date(parameters.created * 1000);
if (typeof parameters.expires === 'number')
parameters.expires = new Date(parameters.expires * 1000);
return { key, components, parameters };
}
function parseSignatureInputHeader(header) {
return parseParametersHeader('Signature-Input', header);
}
function parseAcceptSignatureHeader(header) {
return parseParametersHeader('Accept-Signature', header);
}
function parseSignatureHeader(key, header) {
const signatureMatch = header.toString().match(/^([\w-]+)=:([A-Za-z0-9+/=]+):$/);
if (!signatureMatch)
throw new Error('Invalid Signature header');
const [, signatureKey, signature] = signatureMatch;
if (signatureKey !== key)
throw new Error(`Invalid Signature header. Key mismatch ${signatureKey} !== ${key}`);
return (0, base64_1.decode)(signature);
}
//# sourceMappingURL=parse.js.map