UNPKG

@sphereon/oid4vc-common

Version:

OpenID 4 Verifiable Credentials Common

62 lines 2.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkExp = exports.decodeJwt = exports.decodeProtectedHeader = exports.isJwe = exports.isJws = exports.BASE64_URL_REGEX = exports.epochTime = exports.getNowSkewed = exports.parseJWT = void 0; const jwt_decode_1 = require("jwt-decode"); function parseJWT(jwt) { const header = (0, jwt_decode_1.jwtDecode)(jwt, { header: true }); const payload = (0, jwt_decode_1.jwtDecode)(jwt, { header: false }); if (!payload || !header) { throw new Error('Jwt Payload and/or Header could not be parsed'); } return { header, payload }; } exports.parseJWT = parseJWT; /** * The maximum allowed clock skew time in seconds. If an time based validation * is performed against current time (`now`), the validation can be of by the skew * time. * * See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.5 */ const DEFAULT_SKEW_TIME = 60; function getNowSkewed(now, skewTime) { const _now = now ? now : epochTime(); const _skewTime = skewTime ? skewTime : DEFAULT_SKEW_TIME; return { nowSkewedPast: _now - _skewTime, nowSkewedFuture: _now + _skewTime, }; } exports.getNowSkewed = getNowSkewed; /** * Returns the current unix timestamp in seconds. */ function epochTime() { return Math.floor(Date.now() / 1000); } exports.epochTime = epochTime; exports.BASE64_URL_REGEX = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/; const isJws = (jws) => { const jwsParts = jws.split('.'); return jwsParts.length === 3 && jwsParts.every((part) => exports.BASE64_URL_REGEX.test(part)); }; exports.isJws = isJws; const isJwe = (jwe) => { const jweParts = jwe.split('.'); return jweParts.length === 5 && jweParts.every((part) => exports.BASE64_URL_REGEX.test(part)); }; exports.isJwe = isJwe; const decodeProtectedHeader = (jwt) => { return (0, jwt_decode_1.jwtDecode)(jwt, { header: true }); }; exports.decodeProtectedHeader = decodeProtectedHeader; const decodeJwt = (jwt) => { return (0, jwt_decode_1.jwtDecode)(jwt, { header: false }); }; exports.decodeJwt = decodeJwt; const checkExp = (input) => { const { exp, now, clockSkew } = input; return exp < (now !== null && now !== void 0 ? now : Date.now() / 1000) - (clockSkew !== null && clockSkew !== void 0 ? clockSkew : 120); }; exports.checkExp = checkExp; //# sourceMappingURL=jwtUtils.js.map