@owf/token-status-list 0.3.2 → 0.3.3-alpha-20260716073051
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +7 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.mjs +7 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -270,13 +270,16 @@ var StatusListCwt = class StatusListCwt {
|
|
|
270
270
|
this.protectedHeaders = options.protectedHeaders instanceof _owf_cose.ProtectedHeaders ? options.protectedHeaders : _owf_cose.ProtectedHeaders.create({ protectedHeaders: options.protectedHeaders });
|
|
271
271
|
this.unprotectedHeaders = options.unprotectedHeaders instanceof _owf_cose.UnprotectedHeaders ? options.unprotectedHeaders : _owf_cose.UnprotectedHeaders.create({ unprotectedHeaders: options.unprotectedHeaders });
|
|
272
272
|
this.signatureOrTag = options.signatureOrTag;
|
|
273
|
+
this.originalPayloadBytes = options.originalPayloadBytes;
|
|
273
274
|
if (this.protectedHeaders.headers.get(16) === void 0) this.protectedHeaders.headers.set(16, MediaTypes.StatusListCwt);
|
|
274
275
|
}
|
|
275
276
|
setStatusList(statusList) {
|
|
276
277
|
this.payload.setStatusList(statusList);
|
|
278
|
+
this.originalPayloadBytes = void 0;
|
|
277
279
|
}
|
|
278
280
|
updateStatusList(index, value) {
|
|
279
281
|
this.payload.statusList.setStatus(index, value);
|
|
282
|
+
this.originalPayloadBytes = void 0;
|
|
280
283
|
}
|
|
281
284
|
/**
|
|
282
285
|
*
|
|
@@ -302,7 +305,8 @@ var StatusListCwt = class StatusListCwt {
|
|
|
302
305
|
payload,
|
|
303
306
|
protectedHeaders: cwt.protectedHeaders,
|
|
304
307
|
unprotectedHeaders: cwt.unprotectedHeaders,
|
|
305
|
-
signatureOrTag: cwt.signatureOrTag
|
|
308
|
+
signatureOrTag: cwt.signatureOrTag,
|
|
309
|
+
originalPayloadBytes: new Uint8Array(cwt.payload)
|
|
306
310
|
});
|
|
307
311
|
}
|
|
308
312
|
async signAndEncode(options, ctx) {
|
|
@@ -332,7 +336,7 @@ var StatusListCwt = class StatusListCwt {
|
|
|
332
336
|
return await new _owf_cose.Cwt({
|
|
333
337
|
protectedHeaders: this.protectedHeaders,
|
|
334
338
|
unprotectedHeaders: this.unprotectedHeaders,
|
|
335
|
-
payload: this.payload.encode(),
|
|
339
|
+
payload: this.originalPayloadBytes ?? this.payload.encode(),
|
|
336
340
|
signature: this.signatureOrTag
|
|
337
341
|
}).verifySignature({ key }, ctx);
|
|
338
342
|
}
|
|
@@ -340,7 +344,7 @@ var StatusListCwt = class StatusListCwt {
|
|
|
340
344
|
return await new _owf_cose.Cwt({
|
|
341
345
|
protectedHeaders: this.protectedHeaders,
|
|
342
346
|
unprotectedHeaders: this.unprotectedHeaders,
|
|
343
|
-
payload: this.payload.encode(),
|
|
347
|
+
payload: this.originalPayloadBytes ?? this.payload.encode(),
|
|
344
348
|
tag: this.signatureOrTag
|
|
345
349
|
}).verifyAuthenticationCode({ key }, ctx);
|
|
346
350
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["IdentityException","z","zUint8Array","CborStructure","TypedMap","RegisteredCwtClaimKey","z","CborStructure","TypedMap","ProtectedHeaders","UnprotectedHeaders","Cwt","RegisteredCwtClaimKey","z","zUint8Array","CborStructure","TypedMap","base64url"],"sources":["../src/status-list-exception.ts","../src/status-list.ts","../src/cbor/status-list-cbor.ts","../src/types.ts","../src/cbor/status-list-cwt-payload.ts","../src/cbor/status-list-cwt.ts","../src/cbor/status-list-info.ts","../src/fetch-status-list.ts","../src/jwt-types.ts","../src/status-list-jwt.ts"],"sourcesContent":["import { IdentityException } from '@owf/identity-common'\n\n/**\n * SLException is a custom error class for Status List related exceptions.\n */\nexport class SLException extends IdentityException {\n constructor(message: string, details?: unknown) {\n super(message, details)\n Object.setPrototypeOf(this, SLException.prototype)\n this.name = 'SLException'\n }\n}\n","import { deflate, inflate } from 'pako'\nimport { SLException } from './status-list-exception'\nimport type { BitsPerStatus, StatusType } from './types'\n\n/**\n * StatusList is a class that manages a list of statuses with variable bit size.\n */\nexport class StatusList {\n private _statusList: Array<StatusType | number>\n private bitsPerStatus: BitsPerStatus\n public readonly totalStatuses: number\n public aggregationUri?: string\n\n constructor(statusList: number[], bitsPerStatus: BitsPerStatus, aggregationUri?: string) {\n if (![1, 2, 4, 8].includes(bitsPerStatus)) {\n throw new SLException('bitsPerStatus must be 1, 2, 4, or 8')\n }\n for (let i = 0; i < statusList.length; i++) {\n if (statusList[i] > 2 ** bitsPerStatus) {\n throw new SLException(`Status value out of range at index ${i} with value ${statusList[i]}`)\n }\n }\n this._statusList = statusList\n this.bitsPerStatus = bitsPerStatus\n this.totalStatuses = statusList.length\n this.aggregationUri = aggregationUri\n }\n\n /** Get the status list. */\n get statusList(): number[] {\n return this._statusList\n }\n\n /** Get the number of bits per status. */\n getBitsPerStatus(): BitsPerStatus {\n return this.bitsPerStatus\n }\n\n /** Get the status at a specific index. */\n getStatus(index: number): StatusType {\n if (index < 0 || index >= this.totalStatuses) {\n throw new Error('Index out of bounds')\n }\n return this._statusList[index]\n }\n\n /** Set the status at a specific index. */\n setStatus(index: number, value: StatusType | number): void {\n if (index < 0 || index >= this.totalStatuses) {\n throw new Error('Index out of bounds')\n }\n this._statusList[index] = value\n }\n\n /** Compress the status list and return as raw bytes. */\n compressStatusListToBytes(): Uint8Array {\n const byteArray = this.encodeStatusListIntoByteArray()\n return deflate(byteArray, { level: 9 })\n }\n\n /** Decompress a raw byte array and return a new StatusList instance. */\n static decompressStatusListFromBytes(\n compressed: Uint8Array,\n bitsPerStatus: BitsPerStatus,\n aggregationUri?: string\n ): StatusList {\n try {\n const decompressed = inflate(compressed)\n const statusList = StatusList.decodeStatusListFromByteArray(decompressed, bitsPerStatus)\n return new StatusList(statusList, bitsPerStatus, aggregationUri)\n } catch (err: unknown) {\n throw new Error(`Decompression failed: ${err}`)\n }\n }\n\n /** Encode the status list into a byte array. */\n public encodeStatusListIntoByteArray(): Uint8Array {\n const numBits = this.bitsPerStatus\n const numBytes = Math.ceil((this.totalStatuses * numBits) / 8)\n const byteArray = new Uint8Array(numBytes)\n let byteIndex = 0\n let bitIndex = 0\n let currentByte = ''\n for (let i = 0; i < this.totalStatuses; i++) {\n const status = this._statusList[i]\n currentByte = status.toString(2).padStart(numBits, '0') + currentByte\n bitIndex += numBits\n\n if (bitIndex >= 8 || i === this.totalStatuses - 1) {\n if (i === this.totalStatuses - 1 && bitIndex % 8 !== 0) {\n currentByte = currentByte.padStart(8, '0')\n }\n byteArray[byteIndex] = Number.parseInt(currentByte, 2)\n currentByte = ''\n bitIndex = 0\n byteIndex++\n }\n }\n\n return byteArray\n }\n\n /** Decode the byte array into a status list. */\n private static decodeStatusListFromByteArray(byteArray: Uint8Array, bitsPerStatus: BitsPerStatus): StatusType[] {\n const numBits = bitsPerStatus\n const totalStatuses = (byteArray.length * 8) / numBits\n const statusList = new Array<number>(totalStatuses)\n let bitIndex = 0\n for (let i = 0; i < totalStatuses; i++) {\n const byte = byteArray[Math.floor((i * numBits) / 8)]\n let byteString = byte.toString(2)\n if (byteString.length < 8) {\n byteString = '0'.repeat(8 - byteString.length) + byteString\n }\n const status = byteString.slice(bitIndex, bitIndex + numBits)\n const group = Math.floor(i / (8 / numBits))\n const indexInGroup = i % (8 / numBits)\n const position = group * (8 / numBits) + (8 / numBits + -1 - indexInGroup)\n statusList[position] = Number.parseInt(status, 2)\n bitIndex = (bitIndex + numBits) % 8\n }\n return statusList\n }\n}\n","import { CborStructure, TypedMap, typedMap, zUint8Array } from '@owf/cose'\nimport { z } from 'zod'\nimport { StatusList } from '../status-list'\nimport type { BitsPerStatus } from '../types'\n\nexport const statusListCborEncodedSchema = typedMap([\n ['bits', z.union([z.literal(1), z.literal(2), z.literal(4), z.literal(8)])],\n ['lst', zUint8Array],\n ['aggregation_uri', z.string().optional()],\n])\n\nexport const statusListCborDecodedSchema = z.instanceof(StatusList)\n\nexport type StatusListCborEncodedStructure = z.infer<typeof statusListCborEncodedSchema>\nexport type StatusListCborDecodedStructure = z.infer<typeof statusListCborDecodedSchema>\n\nexport type CreateStatusListCborOptions = {\n bits: BitsPerStatus\n list: Uint8Array | number[]\n aggregationUri?: string\n}\n\nexport type StatusListCborWithStatusListOptions = {\n statusList: StatusList\n}\n\nexport class StatusListCbor extends CborStructure<StatusListCborEncodedStructure, StatusListCborDecodedStructure> {\n public statusList = this.structure\n\n public static override get encodingSchema() {\n return z.codec(statusListCborEncodedSchema, statusListCborDecodedSchema, {\n encode: (statusList) => {\n return new TypedMap([\n ['bits', statusList.getBitsPerStatus()],\n ['lst', statusList.compressStatusListToBytes()],\n ['aggregation_uri', statusList.aggregationUri],\n ]) satisfies StatusListCborEncodedStructure\n },\n decode: (input) => {\n return StatusList.decompressStatusListFromBytes(\n input.get('lst'),\n input.get('bits'),\n input.get('aggregation_uri')\n )\n },\n })\n }\n\n public static create(options: CreateStatusListCborOptions | StatusListCborWithStatusListOptions) {\n const statusList =\n 'statusList' in options\n ? options.statusList\n : options.list instanceof Uint8Array\n ? StatusList.decompressStatusListFromBytes(options.list, options.bits, options.aggregationUri)\n : new StatusList(options.list, options.bits, options.aggregationUri)\n\n return new StatusListCbor(statusList)\n }\n}\n","// ==================== Common Types & Constants ====================\n\n/**\n * Status Type values as defined in the spec.\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-7\n */\nexport enum StatusType {\n /** The status of the Referenced Token is valid, correct or legal. */\n Valid = 0x00,\n /** The status of the Referenced Token is revoked, annulled, taken back, recalled or cancelled. */\n Invalid = 0x01,\n /** The status of the Referenced Token is temporarily invalid, hanging, debarred from privilege. */\n Suspended = 0x02,\n /** Application-specific status (0x03). */\n ApplicationSpecific3 = 0x03,\n /** Application-specific status range start (0x0C). */\n ApplicationSpecificRangeStart = 0x0c,\n /** Application-specific status range end (0x0F). */\n ApplicationSpecificRangeEnd = 0x0f,\n}\n\n/**\n * Media types for Status List Tokens\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-14.7\n */\nexport const MediaTypes = {\n /** Media type for JWT-based Status List Token */\n StatusListJwt: 'application/statuslist+jwt',\n /** Media type for CWT-based Status List Token */\n StatusListCwt: 'application/statuslist+cwt',\n} as const\n\n/**\n * BitsPerStatus type.\n */\nexport type BitsPerStatus = 1 | 2 | 4 | 8\n\n/**\n * Reference to a status list entry.\n */\nexport interface StatusListEntry {\n idx: number\n uri: string\n}\n","import { CborStructure, RegisteredCwtClaimKey, TypedMap, typedMap } from '@owf/cose'\nimport z from 'zod'\nimport type { StatusList } from '../status-list'\nimport { StatusListCbor, type StatusListCborEncodedStructure } from './status-list-cbor'\n\nexport enum StatusListCwtClaimKey {\n TimeToLive = 65534,\n StatusList = 65533,\n}\n\nconst statusListCwtPayloadSchema = typedMap(\n [\n [RegisteredCwtClaimKey.Subject, z.string()],\n [RegisteredCwtClaimKey.IssuedAt, z.number()],\n [RegisteredCwtClaimKey.ExpirationTime, z.number().exactOptional()],\n [StatusListCwtClaimKey.TimeToLive, z.number().exactOptional()],\n [StatusListCwtClaimKey.StatusList, z.instanceof(StatusListCbor)],\n ],\n { allowAdditionalKeys: true }\n)\n\nexport type StatusListCwtPayloadEncodedStructure = z.infer<typeof statusListCwtPayloadSchema>\nexport type StatusListCwtPayloadDecodedStructure = z.infer<typeof statusListCwtPayloadSchema>\n\nexport type CreateStatusListCwtPayloadOptions = {\n subject: string\n statusList: StatusListCbor | StatusList\n issuedAt?: Date\n expirationTime?: Date\n timeToLive?: number\n additionalClaims?: Map<number | string, unknown>\n}\n\nexport class StatusListCwtPayload extends CborStructure<\n StatusListCwtPayloadEncodedStructure,\n StatusListCwtPayloadDecodedStructure\n> {\n public static override get encodingSchema() {\n return z.codec(statusListCwtPayloadSchema.in, statusListCwtPayloadSchema.out, {\n decode: (input) => {\n const map: StatusListCwtPayloadDecodedStructure = TypedMap.fromMap(input)\n\n map.set(\n StatusListCwtClaimKey.StatusList,\n StatusListCbor.fromEncodedStructure(\n input.get(StatusListCwtClaimKey.StatusList) as StatusListCborEncodedStructure\n )\n )\n\n return map\n },\n encode: (output) => {\n const map = output.toMap() as Map<unknown, unknown>\n map.set(StatusListCwtClaimKey.StatusList, output.get(StatusListCwtClaimKey.StatusList).encodedStructure)\n return map\n },\n })\n }\n\n public static create(options: CreateStatusListCwtPayloadOptions) {\n const map = new TypedMap([\n [RegisteredCwtClaimKey.Subject, options.subject],\n [RegisteredCwtClaimKey.IssuedAt, Math.floor((options.issuedAt?.getTime() ?? Date.now()) / 1000)],\n [\n StatusListCwtClaimKey.StatusList,\n options.statusList instanceof StatusListCbor\n ? options.statusList\n : StatusListCbor.create({ statusList: options.statusList }),\n ],\n ...(options.additionalClaims ?? new Map()).entries(),\n ]) satisfies StatusListCwtPayloadEncodedStructure\n\n if (options.expirationTime) {\n map.set(RegisteredCwtClaimKey.ExpirationTime, Math.floor(options.expirationTime.getTime() / 1000))\n }\n\n if (options.timeToLive) {\n map.set(StatusListCwtClaimKey.TimeToLive, options.timeToLive)\n }\n\n return new StatusListCwtPayload(statusListCwtPayloadSchema.parse(map.toMap()))\n }\n\n public get subject() {\n return this.structure.get(RegisteredCwtClaimKey.Subject)\n }\n\n public get issuedAt() {\n return new Date(this.structure.get(RegisteredCwtClaimKey.IssuedAt) * 1000)\n }\n\n public get expirationTime() {\n return this.structure.has(RegisteredCwtClaimKey.ExpirationTime)\n ? // biome-ignore lint/style/noNonNullAssertion: checked with `has` in the line above\n new Date(this.structure.get(RegisteredCwtClaimKey.ExpirationTime)! * 1000)\n : undefined\n }\n\n public get timeToLive() {\n return this.structure.get(StatusListCwtClaimKey.TimeToLive)\n }\n\n public get statusList() {\n return this.structure.get(StatusListCwtClaimKey.StatusList).statusList\n }\n\n public getCustomClaim<ClaimType = unknown>(key: number) {\n return this.structure.get(key) as ClaimType | unknown\n }\n\n public setStatusList(statusList: StatusList | StatusListCbor) {\n this.structure.set(\n StatusListCwtClaimKey.StatusList,\n statusList instanceof StatusListCbor ? statusList : StatusListCbor.create({ statusList })\n )\n }\n}\n","import {\n type CoseKey,\n Cwt,\n type Mac0Context,\n type ProtectedHeaderOptions,\n ProtectedHeaders,\n RegisteredCwtClaimKey,\n type Sign1Context,\n type SignatureAlgorithm,\n type UnprotectedHeaderOptions,\n UnprotectedHeaders,\n} from '@owf/cose'\nimport { StatusList } from '../status-list'\nimport { SLException } from '../status-list-exception'\nimport { type BitsPerStatus, MediaTypes, StatusType } from '../types'\nimport { StatusListCbor } from './status-list-cbor'\nimport { type CreateStatusListCwtPayloadOptions, StatusListCwtPayload } from './status-list-cwt-payload'\n\nexport type StatusListCwtOptions = {\n payload: StatusListCwtPayload | CreateStatusListCwtPayloadOptions\n protectedHeaders?: ProtectedHeaders | ProtectedHeaderOptions['protectedHeaders']\n unprotectedHeaders?: UnprotectedHeaders | UnprotectedHeaderOptions['unprotectedHeaders']\n signatureOrTag?: Uint8Array\n}\n\nexport enum StatusListCwtHeaderKey {\n Typ = 16,\n}\n\nexport class StatusListCwt {\n public payload: StatusListCwtPayload\n public protectedHeaders?: ProtectedHeaders\n public unprotectedHeaders?: UnprotectedHeaders\n private signatureOrTag?: Uint8Array\n\n public constructor(options: StatusListCwtOptions) {\n this.payload =\n options.payload instanceof StatusListCwtPayload ? options.payload : StatusListCwtPayload.create(options.payload)\n this.protectedHeaders =\n options.protectedHeaders instanceof ProtectedHeaders\n ? options.protectedHeaders\n : ProtectedHeaders.create({ protectedHeaders: options.protectedHeaders })\n this.unprotectedHeaders =\n options.unprotectedHeaders instanceof UnprotectedHeaders\n ? options.unprotectedHeaders\n : UnprotectedHeaders.create({ unprotectedHeaders: options.unprotectedHeaders })\n\n this.signatureOrTag = options.signatureOrTag\n\n if (this.protectedHeaders.headers.get(StatusListCwtHeaderKey.Typ) === undefined) {\n this.protectedHeaders.headers.set(StatusListCwtHeaderKey.Typ, MediaTypes.StatusListCwt)\n }\n }\n\n public setStatusList(statusList: StatusList | StatusListCbor) {\n this.payload.setStatusList(statusList)\n }\n\n public updateStatusList(index: number, value: number) {\n this.payload.statusList.setStatus(index, value)\n }\n\n /**\n *\n * Create a minimal status list cwt. If you want to configure more options, like additional claims, use the constructor method\n *\n */\n public static createFromStatusListAndSubject(\n statusList:\n | StatusList\n | StatusListCbor\n | { statusList: number[]; bitsPerStatus: BitsPerStatus; aggregationUri?: string },\n subject: string\n ) {\n const cborStatusList =\n statusList instanceof StatusListCbor\n ? statusList\n : statusList instanceof StatusList\n ? StatusListCbor.create({ statusList })\n : StatusListCbor.create({\n bits: statusList.bitsPerStatus,\n list: statusList.statusList,\n aggregationUri: statusList.aggregationUri,\n })\n\n return new StatusListCwt({ payload: StatusListCwtPayload.create({ statusList: cborStatusList, subject }) })\n }\n\n public static fromToken(token: Uint8Array) {\n const cwt = Cwt.fromToken(token)\n\n if (!cwt.payload) {\n throw new SLException('Cwt does not contain payload, detached payload is not supported for status list CWT')\n }\n const payload = StatusListCwtPayload.decode(cwt.payload)\n\n return new StatusListCwt({\n payload,\n protectedHeaders: cwt.protectedHeaders,\n unprotectedHeaders: cwt.unprotectedHeaders,\n signatureOrTag: cwt.signatureOrTag,\n })\n }\n\n public async signAndEncode(\n options: {\n signingKey: CoseKey\n algorithm?: SignatureAlgorithm\n },\n ctx: Pick<Sign1Context, 'sign'>\n ) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.payload.encode(),\n })\n return (await cwt.asSign1.sign(options, ctx)).encode()\n }\n\n public async authenticateAndEncode(options: { key: CoseKey }, ctx: Pick<Mac0Context, 'authenticate'>) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.payload.encode(),\n })\n return (await cwt.asMac0.authenticate(options, ctx)).encode()\n }\n\n /**\n * @todo add check for `ttl` claim\n */\n public verifyStatus({\n idx,\n uri,\n checkFreshness = true,\n now = new Date(),\n }: {\n idx: number\n uri: string\n checkFreshness?: boolean\n now?: Date\n }) {\n if (this.payload.expirationTime && this.payload.expirationTime < now) {\n throw new SLException(\n `The expiration claim (${RegisteredCwtClaimKey.ExpirationTime}) '${this.payload.expirationTime}' is in the past (compared to '${now}'), and therefore not valid`\n )\n }\n if (this.payload.subject !== uri) {\n throw new SLException(\n `The subject claim (${RegisteredCwtClaimKey.Subject}) '${this.payload.subject}' must be equal to the uri '${uri}'`\n )\n }\n if (checkFreshness && this.payload.issuedAt > now) {\n throw new SLException(\n `The issued at claim (${RegisteredCwtClaimKey.IssuedAt}) '${this.payload.issuedAt}' is in the future (compared to '${now}'), and therefore not valid`\n )\n }\n if (this.payload.statusList.getStatus(idx) !== StatusType.Valid) {\n throw new SLException(\n `Status for id '${idx}' is not Valid (${StatusType.Valid}), but is instead '${this.payload.statusList.getStatus(idx)}'`\n )\n }\n }\n\n public async verifySignature({ key }: { key: CoseKey }, ctx: Pick<Sign1Context, 'verify'>) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.payload.encode(),\n signature: this.signatureOrTag,\n })\n\n return await cwt.verifySignature({ key }, ctx)\n }\n\n public async verifyAuthenticationCode({ key }: { key: CoseKey }, ctx: Pick<Mac0Context, 'verify'>) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.payload.encode(),\n tag: this.signatureOrTag,\n })\n\n return await cwt.verifyAuthenticationCode({ key }, ctx)\n }\n}\n","import { CborStructure, TypedMap, typedMap, zUint8Array } from '@owf/cose'\nimport { z } from 'zod'\n\n/**\n * StatusListInfo carries a reference to an IETF Token Status List\n * (draft-ietf-oauth-status-list) entry from inside the MSO's Status structure.\n *\n * Defined in ISO/IEC 18013-5 second edition (CD), 12.3.6.\n */\n// NOTE: idx is `uint` in the spec (unbounded CBOR uint). We constrain to JS\n// safe-integer range here, which is more than enough for real-world status\n// list sizes (Number.MAX_SAFE_INTEGER is ~9 × 10^15).\nconst statusListInfoSchema = typedMap([\n ['uri', z.string()],\n ['idx', z.number().int().nonnegative()],\n ['certificate', zUint8Array.exactOptional()],\n])\n\nexport type StatusListInfoDecodedStructure = z.output<typeof statusListInfoSchema>\nexport type StatusListInfoEncodedStructure = z.input<typeof statusListInfoSchema>\n\nexport type StatusListInfoOptions = {\n uri: string\n idx: number\n certificate?: Uint8Array\n}\n\nexport class StatusListInfo extends CborStructure<StatusListInfoEncodedStructure, StatusListInfoDecodedStructure> {\n public static override get encodingSchema() {\n return statusListInfoSchema\n }\n\n public get uri() {\n return this.structure.get('uri')\n }\n\n public get idx() {\n return this.structure.get('idx')\n }\n\n public get certificate() {\n return this.structure.get('certificate')\n }\n\n public static create(options: StatusListInfoOptions): StatusListInfo {\n const map: StatusListInfoDecodedStructure = new TypedMap([\n ['uri', options.uri],\n ['idx', options.idx],\n ])\n if (options.certificate) {\n map.set('certificate', options.certificate)\n }\n return StatusListInfo.fromDecodedStructure(map)\n }\n}\n","import { SLException } from './status-list-exception'\nimport { MediaTypes } from './types'\n\nexport const fetchStatusList = async ({\n uri,\n customFetcher = fetch,\n acceptedFormats = ['jwt', 'cwt'],\n}: {\n uri: string\n /**\n *\n * If none is supplied either can be returned\n *\n */\n acceptedFormats?: Array<'cwt' | 'jwt'>\n customFetcher?: typeof fetch\n}): Promise<string | Uint8Array> => {\n try {\n if (acceptedFormats.length === 0) {\n throw new SLException(`At least one accepted format (cwt, jwt) needs to be provided`)\n }\n\n const acceptHeaders = acceptedFormats.map((format) =>\n format === 'jwt' ? MediaTypes.StatusListJwt : MediaTypes.StatusListCwt\n )\n\n const response = await customFetcher(uri, {\n headers: {\n Accept: acceptHeaders.join(','),\n },\n })\n\n if (response.status > 399 || response.status <= 199) {\n throw new Error(`Could not fetch status list, response status '${response.status}'`)\n }\n\n const contentType = response.headers.get('Content-type')\n if (contentType === MediaTypes.StatusListJwt) {\n return await response.text()\n } else if (contentType === MediaTypes.StatusListCwt) {\n return await (await response.blob()).bytes()\n }\n\n throw new SLException('Content type was either not provided in the response or invalid.')\n } catch (e) {\n throw new SLException(`Could not fetch either a JWT or CWT as status list. ${(e as Error).message}`)\n }\n}\n","import type { JwtPayload } from '@owf/identity-common'\nimport type { BitsPerStatus, StatusListEntry } from './types'\n\n// ==================== JWT Types & Constants ====================\n\n/**\n * JWT type header value for Status List Token\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-5.1\n */\nexport const JWT_STATUS_LIST_TYPE = 'statuslist+jwt'\n\n/**\n * JWT claim names for Status List\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-14.1\n */\nexport const JWTClaimNames = {\n STATUS: 'status',\n STATUS_LIST: 'status_list',\n TTL: 'ttl',\n IDX: 'idx',\n URI: 'uri',\n BITS: 'bits',\n LST: 'lst',\n AGGREGATION_URI: 'aggregation_uri',\n} as const\n\n/**\n * Payload for a JWT with a status reference.\n */\nexport interface JWTwithStatusListPayload extends JwtPayload {\n status: {\n status_list: StatusListEntry\n }\n}\n\n/**\n * Payload for a Status List JWT.\n */\nexport interface StatusListJWTPayload extends JwtPayload {\n ttl?: number\n status_list: {\n bits: BitsPerStatus\n lst: string\n }\n}\n\n/**\n * Header parameters for a JWT Status List Token.\n */\nexport type StatusListJWTHeaderParameters = {\n alg: string\n typ: typeof JWT_STATUS_LIST_TYPE\n [key: string]: unknown\n}\n","import type { JwtPayload } from '@owf/identity-common'\nimport { base64url, bytesToString } from '@owf/identity-common'\nimport type { JWTwithStatusListPayload, StatusListJWTHeaderParameters, StatusListJWTPayload } from './jwt-types'\nimport { JWT_STATUS_LIST_TYPE } from './jwt-types'\nimport { StatusList } from './status-list'\nimport { SLException } from './status-list-exception'\nimport { type StatusListEntry, StatusType } from './types'\n\n/**\n * Decode a JWT and return the payload.\n * @param jwt JWT token in compact JWS serialization.\n */\nfunction decodeJwtPayload<T>(jwt: string): T {\n const parts = jwt.split('.')\n return JSON.parse(bytesToString(base64url.decode(parts[1])))\n}\n\n/**\n * Adds the status list to the payload and header of a JWT.\n */\nexport function createHeaderAndPayload(list: StatusList, payload: JwtPayload, header: StatusListJWTHeaderParameters) {\n if (!payload.sub) {\n throw new SLException('sub field is required')\n }\n if (!payload.iat) {\n throw new SLException('iat field is required')\n }\n\n header.typ = JWT_STATUS_LIST_TYPE\n payload.status_list = {\n bits: list.getBitsPerStatus(),\n lst: base64url.encode(list.compressStatusListToBytes()),\n }\n return { header, payload }\n}\n\n/**\n * Get the status list from a JWT, but do not verify the signature.\n */\nexport function getListFromStatusListJWT(jwt: string): StatusList {\n const payload = decodeJwtPayload<StatusListJWTPayload>(jwt)\n const statusList = payload.status_list\n const compressed = base64url.decode(statusList.lst)\n return StatusList.decompressStatusListFromBytes(compressed, statusList.bits)\n}\n\n/**\n * Get the status list entry from a JWT, but do not verify the signature.\n */\nexport function getStatusListFromJWT(jwt: string): StatusListEntry {\n const payload = decodeJwtPayload<JWTwithStatusListPayload>(jwt)\n return payload.status.status_list\n}\n\n/**\n * Verify the status of an `idx` in a `token`\n *\n * @todo properly validate the JWT with zod + signature\n */\nexport function verifyStatus({\n uri,\n idx,\n token,\n checkFreshness = true,\n now = new Date(),\n}: {\n token: string\n idx: number\n uri: string\n checkFreshness?: boolean\n now?: Date\n}) {\n const payload = decodeJwtPayload<StatusListJWTPayload>(token)\n const compressed = base64url.decode(payload.status_list.lst)\n const statusList = StatusList.decompressStatusListFromBytes(compressed, payload.status_list.bits)\n if (payload.subject !== uri) {\n throw new SLException(`The subject claim '${payload.subject}' must be equal to the uri '${uri}'`)\n }\n if (checkFreshness && payload.iat && payload.iat > Math.floor(now.getTime() / 1000)) {\n throw new SLException(\n `The issued at claim '${payload.issuedAt}' is in the future (compared to '${now}'), and therefore not valid`\n )\n }\n if (payload.exp && payload.exp < Math.floor(now.getTime() / 1000)) {\n throw new SLException(\n `The expiry claim '${payload.exp}' is in the past (compared to '${now}'), and therefore not valid`\n )\n }\n if (statusList.getStatus(idx) !== StatusType.Valid) {\n throw new SLException(\n `Status for id '${idx}' is not Valid (${StatusType.Valid}), but is instead '${statusList.getStatus(idx)}'`\n )\n }\n return true\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["IdentityException","z","zUint8Array","CborStructure","TypedMap","RegisteredCwtClaimKey","z","CborStructure","TypedMap","ProtectedHeaders","UnprotectedHeaders","Cwt","RegisteredCwtClaimKey","z","zUint8Array","CborStructure","TypedMap","base64url"],"sources":["../src/status-list-exception.ts","../src/status-list.ts","../src/cbor/status-list-cbor.ts","../src/types.ts","../src/cbor/status-list-cwt-payload.ts","../src/cbor/status-list-cwt.ts","../src/cbor/status-list-info.ts","../src/fetch-status-list.ts","../src/jwt-types.ts","../src/status-list-jwt.ts"],"sourcesContent":["import { IdentityException } from '@owf/identity-common'\n\n/**\n * SLException is a custom error class for Status List related exceptions.\n */\nexport class SLException extends IdentityException {\n constructor(message: string, details?: unknown) {\n super(message, details)\n Object.setPrototypeOf(this, SLException.prototype)\n this.name = 'SLException'\n }\n}\n","import { deflate, inflate } from 'pako'\nimport { SLException } from './status-list-exception'\nimport type { BitsPerStatus, StatusType } from './types'\n\n/**\n * StatusList is a class that manages a list of statuses with variable bit size.\n */\nexport class StatusList {\n private _statusList: Array<StatusType | number>\n private bitsPerStatus: BitsPerStatus\n public readonly totalStatuses: number\n public aggregationUri?: string\n\n constructor(statusList: number[], bitsPerStatus: BitsPerStatus, aggregationUri?: string) {\n if (![1, 2, 4, 8].includes(bitsPerStatus)) {\n throw new SLException('bitsPerStatus must be 1, 2, 4, or 8')\n }\n for (let i = 0; i < statusList.length; i++) {\n if (statusList[i] > 2 ** bitsPerStatus) {\n throw new SLException(`Status value out of range at index ${i} with value ${statusList[i]}`)\n }\n }\n this._statusList = statusList\n this.bitsPerStatus = bitsPerStatus\n this.totalStatuses = statusList.length\n this.aggregationUri = aggregationUri\n }\n\n /** Get the status list. */\n get statusList(): number[] {\n return this._statusList\n }\n\n /** Get the number of bits per status. */\n getBitsPerStatus(): BitsPerStatus {\n return this.bitsPerStatus\n }\n\n /** Get the status at a specific index. */\n getStatus(index: number): StatusType {\n if (index < 0 || index >= this.totalStatuses) {\n throw new Error('Index out of bounds')\n }\n return this._statusList[index]\n }\n\n /** Set the status at a specific index. */\n setStatus(index: number, value: StatusType | number): void {\n if (index < 0 || index >= this.totalStatuses) {\n throw new Error('Index out of bounds')\n }\n this._statusList[index] = value\n }\n\n /** Compress the status list and return as raw bytes. */\n compressStatusListToBytes(): Uint8Array {\n const byteArray = this.encodeStatusListIntoByteArray()\n return deflate(byteArray, { level: 9 })\n }\n\n /** Decompress a raw byte array and return a new StatusList instance. */\n static decompressStatusListFromBytes(\n compressed: Uint8Array,\n bitsPerStatus: BitsPerStatus,\n aggregationUri?: string\n ): StatusList {\n try {\n const decompressed = inflate(compressed)\n const statusList = StatusList.decodeStatusListFromByteArray(decompressed, bitsPerStatus)\n return new StatusList(statusList, bitsPerStatus, aggregationUri)\n } catch (err: unknown) {\n throw new Error(`Decompression failed: ${err}`)\n }\n }\n\n /** Encode the status list into a byte array. */\n public encodeStatusListIntoByteArray(): Uint8Array {\n const numBits = this.bitsPerStatus\n const numBytes = Math.ceil((this.totalStatuses * numBits) / 8)\n const byteArray = new Uint8Array(numBytes)\n let byteIndex = 0\n let bitIndex = 0\n let currentByte = ''\n for (let i = 0; i < this.totalStatuses; i++) {\n const status = this._statusList[i]\n currentByte = status.toString(2).padStart(numBits, '0') + currentByte\n bitIndex += numBits\n\n if (bitIndex >= 8 || i === this.totalStatuses - 1) {\n if (i === this.totalStatuses - 1 && bitIndex % 8 !== 0) {\n currentByte = currentByte.padStart(8, '0')\n }\n byteArray[byteIndex] = Number.parseInt(currentByte, 2)\n currentByte = ''\n bitIndex = 0\n byteIndex++\n }\n }\n\n return byteArray\n }\n\n /** Decode the byte array into a status list. */\n private static decodeStatusListFromByteArray(byteArray: Uint8Array, bitsPerStatus: BitsPerStatus): StatusType[] {\n const numBits = bitsPerStatus\n const totalStatuses = (byteArray.length * 8) / numBits\n const statusList = new Array<number>(totalStatuses)\n let bitIndex = 0\n for (let i = 0; i < totalStatuses; i++) {\n const byte = byteArray[Math.floor((i * numBits) / 8)]\n let byteString = byte.toString(2)\n if (byteString.length < 8) {\n byteString = '0'.repeat(8 - byteString.length) + byteString\n }\n const status = byteString.slice(bitIndex, bitIndex + numBits)\n const group = Math.floor(i / (8 / numBits))\n const indexInGroup = i % (8 / numBits)\n const position = group * (8 / numBits) + (8 / numBits + -1 - indexInGroup)\n statusList[position] = Number.parseInt(status, 2)\n bitIndex = (bitIndex + numBits) % 8\n }\n return statusList\n }\n}\n","import { CborStructure, TypedMap, typedMap, zUint8Array } from '@owf/cose'\nimport { z } from 'zod'\nimport { StatusList } from '../status-list'\nimport type { BitsPerStatus } from '../types'\n\nexport const statusListCborEncodedSchema = typedMap([\n ['bits', z.union([z.literal(1), z.literal(2), z.literal(4), z.literal(8)])],\n ['lst', zUint8Array],\n ['aggregation_uri', z.string().optional()],\n])\n\nexport const statusListCborDecodedSchema = z.instanceof(StatusList)\n\nexport type StatusListCborEncodedStructure = z.infer<typeof statusListCborEncodedSchema>\nexport type StatusListCborDecodedStructure = z.infer<typeof statusListCborDecodedSchema>\n\nexport type CreateStatusListCborOptions = {\n bits: BitsPerStatus\n list: Uint8Array | number[]\n aggregationUri?: string\n}\n\nexport type StatusListCborWithStatusListOptions = {\n statusList: StatusList\n}\n\nexport class StatusListCbor extends CborStructure<StatusListCborEncodedStructure, StatusListCborDecodedStructure> {\n public statusList = this.structure\n\n public static override get encodingSchema() {\n return z.codec(statusListCborEncodedSchema, statusListCborDecodedSchema, {\n encode: (statusList) => {\n return new TypedMap([\n ['bits', statusList.getBitsPerStatus()],\n ['lst', statusList.compressStatusListToBytes()],\n ['aggregation_uri', statusList.aggregationUri],\n ]) satisfies StatusListCborEncodedStructure\n },\n decode: (input) => {\n return StatusList.decompressStatusListFromBytes(\n input.get('lst'),\n input.get('bits'),\n input.get('aggregation_uri')\n )\n },\n })\n }\n\n public static create(options: CreateStatusListCborOptions | StatusListCborWithStatusListOptions) {\n const statusList =\n 'statusList' in options\n ? options.statusList\n : options.list instanceof Uint8Array\n ? StatusList.decompressStatusListFromBytes(options.list, options.bits, options.aggregationUri)\n : new StatusList(options.list, options.bits, options.aggregationUri)\n\n return new StatusListCbor(statusList)\n }\n}\n","// ==================== Common Types & Constants ====================\n\n/**\n * Status Type values as defined in the spec.\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-7\n */\nexport enum StatusType {\n /** The status of the Referenced Token is valid, correct or legal. */\n Valid = 0x00,\n /** The status of the Referenced Token is revoked, annulled, taken back, recalled or cancelled. */\n Invalid = 0x01,\n /** The status of the Referenced Token is temporarily invalid, hanging, debarred from privilege. */\n Suspended = 0x02,\n /** Application-specific status (0x03). */\n ApplicationSpecific3 = 0x03,\n /** Application-specific status range start (0x0C). */\n ApplicationSpecificRangeStart = 0x0c,\n /** Application-specific status range end (0x0F). */\n ApplicationSpecificRangeEnd = 0x0f,\n}\n\n/**\n * Media types for Status List Tokens\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-14.7\n */\nexport const MediaTypes = {\n /** Media type for JWT-based Status List Token */\n StatusListJwt: 'application/statuslist+jwt',\n /** Media type for CWT-based Status List Token */\n StatusListCwt: 'application/statuslist+cwt',\n} as const\n\n/**\n * BitsPerStatus type.\n */\nexport type BitsPerStatus = 1 | 2 | 4 | 8\n\n/**\n * Reference to a status list entry.\n */\nexport interface StatusListEntry {\n idx: number\n uri: string\n}\n","import { CborStructure, RegisteredCwtClaimKey, TypedMap, typedMap } from '@owf/cose'\nimport z from 'zod'\nimport type { StatusList } from '../status-list'\nimport { StatusListCbor, type StatusListCborEncodedStructure } from './status-list-cbor'\n\nexport enum StatusListCwtClaimKey {\n TimeToLive = 65534,\n StatusList = 65533,\n}\n\nconst statusListCwtPayloadSchema = typedMap(\n [\n [RegisteredCwtClaimKey.Subject, z.string()],\n [RegisteredCwtClaimKey.IssuedAt, z.number()],\n [RegisteredCwtClaimKey.ExpirationTime, z.number().exactOptional()],\n [StatusListCwtClaimKey.TimeToLive, z.number().exactOptional()],\n [StatusListCwtClaimKey.StatusList, z.instanceof(StatusListCbor)],\n ],\n { allowAdditionalKeys: true }\n)\n\nexport type StatusListCwtPayloadEncodedStructure = z.infer<typeof statusListCwtPayloadSchema>\nexport type StatusListCwtPayloadDecodedStructure = z.infer<typeof statusListCwtPayloadSchema>\n\nexport type CreateStatusListCwtPayloadOptions = {\n subject: string\n statusList: StatusListCbor | StatusList\n issuedAt?: Date\n expirationTime?: Date\n timeToLive?: number\n additionalClaims?: Map<number | string, unknown>\n}\n\nexport class StatusListCwtPayload extends CborStructure<\n StatusListCwtPayloadEncodedStructure,\n StatusListCwtPayloadDecodedStructure\n> {\n public static override get encodingSchema() {\n return z.codec(statusListCwtPayloadSchema.in, statusListCwtPayloadSchema.out, {\n decode: (input) => {\n const map: StatusListCwtPayloadDecodedStructure = TypedMap.fromMap(input)\n\n map.set(\n StatusListCwtClaimKey.StatusList,\n StatusListCbor.fromEncodedStructure(\n input.get(StatusListCwtClaimKey.StatusList) as StatusListCborEncodedStructure\n )\n )\n\n return map\n },\n encode: (output) => {\n const map = output.toMap() as Map<unknown, unknown>\n map.set(StatusListCwtClaimKey.StatusList, output.get(StatusListCwtClaimKey.StatusList).encodedStructure)\n return map\n },\n })\n }\n\n public static create(options: CreateStatusListCwtPayloadOptions) {\n const map = new TypedMap([\n [RegisteredCwtClaimKey.Subject, options.subject],\n [RegisteredCwtClaimKey.IssuedAt, Math.floor((options.issuedAt?.getTime() ?? Date.now()) / 1000)],\n [\n StatusListCwtClaimKey.StatusList,\n options.statusList instanceof StatusListCbor\n ? options.statusList\n : StatusListCbor.create({ statusList: options.statusList }),\n ],\n ...(options.additionalClaims ?? new Map()).entries(),\n ]) satisfies StatusListCwtPayloadEncodedStructure\n\n if (options.expirationTime) {\n map.set(RegisteredCwtClaimKey.ExpirationTime, Math.floor(options.expirationTime.getTime() / 1000))\n }\n\n if (options.timeToLive) {\n map.set(StatusListCwtClaimKey.TimeToLive, options.timeToLive)\n }\n\n return new StatusListCwtPayload(statusListCwtPayloadSchema.parse(map.toMap()))\n }\n\n public get subject() {\n return this.structure.get(RegisteredCwtClaimKey.Subject)\n }\n\n public get issuedAt() {\n return new Date(this.structure.get(RegisteredCwtClaimKey.IssuedAt) * 1000)\n }\n\n public get expirationTime() {\n return this.structure.has(RegisteredCwtClaimKey.ExpirationTime)\n ? // biome-ignore lint/style/noNonNullAssertion: checked with `has` in the line above\n new Date(this.structure.get(RegisteredCwtClaimKey.ExpirationTime)! * 1000)\n : undefined\n }\n\n public get timeToLive() {\n return this.structure.get(StatusListCwtClaimKey.TimeToLive)\n }\n\n public get statusList() {\n return this.structure.get(StatusListCwtClaimKey.StatusList).statusList\n }\n\n public getCustomClaim<ClaimType = unknown>(key: number) {\n return this.structure.get(key) as ClaimType | unknown\n }\n\n public setStatusList(statusList: StatusList | StatusListCbor) {\n this.structure.set(\n StatusListCwtClaimKey.StatusList,\n statusList instanceof StatusListCbor ? statusList : StatusListCbor.create({ statusList })\n )\n }\n}\n","import {\n type CoseKey,\n Cwt,\n type Mac0Context,\n type ProtectedHeaderOptions,\n ProtectedHeaders,\n RegisteredCwtClaimKey,\n type Sign1Context,\n type SignatureAlgorithm,\n type UnprotectedHeaderOptions,\n UnprotectedHeaders,\n} from '@owf/cose'\nimport { StatusList } from '../status-list'\nimport { SLException } from '../status-list-exception'\nimport { type BitsPerStatus, MediaTypes, StatusType } from '../types'\nimport { StatusListCbor } from './status-list-cbor'\nimport { type CreateStatusListCwtPayloadOptions, StatusListCwtPayload } from './status-list-cwt-payload'\n\nexport type StatusListCwtOptions = {\n payload: StatusListCwtPayload | CreateStatusListCwtPayloadOptions\n protectedHeaders?: ProtectedHeaders | ProtectedHeaderOptions['protectedHeaders']\n unprotectedHeaders?: UnprotectedHeaders | UnprotectedHeaderOptions['unprotectedHeaders']\n signatureOrTag?: Uint8Array\n originalPayloadBytes?: Uint8Array\n}\n\nexport enum StatusListCwtHeaderKey {\n Typ = 16,\n}\n\nexport class StatusListCwt {\n public payload: StatusListCwtPayload\n public protectedHeaders?: ProtectedHeaders\n public unprotectedHeaders?: UnprotectedHeaders\n private signatureOrTag?: Uint8Array\n private originalPayloadBytes?: Uint8Array\n\n public constructor(options: StatusListCwtOptions) {\n this.payload =\n options.payload instanceof StatusListCwtPayload ? options.payload : StatusListCwtPayload.create(options.payload)\n this.protectedHeaders =\n options.protectedHeaders instanceof ProtectedHeaders\n ? options.protectedHeaders\n : ProtectedHeaders.create({ protectedHeaders: options.protectedHeaders })\n this.unprotectedHeaders =\n options.unprotectedHeaders instanceof UnprotectedHeaders\n ? options.unprotectedHeaders\n : UnprotectedHeaders.create({ unprotectedHeaders: options.unprotectedHeaders })\n\n this.signatureOrTag = options.signatureOrTag\n this.originalPayloadBytes = options.originalPayloadBytes\n\n if (this.protectedHeaders.headers.get(StatusListCwtHeaderKey.Typ) === undefined) {\n this.protectedHeaders.headers.set(StatusListCwtHeaderKey.Typ, MediaTypes.StatusListCwt)\n }\n }\n\n public setStatusList(statusList: StatusList | StatusListCbor) {\n this.payload.setStatusList(statusList)\n this.originalPayloadBytes = undefined\n }\n\n public updateStatusList(index: number, value: number) {\n this.payload.statusList.setStatus(index, value)\n this.originalPayloadBytes = undefined\n }\n\n /**\n *\n * Create a minimal status list cwt. If you want to configure more options, like additional claims, use the constructor method\n *\n */\n public static createFromStatusListAndSubject(\n statusList:\n | StatusList\n | StatusListCbor\n | { statusList: number[]; bitsPerStatus: BitsPerStatus; aggregationUri?: string },\n subject: string\n ) {\n const cborStatusList =\n statusList instanceof StatusListCbor\n ? statusList\n : statusList instanceof StatusList\n ? StatusListCbor.create({ statusList })\n : StatusListCbor.create({\n bits: statusList.bitsPerStatus,\n list: statusList.statusList,\n aggregationUri: statusList.aggregationUri,\n })\n\n return new StatusListCwt({ payload: StatusListCwtPayload.create({ statusList: cborStatusList, subject }) })\n }\n\n public static fromToken(token: Uint8Array) {\n const cwt = Cwt.fromToken(token)\n\n if (!cwt.payload) {\n throw new SLException('Cwt does not contain payload, detached payload is not supported for status list CWT')\n }\n const payload = StatusListCwtPayload.decode(cwt.payload)\n\n return new StatusListCwt({\n payload,\n protectedHeaders: cwt.protectedHeaders,\n unprotectedHeaders: cwt.unprotectedHeaders,\n signatureOrTag: cwt.signatureOrTag,\n originalPayloadBytes: new Uint8Array(cwt.payload),\n })\n }\n\n public async signAndEncode(\n options: {\n signingKey: CoseKey\n algorithm?: SignatureAlgorithm\n },\n ctx: Pick<Sign1Context, 'sign'>\n ) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.payload.encode(),\n })\n return (await cwt.asSign1.sign(options, ctx)).encode()\n }\n\n public async authenticateAndEncode(options: { key: CoseKey }, ctx: Pick<Mac0Context, 'authenticate'>) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.payload.encode(),\n })\n return (await cwt.asMac0.authenticate(options, ctx)).encode()\n }\n\n /**\n * @todo add check for `ttl` claim\n */\n public verifyStatus({\n idx,\n uri,\n checkFreshness = true,\n now = new Date(),\n }: {\n idx: number\n uri: string\n checkFreshness?: boolean\n now?: Date\n }) {\n if (this.payload.expirationTime && this.payload.expirationTime < now) {\n throw new SLException(\n `The expiration claim (${RegisteredCwtClaimKey.ExpirationTime}) '${this.payload.expirationTime}' is in the past (compared to '${now}'), and therefore not valid`\n )\n }\n if (this.payload.subject !== uri) {\n throw new SLException(\n `The subject claim (${RegisteredCwtClaimKey.Subject}) '${this.payload.subject}' must be equal to the uri '${uri}'`\n )\n }\n if (checkFreshness && this.payload.issuedAt > now) {\n throw new SLException(\n `The issued at claim (${RegisteredCwtClaimKey.IssuedAt}) '${this.payload.issuedAt}' is in the future (compared to '${now}'), and therefore not valid`\n )\n }\n if (this.payload.statusList.getStatus(idx) !== StatusType.Valid) {\n throw new SLException(\n `Status for id '${idx}' is not Valid (${StatusType.Valid}), but is instead '${this.payload.statusList.getStatus(idx)}'`\n )\n }\n }\n\n public async verifySignature({ key }: { key: CoseKey }, ctx: Pick<Sign1Context, 'verify'>) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.originalPayloadBytes ?? this.payload.encode(),\n signature: this.signatureOrTag,\n })\n\n return await cwt.verifySignature({ key }, ctx)\n }\n\n public async verifyAuthenticationCode({ key }: { key: CoseKey }, ctx: Pick<Mac0Context, 'verify'>) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.originalPayloadBytes ?? this.payload.encode(),\n tag: this.signatureOrTag,\n })\n\n return await cwt.verifyAuthenticationCode({ key }, ctx)\n }\n}\n","import { CborStructure, TypedMap, typedMap, zUint8Array } from '@owf/cose'\nimport { z } from 'zod'\n\n/**\n * StatusListInfo carries a reference to an IETF Token Status List\n * (draft-ietf-oauth-status-list) entry from inside the MSO's Status structure.\n *\n * Defined in ISO/IEC 18013-5 second edition (CD), 12.3.6.\n */\n// NOTE: idx is `uint` in the spec (unbounded CBOR uint). We constrain to JS\n// safe-integer range here, which is more than enough for real-world status\n// list sizes (Number.MAX_SAFE_INTEGER is ~9 × 10^15).\nconst statusListInfoSchema = typedMap([\n ['uri', z.string()],\n ['idx', z.number().int().nonnegative()],\n ['certificate', zUint8Array.exactOptional()],\n])\n\nexport type StatusListInfoDecodedStructure = z.output<typeof statusListInfoSchema>\nexport type StatusListInfoEncodedStructure = z.input<typeof statusListInfoSchema>\n\nexport type StatusListInfoOptions = {\n uri: string\n idx: number\n certificate?: Uint8Array\n}\n\nexport class StatusListInfo extends CborStructure<StatusListInfoEncodedStructure, StatusListInfoDecodedStructure> {\n public static override get encodingSchema() {\n return statusListInfoSchema\n }\n\n public get uri() {\n return this.structure.get('uri')\n }\n\n public get idx() {\n return this.structure.get('idx')\n }\n\n public get certificate() {\n return this.structure.get('certificate')\n }\n\n public static create(options: StatusListInfoOptions): StatusListInfo {\n const map: StatusListInfoDecodedStructure = new TypedMap([\n ['uri', options.uri],\n ['idx', options.idx],\n ])\n if (options.certificate) {\n map.set('certificate', options.certificate)\n }\n return StatusListInfo.fromDecodedStructure(map)\n }\n}\n","import { SLException } from './status-list-exception'\nimport { MediaTypes } from './types'\n\nexport const fetchStatusList = async ({\n uri,\n customFetcher = fetch,\n acceptedFormats = ['jwt', 'cwt'],\n}: {\n uri: string\n /**\n *\n * If none is supplied either can be returned\n *\n */\n acceptedFormats?: Array<'cwt' | 'jwt'>\n customFetcher?: typeof fetch\n}): Promise<string | Uint8Array> => {\n try {\n if (acceptedFormats.length === 0) {\n throw new SLException(`At least one accepted format (cwt, jwt) needs to be provided`)\n }\n\n const acceptHeaders = acceptedFormats.map((format) =>\n format === 'jwt' ? MediaTypes.StatusListJwt : MediaTypes.StatusListCwt\n )\n\n const response = await customFetcher(uri, {\n headers: {\n Accept: acceptHeaders.join(','),\n },\n })\n\n if (response.status > 399 || response.status <= 199) {\n throw new Error(`Could not fetch status list, response status '${response.status}'`)\n }\n\n const contentType = response.headers.get('Content-type')\n if (contentType === MediaTypes.StatusListJwt) {\n return await response.text()\n } else if (contentType === MediaTypes.StatusListCwt) {\n return await (await response.blob()).bytes()\n }\n\n throw new SLException('Content type was either not provided in the response or invalid.')\n } catch (e) {\n throw new SLException(`Could not fetch either a JWT or CWT as status list. ${(e as Error).message}`)\n }\n}\n","import type { JwtPayload } from '@owf/identity-common'\nimport type { BitsPerStatus, StatusListEntry } from './types'\n\n// ==================== JWT Types & Constants ====================\n\n/**\n * JWT type header value for Status List Token\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-5.1\n */\nexport const JWT_STATUS_LIST_TYPE = 'statuslist+jwt'\n\n/**\n * JWT claim names for Status List\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-14.1\n */\nexport const JWTClaimNames = {\n STATUS: 'status',\n STATUS_LIST: 'status_list',\n TTL: 'ttl',\n IDX: 'idx',\n URI: 'uri',\n BITS: 'bits',\n LST: 'lst',\n AGGREGATION_URI: 'aggregation_uri',\n} as const\n\n/**\n * Payload for a JWT with a status reference.\n */\nexport interface JWTwithStatusListPayload extends JwtPayload {\n status: {\n status_list: StatusListEntry\n }\n}\n\n/**\n * Payload for a Status List JWT.\n */\nexport interface StatusListJWTPayload extends JwtPayload {\n ttl?: number\n status_list: {\n bits: BitsPerStatus\n lst: string\n }\n}\n\n/**\n * Header parameters for a JWT Status List Token.\n */\nexport type StatusListJWTHeaderParameters = {\n alg: string\n typ: typeof JWT_STATUS_LIST_TYPE\n [key: string]: unknown\n}\n","import type { JwtPayload } from '@owf/identity-common'\nimport { base64url, bytesToString } from '@owf/identity-common'\nimport type { JWTwithStatusListPayload, StatusListJWTHeaderParameters, StatusListJWTPayload } from './jwt-types'\nimport { JWT_STATUS_LIST_TYPE } from './jwt-types'\nimport { StatusList } from './status-list'\nimport { SLException } from './status-list-exception'\nimport { type StatusListEntry, StatusType } from './types'\n\n/**\n * Decode a JWT and return the payload.\n * @param jwt JWT token in compact JWS serialization.\n */\nfunction decodeJwtPayload<T>(jwt: string): T {\n const parts = jwt.split('.')\n return JSON.parse(bytesToString(base64url.decode(parts[1])))\n}\n\n/**\n * Adds the status list to the payload and header of a JWT.\n */\nexport function createHeaderAndPayload(list: StatusList, payload: JwtPayload, header: StatusListJWTHeaderParameters) {\n if (!payload.sub) {\n throw new SLException('sub field is required')\n }\n if (!payload.iat) {\n throw new SLException('iat field is required')\n }\n\n header.typ = JWT_STATUS_LIST_TYPE\n payload.status_list = {\n bits: list.getBitsPerStatus(),\n lst: base64url.encode(list.compressStatusListToBytes()),\n }\n return { header, payload }\n}\n\n/**\n * Get the status list from a JWT, but do not verify the signature.\n */\nexport function getListFromStatusListJWT(jwt: string): StatusList {\n const payload = decodeJwtPayload<StatusListJWTPayload>(jwt)\n const statusList = payload.status_list\n const compressed = base64url.decode(statusList.lst)\n return StatusList.decompressStatusListFromBytes(compressed, statusList.bits)\n}\n\n/**\n * Get the status list entry from a JWT, but do not verify the signature.\n */\nexport function getStatusListFromJWT(jwt: string): StatusListEntry {\n const payload = decodeJwtPayload<JWTwithStatusListPayload>(jwt)\n return payload.status.status_list\n}\n\n/**\n * Verify the status of an `idx` in a `token`\n *\n * @todo properly validate the JWT with zod + signature\n */\nexport function verifyStatus({\n uri,\n idx,\n token,\n checkFreshness = true,\n now = new Date(),\n}: {\n token: string\n idx: number\n uri: string\n checkFreshness?: boolean\n now?: Date\n}) {\n const payload = decodeJwtPayload<StatusListJWTPayload>(token)\n const compressed = base64url.decode(payload.status_list.lst)\n const statusList = StatusList.decompressStatusListFromBytes(compressed, payload.status_list.bits)\n if (payload.subject !== uri) {\n throw new SLException(`The subject claim '${payload.subject}' must be equal to the uri '${uri}'`)\n }\n if (checkFreshness && payload.iat && payload.iat > Math.floor(now.getTime() / 1000)) {\n throw new SLException(\n `The issued at claim '${payload.issuedAt}' is in the future (compared to '${now}'), and therefore not valid`\n )\n }\n if (payload.exp && payload.exp < Math.floor(now.getTime() / 1000)) {\n throw new SLException(\n `The expiry claim '${payload.exp}' is in the past (compared to '${now}'), and therefore not valid`\n )\n }\n if (statusList.getStatus(idx) !== StatusType.Valid) {\n throw new SLException(\n `Status for id '${idx}' is not Valid (${StatusType.Valid}), but is instead '${statusList.getStatus(idx)}'`\n )\n }\n return true\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -163,6 +163,7 @@ type StatusListCwtOptions = {
|
|
|
163
163
|
protectedHeaders?: ProtectedHeaders | ProtectedHeaderOptions['protectedHeaders'];
|
|
164
164
|
unprotectedHeaders?: UnprotectedHeaders | UnprotectedHeaderOptions['unprotectedHeaders'];
|
|
165
165
|
signatureOrTag?: Uint8Array;
|
|
166
|
+
originalPayloadBytes?: Uint8Array;
|
|
166
167
|
};
|
|
167
168
|
declare enum StatusListCwtHeaderKey {
|
|
168
169
|
Typ = 16
|
|
@@ -172,6 +173,7 @@ declare class StatusListCwt {
|
|
|
172
173
|
protectedHeaders?: ProtectedHeaders;
|
|
173
174
|
unprotectedHeaders?: UnprotectedHeaders;
|
|
174
175
|
private signatureOrTag?;
|
|
176
|
+
private originalPayloadBytes?;
|
|
175
177
|
constructor(options: StatusListCwtOptions);
|
|
176
178
|
setStatusList(statusList: StatusList | StatusListCbor): void;
|
|
177
179
|
updateStatusList(index: number, value: number): void;
|
package/dist/index.d.mts
CHANGED
|
@@ -163,6 +163,7 @@ type StatusListCwtOptions = {
|
|
|
163
163
|
protectedHeaders?: ProtectedHeaders | ProtectedHeaderOptions['protectedHeaders'];
|
|
164
164
|
unprotectedHeaders?: UnprotectedHeaders | UnprotectedHeaderOptions['unprotectedHeaders'];
|
|
165
165
|
signatureOrTag?: Uint8Array;
|
|
166
|
+
originalPayloadBytes?: Uint8Array;
|
|
166
167
|
};
|
|
167
168
|
declare enum StatusListCwtHeaderKey {
|
|
168
169
|
Typ = 16
|
|
@@ -172,6 +173,7 @@ declare class StatusListCwt {
|
|
|
172
173
|
protectedHeaders?: ProtectedHeaders;
|
|
173
174
|
unprotectedHeaders?: UnprotectedHeaders;
|
|
174
175
|
private signatureOrTag?;
|
|
176
|
+
private originalPayloadBytes?;
|
|
175
177
|
constructor(options: StatusListCwtOptions);
|
|
176
178
|
setStatusList(statusList: StatusList | StatusListCbor): void;
|
|
177
179
|
updateStatusList(index: number, value: number): void;
|
package/dist/index.mjs
CHANGED
|
@@ -246,13 +246,16 @@ var StatusListCwt = class StatusListCwt {
|
|
|
246
246
|
this.protectedHeaders = options.protectedHeaders instanceof ProtectedHeaders ? options.protectedHeaders : ProtectedHeaders.create({ protectedHeaders: options.protectedHeaders });
|
|
247
247
|
this.unprotectedHeaders = options.unprotectedHeaders instanceof UnprotectedHeaders ? options.unprotectedHeaders : UnprotectedHeaders.create({ unprotectedHeaders: options.unprotectedHeaders });
|
|
248
248
|
this.signatureOrTag = options.signatureOrTag;
|
|
249
|
+
this.originalPayloadBytes = options.originalPayloadBytes;
|
|
249
250
|
if (this.protectedHeaders.headers.get(16) === void 0) this.protectedHeaders.headers.set(16, MediaTypes.StatusListCwt);
|
|
250
251
|
}
|
|
251
252
|
setStatusList(statusList) {
|
|
252
253
|
this.payload.setStatusList(statusList);
|
|
254
|
+
this.originalPayloadBytes = void 0;
|
|
253
255
|
}
|
|
254
256
|
updateStatusList(index, value) {
|
|
255
257
|
this.payload.statusList.setStatus(index, value);
|
|
258
|
+
this.originalPayloadBytes = void 0;
|
|
256
259
|
}
|
|
257
260
|
/**
|
|
258
261
|
*
|
|
@@ -278,7 +281,8 @@ var StatusListCwt = class StatusListCwt {
|
|
|
278
281
|
payload,
|
|
279
282
|
protectedHeaders: cwt.protectedHeaders,
|
|
280
283
|
unprotectedHeaders: cwt.unprotectedHeaders,
|
|
281
|
-
signatureOrTag: cwt.signatureOrTag
|
|
284
|
+
signatureOrTag: cwt.signatureOrTag,
|
|
285
|
+
originalPayloadBytes: new Uint8Array(cwt.payload)
|
|
282
286
|
});
|
|
283
287
|
}
|
|
284
288
|
async signAndEncode(options, ctx) {
|
|
@@ -308,7 +312,7 @@ var StatusListCwt = class StatusListCwt {
|
|
|
308
312
|
return await new Cwt({
|
|
309
313
|
protectedHeaders: this.protectedHeaders,
|
|
310
314
|
unprotectedHeaders: this.unprotectedHeaders,
|
|
311
|
-
payload: this.payload.encode(),
|
|
315
|
+
payload: this.originalPayloadBytes ?? this.payload.encode(),
|
|
312
316
|
signature: this.signatureOrTag
|
|
313
317
|
}).verifySignature({ key }, ctx);
|
|
314
318
|
}
|
|
@@ -316,7 +320,7 @@ var StatusListCwt = class StatusListCwt {
|
|
|
316
320
|
return await new Cwt({
|
|
317
321
|
protectedHeaders: this.protectedHeaders,
|
|
318
322
|
unprotectedHeaders: this.unprotectedHeaders,
|
|
319
|
-
payload: this.payload.encode(),
|
|
323
|
+
payload: this.originalPayloadBytes ?? this.payload.encode(),
|
|
320
324
|
tag: this.signatureOrTag
|
|
321
325
|
}).verifyAuthenticationCode({ key }, ctx);
|
|
322
326
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["z","z"],"sources":["../src/status-list-exception.ts","../src/status-list.ts","../src/cbor/status-list-cbor.ts","../src/types.ts","../src/cbor/status-list-cwt-payload.ts","../src/cbor/status-list-cwt.ts","../src/cbor/status-list-info.ts","../src/fetch-status-list.ts","../src/jwt-types.ts","../src/status-list-jwt.ts"],"sourcesContent":["import { IdentityException } from '@owf/identity-common'\n\n/**\n * SLException is a custom error class for Status List related exceptions.\n */\nexport class SLException extends IdentityException {\n constructor(message: string, details?: unknown) {\n super(message, details)\n Object.setPrototypeOf(this, SLException.prototype)\n this.name = 'SLException'\n }\n}\n","import { deflate, inflate } from 'pako'\nimport { SLException } from './status-list-exception'\nimport type { BitsPerStatus, StatusType } from './types'\n\n/**\n * StatusList is a class that manages a list of statuses with variable bit size.\n */\nexport class StatusList {\n private _statusList: Array<StatusType | number>\n private bitsPerStatus: BitsPerStatus\n public readonly totalStatuses: number\n public aggregationUri?: string\n\n constructor(statusList: number[], bitsPerStatus: BitsPerStatus, aggregationUri?: string) {\n if (![1, 2, 4, 8].includes(bitsPerStatus)) {\n throw new SLException('bitsPerStatus must be 1, 2, 4, or 8')\n }\n for (let i = 0; i < statusList.length; i++) {\n if (statusList[i] > 2 ** bitsPerStatus) {\n throw new SLException(`Status value out of range at index ${i} with value ${statusList[i]}`)\n }\n }\n this._statusList = statusList\n this.bitsPerStatus = bitsPerStatus\n this.totalStatuses = statusList.length\n this.aggregationUri = aggregationUri\n }\n\n /** Get the status list. */\n get statusList(): number[] {\n return this._statusList\n }\n\n /** Get the number of bits per status. */\n getBitsPerStatus(): BitsPerStatus {\n return this.bitsPerStatus\n }\n\n /** Get the status at a specific index. */\n getStatus(index: number): StatusType {\n if (index < 0 || index >= this.totalStatuses) {\n throw new Error('Index out of bounds')\n }\n return this._statusList[index]\n }\n\n /** Set the status at a specific index. */\n setStatus(index: number, value: StatusType | number): void {\n if (index < 0 || index >= this.totalStatuses) {\n throw new Error('Index out of bounds')\n }\n this._statusList[index] = value\n }\n\n /** Compress the status list and return as raw bytes. */\n compressStatusListToBytes(): Uint8Array {\n const byteArray = this.encodeStatusListIntoByteArray()\n return deflate(byteArray, { level: 9 })\n }\n\n /** Decompress a raw byte array and return a new StatusList instance. */\n static decompressStatusListFromBytes(\n compressed: Uint8Array,\n bitsPerStatus: BitsPerStatus,\n aggregationUri?: string\n ): StatusList {\n try {\n const decompressed = inflate(compressed)\n const statusList = StatusList.decodeStatusListFromByteArray(decompressed, bitsPerStatus)\n return new StatusList(statusList, bitsPerStatus, aggregationUri)\n } catch (err: unknown) {\n throw new Error(`Decompression failed: ${err}`)\n }\n }\n\n /** Encode the status list into a byte array. */\n public encodeStatusListIntoByteArray(): Uint8Array {\n const numBits = this.bitsPerStatus\n const numBytes = Math.ceil((this.totalStatuses * numBits) / 8)\n const byteArray = new Uint8Array(numBytes)\n let byteIndex = 0\n let bitIndex = 0\n let currentByte = ''\n for (let i = 0; i < this.totalStatuses; i++) {\n const status = this._statusList[i]\n currentByte = status.toString(2).padStart(numBits, '0') + currentByte\n bitIndex += numBits\n\n if (bitIndex >= 8 || i === this.totalStatuses - 1) {\n if (i === this.totalStatuses - 1 && bitIndex % 8 !== 0) {\n currentByte = currentByte.padStart(8, '0')\n }\n byteArray[byteIndex] = Number.parseInt(currentByte, 2)\n currentByte = ''\n bitIndex = 0\n byteIndex++\n }\n }\n\n return byteArray\n }\n\n /** Decode the byte array into a status list. */\n private static decodeStatusListFromByteArray(byteArray: Uint8Array, bitsPerStatus: BitsPerStatus): StatusType[] {\n const numBits = bitsPerStatus\n const totalStatuses = (byteArray.length * 8) / numBits\n const statusList = new Array<number>(totalStatuses)\n let bitIndex = 0\n for (let i = 0; i < totalStatuses; i++) {\n const byte = byteArray[Math.floor((i * numBits) / 8)]\n let byteString = byte.toString(2)\n if (byteString.length < 8) {\n byteString = '0'.repeat(8 - byteString.length) + byteString\n }\n const status = byteString.slice(bitIndex, bitIndex + numBits)\n const group = Math.floor(i / (8 / numBits))\n const indexInGroup = i % (8 / numBits)\n const position = group * (8 / numBits) + (8 / numBits + -1 - indexInGroup)\n statusList[position] = Number.parseInt(status, 2)\n bitIndex = (bitIndex + numBits) % 8\n }\n return statusList\n }\n}\n","import { CborStructure, TypedMap, typedMap, zUint8Array } from '@owf/cose'\nimport { z } from 'zod'\nimport { StatusList } from '../status-list'\nimport type { BitsPerStatus } from '../types'\n\nexport const statusListCborEncodedSchema = typedMap([\n ['bits', z.union([z.literal(1), z.literal(2), z.literal(4), z.literal(8)])],\n ['lst', zUint8Array],\n ['aggregation_uri', z.string().optional()],\n])\n\nexport const statusListCborDecodedSchema = z.instanceof(StatusList)\n\nexport type StatusListCborEncodedStructure = z.infer<typeof statusListCborEncodedSchema>\nexport type StatusListCborDecodedStructure = z.infer<typeof statusListCborDecodedSchema>\n\nexport type CreateStatusListCborOptions = {\n bits: BitsPerStatus\n list: Uint8Array | number[]\n aggregationUri?: string\n}\n\nexport type StatusListCborWithStatusListOptions = {\n statusList: StatusList\n}\n\nexport class StatusListCbor extends CborStructure<StatusListCborEncodedStructure, StatusListCborDecodedStructure> {\n public statusList = this.structure\n\n public static override get encodingSchema() {\n return z.codec(statusListCborEncodedSchema, statusListCborDecodedSchema, {\n encode: (statusList) => {\n return new TypedMap([\n ['bits', statusList.getBitsPerStatus()],\n ['lst', statusList.compressStatusListToBytes()],\n ['aggregation_uri', statusList.aggregationUri],\n ]) satisfies StatusListCborEncodedStructure\n },\n decode: (input) => {\n return StatusList.decompressStatusListFromBytes(\n input.get('lst'),\n input.get('bits'),\n input.get('aggregation_uri')\n )\n },\n })\n }\n\n public static create(options: CreateStatusListCborOptions | StatusListCborWithStatusListOptions) {\n const statusList =\n 'statusList' in options\n ? options.statusList\n : options.list instanceof Uint8Array\n ? StatusList.decompressStatusListFromBytes(options.list, options.bits, options.aggregationUri)\n : new StatusList(options.list, options.bits, options.aggregationUri)\n\n return new StatusListCbor(statusList)\n }\n}\n","// ==================== Common Types & Constants ====================\n\n/**\n * Status Type values as defined in the spec.\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-7\n */\nexport enum StatusType {\n /** The status of the Referenced Token is valid, correct or legal. */\n Valid = 0x00,\n /** The status of the Referenced Token is revoked, annulled, taken back, recalled or cancelled. */\n Invalid = 0x01,\n /** The status of the Referenced Token is temporarily invalid, hanging, debarred from privilege. */\n Suspended = 0x02,\n /** Application-specific status (0x03). */\n ApplicationSpecific3 = 0x03,\n /** Application-specific status range start (0x0C). */\n ApplicationSpecificRangeStart = 0x0c,\n /** Application-specific status range end (0x0F). */\n ApplicationSpecificRangeEnd = 0x0f,\n}\n\n/**\n * Media types for Status List Tokens\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-14.7\n */\nexport const MediaTypes = {\n /** Media type for JWT-based Status List Token */\n StatusListJwt: 'application/statuslist+jwt',\n /** Media type for CWT-based Status List Token */\n StatusListCwt: 'application/statuslist+cwt',\n} as const\n\n/**\n * BitsPerStatus type.\n */\nexport type BitsPerStatus = 1 | 2 | 4 | 8\n\n/**\n * Reference to a status list entry.\n */\nexport interface StatusListEntry {\n idx: number\n uri: string\n}\n","import { CborStructure, RegisteredCwtClaimKey, TypedMap, typedMap } from '@owf/cose'\nimport z from 'zod'\nimport type { StatusList } from '../status-list'\nimport { StatusListCbor, type StatusListCborEncodedStructure } from './status-list-cbor'\n\nexport enum StatusListCwtClaimKey {\n TimeToLive = 65534,\n StatusList = 65533,\n}\n\nconst statusListCwtPayloadSchema = typedMap(\n [\n [RegisteredCwtClaimKey.Subject, z.string()],\n [RegisteredCwtClaimKey.IssuedAt, z.number()],\n [RegisteredCwtClaimKey.ExpirationTime, z.number().exactOptional()],\n [StatusListCwtClaimKey.TimeToLive, z.number().exactOptional()],\n [StatusListCwtClaimKey.StatusList, z.instanceof(StatusListCbor)],\n ],\n { allowAdditionalKeys: true }\n)\n\nexport type StatusListCwtPayloadEncodedStructure = z.infer<typeof statusListCwtPayloadSchema>\nexport type StatusListCwtPayloadDecodedStructure = z.infer<typeof statusListCwtPayloadSchema>\n\nexport type CreateStatusListCwtPayloadOptions = {\n subject: string\n statusList: StatusListCbor | StatusList\n issuedAt?: Date\n expirationTime?: Date\n timeToLive?: number\n additionalClaims?: Map<number | string, unknown>\n}\n\nexport class StatusListCwtPayload extends CborStructure<\n StatusListCwtPayloadEncodedStructure,\n StatusListCwtPayloadDecodedStructure\n> {\n public static override get encodingSchema() {\n return z.codec(statusListCwtPayloadSchema.in, statusListCwtPayloadSchema.out, {\n decode: (input) => {\n const map: StatusListCwtPayloadDecodedStructure = TypedMap.fromMap(input)\n\n map.set(\n StatusListCwtClaimKey.StatusList,\n StatusListCbor.fromEncodedStructure(\n input.get(StatusListCwtClaimKey.StatusList) as StatusListCborEncodedStructure\n )\n )\n\n return map\n },\n encode: (output) => {\n const map = output.toMap() as Map<unknown, unknown>\n map.set(StatusListCwtClaimKey.StatusList, output.get(StatusListCwtClaimKey.StatusList).encodedStructure)\n return map\n },\n })\n }\n\n public static create(options: CreateStatusListCwtPayloadOptions) {\n const map = new TypedMap([\n [RegisteredCwtClaimKey.Subject, options.subject],\n [RegisteredCwtClaimKey.IssuedAt, Math.floor((options.issuedAt?.getTime() ?? Date.now()) / 1000)],\n [\n StatusListCwtClaimKey.StatusList,\n options.statusList instanceof StatusListCbor\n ? options.statusList\n : StatusListCbor.create({ statusList: options.statusList }),\n ],\n ...(options.additionalClaims ?? new Map()).entries(),\n ]) satisfies StatusListCwtPayloadEncodedStructure\n\n if (options.expirationTime) {\n map.set(RegisteredCwtClaimKey.ExpirationTime, Math.floor(options.expirationTime.getTime() / 1000))\n }\n\n if (options.timeToLive) {\n map.set(StatusListCwtClaimKey.TimeToLive, options.timeToLive)\n }\n\n return new StatusListCwtPayload(statusListCwtPayloadSchema.parse(map.toMap()))\n }\n\n public get subject() {\n return this.structure.get(RegisteredCwtClaimKey.Subject)\n }\n\n public get issuedAt() {\n return new Date(this.structure.get(RegisteredCwtClaimKey.IssuedAt) * 1000)\n }\n\n public get expirationTime() {\n return this.structure.has(RegisteredCwtClaimKey.ExpirationTime)\n ? // biome-ignore lint/style/noNonNullAssertion: checked with `has` in the line above\n new Date(this.structure.get(RegisteredCwtClaimKey.ExpirationTime)! * 1000)\n : undefined\n }\n\n public get timeToLive() {\n return this.structure.get(StatusListCwtClaimKey.TimeToLive)\n }\n\n public get statusList() {\n return this.structure.get(StatusListCwtClaimKey.StatusList).statusList\n }\n\n public getCustomClaim<ClaimType = unknown>(key: number) {\n return this.structure.get(key) as ClaimType | unknown\n }\n\n public setStatusList(statusList: StatusList | StatusListCbor) {\n this.structure.set(\n StatusListCwtClaimKey.StatusList,\n statusList instanceof StatusListCbor ? statusList : StatusListCbor.create({ statusList })\n )\n }\n}\n","import {\n type CoseKey,\n Cwt,\n type Mac0Context,\n type ProtectedHeaderOptions,\n ProtectedHeaders,\n RegisteredCwtClaimKey,\n type Sign1Context,\n type SignatureAlgorithm,\n type UnprotectedHeaderOptions,\n UnprotectedHeaders,\n} from '@owf/cose'\nimport { StatusList } from '../status-list'\nimport { SLException } from '../status-list-exception'\nimport { type BitsPerStatus, MediaTypes, StatusType } from '../types'\nimport { StatusListCbor } from './status-list-cbor'\nimport { type CreateStatusListCwtPayloadOptions, StatusListCwtPayload } from './status-list-cwt-payload'\n\nexport type StatusListCwtOptions = {\n payload: StatusListCwtPayload | CreateStatusListCwtPayloadOptions\n protectedHeaders?: ProtectedHeaders | ProtectedHeaderOptions['protectedHeaders']\n unprotectedHeaders?: UnprotectedHeaders | UnprotectedHeaderOptions['unprotectedHeaders']\n signatureOrTag?: Uint8Array\n}\n\nexport enum StatusListCwtHeaderKey {\n Typ = 16,\n}\n\nexport class StatusListCwt {\n public payload: StatusListCwtPayload\n public protectedHeaders?: ProtectedHeaders\n public unprotectedHeaders?: UnprotectedHeaders\n private signatureOrTag?: Uint8Array\n\n public constructor(options: StatusListCwtOptions) {\n this.payload =\n options.payload instanceof StatusListCwtPayload ? options.payload : StatusListCwtPayload.create(options.payload)\n this.protectedHeaders =\n options.protectedHeaders instanceof ProtectedHeaders\n ? options.protectedHeaders\n : ProtectedHeaders.create({ protectedHeaders: options.protectedHeaders })\n this.unprotectedHeaders =\n options.unprotectedHeaders instanceof UnprotectedHeaders\n ? options.unprotectedHeaders\n : UnprotectedHeaders.create({ unprotectedHeaders: options.unprotectedHeaders })\n\n this.signatureOrTag = options.signatureOrTag\n\n if (this.protectedHeaders.headers.get(StatusListCwtHeaderKey.Typ) === undefined) {\n this.protectedHeaders.headers.set(StatusListCwtHeaderKey.Typ, MediaTypes.StatusListCwt)\n }\n }\n\n public setStatusList(statusList: StatusList | StatusListCbor) {\n this.payload.setStatusList(statusList)\n }\n\n public updateStatusList(index: number, value: number) {\n this.payload.statusList.setStatus(index, value)\n }\n\n /**\n *\n * Create a minimal status list cwt. If you want to configure more options, like additional claims, use the constructor method\n *\n */\n public static createFromStatusListAndSubject(\n statusList:\n | StatusList\n | StatusListCbor\n | { statusList: number[]; bitsPerStatus: BitsPerStatus; aggregationUri?: string },\n subject: string\n ) {\n const cborStatusList =\n statusList instanceof StatusListCbor\n ? statusList\n : statusList instanceof StatusList\n ? StatusListCbor.create({ statusList })\n : StatusListCbor.create({\n bits: statusList.bitsPerStatus,\n list: statusList.statusList,\n aggregationUri: statusList.aggregationUri,\n })\n\n return new StatusListCwt({ payload: StatusListCwtPayload.create({ statusList: cborStatusList, subject }) })\n }\n\n public static fromToken(token: Uint8Array) {\n const cwt = Cwt.fromToken(token)\n\n if (!cwt.payload) {\n throw new SLException('Cwt does not contain payload, detached payload is not supported for status list CWT')\n }\n const payload = StatusListCwtPayload.decode(cwt.payload)\n\n return new StatusListCwt({\n payload,\n protectedHeaders: cwt.protectedHeaders,\n unprotectedHeaders: cwt.unprotectedHeaders,\n signatureOrTag: cwt.signatureOrTag,\n })\n }\n\n public async signAndEncode(\n options: {\n signingKey: CoseKey\n algorithm?: SignatureAlgorithm\n },\n ctx: Pick<Sign1Context, 'sign'>\n ) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.payload.encode(),\n })\n return (await cwt.asSign1.sign(options, ctx)).encode()\n }\n\n public async authenticateAndEncode(options: { key: CoseKey }, ctx: Pick<Mac0Context, 'authenticate'>) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.payload.encode(),\n })\n return (await cwt.asMac0.authenticate(options, ctx)).encode()\n }\n\n /**\n * @todo add check for `ttl` claim\n */\n public verifyStatus({\n idx,\n uri,\n checkFreshness = true,\n now = new Date(),\n }: {\n idx: number\n uri: string\n checkFreshness?: boolean\n now?: Date\n }) {\n if (this.payload.expirationTime && this.payload.expirationTime < now) {\n throw new SLException(\n `The expiration claim (${RegisteredCwtClaimKey.ExpirationTime}) '${this.payload.expirationTime}' is in the past (compared to '${now}'), and therefore not valid`\n )\n }\n if (this.payload.subject !== uri) {\n throw new SLException(\n `The subject claim (${RegisteredCwtClaimKey.Subject}) '${this.payload.subject}' must be equal to the uri '${uri}'`\n )\n }\n if (checkFreshness && this.payload.issuedAt > now) {\n throw new SLException(\n `The issued at claim (${RegisteredCwtClaimKey.IssuedAt}) '${this.payload.issuedAt}' is in the future (compared to '${now}'), and therefore not valid`\n )\n }\n if (this.payload.statusList.getStatus(idx) !== StatusType.Valid) {\n throw new SLException(\n `Status for id '${idx}' is not Valid (${StatusType.Valid}), but is instead '${this.payload.statusList.getStatus(idx)}'`\n )\n }\n }\n\n public async verifySignature({ key }: { key: CoseKey }, ctx: Pick<Sign1Context, 'verify'>) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.payload.encode(),\n signature: this.signatureOrTag,\n })\n\n return await cwt.verifySignature({ key }, ctx)\n }\n\n public async verifyAuthenticationCode({ key }: { key: CoseKey }, ctx: Pick<Mac0Context, 'verify'>) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.payload.encode(),\n tag: this.signatureOrTag,\n })\n\n return await cwt.verifyAuthenticationCode({ key }, ctx)\n }\n}\n","import { CborStructure, TypedMap, typedMap, zUint8Array } from '@owf/cose'\nimport { z } from 'zod'\n\n/**\n * StatusListInfo carries a reference to an IETF Token Status List\n * (draft-ietf-oauth-status-list) entry from inside the MSO's Status structure.\n *\n * Defined in ISO/IEC 18013-5 second edition (CD), 12.3.6.\n */\n// NOTE: idx is `uint` in the spec (unbounded CBOR uint). We constrain to JS\n// safe-integer range here, which is more than enough for real-world status\n// list sizes (Number.MAX_SAFE_INTEGER is ~9 × 10^15).\nconst statusListInfoSchema = typedMap([\n ['uri', z.string()],\n ['idx', z.number().int().nonnegative()],\n ['certificate', zUint8Array.exactOptional()],\n])\n\nexport type StatusListInfoDecodedStructure = z.output<typeof statusListInfoSchema>\nexport type StatusListInfoEncodedStructure = z.input<typeof statusListInfoSchema>\n\nexport type StatusListInfoOptions = {\n uri: string\n idx: number\n certificate?: Uint8Array\n}\n\nexport class StatusListInfo extends CborStructure<StatusListInfoEncodedStructure, StatusListInfoDecodedStructure> {\n public static override get encodingSchema() {\n return statusListInfoSchema\n }\n\n public get uri() {\n return this.structure.get('uri')\n }\n\n public get idx() {\n return this.structure.get('idx')\n }\n\n public get certificate() {\n return this.structure.get('certificate')\n }\n\n public static create(options: StatusListInfoOptions): StatusListInfo {\n const map: StatusListInfoDecodedStructure = new TypedMap([\n ['uri', options.uri],\n ['idx', options.idx],\n ])\n if (options.certificate) {\n map.set('certificate', options.certificate)\n }\n return StatusListInfo.fromDecodedStructure(map)\n }\n}\n","import { SLException } from './status-list-exception'\nimport { MediaTypes } from './types'\n\nexport const fetchStatusList = async ({\n uri,\n customFetcher = fetch,\n acceptedFormats = ['jwt', 'cwt'],\n}: {\n uri: string\n /**\n *\n * If none is supplied either can be returned\n *\n */\n acceptedFormats?: Array<'cwt' | 'jwt'>\n customFetcher?: typeof fetch\n}): Promise<string | Uint8Array> => {\n try {\n if (acceptedFormats.length === 0) {\n throw new SLException(`At least one accepted format (cwt, jwt) needs to be provided`)\n }\n\n const acceptHeaders = acceptedFormats.map((format) =>\n format === 'jwt' ? MediaTypes.StatusListJwt : MediaTypes.StatusListCwt\n )\n\n const response = await customFetcher(uri, {\n headers: {\n Accept: acceptHeaders.join(','),\n },\n })\n\n if (response.status > 399 || response.status <= 199) {\n throw new Error(`Could not fetch status list, response status '${response.status}'`)\n }\n\n const contentType = response.headers.get('Content-type')\n if (contentType === MediaTypes.StatusListJwt) {\n return await response.text()\n } else if (contentType === MediaTypes.StatusListCwt) {\n return await (await response.blob()).bytes()\n }\n\n throw new SLException('Content type was either not provided in the response or invalid.')\n } catch (e) {\n throw new SLException(`Could not fetch either a JWT or CWT as status list. ${(e as Error).message}`)\n }\n}\n","import type { JwtPayload } from '@owf/identity-common'\nimport type { BitsPerStatus, StatusListEntry } from './types'\n\n// ==================== JWT Types & Constants ====================\n\n/**\n * JWT type header value for Status List Token\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-5.1\n */\nexport const JWT_STATUS_LIST_TYPE = 'statuslist+jwt'\n\n/**\n * JWT claim names for Status List\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-14.1\n */\nexport const JWTClaimNames = {\n STATUS: 'status',\n STATUS_LIST: 'status_list',\n TTL: 'ttl',\n IDX: 'idx',\n URI: 'uri',\n BITS: 'bits',\n LST: 'lst',\n AGGREGATION_URI: 'aggregation_uri',\n} as const\n\n/**\n * Payload for a JWT with a status reference.\n */\nexport interface JWTwithStatusListPayload extends JwtPayload {\n status: {\n status_list: StatusListEntry\n }\n}\n\n/**\n * Payload for a Status List JWT.\n */\nexport interface StatusListJWTPayload extends JwtPayload {\n ttl?: number\n status_list: {\n bits: BitsPerStatus\n lst: string\n }\n}\n\n/**\n * Header parameters for a JWT Status List Token.\n */\nexport type StatusListJWTHeaderParameters = {\n alg: string\n typ: typeof JWT_STATUS_LIST_TYPE\n [key: string]: unknown\n}\n","import type { JwtPayload } from '@owf/identity-common'\nimport { base64url, bytesToString } from '@owf/identity-common'\nimport type { JWTwithStatusListPayload, StatusListJWTHeaderParameters, StatusListJWTPayload } from './jwt-types'\nimport { JWT_STATUS_LIST_TYPE } from './jwt-types'\nimport { StatusList } from './status-list'\nimport { SLException } from './status-list-exception'\nimport { type StatusListEntry, StatusType } from './types'\n\n/**\n * Decode a JWT and return the payload.\n * @param jwt JWT token in compact JWS serialization.\n */\nfunction decodeJwtPayload<T>(jwt: string): T {\n const parts = jwt.split('.')\n return JSON.parse(bytesToString(base64url.decode(parts[1])))\n}\n\n/**\n * Adds the status list to the payload and header of a JWT.\n */\nexport function createHeaderAndPayload(list: StatusList, payload: JwtPayload, header: StatusListJWTHeaderParameters) {\n if (!payload.sub) {\n throw new SLException('sub field is required')\n }\n if (!payload.iat) {\n throw new SLException('iat field is required')\n }\n\n header.typ = JWT_STATUS_LIST_TYPE\n payload.status_list = {\n bits: list.getBitsPerStatus(),\n lst: base64url.encode(list.compressStatusListToBytes()),\n }\n return { header, payload }\n}\n\n/**\n * Get the status list from a JWT, but do not verify the signature.\n */\nexport function getListFromStatusListJWT(jwt: string): StatusList {\n const payload = decodeJwtPayload<StatusListJWTPayload>(jwt)\n const statusList = payload.status_list\n const compressed = base64url.decode(statusList.lst)\n return StatusList.decompressStatusListFromBytes(compressed, statusList.bits)\n}\n\n/**\n * Get the status list entry from a JWT, but do not verify the signature.\n */\nexport function getStatusListFromJWT(jwt: string): StatusListEntry {\n const payload = decodeJwtPayload<JWTwithStatusListPayload>(jwt)\n return payload.status.status_list\n}\n\n/**\n * Verify the status of an `idx` in a `token`\n *\n * @todo properly validate the JWT with zod + signature\n */\nexport function verifyStatus({\n uri,\n idx,\n token,\n checkFreshness = true,\n now = new Date(),\n}: {\n token: string\n idx: number\n uri: string\n checkFreshness?: boolean\n now?: Date\n}) {\n const payload = decodeJwtPayload<StatusListJWTPayload>(token)\n const compressed = base64url.decode(payload.status_list.lst)\n const statusList = StatusList.decompressStatusListFromBytes(compressed, payload.status_list.bits)\n if (payload.subject !== uri) {\n throw new SLException(`The subject claim '${payload.subject}' must be equal to the uri '${uri}'`)\n }\n if (checkFreshness && payload.iat && payload.iat > Math.floor(now.getTime() / 1000)) {\n throw new SLException(\n `The issued at claim '${payload.issuedAt}' is in the future (compared to '${now}'), and therefore not valid`\n )\n }\n if (payload.exp && payload.exp < Math.floor(now.getTime() / 1000)) {\n throw new SLException(\n `The expiry claim '${payload.exp}' is in the past (compared to '${now}'), and therefore not valid`\n )\n }\n if (statusList.getStatus(idx) !== StatusType.Valid) {\n throw new SLException(\n `Status for id '${idx}' is not Valid (${StatusType.Valid}), but is instead '${statusList.getStatus(idx)}'`\n )\n }\n return true\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["z","z"],"sources":["../src/status-list-exception.ts","../src/status-list.ts","../src/cbor/status-list-cbor.ts","../src/types.ts","../src/cbor/status-list-cwt-payload.ts","../src/cbor/status-list-cwt.ts","../src/cbor/status-list-info.ts","../src/fetch-status-list.ts","../src/jwt-types.ts","../src/status-list-jwt.ts"],"sourcesContent":["import { IdentityException } from '@owf/identity-common'\n\n/**\n * SLException is a custom error class for Status List related exceptions.\n */\nexport class SLException extends IdentityException {\n constructor(message: string, details?: unknown) {\n super(message, details)\n Object.setPrototypeOf(this, SLException.prototype)\n this.name = 'SLException'\n }\n}\n","import { deflate, inflate } from 'pako'\nimport { SLException } from './status-list-exception'\nimport type { BitsPerStatus, StatusType } from './types'\n\n/**\n * StatusList is a class that manages a list of statuses with variable bit size.\n */\nexport class StatusList {\n private _statusList: Array<StatusType | number>\n private bitsPerStatus: BitsPerStatus\n public readonly totalStatuses: number\n public aggregationUri?: string\n\n constructor(statusList: number[], bitsPerStatus: BitsPerStatus, aggregationUri?: string) {\n if (![1, 2, 4, 8].includes(bitsPerStatus)) {\n throw new SLException('bitsPerStatus must be 1, 2, 4, or 8')\n }\n for (let i = 0; i < statusList.length; i++) {\n if (statusList[i] > 2 ** bitsPerStatus) {\n throw new SLException(`Status value out of range at index ${i} with value ${statusList[i]}`)\n }\n }\n this._statusList = statusList\n this.bitsPerStatus = bitsPerStatus\n this.totalStatuses = statusList.length\n this.aggregationUri = aggregationUri\n }\n\n /** Get the status list. */\n get statusList(): number[] {\n return this._statusList\n }\n\n /** Get the number of bits per status. */\n getBitsPerStatus(): BitsPerStatus {\n return this.bitsPerStatus\n }\n\n /** Get the status at a specific index. */\n getStatus(index: number): StatusType {\n if (index < 0 || index >= this.totalStatuses) {\n throw new Error('Index out of bounds')\n }\n return this._statusList[index]\n }\n\n /** Set the status at a specific index. */\n setStatus(index: number, value: StatusType | number): void {\n if (index < 0 || index >= this.totalStatuses) {\n throw new Error('Index out of bounds')\n }\n this._statusList[index] = value\n }\n\n /** Compress the status list and return as raw bytes. */\n compressStatusListToBytes(): Uint8Array {\n const byteArray = this.encodeStatusListIntoByteArray()\n return deflate(byteArray, { level: 9 })\n }\n\n /** Decompress a raw byte array and return a new StatusList instance. */\n static decompressStatusListFromBytes(\n compressed: Uint8Array,\n bitsPerStatus: BitsPerStatus,\n aggregationUri?: string\n ): StatusList {\n try {\n const decompressed = inflate(compressed)\n const statusList = StatusList.decodeStatusListFromByteArray(decompressed, bitsPerStatus)\n return new StatusList(statusList, bitsPerStatus, aggregationUri)\n } catch (err: unknown) {\n throw new Error(`Decompression failed: ${err}`)\n }\n }\n\n /** Encode the status list into a byte array. */\n public encodeStatusListIntoByteArray(): Uint8Array {\n const numBits = this.bitsPerStatus\n const numBytes = Math.ceil((this.totalStatuses * numBits) / 8)\n const byteArray = new Uint8Array(numBytes)\n let byteIndex = 0\n let bitIndex = 0\n let currentByte = ''\n for (let i = 0; i < this.totalStatuses; i++) {\n const status = this._statusList[i]\n currentByte = status.toString(2).padStart(numBits, '0') + currentByte\n bitIndex += numBits\n\n if (bitIndex >= 8 || i === this.totalStatuses - 1) {\n if (i === this.totalStatuses - 1 && bitIndex % 8 !== 0) {\n currentByte = currentByte.padStart(8, '0')\n }\n byteArray[byteIndex] = Number.parseInt(currentByte, 2)\n currentByte = ''\n bitIndex = 0\n byteIndex++\n }\n }\n\n return byteArray\n }\n\n /** Decode the byte array into a status list. */\n private static decodeStatusListFromByteArray(byteArray: Uint8Array, bitsPerStatus: BitsPerStatus): StatusType[] {\n const numBits = bitsPerStatus\n const totalStatuses = (byteArray.length * 8) / numBits\n const statusList = new Array<number>(totalStatuses)\n let bitIndex = 0\n for (let i = 0; i < totalStatuses; i++) {\n const byte = byteArray[Math.floor((i * numBits) / 8)]\n let byteString = byte.toString(2)\n if (byteString.length < 8) {\n byteString = '0'.repeat(8 - byteString.length) + byteString\n }\n const status = byteString.slice(bitIndex, bitIndex + numBits)\n const group = Math.floor(i / (8 / numBits))\n const indexInGroup = i % (8 / numBits)\n const position = group * (8 / numBits) + (8 / numBits + -1 - indexInGroup)\n statusList[position] = Number.parseInt(status, 2)\n bitIndex = (bitIndex + numBits) % 8\n }\n return statusList\n }\n}\n","import { CborStructure, TypedMap, typedMap, zUint8Array } from '@owf/cose'\nimport { z } from 'zod'\nimport { StatusList } from '../status-list'\nimport type { BitsPerStatus } from '../types'\n\nexport const statusListCborEncodedSchema = typedMap([\n ['bits', z.union([z.literal(1), z.literal(2), z.literal(4), z.literal(8)])],\n ['lst', zUint8Array],\n ['aggregation_uri', z.string().optional()],\n])\n\nexport const statusListCborDecodedSchema = z.instanceof(StatusList)\n\nexport type StatusListCborEncodedStructure = z.infer<typeof statusListCborEncodedSchema>\nexport type StatusListCborDecodedStructure = z.infer<typeof statusListCborDecodedSchema>\n\nexport type CreateStatusListCborOptions = {\n bits: BitsPerStatus\n list: Uint8Array | number[]\n aggregationUri?: string\n}\n\nexport type StatusListCborWithStatusListOptions = {\n statusList: StatusList\n}\n\nexport class StatusListCbor extends CborStructure<StatusListCborEncodedStructure, StatusListCborDecodedStructure> {\n public statusList = this.structure\n\n public static override get encodingSchema() {\n return z.codec(statusListCborEncodedSchema, statusListCborDecodedSchema, {\n encode: (statusList) => {\n return new TypedMap([\n ['bits', statusList.getBitsPerStatus()],\n ['lst', statusList.compressStatusListToBytes()],\n ['aggregation_uri', statusList.aggregationUri],\n ]) satisfies StatusListCborEncodedStructure\n },\n decode: (input) => {\n return StatusList.decompressStatusListFromBytes(\n input.get('lst'),\n input.get('bits'),\n input.get('aggregation_uri')\n )\n },\n })\n }\n\n public static create(options: CreateStatusListCborOptions | StatusListCborWithStatusListOptions) {\n const statusList =\n 'statusList' in options\n ? options.statusList\n : options.list instanceof Uint8Array\n ? StatusList.decompressStatusListFromBytes(options.list, options.bits, options.aggregationUri)\n : new StatusList(options.list, options.bits, options.aggregationUri)\n\n return new StatusListCbor(statusList)\n }\n}\n","// ==================== Common Types & Constants ====================\n\n/**\n * Status Type values as defined in the spec.\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-7\n */\nexport enum StatusType {\n /** The status of the Referenced Token is valid, correct or legal. */\n Valid = 0x00,\n /** The status of the Referenced Token is revoked, annulled, taken back, recalled or cancelled. */\n Invalid = 0x01,\n /** The status of the Referenced Token is temporarily invalid, hanging, debarred from privilege. */\n Suspended = 0x02,\n /** Application-specific status (0x03). */\n ApplicationSpecific3 = 0x03,\n /** Application-specific status range start (0x0C). */\n ApplicationSpecificRangeStart = 0x0c,\n /** Application-specific status range end (0x0F). */\n ApplicationSpecificRangeEnd = 0x0f,\n}\n\n/**\n * Media types for Status List Tokens\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-14.7\n */\nexport const MediaTypes = {\n /** Media type for JWT-based Status List Token */\n StatusListJwt: 'application/statuslist+jwt',\n /** Media type for CWT-based Status List Token */\n StatusListCwt: 'application/statuslist+cwt',\n} as const\n\n/**\n * BitsPerStatus type.\n */\nexport type BitsPerStatus = 1 | 2 | 4 | 8\n\n/**\n * Reference to a status list entry.\n */\nexport interface StatusListEntry {\n idx: number\n uri: string\n}\n","import { CborStructure, RegisteredCwtClaimKey, TypedMap, typedMap } from '@owf/cose'\nimport z from 'zod'\nimport type { StatusList } from '../status-list'\nimport { StatusListCbor, type StatusListCborEncodedStructure } from './status-list-cbor'\n\nexport enum StatusListCwtClaimKey {\n TimeToLive = 65534,\n StatusList = 65533,\n}\n\nconst statusListCwtPayloadSchema = typedMap(\n [\n [RegisteredCwtClaimKey.Subject, z.string()],\n [RegisteredCwtClaimKey.IssuedAt, z.number()],\n [RegisteredCwtClaimKey.ExpirationTime, z.number().exactOptional()],\n [StatusListCwtClaimKey.TimeToLive, z.number().exactOptional()],\n [StatusListCwtClaimKey.StatusList, z.instanceof(StatusListCbor)],\n ],\n { allowAdditionalKeys: true }\n)\n\nexport type StatusListCwtPayloadEncodedStructure = z.infer<typeof statusListCwtPayloadSchema>\nexport type StatusListCwtPayloadDecodedStructure = z.infer<typeof statusListCwtPayloadSchema>\n\nexport type CreateStatusListCwtPayloadOptions = {\n subject: string\n statusList: StatusListCbor | StatusList\n issuedAt?: Date\n expirationTime?: Date\n timeToLive?: number\n additionalClaims?: Map<number | string, unknown>\n}\n\nexport class StatusListCwtPayload extends CborStructure<\n StatusListCwtPayloadEncodedStructure,\n StatusListCwtPayloadDecodedStructure\n> {\n public static override get encodingSchema() {\n return z.codec(statusListCwtPayloadSchema.in, statusListCwtPayloadSchema.out, {\n decode: (input) => {\n const map: StatusListCwtPayloadDecodedStructure = TypedMap.fromMap(input)\n\n map.set(\n StatusListCwtClaimKey.StatusList,\n StatusListCbor.fromEncodedStructure(\n input.get(StatusListCwtClaimKey.StatusList) as StatusListCborEncodedStructure\n )\n )\n\n return map\n },\n encode: (output) => {\n const map = output.toMap() as Map<unknown, unknown>\n map.set(StatusListCwtClaimKey.StatusList, output.get(StatusListCwtClaimKey.StatusList).encodedStructure)\n return map\n },\n })\n }\n\n public static create(options: CreateStatusListCwtPayloadOptions) {\n const map = new TypedMap([\n [RegisteredCwtClaimKey.Subject, options.subject],\n [RegisteredCwtClaimKey.IssuedAt, Math.floor((options.issuedAt?.getTime() ?? Date.now()) / 1000)],\n [\n StatusListCwtClaimKey.StatusList,\n options.statusList instanceof StatusListCbor\n ? options.statusList\n : StatusListCbor.create({ statusList: options.statusList }),\n ],\n ...(options.additionalClaims ?? new Map()).entries(),\n ]) satisfies StatusListCwtPayloadEncodedStructure\n\n if (options.expirationTime) {\n map.set(RegisteredCwtClaimKey.ExpirationTime, Math.floor(options.expirationTime.getTime() / 1000))\n }\n\n if (options.timeToLive) {\n map.set(StatusListCwtClaimKey.TimeToLive, options.timeToLive)\n }\n\n return new StatusListCwtPayload(statusListCwtPayloadSchema.parse(map.toMap()))\n }\n\n public get subject() {\n return this.structure.get(RegisteredCwtClaimKey.Subject)\n }\n\n public get issuedAt() {\n return new Date(this.structure.get(RegisteredCwtClaimKey.IssuedAt) * 1000)\n }\n\n public get expirationTime() {\n return this.structure.has(RegisteredCwtClaimKey.ExpirationTime)\n ? // biome-ignore lint/style/noNonNullAssertion: checked with `has` in the line above\n new Date(this.structure.get(RegisteredCwtClaimKey.ExpirationTime)! * 1000)\n : undefined\n }\n\n public get timeToLive() {\n return this.structure.get(StatusListCwtClaimKey.TimeToLive)\n }\n\n public get statusList() {\n return this.structure.get(StatusListCwtClaimKey.StatusList).statusList\n }\n\n public getCustomClaim<ClaimType = unknown>(key: number) {\n return this.structure.get(key) as ClaimType | unknown\n }\n\n public setStatusList(statusList: StatusList | StatusListCbor) {\n this.structure.set(\n StatusListCwtClaimKey.StatusList,\n statusList instanceof StatusListCbor ? statusList : StatusListCbor.create({ statusList })\n )\n }\n}\n","import {\n type CoseKey,\n Cwt,\n type Mac0Context,\n type ProtectedHeaderOptions,\n ProtectedHeaders,\n RegisteredCwtClaimKey,\n type Sign1Context,\n type SignatureAlgorithm,\n type UnprotectedHeaderOptions,\n UnprotectedHeaders,\n} from '@owf/cose'\nimport { StatusList } from '../status-list'\nimport { SLException } from '../status-list-exception'\nimport { type BitsPerStatus, MediaTypes, StatusType } from '../types'\nimport { StatusListCbor } from './status-list-cbor'\nimport { type CreateStatusListCwtPayloadOptions, StatusListCwtPayload } from './status-list-cwt-payload'\n\nexport type StatusListCwtOptions = {\n payload: StatusListCwtPayload | CreateStatusListCwtPayloadOptions\n protectedHeaders?: ProtectedHeaders | ProtectedHeaderOptions['protectedHeaders']\n unprotectedHeaders?: UnprotectedHeaders | UnprotectedHeaderOptions['unprotectedHeaders']\n signatureOrTag?: Uint8Array\n originalPayloadBytes?: Uint8Array\n}\n\nexport enum StatusListCwtHeaderKey {\n Typ = 16,\n}\n\nexport class StatusListCwt {\n public payload: StatusListCwtPayload\n public protectedHeaders?: ProtectedHeaders\n public unprotectedHeaders?: UnprotectedHeaders\n private signatureOrTag?: Uint8Array\n private originalPayloadBytes?: Uint8Array\n\n public constructor(options: StatusListCwtOptions) {\n this.payload =\n options.payload instanceof StatusListCwtPayload ? options.payload : StatusListCwtPayload.create(options.payload)\n this.protectedHeaders =\n options.protectedHeaders instanceof ProtectedHeaders\n ? options.protectedHeaders\n : ProtectedHeaders.create({ protectedHeaders: options.protectedHeaders })\n this.unprotectedHeaders =\n options.unprotectedHeaders instanceof UnprotectedHeaders\n ? options.unprotectedHeaders\n : UnprotectedHeaders.create({ unprotectedHeaders: options.unprotectedHeaders })\n\n this.signatureOrTag = options.signatureOrTag\n this.originalPayloadBytes = options.originalPayloadBytes\n\n if (this.protectedHeaders.headers.get(StatusListCwtHeaderKey.Typ) === undefined) {\n this.protectedHeaders.headers.set(StatusListCwtHeaderKey.Typ, MediaTypes.StatusListCwt)\n }\n }\n\n public setStatusList(statusList: StatusList | StatusListCbor) {\n this.payload.setStatusList(statusList)\n this.originalPayloadBytes = undefined\n }\n\n public updateStatusList(index: number, value: number) {\n this.payload.statusList.setStatus(index, value)\n this.originalPayloadBytes = undefined\n }\n\n /**\n *\n * Create a minimal status list cwt. If you want to configure more options, like additional claims, use the constructor method\n *\n */\n public static createFromStatusListAndSubject(\n statusList:\n | StatusList\n | StatusListCbor\n | { statusList: number[]; bitsPerStatus: BitsPerStatus; aggregationUri?: string },\n subject: string\n ) {\n const cborStatusList =\n statusList instanceof StatusListCbor\n ? statusList\n : statusList instanceof StatusList\n ? StatusListCbor.create({ statusList })\n : StatusListCbor.create({\n bits: statusList.bitsPerStatus,\n list: statusList.statusList,\n aggregationUri: statusList.aggregationUri,\n })\n\n return new StatusListCwt({ payload: StatusListCwtPayload.create({ statusList: cborStatusList, subject }) })\n }\n\n public static fromToken(token: Uint8Array) {\n const cwt = Cwt.fromToken(token)\n\n if (!cwt.payload) {\n throw new SLException('Cwt does not contain payload, detached payload is not supported for status list CWT')\n }\n const payload = StatusListCwtPayload.decode(cwt.payload)\n\n return new StatusListCwt({\n payload,\n protectedHeaders: cwt.protectedHeaders,\n unprotectedHeaders: cwt.unprotectedHeaders,\n signatureOrTag: cwt.signatureOrTag,\n originalPayloadBytes: new Uint8Array(cwt.payload),\n })\n }\n\n public async signAndEncode(\n options: {\n signingKey: CoseKey\n algorithm?: SignatureAlgorithm\n },\n ctx: Pick<Sign1Context, 'sign'>\n ) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.payload.encode(),\n })\n return (await cwt.asSign1.sign(options, ctx)).encode()\n }\n\n public async authenticateAndEncode(options: { key: CoseKey }, ctx: Pick<Mac0Context, 'authenticate'>) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.payload.encode(),\n })\n return (await cwt.asMac0.authenticate(options, ctx)).encode()\n }\n\n /**\n * @todo add check for `ttl` claim\n */\n public verifyStatus({\n idx,\n uri,\n checkFreshness = true,\n now = new Date(),\n }: {\n idx: number\n uri: string\n checkFreshness?: boolean\n now?: Date\n }) {\n if (this.payload.expirationTime && this.payload.expirationTime < now) {\n throw new SLException(\n `The expiration claim (${RegisteredCwtClaimKey.ExpirationTime}) '${this.payload.expirationTime}' is in the past (compared to '${now}'), and therefore not valid`\n )\n }\n if (this.payload.subject !== uri) {\n throw new SLException(\n `The subject claim (${RegisteredCwtClaimKey.Subject}) '${this.payload.subject}' must be equal to the uri '${uri}'`\n )\n }\n if (checkFreshness && this.payload.issuedAt > now) {\n throw new SLException(\n `The issued at claim (${RegisteredCwtClaimKey.IssuedAt}) '${this.payload.issuedAt}' is in the future (compared to '${now}'), and therefore not valid`\n )\n }\n if (this.payload.statusList.getStatus(idx) !== StatusType.Valid) {\n throw new SLException(\n `Status for id '${idx}' is not Valid (${StatusType.Valid}), but is instead '${this.payload.statusList.getStatus(idx)}'`\n )\n }\n }\n\n public async verifySignature({ key }: { key: CoseKey }, ctx: Pick<Sign1Context, 'verify'>) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.originalPayloadBytes ?? this.payload.encode(),\n signature: this.signatureOrTag,\n })\n\n return await cwt.verifySignature({ key }, ctx)\n }\n\n public async verifyAuthenticationCode({ key }: { key: CoseKey }, ctx: Pick<Mac0Context, 'verify'>) {\n const cwt = new Cwt({\n protectedHeaders: this.protectedHeaders,\n unprotectedHeaders: this.unprotectedHeaders,\n payload: this.originalPayloadBytes ?? this.payload.encode(),\n tag: this.signatureOrTag,\n })\n\n return await cwt.verifyAuthenticationCode({ key }, ctx)\n }\n}\n","import { CborStructure, TypedMap, typedMap, zUint8Array } from '@owf/cose'\nimport { z } from 'zod'\n\n/**\n * StatusListInfo carries a reference to an IETF Token Status List\n * (draft-ietf-oauth-status-list) entry from inside the MSO's Status structure.\n *\n * Defined in ISO/IEC 18013-5 second edition (CD), 12.3.6.\n */\n// NOTE: idx is `uint` in the spec (unbounded CBOR uint). We constrain to JS\n// safe-integer range here, which is more than enough for real-world status\n// list sizes (Number.MAX_SAFE_INTEGER is ~9 × 10^15).\nconst statusListInfoSchema = typedMap([\n ['uri', z.string()],\n ['idx', z.number().int().nonnegative()],\n ['certificate', zUint8Array.exactOptional()],\n])\n\nexport type StatusListInfoDecodedStructure = z.output<typeof statusListInfoSchema>\nexport type StatusListInfoEncodedStructure = z.input<typeof statusListInfoSchema>\n\nexport type StatusListInfoOptions = {\n uri: string\n idx: number\n certificate?: Uint8Array\n}\n\nexport class StatusListInfo extends CborStructure<StatusListInfoEncodedStructure, StatusListInfoDecodedStructure> {\n public static override get encodingSchema() {\n return statusListInfoSchema\n }\n\n public get uri() {\n return this.structure.get('uri')\n }\n\n public get idx() {\n return this.structure.get('idx')\n }\n\n public get certificate() {\n return this.structure.get('certificate')\n }\n\n public static create(options: StatusListInfoOptions): StatusListInfo {\n const map: StatusListInfoDecodedStructure = new TypedMap([\n ['uri', options.uri],\n ['idx', options.idx],\n ])\n if (options.certificate) {\n map.set('certificate', options.certificate)\n }\n return StatusListInfo.fromDecodedStructure(map)\n }\n}\n","import { SLException } from './status-list-exception'\nimport { MediaTypes } from './types'\n\nexport const fetchStatusList = async ({\n uri,\n customFetcher = fetch,\n acceptedFormats = ['jwt', 'cwt'],\n}: {\n uri: string\n /**\n *\n * If none is supplied either can be returned\n *\n */\n acceptedFormats?: Array<'cwt' | 'jwt'>\n customFetcher?: typeof fetch\n}): Promise<string | Uint8Array> => {\n try {\n if (acceptedFormats.length === 0) {\n throw new SLException(`At least one accepted format (cwt, jwt) needs to be provided`)\n }\n\n const acceptHeaders = acceptedFormats.map((format) =>\n format === 'jwt' ? MediaTypes.StatusListJwt : MediaTypes.StatusListCwt\n )\n\n const response = await customFetcher(uri, {\n headers: {\n Accept: acceptHeaders.join(','),\n },\n })\n\n if (response.status > 399 || response.status <= 199) {\n throw new Error(`Could not fetch status list, response status '${response.status}'`)\n }\n\n const contentType = response.headers.get('Content-type')\n if (contentType === MediaTypes.StatusListJwt) {\n return await response.text()\n } else if (contentType === MediaTypes.StatusListCwt) {\n return await (await response.blob()).bytes()\n }\n\n throw new SLException('Content type was either not provided in the response or invalid.')\n } catch (e) {\n throw new SLException(`Could not fetch either a JWT or CWT as status list. ${(e as Error).message}`)\n }\n}\n","import type { JwtPayload } from '@owf/identity-common'\nimport type { BitsPerStatus, StatusListEntry } from './types'\n\n// ==================== JWT Types & Constants ====================\n\n/**\n * JWT type header value for Status List Token\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-5.1\n */\nexport const JWT_STATUS_LIST_TYPE = 'statuslist+jwt'\n\n/**\n * JWT claim names for Status List\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-16.html#section-14.1\n */\nexport const JWTClaimNames = {\n STATUS: 'status',\n STATUS_LIST: 'status_list',\n TTL: 'ttl',\n IDX: 'idx',\n URI: 'uri',\n BITS: 'bits',\n LST: 'lst',\n AGGREGATION_URI: 'aggregation_uri',\n} as const\n\n/**\n * Payload for a JWT with a status reference.\n */\nexport interface JWTwithStatusListPayload extends JwtPayload {\n status: {\n status_list: StatusListEntry\n }\n}\n\n/**\n * Payload for a Status List JWT.\n */\nexport interface StatusListJWTPayload extends JwtPayload {\n ttl?: number\n status_list: {\n bits: BitsPerStatus\n lst: string\n }\n}\n\n/**\n * Header parameters for a JWT Status List Token.\n */\nexport type StatusListJWTHeaderParameters = {\n alg: string\n typ: typeof JWT_STATUS_LIST_TYPE\n [key: string]: unknown\n}\n","import type { JwtPayload } from '@owf/identity-common'\nimport { base64url, bytesToString } from '@owf/identity-common'\nimport type { JWTwithStatusListPayload, StatusListJWTHeaderParameters, StatusListJWTPayload } from './jwt-types'\nimport { JWT_STATUS_LIST_TYPE } from './jwt-types'\nimport { StatusList } from './status-list'\nimport { SLException } from './status-list-exception'\nimport { type StatusListEntry, StatusType } from './types'\n\n/**\n * Decode a JWT and return the payload.\n * @param jwt JWT token in compact JWS serialization.\n */\nfunction decodeJwtPayload<T>(jwt: string): T {\n const parts = jwt.split('.')\n return JSON.parse(bytesToString(base64url.decode(parts[1])))\n}\n\n/**\n * Adds the status list to the payload and header of a JWT.\n */\nexport function createHeaderAndPayload(list: StatusList, payload: JwtPayload, header: StatusListJWTHeaderParameters) {\n if (!payload.sub) {\n throw new SLException('sub field is required')\n }\n if (!payload.iat) {\n throw new SLException('iat field is required')\n }\n\n header.typ = JWT_STATUS_LIST_TYPE\n payload.status_list = {\n bits: list.getBitsPerStatus(),\n lst: base64url.encode(list.compressStatusListToBytes()),\n }\n return { header, payload }\n}\n\n/**\n * Get the status list from a JWT, but do not verify the signature.\n */\nexport function getListFromStatusListJWT(jwt: string): StatusList {\n const payload = decodeJwtPayload<StatusListJWTPayload>(jwt)\n const statusList = payload.status_list\n const compressed = base64url.decode(statusList.lst)\n return StatusList.decompressStatusListFromBytes(compressed, statusList.bits)\n}\n\n/**\n * Get the status list entry from a JWT, but do not verify the signature.\n */\nexport function getStatusListFromJWT(jwt: string): StatusListEntry {\n const payload = decodeJwtPayload<JWTwithStatusListPayload>(jwt)\n return payload.status.status_list\n}\n\n/**\n * Verify the status of an `idx` in a `token`\n *\n * @todo properly validate the JWT with zod + signature\n */\nexport function verifyStatus({\n uri,\n idx,\n token,\n checkFreshness = true,\n now = new Date(),\n}: {\n token: string\n idx: number\n uri: string\n checkFreshness?: boolean\n now?: Date\n}) {\n const payload = decodeJwtPayload<StatusListJWTPayload>(token)\n const compressed = base64url.decode(payload.status_list.lst)\n const statusList = StatusList.decompressStatusListFromBytes(compressed, payload.status_list.bits)\n if (payload.subject !== uri) {\n throw new SLException(`The subject claim '${payload.subject}' must be equal to the uri '${uri}'`)\n }\n if (checkFreshness && payload.iat && payload.iat > Math.floor(now.getTime() / 1000)) {\n throw new SLException(\n `The issued at claim '${payload.issuedAt}' is in the future (compared to '${now}'), and therefore not valid`\n )\n }\n if (payload.exp && payload.exp < Math.floor(now.getTime() / 1000)) {\n throw new SLException(\n `The expiry claim '${payload.exp}' is in the past (compared to '${now}'), and therefore not valid`\n )\n }\n if (statusList.getStatus(idx) !== StatusType.Valid) {\n throw new SLException(\n `Status for id '${idx}' is not Valid (${StatusType.Valid}), but is instead '${statusList.getStatus(idx)}'`\n )\n }\n return true\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@owf/token-status-list",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3-alpha-20260716073051",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist"
|
|
6
6
|
],
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"cbor-x": "^1.6.4",
|
|
31
31
|
"pako": "^3.0.1",
|
|
32
32
|
"zod": "^4.4.3",
|
|
33
|
-
"@owf/cose": "0.3.
|
|
34
|
-
"@owf/identity-common": "0.3.
|
|
33
|
+
"@owf/cose": "0.3.3-alpha-20260716073051",
|
|
34
|
+
"@owf/identity-common": "0.3.3-alpha-20260716073051"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@noble/curves": "^2.2.0",
|