UNPKG

@ltonetwork/http-message-signatures

Version:

Implementation of the IETF HTTP Message Signatures draft standard

61 lines 2.79 kB
"use strict"; 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