@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 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
  }
@@ -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
  }
@@ -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.2",
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.2",
34
- "@owf/identity-common": "0.3.2"
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",