mirror of
https://github.com/hanzoai/jose.git
synced 2026-09-24 17:00:01 +00:00
52 lines
2.3 KiB
JavaScript
52 lines
2.3 KiB
JavaScript
import { JOSENotSupported, JWEInvalid, JWSInvalid } from '../util/errors.js';
|
|
export const JWS_RECOGNIZED = new Map([['b64', true]]);
|
|
export const JWE_RECOGNIZED = new Map();
|
|
export function validateAlgorithms(option, algorithms) {
|
|
if (algorithms !== undefined &&
|
|
(!Array.isArray(algorithms) || algorithms.some((s) => typeof s !== 'string'))) {
|
|
throw new TypeError(`"${option}" option must be an array of strings`);
|
|
}
|
|
if (!algorithms) {
|
|
return undefined;
|
|
}
|
|
return new Set(algorithms);
|
|
}
|
|
export function validateCritDuplicates(Err, protectedHeader) {
|
|
const { crit } = protectedHeader ?? {};
|
|
if (Array.isArray(crit) && new Set(crit).size !== crit.length) {
|
|
throw new Err('"crit" (Critical) Header Parameter MUST NOT contain duplicate values');
|
|
}
|
|
}
|
|
export function validateCrit(Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) {
|
|
if (joseHeader.crit !== undefined && protectedHeader?.crit === undefined) {
|
|
throw new Err('"crit" (Critical) Header Parameter MUST be integrity protected');
|
|
}
|
|
if (!protectedHeader || protectedHeader.crit === undefined) {
|
|
return new Set();
|
|
}
|
|
if (!Array.isArray(protectedHeader.crit) ||
|
|
protectedHeader.crit.length === 0 ||
|
|
protectedHeader.crit.some((input) => typeof input !== 'string' || input.length === 0)) {
|
|
throw new Err('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');
|
|
}
|
|
let recognized;
|
|
if (recognizedOption !== undefined) {
|
|
recognized = new Map([...Object.entries(recognizedOption), ...recognizedDefault.entries()]);
|
|
}
|
|
else {
|
|
recognized = recognizedDefault;
|
|
}
|
|
for (const parameter of protectedHeader.crit) {
|
|
if (!recognized.has(parameter)) {
|
|
throw new JOSENotSupported(`Extension Header Parameter "${parameter}" is not recognized`);
|
|
}
|
|
if (joseHeader[parameter] === undefined) {
|
|
throw new Err(`Extension Header Parameter "${parameter}" is missing`);
|
|
}
|
|
if (recognized.get(parameter) && protectedHeader[parameter] === undefined) {
|
|
throw new Err(`Extension Header Parameter "${parameter}" MUST be integrity protected`);
|
|
}
|
|
}
|
|
return new Set(protectedHeader.crit);
|
|
}
|