@sd-jwt/core 0.20.1 → 0.21.0-alpha-20260916100413
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/LICENSE +2 -2
- package/README.md +82 -80
- package/dist/index.cjs +1526 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +696 -0
- package/dist/index.d.mts +537 -527
- package/dist/index.mjs +1422 -1998
- package/dist/index.mjs.map +1 -0
- package/package.json +29 -49
- package/CHANGELOG.md +0 -39
- package/dist/index.d.ts +0 -686
- package/dist/index.js +0 -2100
- package/src/decode/decode.ts +0 -407
- package/src/decode/index.ts +0 -1
- package/src/decoy.ts +0 -15
- package/src/flattenJSON.ts +0 -99
- package/src/generalJSON.ts +0 -157
- package/src/index.ts +0 -1000
- package/src/jwt.ts +0 -286
- package/src/kbjwt.ts +0 -101
- package/src/present/index.ts +0 -1
- package/src/present/present.ts +0 -216
- package/src/sdjwt.ts +0 -384
- package/src/test/decode/decode.spec.ts +0 -197
- package/src/test/decoy.spec.ts +0 -30
- package/src/test/flattenJSON.spec.ts +0 -122
- package/src/test/generalJSON.spec.ts +0 -198
- package/src/test/index.spec.ts +0 -986
- package/src/test/jwt.spec.ts +0 -301
- package/src/test/kbjwt.spec.ts +0 -555
- package/src/test/pass.spec.ts +0 -7
- package/src/test/present/present.spec.ts +0 -305
- package/src/test/sdjwt.spec.ts +0 -384
- package/src/test/types/type.spec.ts +0 -88
- package/src/test/utils/base64url.spec.ts +0 -33
- package/src/test/utils/disclosure.spec.ts +0 -170
- package/src/test/utils/error.spec.ts +0 -15
- package/src/types/index.ts +0 -2
- package/src/types/type.ts +0 -270
- package/src/types/verification-error.ts +0 -55
- package/src/utils/base64url.ts +0 -6
- package/src/utils/disclosure.ts +0 -121
- package/src/utils/error.ts +0 -25
- package/src/utils/index.ts +0 -3
- package/src/utils/strict-json.ts +0 -17
- package/test/app-e2e.spec.ts +0 -292
- package/test/array_data_types.json +0 -31
- package/test/array_full_sd.json +0 -21
- package/test/array_in_sd.json +0 -13
- package/test/array_nested_in_plain.json +0 -29
- package/test/array_none_disclosed.json +0 -17
- package/test/array_of_nulls.json +0 -15
- package/test/array_of_objects.json +0 -65
- package/test/array_of_scalars.json +0 -19
- package/test/array_recursive_sd.json +0 -35
- package/test/array_recursive_sd_some_disclosed.json +0 -63
- package/test/complex.json +0 -43
- package/test/header_mod.json +0 -48
- package/test/json_serialization.json +0 -48
- package/test/key_binding.json +0 -48
- package/test/no_sd.json +0 -36
- package/test/object_data_types.json +0 -62
- package/test/recursions.json +0 -117
- package/test/rfc9901-audit-fixes.spec.ts +0 -252
- package/test/rfc9901-validation.spec.ts +0 -150
- package/test/tsconfig.json +0 -4
- package/tsconfig.json +0 -7
- package/vitest.config.mts +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["base64urlDecodeJson","uint8ArrayToBase64Url","base64urlEncode","decodeJwtCommon","base64urlEncode","nowInSeconds","base64urlEncode","nowInSeconds","uint8ArrayToBase64Url","uint8ArrayToBase64Url","base64urlEncode"],"sources":["../src/types/type.ts","../src/utils/error.ts","../src/utils/strict-json.ts","../src/utils/disclosure.ts","../src/decode/decode.ts","../src/flattenJSON.ts","../src/generalJSON.ts","../src/jwt.ts","../src/kbjwt.ts","../src/decoy.ts","../src/present/present.ts","../src/sdjwt.ts","../src/index.ts"],"sourcesContent":["export const SD_SEPARATOR = '~'\nexport const SD_LIST_KEY = '...'\nexport const SD_DIGEST = '_sd'\nexport const SD_DECOY = '_sd_decoy'\nexport const KB_JWT_TYP = 'kb+jwt'\n\nexport type SDJWTCompact = string\nexport type Base64urlString = string\n\nexport type DisclosureData<T> = [string, string, T] | [string, T]\n\nexport const encodePathSegment = (segment: string) => segment.replace(/~/g, '~0').replace(/\\./g, '~1')\n\nexport const encodePath = (segments: string[]) => segments.map(encodePathSegment).join('.')\n\n// based on https://www.iana.org/assignments/named-information/named-information.xhtml\nexport const IANA_HASH_ALGORITHMS = [\n 'sha-256',\n 'sha-256-128',\n 'sha-256-120',\n 'sha-256-96',\n 'sha-256-64',\n 'sha-256-32',\n 'sha-384',\n 'sha-512',\n 'sha3-224',\n 'sha3-256',\n 'sha3-384',\n 'sha3-512',\n 'blake2s-256',\n 'blake2b-256',\n 'blake2b-512',\n 'k12-256',\n 'k12-512',\n] as const\n\nexport type HashAlgorithm = (typeof IANA_HASH_ALGORITHMS)[number]\n\nexport const DEFAULT_SECURE_HASH_ALGORITHMS = [\n 'sha-256',\n 'sha-384',\n 'sha-512',\n 'sha3-256',\n 'sha3-384',\n 'sha3-512',\n 'blake2s-256',\n 'blake2b-256',\n 'blake2b-512',\n 'k12-256',\n 'k12-512',\n] as const satisfies ReadonlyArray<HashAlgorithm>\n\nexport type SDJWTConfig<T = unknown> = {\n omitTyp?: boolean\n hasher?: Hasher\n hashAlg?: HashAlgorithm\n allowedDisclosureHashAlgorithms?: ReadonlyArray<HashAlgorithm>\n saltGenerator?: SaltGenerator\n signer?: Signer\n signAlg?: string\n verifier?: Verifier<T>\n kbSigner?: Signer\n kbSignAlg?: string\n kbVerifier?: KbVerifier\n}\n\nexport type kbHeader = { typ: 'kb+jwt'; alg: string }\nexport type kbPayload = {\n iat: number\n aud: string\n nonce: string\n sd_hash: string\n}\n\nexport type KBOptions = {\n payload: Omit<kbPayload, 'sd_hash'>\n}\n\n// This type declaration is from lib.dom.ts\ninterface RsaOtherPrimesInfo {\n d?: string\n r?: string\n t?: string\n}\n\ninterface JsonWebKey {\n alg?: string\n crv?: string\n d?: string\n dp?: string\n dq?: string\n e?: string\n ext?: boolean\n k?: string\n key_ops?: string[]\n kty?: string\n n?: string\n oth?: RsaOtherPrimesInfo[]\n p?: string\n q?: string\n qi?: string\n use?: string\n x?: string\n y?: string\n}\n\nexport interface JwtPayload {\n cnf?: {\n jwk: JsonWebKey\n }\n exp?: number\n [key: string]: unknown\n}\n\nexport type OrPromise<T> = T | Promise<T>\n\nexport type Signer = (data: string) => OrPromise<string>\nexport type Verifier<T = unknown> = (data: string, sig: string, options?: T) => OrPromise<boolean>\nexport type KbVerifier = (data: string, sig: string, payload: JwtPayload) => OrPromise<boolean>\nexport type Hasher = (data: string | ArrayBuffer, alg: string) => OrPromise<Uint8Array>\nexport type SaltGenerator = (length: number) => OrPromise<string>\nexport type HasherAndAlg = {\n hasher: Hasher\n alg: string\n}\n\n// This functions are sync versions\nexport type SignerSync = (data: string) => string\nexport type VerifierSync = (data: string, sig: string) => boolean\nexport type HasherSync = (data: string, alg: string) => Uint8Array\nexport type SaltGeneratorSync = (length: number) => string\nexport type HasherAndAlgSync = {\n hasher: HasherSync\n alg: string\n}\n\ntype NonNever<T> = {\n [P in keyof T as T[P] extends never ? never : P]: T[P]\n}\n\nexport type SD<Payload> = { [SD_DIGEST]?: Array<keyof Payload> }\nexport type DECOY = { [SD_DECOY]?: number }\n\n/**\n * This is a disclosureFrame type that is used to represent the structure of what is being disclosed.\n * DisclosureFrame is made from the payload type.\n *\n * For example, if the payload is\n * {\n * foo: 'bar',\n * test: {\n * zzz: 'yyy',\n * }\n * arr: ['1', '2', {a: 'b'}]\n * }\n *\n * The disclosureFrame can be subset of:\n * {\n * _sd: [\"foo\", \"test\", \"arr\"],\n * test: {\n * _sd: [\"zzz\"],\n * },\n * arr: {\n * _sd: [\"0\", \"1\", \"2\"],\n * \"2\": {\n * _sd: [\"a\"],\n * }\n * }\n * }\n *\n * The disclosureFrame can be used with decoy.\n * Decoy can be used like this:\n * {\n * ...\n * _sd: ...\n * _sd_decoy: 1 // number of decoy in this layer\n * }\n *\n */\ntype Frame<Payload> =\n Payload extends Array<infer U>\n ? U extends object\n ? Record<number, Frame<U>> & SD<Payload> & DECOY\n : SD<Payload> & DECOY\n : Payload extends Record<string, unknown>\n ? NonNever<\n {\n [K in keyof Payload]?: NonNullable<Payload[K]> extends object ? Frame<Payload[K]> : never\n } & SD<Payload> &\n DECOY\n >\n : SD<Payload> & DECOY\n\n/**\n * This is a disclosureFrame type that is used to represent the structure of what is being disclosed.\n */\nexport type Extensible = Record<string, unknown | boolean>\n\nexport type DisclosureFrame<T extends Extensible> = Frame<T>\n\n/**\n * This is a presentationFrame type that is used to represent the structure of what is being presented.\n * PresentationFrame is made from the payload type.\n * const claims = {\n firstname: 'John',\n lastname: 'Doe',\n ssn: '123-45-6789',\n id: '1234',\n data: {\n firstname: 'John',\n lastname: 'Doe',\n ssn: '123-45-6789',\n list: [{ r: 'd' }, 'b', 'c'],\n list2: ['1', '2', '3'],\n list3: ['1', null, 2],\n },\n data2: {\n hi: 'bye',\n },\n };\n\n Example of a presentationFrame:\n const presentationFrame: PresentationFrame<typeof claims> = {\n firstname: true,\n lastname: true,\n ssn: true,\n id: 'true',\n data: {\n firstname: true,\n list: {\n 1: true,\n 0: {\n r: true,\n },\n },\n list2: {\n 1: true,\n },\n list3: true,\n },\n data2: true,\n };\n*/\ntype PFrame<Payload> =\n Payload extends Array<infer U>\n ? U extends object\n ? Record<number, PFrame<U> | boolean> | boolean\n : Record<number, boolean> | boolean\n : {\n [K in keyof Payload]?: NonNullable<Payload[K]> extends object ? PFrame<Payload[K]> | boolean : boolean\n }\n\nexport type PresentationFrame<T extends Extensible> = PFrame<T>\n","export class SDJWTException extends Error {\n public details?: unknown\n\n constructor(message: string, details?: unknown) {\n super(message)\n Object.setPrototypeOf(this, SDJWTException.prototype)\n this.name = 'SDJWTException'\n this.details = details\n }\n\n getFullMessage(): string {\n return `${this.name}: ${this.message} ${this.details ? `- ${JSON.stringify(this.details)}` : ''}`\n }\n}\n\n/**\n * Narrows an unknown caught value to an Error instance.\n */\nexport function ensureError(value: unknown): Error {\n if (value instanceof Error) return value\n if (typeof value === 'string') return new Error(value)\n return new Error(String(value))\n}\n","import { base64urlDecodeJson } from '@owf/identity-common'\nimport { SDJWTException } from './error'\n\n/**\n * Decode base64url encoded JSON with {@link base64urlDecodeJson}, rethrowing failures as an\n * `SDJWTException` with the given message.\n */\nexport const decodeBase64urlJsonStrict = <T>(encoded: string, errorMessage: string): T => {\n try {\n return base64urlDecodeJson<T>(encoded)\n } catch {\n throw new SDJWTException(errorMessage)\n }\n}\n","import { type DisclosureData, type HasherAndAlg, type HasherAndAlgSync, SD_DIGEST, SD_LIST_KEY } from '../types'\nimport { base64urlEncode, uint8ArrayToBase64Url } from './base64url'\nimport { SDJWTException } from './error'\nimport { decodeBase64urlJsonStrict } from './strict-json'\n\nexport class Disclosure<T = unknown> {\n public salt!: string\n public key?: string\n public value!: T\n public _digest: string | undefined\n private _encoded: string | undefined\n\n public constructor(data: DisclosureData<T>, _meta?: { digest: string; encoded: string }) {\n if (!Array.isArray(data) || (data.length !== 2 && data.length !== 3)) {\n throw new SDJWTException('Invalid disclosure data')\n }\n if (typeof data[0] !== 'string') {\n throw new SDJWTException('Invalid disclosure salt')\n }\n\n // If the meta is provided, then we assume that the data is already encoded and digested\n this._digest = _meta?.digest\n this._encoded = _meta?.encoded\n\n if (data.length === 2) {\n this.salt = data[0]\n this.value = data[1]\n return\n }\n if (data.length === 3) {\n if (typeof data[1] !== 'string') {\n throw new SDJWTException('Invalid disclosure claim name')\n }\n if (data[1] === SD_DIGEST || data[1] === SD_LIST_KEY) {\n throw new SDJWTException(`Reserved disclosure claim name \"${data[1]}\" is not allowed`)\n }\n this.salt = data[0]\n this.key = data[1]\n this.value = data[2]\n return\n }\n }\n\n // We need to digest of the original encoded data.\n // After decode process, we use JSON.stringify to encode the data.\n // This can be different from the original encoded data.\n public static async fromEncode<T>(s: string, hash: HasherAndAlg) {\n const { hasher, alg } = hash\n const digest = await hasher(s, alg)\n const digestStr = uint8ArrayToBase64Url(digest)\n const item = decodeBase64urlJsonStrict<DisclosureData<T>>(s, 'Invalid disclosure data')\n return Disclosure.fromArray<T>(item, { digest: digestStr, encoded: s })\n }\n\n public static fromEncodeSync<T>(s: string, hash: HasherAndAlgSync) {\n const { hasher, alg } = hash\n const digest = hasher(s, alg)\n const digestStr = uint8ArrayToBase64Url(digest)\n const item = decodeBase64urlJsonStrict<DisclosureData<T>>(s, 'Invalid disclosure data')\n return Disclosure.fromArray<T>(item, { digest: digestStr, encoded: s })\n }\n\n public static fromArray<T>(item: DisclosureData<T>, _meta?: { digest: string; encoded: string }) {\n return new Disclosure(item, _meta)\n }\n\n public encode() {\n if (!this._encoded) {\n // we use JSON.stringify to encode the data\n // It's the most reliable and universal way to encode JSON object\n this._encoded = base64urlEncode(JSON.stringify(this.decode()))\n }\n return this._encoded\n }\n\n public decode(): DisclosureData<T> {\n return this.key ? [this.salt, this.key, this.value] : [this.salt, this.value]\n }\n\n public async digest(hash: HasherAndAlg): Promise<string> {\n const { hasher, alg } = hash\n if (!this._digest) {\n const hash = await hasher(this.encode(), alg)\n this._digest = uint8ArrayToBase64Url(hash)\n }\n\n return this._digest\n }\n\n public digestSync(hash: HasherAndAlgSync): string {\n const { hasher, alg } = hash\n if (!this._digest) {\n const hash = hasher(this.encode(), alg)\n this._digest = uint8ArrayToBase64Url(hash)\n }\n\n return this._digest\n }\n}\n","import { decodeJwt as decodeJwtCommon } from '@owf/identity-common'\nimport {\n DEFAULT_SECURE_HASH_ALGORITHMS,\n encodePathSegment,\n type HashAlgorithm,\n type Hasher,\n type HasherAndAlg,\n type HasherAndAlgSync,\n type HasherSync,\n IANA_HASH_ALGORITHMS,\n SD_DIGEST,\n SD_LIST_KEY,\n SD_SEPARATOR,\n} from '../types'\nimport { Disclosure, SDJWTException } from '../utils'\n\n/**\n * Decode a JWT with `decodeJwt` from `@owf/identity-common`, rethrowing failures as an `SDJWTException`.\n */\nexport const decodeJwt = <H extends Record<string, unknown>, T extends Record<string, unknown>>(\n jwt: string\n): { header: H; payload: T; signature: string } => {\n try {\n return decodeJwtCommon<H, T>(jwt)\n } catch {\n throw new SDJWTException('Invalid JWT as input')\n }\n}\n\n// Split the sdjwt into 3 parts: jwt, disclosures and keybinding jwt. each part is base64url encoded\n// It's separated by the ~ character\n//\n// If there is no keybinding jwt, the third part will be undefined\n// If there are no disclosures, the second part will be an empty array\nexport const splitSdJwt = (sdjwt: string): { jwt: string; disclosures: string[]; kbJwt?: string } => {\n const [encodedJwt, ...encodedDisclosures] = sdjwt.split(SD_SEPARATOR)\n if (encodedDisclosures.length === 0) {\n throw new SDJWTException('Invalid SD-JWT: missing SD-JWT separator')\n }\n\n const encodedKeyBindingJwt = encodedDisclosures.pop()\n return {\n jwt: encodedJwt,\n disclosures: encodedDisclosures,\n kbJwt: encodedKeyBindingJwt || undefined,\n }\n}\n\n// Decode the sdjwt into the jwt, disclosures and keybinding jwt\n// jwt, disclosures and keybinding jwt are also decoded\nexport const decodeSdJwt = async (sdjwt: string, hasher: Hasher): Promise<DecodedSDJwt> => {\n const [encodedJwt, ...encodedDisclosures] = sdjwt.split(SD_SEPARATOR)\n const jwt = decodeJwt(encodedJwt)\n\n if (encodedDisclosures.length === 0) {\n throw new SDJWTException('Invalid SD-JWT: missing SD-JWT separator')\n }\n\n const encodedKeyBindingJwt = encodedDisclosures.pop()\n const kbJwt = encodedKeyBindingJwt ? decodeJwt(encodedKeyBindingJwt) : undefined\n\n const { _sd_alg } = getSDAlgAndPayload(jwt.payload)\n\n const disclosures = await Promise.all(\n encodedDisclosures.map((ed) => Disclosure.fromEncode(ed, { alg: _sd_alg, hasher }))\n )\n\n return {\n jwt,\n disclosures,\n kbJwt,\n }\n}\n\nexport const decodeSdJwtSync = (sdjwt: string, hasher: HasherSync): DecodedSDJwt => {\n const [encodedJwt, ...encodedDisclosures] = sdjwt.split(SD_SEPARATOR)\n const jwt = decodeJwt(encodedJwt)\n\n if (encodedDisclosures.length === 0) {\n throw new SDJWTException('Invalid SD-JWT: missing SD-JWT separator')\n }\n\n const encodedKeyBindingJwt = encodedDisclosures.pop()\n const kbJwt = encodedKeyBindingJwt ? decodeJwt(encodedKeyBindingJwt) : undefined\n\n const { _sd_alg } = getSDAlgAndPayload(jwt.payload)\n\n const disclosures = encodedDisclosures.map((ed) => Disclosure.fromEncodeSync(ed, { alg: _sd_alg, hasher }))\n\n return {\n jwt,\n disclosures,\n kbJwt,\n }\n}\n\n// Get the claims from jwt and disclosures\n// The digested values are matched with the disclosures and the claims are extracted\nexport const getClaims = async <T = Record<string, unknown>>(\n rawPayload: Record<string, unknown>,\n disclosures: Array<Disclosure>,\n hasher: Hasher\n): Promise<T> => {\n const { unpackedObj } = await unpack(rawPayload, disclosures, hasher)\n // The caller supplies T to match their expected shape\n return unpackedObj as T\n}\n\nexport const getClaimsSync = <T = Record<string, unknown>>(\n rawPayload: Record<string, unknown>,\n disclosures: Array<Disclosure>,\n hasher: HasherSync\n): T => {\n const { unpackedObj } = unpackSync(rawPayload, disclosures, hasher)\n // The caller supplies T to match their expected shape\n return unpackedObj as T\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v)\n\nconst unpackArray = (\n arr: Array<unknown>,\n map: Record<string, Disclosure>,\n prefix = '',\n seenDigests?: Set<string>\n): { unpackedObj: unknown; disclosureKeymap: Record<string, string> } => {\n const keys: Record<string, string> = {}\n const unpackedArray: unknown[] = []\n arr.forEach((item, idx) => {\n if (isRecord(item)) {\n const hash = item[SD_LIST_KEY]\n if (SD_LIST_KEY in item) {\n if (Object.keys(item).length !== 1 || typeof hash !== 'string') {\n throw new SDJWTException('Invalid array disclosure placeholder')\n }\n // RFC 9901 Section 7.1 step 4: reject duplicate digests\n if (seenDigests) {\n if (seenDigests.has(hash)) {\n throw new SDJWTException('Duplicate digest found in SD-JWT payload')\n }\n seenDigests.add(hash)\n }\n const disclosed = map[hash]\n if (disclosed) {\n if (typeof disclosed.key === 'string') {\n throw new SDJWTException('Object-property disclosure cannot be used as an array element')\n }\n const presentKey = prefix ? `${prefix}.${idx}` : `${idx}`\n keys[presentKey] = hash\n\n const { unpackedObj, disclosureKeymap: disclosureKeys } = unpackObjInternal(\n disclosed.value,\n map,\n presentKey,\n seenDigests\n )\n unpackedArray.push(unpackedObj)\n Object.assign(keys, disclosureKeys)\n }\n } else {\n const newKey = prefix ? `${prefix}.${idx}` : `${idx}`\n const { unpackedObj, disclosureKeymap: disclosureKeys } = unpackObjInternal(item, map, newKey, seenDigests)\n unpackedArray.push(unpackedObj)\n Object.assign(keys, disclosureKeys)\n }\n } else if (Array.isArray(item)) {\n const newKey = prefix ? `${prefix}.${idx}` : `${idx}`\n const { unpackedObj, disclosureKeymap: disclosureKeys } = unpackObjInternal(item, map, newKey, seenDigests)\n unpackedArray.push(unpackedObj)\n Object.assign(keys, disclosureKeys)\n } else {\n unpackedArray.push(item)\n }\n })\n return { unpackedObj: unpackedArray, disclosureKeymap: keys }\n}\n\nexport const unpackObj = (obj: unknown, map: Record<string, Disclosure>) => {\n const copiedObj = JSON.parse(JSON.stringify(obj))\n const seenDigests = new Set<string>()\n const result = unpackObjInternal(copiedObj, map, '', seenDigests)\n\n // RFC 9901 Section 7.1 step 5: reject unreferenced disclosures\n const mapDigests = Object.keys(map)\n const unusedDigests = mapDigests.filter((d) => !seenDigests.has(d))\n if (unusedDigests.length > 0) {\n throw new SDJWTException('Unreferenced disclosure(s) detected in SD-JWT')\n }\n\n return result\n}\n\nconst unpackObjInternal = (\n obj: unknown,\n map: Record<string, Disclosure>,\n prefix = '',\n seenDigests?: Set<string>\n): { unpackedObj: unknown; disclosureKeymap: Record<string, string> } => {\n const keys: Record<string, string> = {}\n if (typeof obj === 'object' && obj !== null) {\n if (Array.isArray(obj)) {\n return unpackArray(obj, map, prefix, seenDigests)\n }\n\n const record = obj as Record<string, unknown>\n for (const key in record) {\n if (prefix && key === '_sd_alg') {\n throw new SDJWTException('Nested _sd_alg is not allowed')\n }\n if (key !== SD_DIGEST && key !== SD_LIST_KEY && typeof record[key] === 'object') {\n const escapedKey = encodePathSegment(key)\n const newKey = prefix ? `${prefix}.${escapedKey}` : escapedKey\n const { unpackedObj, disclosureKeymap: disclosureKeys } = unpackObjInternal(\n record[key],\n map,\n newKey,\n seenDigests\n )\n record[key] = unpackedObj\n Object.assign(keys, disclosureKeys)\n }\n }\n\n const { _sd, ...payload } = record as Record<string, unknown> & {\n _sd?: Array<string>\n }\n const claims: Record<string, unknown> = {}\n if (_sd !== undefined) {\n if (!Array.isArray(_sd) || !_sd.every((hash) => typeof hash === 'string')) {\n throw new SDJWTException('Invalid _sd claim: expected array of strings')\n }\n for (const hash of _sd) {\n // RFC 9901 Section 7.1 step 4: reject duplicate digests\n if (seenDigests) {\n if (seenDigests.has(hash)) {\n throw new SDJWTException('Duplicate digest found in SD-JWT payload')\n }\n seenDigests.add(hash)\n }\n const disclosed = map[hash]\n if (disclosed) {\n if (typeof disclosed.key !== 'string') {\n throw new SDJWTException('Array disclosure cannot be used as an object property')\n }\n // RFC 9901 Section 7.1 step 3c.ii.3: reject if claim name already exists\n if (disclosed.key in payload) {\n throw new SDJWTException(`Disclosed claim name \"${disclosed.key}\" conflicts with existing payload key`)\n }\n if (disclosed.key in claims) {\n throw new SDJWTException(`Disclosed claim name \"${disclosed.key}\" conflicts with another disclosure`)\n }\n\n const escapedKey = encodePathSegment(disclosed.key)\n const presentKey = prefix ? `${prefix}.${escapedKey}` : escapedKey\n keys[presentKey] = hash\n\n const { unpackedObj, disclosureKeymap: disclosureKeys } = unpackObjInternal(\n disclosed.value,\n map,\n presentKey,\n seenDigests\n )\n claims[disclosed.key] = unpackedObj\n Object.assign(keys, disclosureKeys)\n }\n }\n }\n\n const unpackedObj = Object.assign(payload, claims)\n return { unpackedObj, disclosureKeymap: keys }\n }\n return { unpackedObj: obj, disclosureKeymap: keys }\n}\n\n// Creates a mapping of the digests of the disclosures to the actual disclosures\nexport const createHashMapping = async (disclosures: Array<Disclosure>, hash: HasherAndAlg) => {\n const map: Record<string, Disclosure> = {}\n for (let i = 0; i < disclosures.length; i++) {\n const disclosure = disclosures[i]\n const digest = await disclosure.digest(hash)\n if (digest in map) {\n throw new SDJWTException('Duplicate disclosure digest detected')\n }\n map[digest] = disclosure\n }\n return map\n}\n\nexport const createHashMappingSync = (disclosures: Array<Disclosure>, hash: HasherAndAlgSync) => {\n const map: Record<string, Disclosure> = {}\n for (let i = 0; i < disclosures.length; i++) {\n const disclosure = disclosures[i]\n const digest = disclosure.digestSync(hash)\n if (digest in map) {\n throw new SDJWTException('Duplicate disclosure digest detected')\n }\n map[digest] = disclosure\n }\n return map\n}\n\n// Extract _sd_alg. If it is not present, it is assumed to be sha-256\nexport const getSDAlgAndPayload = (\n SdJwtPayload: Record<string, unknown>,\n allowedAlgorithms: ReadonlyArray<HashAlgorithm> = DEFAULT_SECURE_HASH_ALGORITHMS\n) => {\n const { _sd_alg, ...payload } = SdJwtPayload\n if (_sd_alg === undefined) {\n return { _sd_alg: 'sha-256', payload }\n }\n if (typeof _sd_alg !== 'string') {\n throw new SDJWTException('Invalid _sd_alg: expected string')\n }\n if (!IANA_HASH_ALGORITHMS.includes(_sd_alg as (typeof IANA_HASH_ALGORITHMS)[number])) {\n throw new SDJWTException(`Invalid _sd_alg: ${_sd_alg}`)\n }\n if (!allowedAlgorithms.includes(_sd_alg as HashAlgorithm)) {\n throw new SDJWTException(`Disallowed _sd_alg: ${_sd_alg}`)\n }\n return { _sd_alg, payload }\n}\n\n// Match the digests of the disclosures with the claims and extract the claims\n// unpack function use unpackObjInternal and unpackArray to recursively unpack the claims\n// Since getSDAlgAndPayload create new object So we don't need to clone it again\nexport const unpack = async (SdJwtPayload: Record<string, unknown>, disclosures: Array<Disclosure>, hasher: Hasher) => {\n const { _sd_alg, payload } = getSDAlgAndPayload(SdJwtPayload)\n const hash = { hasher, alg: _sd_alg }\n const map = await createHashMapping(disclosures, hash)\n\n return unpackObj(payload, map)\n}\n\nexport const unpackSync = (\n SdJwtPayload: Record<string, unknown>,\n disclosures: Array<Disclosure>,\n hasher: HasherSync\n) => {\n const { _sd_alg, payload } = getSDAlgAndPayload(SdJwtPayload)\n const hash = { hasher, alg: _sd_alg }\n const map = createHashMappingSync(disclosures, hash)\n\n return unpackObj(payload, map)\n}\n\n// This is the type of the object that is returned by the decodeSdJwt function\n// It is a combination of the decoded jwt, the disclosures and the keybinding jwt\nexport type DecodedSDJwt = {\n jwt: {\n header: Record<string, unknown>\n payload: Record<string, unknown> // raw payload of sd-jwt\n signature: string\n }\n disclosures: Array<Disclosure>\n kbJwt?: {\n header: Record<string, unknown>\n payload: Record<string, unknown>\n signature: string\n }\n}\n","import { splitSdJwt } from './decode'\nimport { SD_SEPARATOR } from './types'\nimport { SDJWTException } from './utils'\n\nexport type FlattenJSONData = {\n jwtData: {\n protected: string\n payload: string\n signature: string\n }\n disclosures: Array<string>\n kb_jwt?: string\n}\n\nexport type FlattenJSONSerialized = {\n payload: string\n signature: string\n protected: string\n header: {\n disclosures: Array<string>\n kb_jwt?: string\n }\n}\n\nexport class FlattenJSON {\n public disclosures: Array<string>\n public kb_jwt?: string\n\n public payload: string\n public signature: string\n public protected: string\n\n constructor(data: FlattenJSONData) {\n this.disclosures = data.disclosures\n this.kb_jwt = data.kb_jwt\n this.payload = data.jwtData.payload\n this.signature = data.jwtData.signature\n this.protected = data.jwtData.protected\n }\n\n public static fromEncode(encodedSdJwt: string) {\n const { jwt, disclosures, kbJwt } = splitSdJwt(encodedSdJwt)\n\n const { 0: protectedHeader, 1: payload, 2: signature } = jwt.split('.')\n if (!protectedHeader || !payload || !signature) {\n throw new SDJWTException('Invalid JWT')\n }\n\n return new FlattenJSON({\n jwtData: {\n protected: protectedHeader,\n payload,\n signature,\n },\n disclosures,\n kb_jwt: kbJwt,\n })\n }\n\n public static fromSerialized(json: FlattenJSONSerialized) {\n return new FlattenJSON({\n jwtData: {\n protected: json.protected,\n payload: json.payload,\n signature: json.signature,\n },\n disclosures: json.header.disclosures,\n kb_jwt: json.header.kb_jwt,\n })\n }\n\n public toJson(): FlattenJSONSerialized {\n return {\n payload: this.payload,\n signature: this.signature,\n protected: this.protected,\n header: {\n disclosures: this.disclosures,\n kb_jwt: this.kb_jwt,\n },\n }\n }\n\n public toEncoded() {\n const data: string[] = []\n\n const jwt = `${this.protected}.${this.payload}.${this.signature}`\n data.push(jwt)\n\n if (this.disclosures && this.disclosures.length > 0) {\n const disclosures = this.disclosures.join(SD_SEPARATOR)\n data.push(disclosures)\n }\n\n const kb_jwt = this.kb_jwt ?? ''\n data.push(kb_jwt)\n return data.join(SD_SEPARATOR)\n }\n}\n","import { splitSdJwt } from './decode'\nimport { SD_SEPARATOR, type Signer } from './types'\nimport { base64urlEncode, SDJWTException } from './utils'\n\nexport type GeneralJSONData = {\n payload: string\n disclosures: Array<string>\n kb_jwt?: string\n signatures: Array<{\n protected: string\n signature: string\n kid?: string\n }>\n}\n\nexport type GeneralJSONSerialized = {\n payload: string\n signatures: Array<{\n header: {\n disclosures?: Array<string>\n kid?: string\n kb_jwt?: string\n [key: string]: unknown\n }\n protected: string\n signature: string\n }>\n}\n\nexport class GeneralJSON {\n public payload: string\n public disclosures: Array<string>\n public kb_jwt?: string\n public signatures: Array<{\n protected: string\n signature: string\n kid?: string\n }>\n\n constructor(data: GeneralJSONData) {\n this.payload = data.payload\n this.disclosures = data.disclosures\n this.kb_jwt = data.kb_jwt\n this.signatures = data.signatures\n }\n\n public static fromEncode(encodedSdJwt: string) {\n const { jwt, disclosures, kbJwt } = splitSdJwt(encodedSdJwt)\n\n const { 0: protectedHeader, 1: payload, 2: signature } = jwt.split('.')\n if (!protectedHeader || !payload || !signature) {\n throw new SDJWTException('Invalid JWT')\n }\n\n return new GeneralJSON({\n payload,\n disclosures,\n kb_jwt: kbJwt,\n signatures: [\n {\n protected: protectedHeader,\n signature,\n },\n ],\n })\n }\n\n public static fromSerialized(json: GeneralJSONSerialized) {\n if (!json.signatures[0]) {\n throw new SDJWTException('Invalid JSON')\n }\n for (let index = 1; index < json.signatures.length; index++) {\n const header = json.signatures[index].header\n if (header && ('disclosures' in header || 'kb_jwt' in header)) {\n throw new SDJWTException('disclosures and kb_jwt MUST only appear in the first unprotected header')\n }\n }\n const disclosures = json.signatures[0].header?.disclosures ?? []\n const kb_jwt = json.signatures[0].header?.kb_jwt\n return new GeneralJSON({\n payload: json.payload,\n disclosures,\n kb_jwt,\n signatures: json.signatures.map((s) => {\n return {\n protected: s.protected,\n signature: s.signature,\n kid: s.header?.kid,\n }\n }),\n })\n }\n\n public toJson() {\n return {\n payload: this.payload,\n signatures: this.signatures.map((s, i) => {\n if (i !== 0) {\n // If present, disclosures and kb_jwt, MUST be included in the first unprotected header and\n // MUST NOT be present in any following unprotected headers.\n return {\n header: {\n kid: s.kid,\n },\n protected: s.protected,\n signature: s.signature,\n }\n }\n return {\n header: {\n disclosures: this.disclosures,\n kid: s.kid,\n kb_jwt: this.kb_jwt,\n },\n protected: s.protected,\n signature: s.signature,\n }\n }),\n }\n }\n\n public toEncoded(index: number) {\n if (index < 0 || index >= this.signatures.length) {\n throw new SDJWTException('Index out of bounds')\n }\n const data: string[] = []\n\n const { protected: protectedHeader, signature } = this.signatures[index]\n const jwt = `${protectedHeader}.${this.payload}.${signature}`\n data.push(jwt)\n\n if (this.disclosures && this.disclosures.length > 0) {\n const disclosures = this.disclosures.join(SD_SEPARATOR)\n data.push(disclosures)\n }\n\n const kb = this.kb_jwt ?? ''\n data.push(kb)\n return data.join(SD_SEPARATOR)\n }\n\n public async addSignature(protectedHeader: Record<string, unknown>, signer: Signer, kid?: string) {\n const header = base64urlEncode(JSON.stringify(protectedHeader))\n const signature = await signer(`${header}.${this.payload}`)\n this.signatures.push({\n protected: header,\n signature,\n kid,\n })\n }\n}\n","import { nowInSeconds } from '@owf/identity-common'\nimport { decodeJwt } from './decode'\nimport type { Base64urlString, Signer, Verifier } from './types'\nimport { base64urlEncode, SDJWTException } from './utils'\n\nexport type JwtData<Header extends Record<string, unknown>, Payload extends Record<string, unknown>> = {\n header?: Header\n payload?: Payload\n signature?: Base64urlString\n encoded?: string\n}\n\n/**\n * Options for the JWT verifier\n */\nexport type VerifierOptions = {\n /**\n * current time in seconds since epoch\n */\n currentDate?: number\n\n /**\n * allowed skew for the current time in seconds. Positive value that will lower the iat and nbf checks, and increase the exp check.\n */\n skewSeconds?: number\n\n /**\n * required claim keys for the payload.\n * If the payload does not contain these keys, the verification will fail.\n */\n requiredClaimKeys?: string[]\n\n /**\n * Expected audience for the processed SD-JWT payload.\n */\n expectedAudience?: string | string[]\n\n /**\n * Allowed JOSE algorithms for issuer-signed JWTs. `none` is always rejected.\n */\n allowedIssuerAlgorithms?: string[]\n\n /**\n * nonce used to verify the key binding jwt to prevent replay attacks.\n */\n keyBindingNonce?: string\n\n /**\n * Expected audience for the Key Binding JWT.\n */\n expectedKeyBindingAudience?: string | string[]\n\n /**\n * Maximum acceptable age of the Key Binding JWT, in seconds.\n */\n keyBindingMaxAgeSeconds?: number\n\n /**\n * Internal option used by SD-JWT validation to defer claim checks until after\n * disclosures are processed.\n */\n skipJwtClaimValidation?: boolean\n\n /**\n * disable the verification of the status claim in the payload.\n *\n * @default false\n */\n disableStatusVerification?: boolean\n\n /**\n * any other custom options\n */\n [key: string]: unknown\n}\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every((item) => typeof item === 'string')\n\nconst validateNumericDate = (payload: Record<string, unknown>, claim: 'iat' | 'nbf' | 'exp') => {\n const value = payload[claim]\n if (value === undefined) return undefined\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new SDJWTException(`Verify Error: JWT ${claim} must be a number`)\n }\n return value\n}\n\nconst getAudiences = (audience: unknown): string[] | undefined => {\n if (typeof audience === 'string') return [audience]\n if (isStringArray(audience)) return audience\n return undefined\n}\n\nconst validateAudience = (payload: Record<string, unknown>, expectedAudience: string | string[] | undefined) => {\n if (expectedAudience === undefined) return\n\n const expectedAudiences = Array.isArray(expectedAudience) ? expectedAudience : [expectedAudience]\n const audiences = getAudiences(payload.aud)\n\n if (!audiences || !expectedAudiences.some((expected) => audiences.includes(expected))) {\n throw new SDJWTException('Verify Error: Invalid audience')\n }\n}\n\nexport const validateJwtPayload = (payload: Record<string, unknown> | undefined, options?: VerifierOptions) => {\n if (!payload) {\n throw new SDJWTException('Verify Error: JWT payload is missing')\n }\n\n const skew = options?.skewSeconds ? options.skewSeconds : 0\n const currentDate = options?.currentDate ?? nowInSeconds()\n const iat = validateNumericDate(payload, 'iat')\n const nbf = validateNumericDate(payload, 'nbf')\n const exp = validateNumericDate(payload, 'exp')\n\n if (iat !== undefined && iat - skew > currentDate) {\n throw new SDJWTException('Verify Error: JWT is not yet valid')\n }\n\n if (nbf !== undefined && nbf - skew > currentDate) {\n throw new SDJWTException('Verify Error: JWT is not yet valid')\n }\n\n if (exp !== undefined && exp + skew <= currentDate) {\n throw new SDJWTException('Verify Error: JWT is expired')\n }\n\n validateAudience(payload, options?.expectedAudience)\n}\n\n// This class is used to create and verify JWT\n// Contains header, payload, and signature\nexport class Jwt<\n Header extends Record<string, unknown> = Record<string, unknown>,\n Payload extends Record<string, unknown> = Record<string, unknown>,\n> {\n public header?: Header\n public payload?: Payload\n public signature?: Base64urlString\n private encoded?: string\n\n constructor(data?: JwtData<Header, Payload>) {\n this.header = data?.header\n this.payload = data?.payload\n this.signature = data?.signature\n this.encoded = data?.encoded\n }\n\n public static decodeJWT<\n Header extends Record<string, unknown> = Record<string, unknown>,\n Payload extends Record<string, unknown> = Record<string, unknown>,\n >(jwt: string): { header: Header; payload: Payload; signature: Base64urlString } {\n return decodeJwt(jwt)\n }\n\n public static fromEncode<\n Header extends Record<string, unknown> = Record<string, unknown>,\n Payload extends Record<string, unknown> = Record<string, unknown>,\n >(encodedJwt: string): Jwt<Header, Payload> {\n const { header, payload, signature } = Jwt.decodeJWT<Header, Payload>(encodedJwt)\n\n const jwt = new Jwt<Header, Payload>({\n header,\n payload,\n signature,\n encoded: encodedJwt,\n })\n\n return jwt\n }\n\n public setHeader(header: Header): Jwt<Header, Payload> {\n this.header = header\n this.encoded = undefined\n return this\n }\n\n public setPayload(payload: Payload): Jwt<Header, Payload> {\n this.payload = payload\n this.encoded = undefined\n return this\n }\n\n protected getUnsignedToken() {\n if (!this.header || !this.payload) {\n throw new SDJWTException('Serialize Error: Invalid JWT')\n }\n\n if (this.encoded) {\n const parts = this.encoded.split('.')\n if (parts.length !== 3) {\n throw new SDJWTException(`Invalid JWT format: ${this.encoded}`)\n }\n const unsignedToken = parts.slice(0, 2).join('.')\n return unsignedToken\n }\n\n const header = base64urlEncode(JSON.stringify(this.header))\n const payload = base64urlEncode(JSON.stringify(this.payload))\n return `${header}.${payload}`\n }\n\n public async sign(signer: Signer) {\n if (!this.header || this.header.alg === 'none') {\n throw new SDJWTException('Sign Error: alg \"none\" is not allowed')\n }\n const data = this.getUnsignedToken()\n this.signature = await signer(data)\n\n return this.encodeJwt()\n }\n\n public encodeJwt(): string {\n if (this.encoded) {\n return this.encoded\n }\n\n if (!this.header || !this.payload || !this.signature) {\n throw new SDJWTException('Serialize Error: Invalid JWT')\n }\n\n const header = base64urlEncode(JSON.stringify(this.header))\n const payload = base64urlEncode(JSON.stringify(this.payload))\n const signature = this.signature\n const compact = `${header}.${payload}.${signature}`\n this.encoded = compact\n\n return compact\n }\n\n /**\n * Verify the JWT using the provided verifier function.\n * It checks the signature and validates the iat, nbf, and exp claims if they are present.\n * @param verifier\n * @param options - Options for verification, such as current date and skew seconds\n * @returns\n */\n public async verify<T>(verifier: Verifier<T>, options?: T & VerifierOptions) {\n const alg = this.header?.alg\n if (typeof alg !== 'string' || alg === 'none') {\n throw new SDJWTException('Verify Error: alg \"none\" is not allowed')\n }\n if (options?.allowedIssuerAlgorithms && !options.allowedIssuerAlgorithms.includes(alg)) {\n throw new SDJWTException(`Verify Error: Disallowed alg ${alg}`)\n }\n\n if (!options?.skipJwtClaimValidation) {\n validateJwtPayload(this.payload, options)\n }\n\n if (!this.signature) {\n throw new SDJWTException('Verify Error: no signature in JWT')\n }\n const data = this.getUnsignedToken()\n\n const verified = await verifier(data, this.signature, options)\n if (!verified) {\n throw new SDJWTException('Verify Error: Invalid JWT Signature')\n }\n return { payload: this.payload, header: this.header }\n }\n}\n","import { nowInSeconds } from '@owf/identity-common'\nimport { Jwt, type VerifierOptions } from './jwt'\nimport { KB_JWT_TYP, type KbVerifier, type kbHeader, type kbPayload } from './types'\nimport { SDJWTException } from './utils'\n\nexport class KBJwt<Header extends kbHeader = kbHeader, Payload extends kbPayload = kbPayload> extends Jwt<\n Header,\n Payload\n> {\n // Checking the validity of the key binding jwt\n // the type unknown is not good, but we don't know at this point how to get the public key of the signer, this is defined in the kbVerifier\n public async verifyKB(values: {\n verifier: KbVerifier\n payload: Record<string, unknown>\n nonce: string\n /**\n * Options forwarded to the common JWT verification, e.g. currentDate and\n * skewSeconds used to validate the iat, nbf and exp claims.\n */\n options?: VerifierOptions\n }) {\n if (!this.header || !this.payload || !this.signature) {\n throw new SDJWTException('Verify Error: Invalid JWT')\n }\n\n if (\n typeof this.header.alg !== 'string' ||\n this.header.alg === 'none' ||\n typeof this.header.typ !== 'string' ||\n this.header.typ !== KB_JWT_TYP ||\n typeof this.payload.iat !== 'number' ||\n typeof this.payload.aud !== 'string' ||\n typeof this.payload.nonce !== 'string' ||\n typeof this.payload.sd_hash !== 'string' ||\n this.payload.sd_hash.length === 0\n ) {\n throw new SDJWTException('Invalid Key Binding Jwt')\n }\n\n if (this.payload.nonce !== values.nonce) {\n throw new SDJWTException('Verify Error: Invalid Nonce')\n }\n\n if (values.options?.expectedKeyBindingAudience !== undefined) {\n const expectedAudiences = Array.isArray(values.options.expectedKeyBindingAudience)\n ? values.options.expectedKeyBindingAudience\n : [values.options.expectedKeyBindingAudience]\n if (!expectedAudiences.includes(this.payload.aud)) {\n throw new SDJWTException('Verify Error: Invalid Key Binding audience')\n }\n }\n\n if (values.options?.keyBindingMaxAgeSeconds !== undefined) {\n const currentDate = values.options.currentDate ?? nowInSeconds()\n const skew = values.options.skewSeconds ?? 0\n if (this.payload.iat + values.options.keyBindingMaxAgeSeconds + skew < currentDate) {\n throw new SDJWTException('Verify Error: Key Binding JWT is too old')\n }\n }\n\n // Delegate signature verification and common JWT claim validation\n // (iat, nbf, exp) to the shared Jwt.verify implementation. The kbVerifier\n // needs the kb+jwt payload (e.g. the holder's cnf key), so we wrap it to\n // forward values.payload instead of the base verifier's options argument.\n await this.verify((data, sig) => values.verifier(data, sig, values.payload), values.options)\n\n return { payload: this.payload, header: this.header }\n }\n\n // This function is for creating KBJwt object for verify properly\n public static fromKBEncode<Header extends kbHeader = kbHeader, Payload extends kbPayload = kbPayload>(\n encodedJwt: string\n ): KBJwt<Header, Payload> {\n const { header, payload, signature } = Jwt.decodeJWT<Header, Payload>(encodedJwt)\n\n const jwt = new KBJwt<Header, Payload>({\n header,\n payload,\n signature,\n encoded: encodedJwt,\n })\n\n return jwt\n }\n}\n","import type { HasherAndAlg, SaltGenerator } from './types'\nimport { uint8ArrayToBase64Url } from './utils'\n\n// This function creates a decoy value that can be used to obscure SD JWT payload.\n// The value is basically a hash of a random salt. So the value is not predictable.\n// return value is a base64url encoded string.\nexport const createDecoy = async (hash: HasherAndAlg, saltGenerator: SaltGenerator): Promise<string> => {\n const { hasher, alg } = hash\n const salt = await saltGenerator(16)\n const decoy = await hasher(salt, alg)\n return uint8ArrayToBase64Url(decoy)\n}\n","import {\n createHashMapping,\n createHashMappingSync,\n decodeSdJwt,\n decodeSdJwtSync,\n getSDAlgAndPayload,\n splitSdJwt,\n unpack,\n unpackObj,\n unpackSync,\n} from '../decode'\nimport type { Extensible, HasherSync } from '../types'\nimport { encodePath, type Hasher, type PresentationFrame, SD_SEPARATOR } from '../types'\nimport { Disclosure, SDJWTException } from '../utils'\n\n// Presentable keys\n// The presentable keys are the path of JSON object that are presentable in the SD JWT\n// e.g. if the SD JWT has the following payload and set sd like this:\n// {\n// \"foo\": \"bar\", // sd\n// \"arr\": [ // sd\n// \"1\", // sd\n// \"2\",\n// {\n// \"a\": \"1\" // sd\n// }\n// ],\n// \"test\": {\n// \"zzz\": \"xxx\" // sd\n// }\n// }\n// The presentable keys are: [\"arr\", \"arr.0\", \"arr.2.a\", \"foo\", \"test.zzz\"]\nexport const presentableKeys = async (\n rawPayload: Record<string, unknown>,\n disclosures: Array<Disclosure>,\n hasher: Hasher\n): Promise<string[]> => {\n const { disclosureKeymap } = await unpack(rawPayload, disclosures, hasher)\n return Object.keys(disclosureKeymap).sort()\n}\n\nexport const presentableKeysSync = (\n rawPayload: Record<string, unknown>,\n disclosures: Array<Disclosure>,\n hasher: HasherSync\n): string[] => {\n const { disclosureKeymap } = unpackSync(rawPayload, disclosures, hasher)\n return Object.keys(disclosureKeymap).sort()\n}\n\nexport const present = async <T extends Record<string, unknown>>(\n sdJwt: string,\n presentFrame: PresentationFrame<T>,\n hasher: Hasher\n): Promise<string> => {\n const { jwt, kbJwt } = splitSdJwt(sdJwt)\n const {\n jwt: { payload },\n disclosures,\n } = await decodeSdJwt(sdJwt, hasher)\n\n const { _sd_alg: alg } = getSDAlgAndPayload(payload)\n const hash = { alg, hasher }\n const keys = transformPresentationFrame(presentFrame)\n\n // hashmap: <digest> => <disclosure>\n // to match the digest with the disclosure\n const hashmap = await createHashMapping(disclosures, hash)\n const { disclosureKeymap } = await unpack(payload, disclosures, hasher)\n const presentedDisclosures = keys.map((k) => hashmap[disclosureKeymap[k]]).filter((d) => d !== undefined)\n\n return [jwt, ...presentedDisclosures.map((d) => d.encode()), kbJwt ?? ''].join(SD_SEPARATOR)\n}\n\nexport const presentSync = <T extends Record<string, unknown>>(\n sdJwt: string,\n presentFrame: PresentationFrame<T>,\n hasher: HasherSync\n): string => {\n const { jwt, kbJwt } = splitSdJwt(sdJwt)\n const {\n jwt: { payload },\n disclosures,\n } = decodeSdJwtSync(sdJwt, hasher)\n\n const { _sd_alg: alg } = getSDAlgAndPayload(payload)\n const hash = { alg, hasher }\n const keys = transformPresentationFrame(presentFrame)\n\n // hashmap: <digest> => <disclosure>\n // to match the digest with the disclosure\n const hashmap = createHashMappingSync(disclosures, hash)\n const { disclosureKeymap } = unpackSync(payload, disclosures, hasher)\n\n const presentedDisclosures = keys.map((k) => hashmap[disclosureKeymap[k]]).filter((d) => d !== undefined)\n\n return [jwt, ...presentedDisclosures.map((d) => d.encode()), kbJwt ?? ''].join(SD_SEPARATOR)\n}\n\n/**\n * Transform the object keys into an array of strings. We are not sorting the array in any way.\n * @param obj The object to transform\n * @param prefix The prefix to add to the keys\n * @returns\n */\nexport const transformPresentationFrame = (obj: PresentationFrame<Extensible>, prefix: string[] = []): string[] => {\n return Object.entries(obj).reduce<string[]>((acc, [key, value]) => {\n const newPrefix = [...prefix, key]\n const encodedPrefix = encodePath(newPrefix)\n if (typeof value === 'boolean') {\n // only add it, when it's true\n if (value) {\n acc.push(encodedPrefix)\n }\n } else if (typeof value === 'object' && value !== null) {\n acc.push(encodedPrefix, ...transformPresentationFrame(value as PresentationFrame<Extensible>, newPrefix))\n }\n return acc\n }, [])\n}\n\nexport type SerializedDisclosure = {\n digest: string\n encoded: string\n salt: string\n key: string | undefined\n value: unknown\n}\n\nexport const createHashMappingForSerializedDisclosure = (disclosures: SerializedDisclosure[]) => {\n const map: Record<string, Disclosure> = {}\n for (let i = 0; i < disclosures.length; i++) {\n const disclosure = disclosures[i]\n const { digest, encoded, key, salt, value } = disclosure\n // we made Disclosure to fit the interface of unpack\n map[digest] = Disclosure.fromArray(key ? [salt, key, value] : [salt, value], { digest, encoded })\n }\n return map\n}\n\n/**\n * This function selects the serialized disclosures from the payload\n * and array of serialized disclosure based on the presentation frame.\n * If you want to know what is serialized disclosures, check type SerializedDisclosure.\n * @param payload: Record<string, unknown>\n * @param disclosures: SerializedDisclosure[]\n * @param presentationFrame: PresentationFrame<T>\n */\nexport const selectDisclosures = <T extends Record<string, unknown>>(\n payload: Record<string, unknown>,\n disclosures: SerializedDisclosure[],\n presentationFrame: PresentationFrame<T>\n) => {\n if (disclosures.length === 0) {\n return []\n }\n\n const hashmap = createHashMappingForSerializedDisclosure(disclosures)\n const { disclosureKeymap } = unpackObj(payload, hashmap)\n const keys = transformPresentationFrame(presentationFrame)\n\n const presentedDisclosures = keys.map((k) => hashmap[disclosureKeymap[k]]).filter((d) => d !== undefined)\n\n const selectedDisclosures: SerializedDisclosure[] = presentedDisclosures.map((d) => {\n const { salt, key, value, _digest } = d\n if (!_digest) {\n throw new SDJWTException('Implementation error: _digest is not defined')\n }\n return {\n digest: _digest,\n encoded: d.encode(),\n salt,\n key,\n value,\n }\n })\n\n return selectedDisclosures\n}\n","import { createHashMapping, getSDAlgAndPayload, unpack } from './decode'\nimport { createDecoy } from './decoy'\nimport { Jwt } from './jwt'\nimport { KBJwt } from './kbjwt'\nimport { transformPresentationFrame } from './present'\nimport {\n type DisclosureFrame,\n encodePathSegment,\n type Hasher,\n type HasherAndAlg,\n type kbHeader,\n type kbPayload,\n type PresentationFrame,\n type SaltGenerator,\n SD_DECOY,\n SD_DIGEST,\n SD_LIST_KEY,\n SD_SEPARATOR,\n type SDJWTCompact,\n} from './types'\nimport { Disclosure, SDJWTException } from './utils'\n\nconst createDisclosureSalt = async (saltGenerator: SaltGenerator, seenSalts: Set<string>) => {\n const salt = await saltGenerator(16)\n if (typeof salt !== 'string') {\n throw new SDJWTException('SaltGenerator must return a string')\n }\n if (seenSalts.has(salt)) {\n throw new SDJWTException('Duplicate disclosure salt detected')\n }\n seenSalts.add(salt)\n return salt\n}\n\nconst addDisclosureDigest = (digest: string, seenDigests: Set<string>) => {\n if (seenDigests.has(digest)) {\n throw new SDJWTException('Duplicate disclosure digest detected')\n }\n seenDigests.add(digest)\n}\n\nexport type SDJwtData<\n Header extends Record<string, unknown>,\n Payload extends Record<string, unknown>,\n KBHeader extends kbHeader = kbHeader,\n KBPayload extends kbPayload = kbPayload,\n> = {\n jwt?: Jwt<Header, Payload>\n disclosures?: Array<Disclosure>\n kbJwt?: KBJwt<KBHeader, KBPayload>\n}\n\nexport class SDJwt<\n Header extends Record<string, unknown> = Record<string, unknown>,\n Payload extends Record<string, unknown> = Record<string, unknown>,\n KBHeader extends kbHeader = kbHeader,\n KBPayload extends kbPayload = kbPayload,\n> {\n public jwt?: Jwt<Header, Payload>\n public disclosures?: Array<Disclosure>\n public kbJwt?: KBJwt<KBHeader, KBPayload>\n\n constructor(data?: SDJwtData<Header, Payload, KBHeader, KBPayload>) {\n this.jwt = data?.jwt\n this.disclosures = data?.disclosures\n this.kbJwt = data?.kbJwt\n }\n\n public static async decodeSDJwt<\n Header extends Record<string, unknown> = Record<string, unknown>,\n Payload extends Record<string, unknown> = Record<string, unknown>,\n KBHeader extends kbHeader = kbHeader,\n KBPayload extends kbPayload = kbPayload,\n >(\n sdjwt: SDJWTCompact,\n hasher: Hasher\n ): Promise<{\n jwt: Jwt<Header, Payload>\n disclosures: Array<Disclosure>\n kbJwt?: KBJwt<KBHeader, KBPayload>\n }> {\n const [encodedJwt, ...encodedDisclosures] = sdjwt.split(SD_SEPARATOR)\n if (encodedDisclosures.length === 0) {\n throw new SDJWTException('Invalid SD-JWT: missing SD-JWT separator')\n }\n const jwt = Jwt.fromEncode<Header, Payload>(encodedJwt)\n\n if (!jwt.payload) {\n throw new Error('Payload is undefined on the JWT. Invalid state reached')\n }\n\n const encodedKeyBindingJwt = encodedDisclosures.pop()\n const kbJwt = encodedKeyBindingJwt ? KBJwt.fromKBEncode<KBHeader, KBPayload>(encodedKeyBindingJwt) : undefined\n\n const { _sd_alg } = getSDAlgAndPayload(jwt.payload)\n\n const disclosures = await Promise.all(\n encodedDisclosures.map((ed) => Disclosure.fromEncode(ed, { alg: _sd_alg, hasher }))\n )\n\n return {\n jwt,\n disclosures,\n kbJwt,\n }\n }\n\n public static async extractJwt<\n Header extends Record<string, unknown> = Record<string, unknown>,\n Payload extends Record<string, unknown> = Record<string, unknown>,\n >(encodedSdJwt: SDJWTCompact): Promise<Jwt<Header, Payload>> {\n const [encodedJwt, ..._encodedDisclosures] = encodedSdJwt.split(SD_SEPARATOR)\n\n return Jwt.fromEncode(encodedJwt)\n }\n\n public static async fromEncode<\n Header extends Record<string, unknown> = Record<string, unknown>,\n Payload extends Record<string, unknown> = Record<string, unknown>,\n KBHeader extends kbHeader = kbHeader,\n KBPayload extends kbPayload = kbPayload,\n >(encodedSdJwt: SDJWTCompact, hasher: Hasher): Promise<SDJwt<Header, Payload>> {\n const { jwt, disclosures, kbJwt } = await SDJwt.decodeSDJwt<Header, Payload, KBHeader, KBPayload>(\n encodedSdJwt,\n hasher\n )\n\n return new SDJwt<Header, Payload, KBHeader, KBPayload>({\n jwt,\n disclosures,\n kbJwt,\n })\n }\n\n public async present<T extends Record<string, unknown>>(\n presentFrame: PresentationFrame<T> | undefined,\n hasher: Hasher\n ): Promise<SDJWTCompact> {\n const disclosures = await this.getPresentDisclosures(presentFrame, hasher)\n const presentSDJwt = new SDJwt({\n jwt: this.jwt,\n disclosures,\n kbJwt: this.kbJwt,\n })\n return presentSDJwt.encodeSDJwt()\n }\n\n public async getPresentDisclosures<T extends Record<string, unknown>>(\n presentFrame: PresentationFrame<T> | undefined,\n hasher: Hasher\n ): Promise<Disclosure<unknown>[]> {\n if (!this.jwt?.payload || !this.disclosures) {\n throw new SDJWTException('Invalid sd-jwt: jwt or disclosures is missing')\n }\n const { _sd_alg: alg } = getSDAlgAndPayload(this.jwt.payload)\n const hash = { alg, hasher }\n const hashmap = await createHashMapping(this.disclosures, hash)\n const { disclosureKeymap } = await unpack(this.jwt.payload, this.disclosures, hasher)\n\n const keys = presentFrame ? transformPresentationFrame(presentFrame) : await this.presentableKeys(hasher)\n const disclosures = keys.map((k) => hashmap[disclosureKeymap[k]]).filter((d) => d !== undefined)\n return disclosures\n }\n\n public encodeSDJwt(): SDJWTCompact {\n const data: string[] = []\n\n if (!this.jwt) {\n throw new SDJWTException('Invalid sd-jwt: jwt is missing')\n }\n\n const encodedJwt = this.jwt.encodeJwt()\n data.push(encodedJwt)\n\n if (this.disclosures && this.disclosures.length > 0) {\n const encodeddisclosures = this.disclosures.map((dc) => dc.encode()).join(SD_SEPARATOR)\n data.push(encodeddisclosures)\n }\n\n data.push(this.kbJwt ? this.kbJwt.encodeJwt() : '')\n return data.join(SD_SEPARATOR)\n }\n\n public async keys(hasher: Hasher): Promise<string[]> {\n return listKeys(await this.getClaims(hasher)).sort()\n }\n\n public async presentableKeys(hasher: Hasher): Promise<string[]> {\n if (!this.jwt?.payload || !this.disclosures) {\n throw new SDJWTException('Invalid sd-jwt: jwt or disclosures is missing')\n }\n const { disclosureKeymap } = await unpack(this.jwt?.payload, this.disclosures, hasher)\n return Object.keys(disclosureKeymap).sort()\n }\n\n public async getClaims<T>(hasher: Hasher): Promise<T> {\n if (!this.jwt?.payload || !this.disclosures) {\n throw new SDJWTException('Invalid sd-jwt: jwt or disclosures is missing')\n }\n const { unpackedObj } = await unpack(this.jwt.payload, this.disclosures, hasher)\n return unpackedObj as T\n }\n}\n\nexport const listKeys = (obj: Record<string, unknown>, prefix = '') => {\n const keys: string[] = []\n for (const key in obj) {\n if (obj[key] === undefined) continue\n const escapedKey = encodePathSegment(key)\n const newKey = prefix ? `${prefix}.${escapedKey}` : escapedKey\n keys.push(newKey)\n\n const value = obj[key]\n if (value && typeof value === 'object') {\n keys.push(...listKeys(value as Record<string, unknown>, newKey))\n }\n }\n return keys\n}\n\nexport const pack = async <T extends Record<string, unknown>>(\n claims: T,\n disclosureFrame: DisclosureFrame<T> | undefined,\n hash: HasherAndAlg,\n saltGenerator: SaltGenerator,\n seenSalts = new Set<string>(),\n seenDigests = new Set<string>()\n): Promise<{\n packedClaims: Record<string, unknown> | Array<Record<string, unknown>>\n disclosures: Array<Disclosure>\n}> => {\n if (!disclosureFrame) {\n return {\n packedClaims: claims,\n disclosures: [],\n }\n }\n\n const sd = disclosureFrame[SD_DIGEST] ?? []\n const decoyCount = disclosureFrame[SD_DECOY] ?? 0\n\n if (Array.isArray(claims)) {\n const packedClaims: Array<Record<typeof SD_LIST_KEY, string>> = []\n const disclosures: Array<Disclosure> = []\n const recursivePackedClaims: Record<number, unknown> = {}\n\n for (const key in disclosureFrame) {\n if (key !== SD_DIGEST) {\n const idx = Number.parseInt(key, 10)\n const packed = await pack(claims[idx], disclosureFrame[idx], hash, saltGenerator, seenSalts, seenDigests)\n recursivePackedClaims[idx] = packed.packedClaims\n disclosures.push(...packed.disclosures)\n }\n }\n\n for (let i = 0; i < claims.length; i++) {\n const claim = recursivePackedClaims[i] ? recursivePackedClaims[i] : claims[i]\n /** This part is set discloure for array items.\n * The example of disclosureFrame of an Array is\n *\n * const claims = {\n * array: ['a', 'b', 'c']\n * }\n *\n * diclosureFrame: DisclosureFrame<typeof claims> = {\n * array: {\n * _sd: [0, 2]\n * }\n * }\n *\n * It means that we want to disclose the first and the third item of the array\n *\n * So If the index `i` is in the disclosure list(sd), then we create a disclosure for the claim\n */\n // @ts-expect-error\n if (sd.includes(i)) {\n const salt = await createDisclosureSalt(saltGenerator, seenSalts)\n const disclosure = new Disclosure([salt, claim])\n const digest = await disclosure.digest(hash)\n addDisclosureDigest(digest, seenDigests)\n packedClaims.push({ [SD_LIST_KEY]: digest })\n disclosures.push(disclosure)\n } else {\n packedClaims.push(claim)\n }\n }\n for (let j = 0; j < decoyCount; j++) {\n const decoyDigest = await createDecoy(hash, saltGenerator)\n addDisclosureDigest(decoyDigest, seenDigests)\n packedClaims.push({ [SD_LIST_KEY]: decoyDigest })\n }\n return { packedClaims, disclosures }\n }\n\n const packedClaims: Record<string, unknown> = {}\n const disclosures: Array<Disclosure> = []\n const recursivePackedClaims: Record<string, unknown> = {}\n\n for (const key in disclosureFrame) {\n if (key !== SD_DIGEST) {\n const packed = await pack(\n // @ts-expect-error\n claims[key],\n disclosureFrame[key],\n hash,\n saltGenerator,\n seenSalts,\n seenDigests\n )\n recursivePackedClaims[key] = packed.packedClaims\n disclosures.push(...packed.disclosures)\n }\n }\n\n const _sd: string[] = []\n\n for (const key in claims) {\n const claim = recursivePackedClaims[key] ? recursivePackedClaims[key] : claims[key]\n if (sd.includes(key)) {\n const salt = await createDisclosureSalt(saltGenerator, seenSalts)\n const disclosure = new Disclosure([salt, key, claim])\n const digest = await disclosure.digest(hash)\n addDisclosureDigest(digest, seenDigests)\n\n _sd.push(digest)\n disclosures.push(disclosure)\n } else {\n packedClaims[key] = claim\n }\n }\n\n for (let j = 0; j < decoyCount; j++) {\n const decoyDigest = await createDecoy(hash, saltGenerator)\n addDisclosureDigest(decoyDigest, seenDigests)\n _sd.push(decoyDigest)\n }\n\n if (_sd.length > 0) {\n packedClaims[SD_DIGEST] = _sd.sort()\n }\n return { packedClaims, disclosures }\n}\n","import { getSDAlgAndPayload } from './decode'\nimport { FlattenJSON } from './flattenJSON'\nimport { GeneralJSON } from './generalJSON'\nimport { Jwt, type VerifierOptions, validateJwtPayload } from './jwt'\nimport { KBJwt } from './kbjwt'\nimport { pack, SDJwt } from './sdjwt'\nimport {\n DEFAULT_SECURE_HASH_ALGORITHMS,\n type DisclosureFrame,\n type Hasher,\n IANA_HASH_ALGORITHMS,\n KB_JWT_TYP,\n type KBOptions,\n type PresentationFrame,\n type SafeVerifyResult,\n SD_DECOY,\n SD_DIGEST,\n SD_LIST_KEY,\n type SDJWTCompact,\n type SDJWTConfig,\n type Signer,\n type VerificationError,\n type VerificationErrorCode,\n} from './types'\nimport { base64urlEncode, ensureError, SDJWTException, uint8ArrayToBase64Url } from './utils'\nimport { decodeBase64urlJsonStrict } from './utils/strict-json'\n\nexport * from './decode'\nexport * from './decoy'\nexport * from './flattenJSON'\nexport * from './generalJSON'\nexport * from './jwt'\nexport * from './kbjwt'\nexport * from './present'\nexport * from './sdjwt'\n// Re-export all types, utils, decode, and present functionality\nexport * from './types'\nexport * from './utils'\n\nexport type SdJwtPayload = Record<string, unknown>\n\n/**\n * Internal utility function to validate that a payload does not contain reserved field names.\n */\nfunction validateReservedFieldsInternal(payload: Record<string, unknown>): void {\n const reservedFields = new Set([SD_DIGEST, '_sd_alg', SD_DECOY, SD_LIST_KEY])\n\n const visit = (node: unknown) => {\n if (!node || typeof node !== 'object') {\n return\n }\n\n for (const [key, value] of Object.entries(node as Record<string, unknown>)) {\n if (reservedFields.has(key)) {\n throw new SDJWTException(`Reserved field name \"${key}\" is not allowed`)\n }\n visit(value)\n }\n }\n\n visit(payload)\n}\n\nexport class SDJwtInstance<ExtendedPayload extends SdJwtPayload, T = unknown> {\n //header type\n protected type?: string\n\n public static readonly DEFAULT_hashAlg = 'sha-256'\n\n protected userConfig: SDJWTConfig<T> = {}\n\n constructor(userConfig?: SDJWTConfig<T>) {\n if (userConfig) {\n if (userConfig.hashAlg && !IANA_HASH_ALGORITHMS.includes(userConfig.hashAlg)) {\n throw new SDJWTException(`Invalid hash algorithm: ${userConfig.hashAlg}`)\n }\n const allowedDisclosureHashAlgorithms =\n userConfig.allowedDisclosureHashAlgorithms ?? DEFAULT_SECURE_HASH_ALGORITHMS\n if (userConfig.hashAlg && !allowedDisclosureHashAlgorithms.includes(userConfig.hashAlg)) {\n throw new SDJWTException(`Disallowed hash algorithm: ${userConfig.hashAlg}`)\n }\n this.userConfig = userConfig\n }\n }\n\n private async createKBJwt(options: KBOptions, sdHash: string): Promise<KBJwt> {\n if (!this.userConfig.kbSigner) {\n throw new SDJWTException('Key Binding Signer not found')\n }\n if (!this.userConfig.kbSignAlg) {\n throw new SDJWTException('Key Binding sign algorithm not specified')\n }\n\n const { payload } = options\n const kbJwt = new KBJwt({\n header: {\n typ: KB_JWT_TYP,\n alg: this.userConfig.kbSignAlg,\n },\n payload: { ...payload, sd_hash: sdHash },\n })\n\n await kbJwt.sign(this.userConfig.kbSigner)\n return kbJwt\n }\n\n private async SignJwt(jwt: Jwt) {\n if (!this.userConfig.signer) {\n throw new SDJWTException('Signer not found')\n }\n await jwt.sign(this.userConfig.signer)\n return jwt\n }\n\n private async VerifyJwt(jwt: Jwt, options?: T & VerifierOptions) {\n if (!this.userConfig.verifier) {\n throw new SDJWTException('Verifier not found')\n }\n return jwt.verify<T>(this.userConfig.verifier, options)\n }\n\n public async issue<Payload extends ExtendedPayload>(\n payload: Payload,\n disclosureFrame?: DisclosureFrame<Payload>,\n options?: {\n header?: object // This is for customizing the header of the jwt\n }\n ): Promise<SDJWTCompact> {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n\n if (!this.userConfig.saltGenerator) {\n throw new SDJWTException('SaltGenerator not found')\n }\n\n if (!this.userConfig.signAlg) {\n throw new SDJWTException('sign alogrithm not specified')\n }\n if (this.userConfig.signAlg === 'none') {\n throw new SDJWTException('sign algorithm \"none\" is not allowed')\n }\n\n this.validateReservedFields<Payload>(payload)\n this.validateDisclosureFrame<Payload>(disclosureFrame)\n\n const hasher = this.userConfig.hasher\n const hashAlg = this.userConfig.hashAlg ?? SDJwtInstance.DEFAULT_hashAlg\n const allowedDisclosureHashAlgorithms =\n this.userConfig.allowedDisclosureHashAlgorithms ?? DEFAULT_SECURE_HASH_ALGORITHMS\n if (!allowedDisclosureHashAlgorithms.includes(hashAlg)) {\n throw new SDJWTException(`Disallowed hash algorithm: ${hashAlg}`)\n }\n\n const { packedClaims, disclosures } = await pack(\n payload,\n disclosureFrame,\n { hasher, alg: hashAlg },\n this.userConfig.saltGenerator\n )\n const alg = this.userConfig.signAlg\n const OptionHeader = options?.header ?? {}\n const CustomHeader = this.userConfig.omitTyp ? OptionHeader : { typ: this.type, ...OptionHeader }\n const header = { ...CustomHeader, alg }\n const jwt = new Jwt({\n header,\n payload: {\n ...packedClaims,\n _sd_alg: disclosureFrame ? hashAlg : undefined,\n },\n })\n await this.SignJwt(jwt)\n\n const sdJwt = new SDJwt({\n jwt,\n disclosures,\n })\n\n return sdJwt.encodeSDJwt()\n }\n\n /**\n * Validates if the payload contains any reserved claim names. If so it will throw an error.\n * @param payload\n * @returns\n */\n protected validateReservedFields<T extends ExtendedPayload>(payload: T) {\n validateReservedFieldsInternal(payload as Record<string, unknown>)\n }\n\n protected validateDisclosureFrame<T extends ExtendedPayload>(_disclosureFrame?: DisclosureFrame<T>) {\n return\n }\n\n public async present<T extends Record<string, unknown>>(\n encodedSDJwt: string,\n presentationFrame?: PresentationFrame<T>,\n options?: {\n kb?: KBOptions\n }\n ): Promise<SDJWTCompact> {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n const hasher = this.userConfig.hasher\n\n const sdjwt = await SDJwt.fromEncode(encodedSDJwt, hasher)\n if (sdjwt.kbJwt) {\n throw new SDJWTException('Holder cannot present an SD-JWT with KB-JWT')\n }\n\n if (!sdjwt.jwt?.payload) throw new SDJWTException('Payload not found')\n const presentSdJwtWithoutKb = await sdjwt.present(presentationFrame, hasher)\n\n if (!options?.kb) {\n return presentSdJwtWithoutKb\n }\n\n const sdHashStr = await this.calculateSDHash(presentSdJwtWithoutKb, sdjwt, hasher)\n\n sdjwt.kbJwt = await this.createKBJwt(options.kb, sdHashStr)\n return sdjwt.present(presentationFrame, hasher)\n }\n\n // This function is for verifying the SD JWT\n // If requiredClaimKeys is provided, it will check if the required claim keys are presentation in the SD JWT\n // If requireKeyBindings is true, it will check if the key binding JWT is presentation and verify it\n public async verify(encodedSDJwt: string, options?: T & VerifierOptions) {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n const hasher = this.userConfig.hasher\n\n const sdjwt = await SDJwt.fromEncode(encodedSDJwt, hasher)\n if (!sdjwt.jwt?.payload) {\n throw new SDJWTException('Invalid SD JWT')\n }\n const { payload, header } = await this.validate(encodedSDJwt, options)\n\n if (options?.requiredClaimKeys) {\n const keys = await sdjwt.keys(hasher)\n const missingKeys = options.requiredClaimKeys.filter((k) => !keys.includes(k))\n if (missingKeys.length > 0) {\n throw new SDJWTException(`Missing required claim keys: ${missingKeys.join(', ')}`)\n }\n }\n\n if (!options?.keyBindingNonce) {\n return { payload, header }\n }\n\n if (!sdjwt.kbJwt) {\n throw new SDJWTException('Key Binding JWT not exist')\n }\n if (!this.userConfig.kbVerifier) {\n throw new SDJWTException('Key Binding Verifier not found')\n }\n const kb = await sdjwt.kbJwt.verifyKB({\n verifier: this.userConfig.kbVerifier,\n payload,\n nonce: options.keyBindingNonce,\n options,\n })\n if (!kb) {\n throw new Error('signature is not valid')\n }\n\n const sdHashfromKb = kb.payload.sd_hash\n const sdjwtWithoutKb = new SDJwt({\n jwt: sdjwt.jwt,\n disclosures: sdjwt.disclosures,\n })\n\n const presentSdJwtWithoutKb = sdjwtWithoutKb.encodeSDJwt()\n const sdHashStr = await this.calculateSDHash(presentSdJwtWithoutKb, sdjwt, hasher)\n\n if (sdHashStr !== sdHashfromKb) {\n throw new SDJWTException('Invalid sd_hash in Key Binding JWT')\n }\n\n return { payload, header, kb }\n }\n\n /**\n * Safe verification that collects all errors instead of failing fast.\n * Returns a result object with either the verified data or an array of all errors.\n *\n * @param encodedSDJwt - The encoded SD-JWT to verify\n * @param options - Verification options\n * @returns A SafeVerifyResult containing either success data or collected errors\n */\n public async safeVerify(\n encodedSDJwt: string,\n options?: T & VerifierOptions\n ): Promise<\n SafeVerifyResult<{\n payload: ExtendedPayload\n header: Record<string, unknown> | undefined\n kb?: {\n payload: Record<string, unknown>\n header: Record<string, unknown>\n }\n }>\n > {\n const errors: VerificationError[] = []\n\n // Helper to add errors\n const addError = (code: VerificationErrorCode, message: string, details?: unknown) => {\n errors.push({ code, message, details })\n }\n\n // Helper to convert exception to error code\n const exceptionToCode = (error: Error): VerificationErrorCode => {\n const message = error.message.toLowerCase()\n if (message.includes('hasher not found')) return 'HASHER_NOT_FOUND'\n if (message.includes('verifier not found')) return 'VERIFIER_NOT_FOUND'\n if (message.includes('invalid sd jwt') || message.includes('invalid jwt')) return 'INVALID_SD_JWT'\n if (message.includes('not yet valid')) return 'JWT_NOT_YET_VALID'\n if (message.includes('expired')) return 'JWT_EXPIRED'\n if (message.includes('signature')) return 'INVALID_JWT_SIGNATURE'\n if (message.includes('missing required claim')) return 'MISSING_REQUIRED_CLAIMS'\n if (message.includes('key binding jwt not exist')) return 'KEY_BINDING_JWT_MISSING'\n if (message.includes('key binding verifier not found')) return 'KEY_BINDING_VERIFIER_NOT_FOUND'\n if (message.includes('sd_hash')) return 'KEY_BINDING_SD_HASH_INVALID'\n return 'UNKNOWN_ERROR'\n }\n\n // Check basic configuration first\n if (!this.userConfig.hasher) {\n addError('HASHER_NOT_FOUND', 'Hasher not found')\n }\n if (!this.userConfig.verifier) {\n addError('VERIFIER_NOT_FOUND', 'Verifier not found')\n }\n\n // If basic config is missing, return early\n if (errors.length > 0) {\n return { success: false, errors }\n }\n\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n\n // hasher and verifier are guaranteed to be defined here\n const hasher = this.userConfig.hasher\n\n // Try to decode and validate the SD-JWT\n let sdjwt: SDJwt | undefined\n let payload: ExtendedPayload | undefined\n let header: Record<string, unknown> | undefined\n\n try {\n sdjwt = await SDJwt.fromEncode(encodedSDJwt, hasher)\n if (!sdjwt.jwt?.payload) {\n addError('INVALID_SD_JWT', 'Invalid SD JWT: missing JWT or payload')\n }\n } catch (e) {\n const error = ensureError(e)\n addError('INVALID_SD_JWT', `Failed to decode SD-JWT: ${error.message}`, error)\n }\n\n // Validate signature and claims\n if (sdjwt?.jwt) {\n try {\n const result = await this.VerifyJwt(sdjwt.jwt, {\n ...options,\n skipJwtClaimValidation: true,\n } as T & VerifierOptions)\n header = result.header\n const claims = await sdjwt.getClaims(hasher)\n payload = claims as ExtendedPayload\n validateJwtPayload(payload, options)\n } catch (e) {\n const error = ensureError(e)\n const code = exceptionToCode(error)\n addError(code, error.message, error)\n }\n }\n\n // Check required claim keys\n if (sdjwt && options?.requiredClaimKeys) {\n try {\n const keys = await sdjwt.keys(hasher)\n const missingKeys = options.requiredClaimKeys.filter((k) => !keys.includes(k))\n if (missingKeys.length > 0) {\n addError('MISSING_REQUIRED_CLAIMS', `Missing required claim keys: ${missingKeys.join(', ')}`, { missingKeys })\n }\n } catch (e) {\n const error = ensureError(e)\n addError('UNKNOWN_ERROR', `Failed to check required claims: ${error.message}`, error)\n }\n }\n\n // Verify key binding if requested\n let kb: { payload: Record<string, unknown>; header: Record<string, unknown> } | undefined\n if (options?.keyBindingNonce && sdjwt) {\n if (!sdjwt.kbJwt) {\n addError('KEY_BINDING_JWT_MISSING', 'Key Binding JWT not exist')\n } else if (!this.userConfig.kbVerifier) {\n addError('KEY_BINDING_VERIFIER_NOT_FOUND', 'Key Binding Verifier not found')\n } else if (payload) {\n try {\n const kbResult = await sdjwt.kbJwt.verifyKB({\n verifier: this.userConfig.kbVerifier,\n payload,\n nonce: options.keyBindingNonce,\n options,\n })\n if (!kbResult) {\n addError('KEY_BINDING_SIGNATURE_INVALID', 'Key binding signature is not valid')\n } else {\n kb = kbResult\n\n // Verify sd_hash\n const sdjwtWithoutKb = new SDJwt({\n jwt: sdjwt.jwt,\n disclosures: sdjwt.disclosures,\n })\n const presentSdJwtWithoutKb = sdjwtWithoutKb.encodeSDJwt()\n const sdHashStr = await this.calculateSDHash(presentSdJwtWithoutKb, sdjwt, hasher)\n\n if (sdHashStr !== kbResult.payload.sd_hash) {\n addError('KEY_BINDING_SD_HASH_INVALID', 'Invalid sd_hash in Key Binding JWT', {\n expected: sdHashStr,\n received: kbResult.payload.sd_hash,\n })\n }\n }\n } catch (e) {\n const error = ensureError(e)\n addError('KEY_BINDING_SIGNATURE_INVALID', `Key binding verification failed: ${error.message}`, error)\n }\n }\n }\n\n // Return result\n if (errors.length > 0) {\n return { success: false, errors }\n }\n\n return {\n success: true,\n data: {\n payload: payload as ExtendedPayload,\n header,\n kb,\n },\n }\n }\n\n private async calculateSDHash(presentSdJwtWithoutKb: string, sdjwt: SDJwt, hasher: Hasher) {\n if (!sdjwt.jwt?.payload) {\n throw new SDJWTException('Invalid SD JWT')\n }\n const { _sd_alg } = getSDAlgAndPayload(sdjwt.jwt.payload)\n const sdHash = await hasher(presentSdJwtWithoutKb, _sd_alg)\n const sdHashStr = uint8ArrayToBase64Url(sdHash)\n return sdHashStr\n }\n\n /**\n * This function is for validating the SD JWT\n * Checking signature, if provided the iat and exp when provided and return its the claims\n * @param encodedSDJwt\n * @param options\n * @returns\n */\n public async validate(encodedSDJwt: string, options?: T & VerifierOptions) {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n const hasher = this.userConfig.hasher\n\n const sdjwt = await SDJwt.fromEncode(encodedSDJwt, hasher)\n if (!sdjwt.jwt) {\n throw new SDJWTException('Invalid SD JWT')\n }\n\n const verifiedPayloads = await this.VerifyJwt(sdjwt.jwt, {\n ...options,\n skipJwtClaimValidation: true,\n } as T & VerifierOptions)\n const claims = await sdjwt.getClaims<ExtendedPayload>(hasher)\n // Validate that unpacked claims do not contain reserved field names\n validateReservedFieldsInternal(claims)\n validateJwtPayload(claims, options)\n return { payload: claims, header: verifiedPayloads.header }\n }\n\n public config(newConfig: SDJWTConfig) {\n this.userConfig = { ...this.userConfig, ...newConfig }\n }\n\n public encode(sdJwt: SDJwt): SDJWTCompact {\n return sdJwt.encodeSDJwt()\n }\n\n public decode(endcodedSDJwt: SDJWTCompact) {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n return SDJwt.fromEncode(endcodedSDJwt, this.userConfig.hasher)\n }\n\n public async keys(endcodedSDJwt: SDJWTCompact) {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n const sdjwt = await SDJwt.fromEncode(endcodedSDJwt, this.userConfig.hasher)\n return sdjwt.keys(this.userConfig.hasher)\n }\n\n public async presentableKeys(endcodedSDJwt: SDJWTCompact) {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n const sdjwt = await SDJwt.fromEncode(endcodedSDJwt, this.userConfig.hasher)\n return sdjwt.presentableKeys(this.userConfig.hasher)\n }\n\n public async getClaims(endcodedSDJwt: SDJWTCompact) {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n const sdjwt = await SDJwt.fromEncode(endcodedSDJwt, this.userConfig.hasher)\n return sdjwt.getClaims(this.userConfig.hasher)\n }\n\n public toFlattenJSON(endcodedSDJwt: SDJWTCompact) {\n return FlattenJSON.fromEncode(endcodedSDJwt)\n }\n\n public toGeneralJSON(endcodedSDJwt: SDJWTCompact) {\n return GeneralJSON.fromEncode(endcodedSDJwt)\n }\n}\n\nexport class SDJwtGeneralJSONInstance<ExtendedPayload extends SdJwtPayload> {\n //header type\n protected type?: string\n\n public static readonly DEFAULT_hashAlg = 'sha-256'\n\n protected userConfig: SDJWTConfig = {}\n\n constructor(userConfig?: SDJWTConfig) {\n if (userConfig) {\n if (userConfig.hashAlg && !IANA_HASH_ALGORITHMS.includes(userConfig.hashAlg)) {\n throw new SDJWTException(`Invalid hash algorithm: ${userConfig.hashAlg}`)\n }\n const allowedDisclosureHashAlgorithms =\n userConfig.allowedDisclosureHashAlgorithms ?? DEFAULT_SECURE_HASH_ALGORITHMS\n if (userConfig.hashAlg && !allowedDisclosureHashAlgorithms.includes(userConfig.hashAlg)) {\n throw new SDJWTException(`Disallowed hash algorithm: ${userConfig.hashAlg}`)\n }\n this.userConfig = userConfig\n }\n }\n\n private async createKBJwt(options: KBOptions, sdHash: string): Promise<KBJwt> {\n if (!this.userConfig.kbSigner) {\n throw new SDJWTException('Key Binding Signer not found')\n }\n if (!this.userConfig.kbSignAlg) {\n throw new SDJWTException('Key Binding sign algorithm not specified')\n }\n\n const { payload } = options\n const kbJwt = new KBJwt({\n header: {\n typ: KB_JWT_TYP,\n alg: this.userConfig.kbSignAlg,\n },\n payload: { ...payload, sd_hash: sdHash },\n })\n\n await kbJwt.sign(this.userConfig.kbSigner)\n return kbJwt\n }\n\n private encodeObj(obj: Record<string, unknown>): string {\n return base64urlEncode(JSON.stringify(obj))\n }\n\n public async issue<Payload extends ExtendedPayload>(\n payload: Payload,\n disclosureFrame: DisclosureFrame<Payload> | undefined,\n options: {\n sigs: Array<{\n signer: Signer\n alg: string\n kid: string\n header?: Record<string, unknown>\n }> // multiple signers for the credential\n }\n ): Promise<GeneralJSON> {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n\n if (!this.userConfig.saltGenerator) {\n throw new SDJWTException('SaltGenerator not found')\n }\n\n this.validateReservedFields<Payload>(payload)\n this.validateDisclosureFrame<Payload>(disclosureFrame)\n\n const hasher = this.userConfig.hasher\n const hashAlg = this.userConfig.hashAlg ?? SDJwtInstance.DEFAULT_hashAlg\n\n const { packedClaims, disclosures } = await pack(\n payload,\n disclosureFrame,\n { hasher, alg: hashAlg },\n this.userConfig.saltGenerator\n )\n\n const encodedSDJwtPayload = this.encodeObj({\n ...packedClaims,\n _sd_alg: disclosureFrame ? hashAlg : undefined,\n })\n\n const encodedDisclosures = disclosures.map((disclosure) => disclosure.encode())\n\n const signatures = await Promise.all(\n options.sigs.map(async (s) => {\n const { signer, alg, kid, header } = s\n const protectedHeader = { typ: this.type, alg, kid, ...header }\n const encodedProtectedHeader = this.encodeObj(protectedHeader)\n const signature = await signer(`${encodedProtectedHeader}.${encodedSDJwtPayload}`)\n\n return {\n protected: encodedProtectedHeader,\n signature,\n }\n })\n )\n\n const generalJson = new GeneralJSON({\n payload: encodedSDJwtPayload,\n disclosures: encodedDisclosures,\n signatures,\n })\n\n return generalJson\n }\n\n /**\n * Validates if the payload contains any reserved claim names. If so it will throw an error.\n * @param payload\n * @returns\n */\n protected validateReservedFields<T extends ExtendedPayload>(payload: T) {\n validateReservedFieldsInternal(payload as Record<string, unknown>)\n }\n\n protected validateDisclosureFrame<T extends ExtendedPayload>(_disclosureFrame?: DisclosureFrame<T>) {\n return\n }\n\n public async present<T extends Record<string, unknown>>(\n generalJSON: GeneralJSON,\n presentationFrame?: PresentationFrame<T>,\n options?: {\n kb?: KBOptions\n }\n ): Promise<GeneralJSON> {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n const hasher = this.userConfig.hasher\n const encodedSDJwt = generalJSON.toEncoded(0)\n const sdjwt = await SDJwt.fromEncode(encodedSDJwt, hasher)\n if (sdjwt.kbJwt) {\n throw new SDJWTException('Holder cannot present an SD-JWT with KB-JWT')\n }\n\n if (!sdjwt.jwt?.payload) throw new SDJWTException('Payload not found')\n const disclosures = await sdjwt.getPresentDisclosures(presentationFrame, hasher)\n const encodedDisclosures = disclosures.map((d) => d.encode())\n const presentedGeneralJSON = new GeneralJSON({\n payload: generalJSON.payload,\n disclosures: encodedDisclosures,\n signatures: generalJSON.signatures,\n })\n\n if (!options?.kb) {\n return presentedGeneralJSON\n }\n\n const presentSdJwtWithoutKb = await sdjwt.present(presentationFrame, hasher)\n\n const sdHashStr = await this.calculateSDHash(presentSdJwtWithoutKb, sdjwt, hasher)\n\n const kbJwt = await this.createKBJwt(options.kb, sdHashStr)\n const encodedKbJwt = kbJwt.encodeJwt()\n presentedGeneralJSON.kb_jwt = encodedKbJwt\n return presentedGeneralJSON\n }\n\n // This function is for verifying the SD JWT\n // If requiredClaimKeys is provided, it will check if the required claim keys are presentation in the SD JWT\n // If requireKeyBindings is true, it will check if the key binding JWT is presentation and verify it\n public async verify(generalJSON: GeneralJSON, options?: VerifierOptions) {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n const hasher = this.userConfig.hasher\n\n const { payload, headers } = await this.validate(generalJSON, options)\n\n const encodedSDJwt = generalJSON.toEncoded(0)\n const sdjwt = await SDJwt.fromEncode(encodedSDJwt, hasher)\n if (!sdjwt.jwt?.payload) {\n throw new SDJWTException('Invalid SD JWT')\n }\n\n if (options?.requiredClaimKeys) {\n const keys = await sdjwt.keys(hasher)\n const missingKeys = options?.requiredClaimKeys.filter((k) => !keys.includes(k))\n if (missingKeys.length > 0) {\n throw new SDJWTException(`Missing required claim keys: ${missingKeys.join(', ')}`)\n }\n }\n\n if (!options?.keyBindingNonce) {\n return { payload, headers }\n }\n\n if (!sdjwt.kbJwt) {\n throw new SDJWTException('Key Binding JWT not exist')\n }\n if (!this.userConfig.kbVerifier) {\n throw new SDJWTException('Key Binding Verifier not found')\n }\n const kb = await sdjwt.kbJwt.verifyKB({\n verifier: this.userConfig.kbVerifier,\n payload,\n nonce: options.keyBindingNonce,\n options,\n })\n if (!kb) {\n throw new Error('signature is not valid')\n }\n const sdHashfromKb = kb.payload.sd_hash\n const sdjwtWithoutKb = new SDJwt({\n jwt: sdjwt.jwt,\n disclosures: sdjwt.disclosures,\n })\n\n const presentSdJwtWithoutKb = sdjwtWithoutKb.encodeSDJwt()\n const sdHashStr = await this.calculateSDHash(presentSdJwtWithoutKb, sdjwt, hasher)\n\n if (sdHashStr !== sdHashfromKb) {\n throw new SDJWTException('Invalid sd_hash in Key Binding JWT')\n }\n\n return { payload, headers, kb }\n }\n\n private async calculateSDHash(presentSdJwtWithoutKb: string, sdjwt: SDJwt, hasher: Hasher) {\n if (!sdjwt.jwt?.payload) {\n throw new SDJWTException('Invalid SD JWT')\n }\n const { _sd_alg } = getSDAlgAndPayload(sdjwt.jwt.payload)\n const sdHash = await hasher(presentSdJwtWithoutKb, _sd_alg)\n const sdHashStr = uint8ArrayToBase64Url(sdHash)\n return sdHashStr\n }\n\n // This function is for validating the SD JWT\n // Just checking signature and return its the claims\n public async validate(generalJSON: GeneralJSON, options?: VerifierOptions) {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n if (!this.userConfig.verifier) {\n throw new SDJWTException('Verifier not found')\n }\n const hasher = this.userConfig.hasher\n const verifier = this.userConfig.verifier\n\n const { payload, signatures } = generalJSON\n\n const results = await Promise.all(\n signatures.map(async (s) => {\n const { protected: encodedHeader, signature } = s\n const verified = await verifier(`${encodedHeader}.${payload}`, signature, {\n ...options,\n skipJwtClaimValidation: true,\n })\n const header = decodeBase64urlJsonStrict<Record<string, unknown>>(encodedHeader, 'Invalid JWT')\n if (typeof header.alg !== 'string' || header.alg === 'none') {\n throw new SDJWTException('Verify Error: alg \"none\" is not allowed')\n }\n if (options?.allowedIssuerAlgorithms && !options.allowedIssuerAlgorithms.includes(header.alg)) {\n throw new SDJWTException(`Verify Error: Disallowed alg ${header.alg}`)\n }\n return { verified, header }\n })\n )\n\n const verified = results.every((r) => r.verified)\n if (!verified) {\n throw new SDJWTException('Signature is not valid')\n }\n\n const encodedSDJwt = generalJSON.toEncoded(0)\n const sdjwt = await SDJwt.fromEncode(encodedSDJwt, hasher)\n if (!sdjwt.jwt) {\n throw new SDJWTException('Invalid SD JWT')\n }\n\n const claims = await sdjwt.getClaims<ExtendedPayload>(hasher)\n // Validate that unpacked claims do not contain reserved field names\n validateReservedFieldsInternal(claims)\n validateJwtPayload(claims, options)\n return { payload: claims, headers: results.map((r) => r.header) }\n }\n\n public config(newConfig: SDJWTConfig) {\n this.userConfig = { ...this.userConfig, ...newConfig }\n }\n\n public encode(sdJwt: GeneralJSON, index: number): SDJWTCompact {\n return sdJwt.toEncoded(index)\n }\n\n public decode(endcodedSDJwt: SDJWTCompact) {\n return GeneralJSON.fromEncode(endcodedSDJwt)\n }\n\n public async keys(generalSdjwt: GeneralJSON) {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n const endcodedSDJwt = generalSdjwt.toEncoded(0)\n const sdjwt = await SDJwt.fromEncode(endcodedSDJwt, this.userConfig.hasher)\n return sdjwt.keys(this.userConfig.hasher)\n }\n\n public async presentableKeys(generalSdjwt: GeneralJSON) {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n const endcodedSDJwt = generalSdjwt.toEncoded(0)\n const sdjwt = await SDJwt.fromEncode(endcodedSDJwt, this.userConfig.hasher)\n return sdjwt.presentableKeys(this.userConfig.hasher)\n }\n\n public async getClaims(generalSdjwt: GeneralJSON) {\n if (!this.userConfig.hasher) {\n throw new SDJWTException('Hasher not found')\n }\n const endcodedSDJwt = generalSdjwt.toEncoded(0)\n const sdjwt = await SDJwt.fromEncode(endcodedSDJwt, this.userConfig.hasher)\n return sdjwt.getClaims(this.userConfig.hasher)\n }\n}\n"],"mappings":"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"}
|