@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.
Files changed (68) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +82 -80
  3. package/dist/index.cjs +1526 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +696 -0
  6. package/dist/index.d.mts +537 -527
  7. package/dist/index.mjs +1422 -1998
  8. package/dist/index.mjs.map +1 -0
  9. package/package.json +29 -49
  10. package/CHANGELOG.md +0 -39
  11. package/dist/index.d.ts +0 -686
  12. package/dist/index.js +0 -2100
  13. package/src/decode/decode.ts +0 -407
  14. package/src/decode/index.ts +0 -1
  15. package/src/decoy.ts +0 -15
  16. package/src/flattenJSON.ts +0 -99
  17. package/src/generalJSON.ts +0 -157
  18. package/src/index.ts +0 -1000
  19. package/src/jwt.ts +0 -286
  20. package/src/kbjwt.ts +0 -101
  21. package/src/present/index.ts +0 -1
  22. package/src/present/present.ts +0 -216
  23. package/src/sdjwt.ts +0 -384
  24. package/src/test/decode/decode.spec.ts +0 -197
  25. package/src/test/decoy.spec.ts +0 -30
  26. package/src/test/flattenJSON.spec.ts +0 -122
  27. package/src/test/generalJSON.spec.ts +0 -198
  28. package/src/test/index.spec.ts +0 -986
  29. package/src/test/jwt.spec.ts +0 -301
  30. package/src/test/kbjwt.spec.ts +0 -555
  31. package/src/test/pass.spec.ts +0 -7
  32. package/src/test/present/present.spec.ts +0 -305
  33. package/src/test/sdjwt.spec.ts +0 -384
  34. package/src/test/types/type.spec.ts +0 -88
  35. package/src/test/utils/base64url.spec.ts +0 -33
  36. package/src/test/utils/disclosure.spec.ts +0 -170
  37. package/src/test/utils/error.spec.ts +0 -15
  38. package/src/types/index.ts +0 -2
  39. package/src/types/type.ts +0 -270
  40. package/src/types/verification-error.ts +0 -55
  41. package/src/utils/base64url.ts +0 -6
  42. package/src/utils/disclosure.ts +0 -121
  43. package/src/utils/error.ts +0 -25
  44. package/src/utils/index.ts +0 -3
  45. package/src/utils/strict-json.ts +0 -17
  46. package/test/app-e2e.spec.ts +0 -292
  47. package/test/array_data_types.json +0 -31
  48. package/test/array_full_sd.json +0 -21
  49. package/test/array_in_sd.json +0 -13
  50. package/test/array_nested_in_plain.json +0 -29
  51. package/test/array_none_disclosed.json +0 -17
  52. package/test/array_of_nulls.json +0 -15
  53. package/test/array_of_objects.json +0 -65
  54. package/test/array_of_scalars.json +0 -19
  55. package/test/array_recursive_sd.json +0 -35
  56. package/test/array_recursive_sd_some_disclosed.json +0 -63
  57. package/test/complex.json +0 -43
  58. package/test/header_mod.json +0 -48
  59. package/test/json_serialization.json +0 -48
  60. package/test/key_binding.json +0 -48
  61. package/test/no_sd.json +0 -36
  62. package/test/object_data_types.json +0 -62
  63. package/test/recursions.json +0 -117
  64. package/test/rfc9901-audit-fixes.spec.ts +0 -252
  65. package/test/rfc9901-validation.spec.ts +0 -150
  66. package/test/tsconfig.json +0 -4
  67. package/tsconfig.json +0 -7
  68. package/vitest.config.mts +0 -4
@@ -0,0 +1,696 @@
1
+ import { base64UrlToUint8Array, base64urlDecode, base64urlEncode, uint8ArrayToBase64Url } from "@owf/identity-common";
2
+ //#region src/types/type.d.ts
3
+ export declare const SD_SEPARATOR = "~";
4
+ export declare const SD_LIST_KEY = "...";
5
+ export declare const SD_DIGEST = "_sd";
6
+ export declare const SD_DECOY = "_sd_decoy";
7
+ export declare const KB_JWT_TYP = "kb+jwt";
8
+ export type SDJWTCompact = string;
9
+ export type Base64urlString = string;
10
+ export type DisclosureData<T> = [string, string, T] | [string, T];
11
+ export declare const encodePathSegment: (segment: string) => string;
12
+ export declare const encodePath: (segments: string[]) => string;
13
+ export declare const IANA_HASH_ALGORITHMS: readonly ["sha-256", "sha-256-128", "sha-256-120", "sha-256-96", "sha-256-64", "sha-256-32", "sha-384", "sha-512", "sha3-224", "sha3-256", "sha3-384", "sha3-512", "blake2s-256", "blake2b-256", "blake2b-512", "k12-256", "k12-512"];
14
+ export type HashAlgorithm = (typeof IANA_HASH_ALGORITHMS)[number];
15
+ export declare const DEFAULT_SECURE_HASH_ALGORITHMS: readonly ["sha-256", "sha-384", "sha-512", "sha3-256", "sha3-384", "sha3-512", "blake2s-256", "blake2b-256", "blake2b-512", "k12-256", "k12-512"];
16
+ export type SDJWTConfig<T = unknown> = {
17
+ omitTyp?: boolean;
18
+ hasher?: Hasher;
19
+ hashAlg?: HashAlgorithm;
20
+ allowedDisclosureHashAlgorithms?: ReadonlyArray<HashAlgorithm>;
21
+ saltGenerator?: SaltGenerator;
22
+ signer?: Signer;
23
+ signAlg?: string;
24
+ verifier?: Verifier<T>;
25
+ kbSigner?: Signer;
26
+ kbSignAlg?: string;
27
+ kbVerifier?: KbVerifier;
28
+ };
29
+ export type kbHeader = {
30
+ typ: 'kb+jwt';
31
+ alg: string;
32
+ };
33
+ export type kbPayload = {
34
+ iat: number;
35
+ aud: string;
36
+ nonce: string;
37
+ sd_hash: string;
38
+ };
39
+ export type KBOptions = {
40
+ payload: Omit<kbPayload, 'sd_hash'>;
41
+ };
42
+ interface RsaOtherPrimesInfo {
43
+ d?: string;
44
+ r?: string;
45
+ t?: string;
46
+ }
47
+ interface JsonWebKey {
48
+ alg?: string;
49
+ crv?: string;
50
+ d?: string;
51
+ dp?: string;
52
+ dq?: string;
53
+ e?: string;
54
+ ext?: boolean;
55
+ k?: string;
56
+ key_ops?: string[];
57
+ kty?: string;
58
+ n?: string;
59
+ oth?: RsaOtherPrimesInfo[];
60
+ p?: string;
61
+ q?: string;
62
+ qi?: string;
63
+ use?: string;
64
+ x?: string;
65
+ y?: string;
66
+ }
67
+ export interface JwtPayload {
68
+ cnf?: {
69
+ jwk: JsonWebKey;
70
+ };
71
+ exp?: number;
72
+ [key: string]: unknown;
73
+ }
74
+ export type OrPromise<T> = T | Promise<T>;
75
+ export type Signer = (data: string) => OrPromise<string>;
76
+ export type Verifier<T = unknown> = (data: string, sig: string, options?: T) => OrPromise<boolean>;
77
+ export type KbVerifier = (data: string, sig: string, payload: JwtPayload) => OrPromise<boolean>;
78
+ export type Hasher = (data: string | ArrayBuffer, alg: string) => OrPromise<Uint8Array>;
79
+ export type SaltGenerator = (length: number) => OrPromise<string>;
80
+ export type HasherAndAlg = {
81
+ hasher: Hasher;
82
+ alg: string;
83
+ };
84
+ export type SignerSync = (data: string) => string;
85
+ export type VerifierSync = (data: string, sig: string) => boolean;
86
+ export type HasherSync = (data: string, alg: string) => Uint8Array;
87
+ export type SaltGeneratorSync = (length: number) => string;
88
+ export type HasherAndAlgSync = {
89
+ hasher: HasherSync;
90
+ alg: string;
91
+ };
92
+ type NonNever<T> = { [P in keyof T as T[P] extends never ? never : P]: T[P]; };
93
+ export type SD<Payload> = {
94
+ [SD_DIGEST]?: Array<keyof Payload>;
95
+ };
96
+ export type DECOY = {
97
+ [SD_DECOY]?: number;
98
+ };
99
+ /**
100
+ * This is a disclosureFrame type that is used to represent the structure of what is being disclosed.
101
+ * DisclosureFrame is made from the payload type.
102
+ *
103
+ * For example, if the payload is
104
+ * {
105
+ * foo: 'bar',
106
+ * test: {
107
+ * zzz: 'yyy',
108
+ * }
109
+ * arr: ['1', '2', {a: 'b'}]
110
+ * }
111
+ *
112
+ * The disclosureFrame can be subset of:
113
+ * {
114
+ * _sd: ["foo", "test", "arr"],
115
+ * test: {
116
+ * _sd: ["zzz"],
117
+ * },
118
+ * arr: {
119
+ * _sd: ["0", "1", "2"],
120
+ * "2": {
121
+ * _sd: ["a"],
122
+ * }
123
+ * }
124
+ * }
125
+ *
126
+ * The disclosureFrame can be used with decoy.
127
+ * Decoy can be used like this:
128
+ * {
129
+ * ...
130
+ * _sd: ...
131
+ * _sd_decoy: 1 // number of decoy in this layer
132
+ * }
133
+ *
134
+ */
135
+ type Frame<Payload> = Payload extends Array<infer U> ? U extends object ? Record<number, Frame<U>> & SD<Payload> & DECOY : SD<Payload> & DECOY : Payload extends Record<string, unknown> ? NonNever<{ [K in keyof Payload]?: NonNullable<Payload[K]> extends object ? Frame<Payload[K]> : never; } & SD<Payload> & DECOY> : SD<Payload> & DECOY;
136
+ /**
137
+ * This is a disclosureFrame type that is used to represent the structure of what is being disclosed.
138
+ */
139
+ export type Extensible = Record<string, unknown | boolean>;
140
+ export type DisclosureFrame<T extends Extensible> = Frame<T>;
141
+ /**
142
+ * This is a presentationFrame type that is used to represent the structure of what is being presented.
143
+ * PresentationFrame is made from the payload type.
144
+ * const claims = {
145
+ firstname: 'John',
146
+ lastname: 'Doe',
147
+ ssn: '123-45-6789',
148
+ id: '1234',
149
+ data: {
150
+ firstname: 'John',
151
+ lastname: 'Doe',
152
+ ssn: '123-45-6789',
153
+ list: [{ r: 'd' }, 'b', 'c'],
154
+ list2: ['1', '2', '3'],
155
+ list3: ['1', null, 2],
156
+ },
157
+ data2: {
158
+ hi: 'bye',
159
+ },
160
+ };
161
+
162
+ Example of a presentationFrame:
163
+ const presentationFrame: PresentationFrame<typeof claims> = {
164
+ firstname: true,
165
+ lastname: true,
166
+ ssn: true,
167
+ id: 'true',
168
+ data: {
169
+ firstname: true,
170
+ list: {
171
+ 1: true,
172
+ 0: {
173
+ r: true,
174
+ },
175
+ },
176
+ list2: {
177
+ 1: true,
178
+ },
179
+ list3: true,
180
+ },
181
+ data2: true,
182
+ };
183
+ */
184
+ type PFrame<Payload> = Payload extends Array<infer U> ? U extends object ? Record<number, PFrame<U> | boolean> | boolean : Record<number, boolean> | boolean : { [K in keyof Payload]?: NonNullable<Payload[K]> extends object ? PFrame<Payload[K]> | boolean : boolean; };
185
+ export type PresentationFrame<T extends Extensible> = PFrame<T>;
186
+ //#endregion
187
+ //#region src/types/verification-error.d.ts
188
+ /**
189
+ * Error codes for SD-JWT verification errors.
190
+ */
191
+ export type VerificationErrorCode = 'HASHER_NOT_FOUND' | 'VERIFIER_NOT_FOUND' | 'INVALID_SD_JWT' | 'INVALID_JWT_FORMAT' | 'JWT_NOT_YET_VALID' | 'JWT_EXPIRED' | 'INVALID_JWT_SIGNATURE' | 'MISSING_REQUIRED_CLAIMS' | 'KEY_BINDING_JWT_MISSING' | 'KEY_BINDING_VERIFIER_NOT_FOUND' | 'KEY_BINDING_SIGNATURE_INVALID' | 'KEY_BINDING_SD_HASH_INVALID' | 'STATUS_VERIFICATION_FAILED' | 'STATUS_INVALID' | 'VCT_VERIFICATION_FAILED' | 'UNKNOWN_ERROR';
192
+ /**
193
+ * Represents a single verification error.
194
+ */
195
+ export type VerificationError = {
196
+ /**
197
+ * The error code identifying the type of error.
198
+ */
199
+ code: VerificationErrorCode;
200
+ /**
201
+ * Human-readable error message.
202
+ */
203
+ message: string;
204
+ /**
205
+ * Optional additional details about the error.
206
+ */
207
+ details?: unknown;
208
+ };
209
+ /**
210
+ * Result type for safe verification that collects all errors.
211
+ */
212
+ export type SafeVerifyResult<T> = {
213
+ success: true;
214
+ data: T;
215
+ errors?: never;
216
+ } | {
217
+ success: false;
218
+ data?: never;
219
+ errors: VerificationError[];
220
+ };
221
+ //#endregion
222
+ //#region src/flattenJSON.d.ts
223
+ export type FlattenJSONData = {
224
+ jwtData: {
225
+ protected: string;
226
+ payload: string;
227
+ signature: string;
228
+ };
229
+ disclosures: Array<string>;
230
+ kb_jwt?: string;
231
+ };
232
+ export type FlattenJSONSerialized = {
233
+ payload: string;
234
+ signature: string;
235
+ protected: string;
236
+ header: {
237
+ disclosures: Array<string>;
238
+ kb_jwt?: string;
239
+ };
240
+ };
241
+ export declare class FlattenJSON {
242
+ disclosures: Array<string>;
243
+ kb_jwt?: string;
244
+ payload: string;
245
+ signature: string;
246
+ protected: string;
247
+ constructor(data: FlattenJSONData);
248
+ static fromEncode(encodedSdJwt: string): FlattenJSON;
249
+ static fromSerialized(json: FlattenJSONSerialized): FlattenJSON;
250
+ toJson(): FlattenJSONSerialized;
251
+ toEncoded(): string;
252
+ }
253
+ //#endregion
254
+ //#region src/generalJSON.d.ts
255
+ export type GeneralJSONData = {
256
+ payload: string;
257
+ disclosures: Array<string>;
258
+ kb_jwt?: string;
259
+ signatures: Array<{
260
+ protected: string;
261
+ signature: string;
262
+ kid?: string;
263
+ }>;
264
+ };
265
+ export type GeneralJSONSerialized = {
266
+ payload: string;
267
+ signatures: Array<{
268
+ header: {
269
+ disclosures?: Array<string>;
270
+ kid?: string;
271
+ kb_jwt?: string;
272
+ [key: string]: unknown;
273
+ };
274
+ protected: string;
275
+ signature: string;
276
+ }>;
277
+ };
278
+ export declare class GeneralJSON {
279
+ payload: string;
280
+ disclosures: Array<string>;
281
+ kb_jwt?: string;
282
+ signatures: Array<{
283
+ protected: string;
284
+ signature: string;
285
+ kid?: string;
286
+ }>;
287
+ constructor(data: GeneralJSONData);
288
+ static fromEncode(encodedSdJwt: string): GeneralJSON;
289
+ static fromSerialized(json: GeneralJSONSerialized): GeneralJSON;
290
+ toJson(): {
291
+ payload: string;
292
+ signatures: ({
293
+ header: {
294
+ kid: string | undefined;
295
+ disclosures?: undefined;
296
+ kb_jwt?: undefined;
297
+ };
298
+ protected: string;
299
+ signature: string;
300
+ } | {
301
+ header: {
302
+ disclosures: string[];
303
+ kid: string | undefined;
304
+ kb_jwt: string | undefined;
305
+ };
306
+ protected: string;
307
+ signature: string;
308
+ })[];
309
+ };
310
+ toEncoded(index: number): string;
311
+ addSignature(protectedHeader: Record<string, unknown>, signer: Signer, kid?: string): Promise<void>;
312
+ }
313
+ //#endregion
314
+ //#region src/jwt.d.ts
315
+ export type JwtData<Header extends Record<string, unknown>, Payload extends Record<string, unknown>> = {
316
+ header?: Header;
317
+ payload?: Payload;
318
+ signature?: Base64urlString;
319
+ encoded?: string;
320
+ };
321
+ /**
322
+ * Options for the JWT verifier
323
+ */
324
+ export type VerifierOptions = {
325
+ /**
326
+ * current time in seconds since epoch
327
+ */
328
+ currentDate?: number;
329
+ /**
330
+ * allowed skew for the current time in seconds. Positive value that will lower the iat and nbf checks, and increase the exp check.
331
+ */
332
+ skewSeconds?: number;
333
+ /**
334
+ * required claim keys for the payload.
335
+ * If the payload does not contain these keys, the verification will fail.
336
+ */
337
+ requiredClaimKeys?: string[];
338
+ /**
339
+ * Expected audience for the processed SD-JWT payload.
340
+ */
341
+ expectedAudience?: string | string[];
342
+ /**
343
+ * Allowed JOSE algorithms for issuer-signed JWTs. `none` is always rejected.
344
+ */
345
+ allowedIssuerAlgorithms?: string[];
346
+ /**
347
+ * nonce used to verify the key binding jwt to prevent replay attacks.
348
+ */
349
+ keyBindingNonce?: string;
350
+ /**
351
+ * Expected audience for the Key Binding JWT.
352
+ */
353
+ expectedKeyBindingAudience?: string | string[];
354
+ /**
355
+ * Maximum acceptable age of the Key Binding JWT, in seconds.
356
+ */
357
+ keyBindingMaxAgeSeconds?: number;
358
+ /**
359
+ * Internal option used by SD-JWT validation to defer claim checks until after
360
+ * disclosures are processed.
361
+ */
362
+ skipJwtClaimValidation?: boolean;
363
+ /**
364
+ * disable the verification of the status claim in the payload.
365
+ *
366
+ * @default false
367
+ */
368
+ disableStatusVerification?: boolean;
369
+ /**
370
+ * any other custom options
371
+ */
372
+ [key: string]: unknown;
373
+ };
374
+ export declare const validateJwtPayload: (payload: Record<string, unknown> | undefined, options?: VerifierOptions) => void;
375
+ export declare class Jwt<Header extends Record<string, unknown> = Record<string, unknown>, Payload extends Record<string, unknown> = Record<string, unknown>> {
376
+ header?: Header;
377
+ payload?: Payload;
378
+ signature?: Base64urlString;
379
+ private encoded?;
380
+ constructor(data?: JwtData<Header, Payload>);
381
+ static decodeJWT<Header extends Record<string, unknown> = Record<string, unknown>, Payload extends Record<string, unknown> = Record<string, unknown>>(jwt: string): {
382
+ header: Header;
383
+ payload: Payload;
384
+ signature: Base64urlString;
385
+ };
386
+ static fromEncode<Header extends Record<string, unknown> = Record<string, unknown>, Payload extends Record<string, unknown> = Record<string, unknown>>(encodedJwt: string): Jwt<Header, Payload>;
387
+ setHeader(header: Header): Jwt<Header, Payload>;
388
+ setPayload(payload: Payload): Jwt<Header, Payload>;
389
+ protected getUnsignedToken(): string;
390
+ sign(signer: Signer): Promise<string>;
391
+ encodeJwt(): string;
392
+ /**
393
+ * Verify the JWT using the provided verifier function.
394
+ * It checks the signature and validates the iat, nbf, and exp claims if they are present.
395
+ * @param verifier
396
+ * @param options - Options for verification, such as current date and skew seconds
397
+ * @returns
398
+ */
399
+ verify<T>(verifier: Verifier<T>, options?: T & VerifierOptions): Promise<{
400
+ payload: Payload | undefined;
401
+ header: Header | undefined;
402
+ }>;
403
+ }
404
+ //#endregion
405
+ //#region src/kbjwt.d.ts
406
+ export declare class KBJwt<Header extends kbHeader = kbHeader, Payload extends kbPayload = kbPayload> extends Jwt<Header, Payload> {
407
+ verifyKB(values: {
408
+ verifier: KbVerifier;
409
+ payload: Record<string, unknown>;
410
+ nonce: string;
411
+ /**
412
+ * Options forwarded to the common JWT verification, e.g. currentDate and
413
+ * skewSeconds used to validate the iat, nbf and exp claims.
414
+ */
415
+ options?: VerifierOptions;
416
+ }): Promise<{
417
+ payload: Payload;
418
+ header: Header;
419
+ }>;
420
+ static fromKBEncode<Header extends kbHeader = kbHeader, Payload extends kbPayload = kbPayload>(encodedJwt: string): KBJwt<Header, Payload>;
421
+ }
422
+ //#endregion
423
+ //#region src/utils/disclosure.d.ts
424
+ export declare class Disclosure<T = unknown> {
425
+ salt: string;
426
+ key?: string;
427
+ value: T;
428
+ _digest: string | undefined;
429
+ private _encoded;
430
+ constructor(data: DisclosureData<T>, _meta?: {
431
+ digest: string;
432
+ encoded: string;
433
+ });
434
+ static fromEncode<T>(s: string, hash: HasherAndAlg): Promise<Disclosure<T>>;
435
+ static fromEncodeSync<T>(s: string, hash: HasherAndAlgSync): Disclosure<T>;
436
+ static fromArray<T>(item: DisclosureData<T>, _meta?: {
437
+ digest: string;
438
+ encoded: string;
439
+ }): Disclosure<T>;
440
+ encode(): string;
441
+ decode(): DisclosureData<T>;
442
+ digest(hash: HasherAndAlg): Promise<string>;
443
+ digestSync(hash: HasherAndAlgSync): string;
444
+ }
445
+ //#endregion
446
+ //#region src/utils/error.d.ts
447
+ export declare class SDJWTException extends Error {
448
+ details?: unknown;
449
+ constructor(message: string, details?: unknown);
450
+ getFullMessage(): string;
451
+ }
452
+ /**
453
+ * Narrows an unknown caught value to an Error instance.
454
+ */
455
+ export declare function ensureError(value: unknown): Error;
456
+ //#endregion
457
+ //#region src/sdjwt.d.ts
458
+ export type SDJwtData<Header extends Record<string, unknown>, Payload extends Record<string, unknown>, KBHeader extends kbHeader = kbHeader, KBPayload extends kbPayload = kbPayload> = {
459
+ jwt?: Jwt<Header, Payload>;
460
+ disclosures?: Array<Disclosure>;
461
+ kbJwt?: KBJwt<KBHeader, KBPayload>;
462
+ };
463
+ export declare class SDJwt<Header extends Record<string, unknown> = Record<string, unknown>, Payload extends Record<string, unknown> = Record<string, unknown>, KBHeader extends kbHeader = kbHeader, KBPayload extends kbPayload = kbPayload> {
464
+ jwt?: Jwt<Header, Payload>;
465
+ disclosures?: Array<Disclosure>;
466
+ kbJwt?: KBJwt<KBHeader, KBPayload>;
467
+ constructor(data?: SDJwtData<Header, Payload, KBHeader, KBPayload>);
468
+ static decodeSDJwt<Header extends Record<string, unknown> = Record<string, unknown>, Payload extends Record<string, unknown> = Record<string, unknown>, KBHeader extends kbHeader = kbHeader, KBPayload extends kbPayload = kbPayload>(sdjwt: SDJWTCompact, hasher: Hasher): Promise<{
469
+ jwt: Jwt<Header, Payload>;
470
+ disclosures: Array<Disclosure>;
471
+ kbJwt?: KBJwt<KBHeader, KBPayload>;
472
+ }>;
473
+ static extractJwt<Header extends Record<string, unknown> = Record<string, unknown>, Payload extends Record<string, unknown> = Record<string, unknown>>(encodedSdJwt: SDJWTCompact): Promise<Jwt<Header, Payload>>;
474
+ static fromEncode<Header extends Record<string, unknown> = Record<string, unknown>, Payload extends Record<string, unknown> = Record<string, unknown>, KBHeader extends kbHeader = kbHeader, KBPayload extends kbPayload = kbPayload>(encodedSdJwt: SDJWTCompact, hasher: Hasher): Promise<SDJwt<Header, Payload>>;
475
+ present<T extends Record<string, unknown>>(presentFrame: PresentationFrame<T> | undefined, hasher: Hasher): Promise<SDJWTCompact>;
476
+ getPresentDisclosures<T extends Record<string, unknown>>(presentFrame: PresentationFrame<T> | undefined, hasher: Hasher): Promise<Disclosure<unknown>[]>;
477
+ encodeSDJwt(): SDJWTCompact;
478
+ keys(hasher: Hasher): Promise<string[]>;
479
+ presentableKeys(hasher: Hasher): Promise<string[]>;
480
+ getClaims<T>(hasher: Hasher): Promise<T>;
481
+ }
482
+ export declare const listKeys: (obj: Record<string, unknown>, prefix?: string) => string[];
483
+ export declare const pack: <T extends Record<string, unknown>>(claims: T, disclosureFrame: DisclosureFrame<T> | undefined, hash: HasherAndAlg, saltGenerator: SaltGenerator, seenSalts?: Set<string>, seenDigests?: Set<string>) => Promise<{
484
+ packedClaims: Record<string, unknown> | Array<Record<string, unknown>>;
485
+ disclosures: Array<Disclosure>;
486
+ }>;
487
+ //#endregion
488
+ //#region src/decode/decode.d.ts
489
+ /**
490
+ * Decode a JWT with `decodeJwt` from `@owf/identity-common`, rethrowing failures as an `SDJWTException`.
491
+ */
492
+ export declare const decodeJwt: <H extends Record<string, unknown>, T extends Record<string, unknown>>(jwt: string) => {
493
+ header: H;
494
+ payload: T;
495
+ signature: string;
496
+ };
497
+ export declare const splitSdJwt: (sdjwt: string) => {
498
+ jwt: string;
499
+ disclosures: string[];
500
+ kbJwt?: string;
501
+ };
502
+ export declare const decodeSdJwt: (sdjwt: string, hasher: Hasher) => Promise<DecodedSDJwt>;
503
+ export declare const decodeSdJwtSync: (sdjwt: string, hasher: HasherSync) => DecodedSDJwt;
504
+ export declare const getClaims: <T = Record<string, unknown>>(rawPayload: Record<string, unknown>, disclosures: Array<Disclosure>, hasher: Hasher) => Promise<T>;
505
+ export declare const getClaimsSync: <T = Record<string, unknown>>(rawPayload: Record<string, unknown>, disclosures: Array<Disclosure>, hasher: HasherSync) => T;
506
+ export declare const unpackObj: (obj: unknown, map: Record<string, Disclosure>) => {
507
+ unpackedObj: unknown;
508
+ disclosureKeymap: Record<string, string>;
509
+ };
510
+ export declare const createHashMapping: (disclosures: Array<Disclosure>, hash: HasherAndAlg) => Promise<Record<string, Disclosure<unknown>>>;
511
+ export declare const createHashMappingSync: (disclosures: Array<Disclosure>, hash: HasherAndAlgSync) => Record<string, Disclosure<unknown>>;
512
+ export declare const getSDAlgAndPayload: (SdJwtPayload: Record<string, unknown>, allowedAlgorithms?: ReadonlyArray<HashAlgorithm>) => {
513
+ _sd_alg: string;
514
+ payload: {
515
+ [x: string]: unknown;
516
+ };
517
+ };
518
+ export declare const unpack: (SdJwtPayload: Record<string, unknown>, disclosures: Array<Disclosure>, hasher: Hasher) => Promise<{
519
+ unpackedObj: unknown;
520
+ disclosureKeymap: Record<string, string>;
521
+ }>;
522
+ export declare const unpackSync: (SdJwtPayload: Record<string, unknown>, disclosures: Array<Disclosure>, hasher: HasherSync) => {
523
+ unpackedObj: unknown;
524
+ disclosureKeymap: Record<string, string>;
525
+ };
526
+ export type DecodedSDJwt = {
527
+ jwt: {
528
+ header: Record<string, unknown>;
529
+ payload: Record<string, unknown>;
530
+ signature: string;
531
+ };
532
+ disclosures: Array<Disclosure>;
533
+ kbJwt?: {
534
+ header: Record<string, unknown>;
535
+ payload: Record<string, unknown>;
536
+ signature: string;
537
+ };
538
+ };
539
+ //#endregion
540
+ //#region src/decoy.d.ts
541
+ export declare const createDecoy: (hash: HasherAndAlg, saltGenerator: SaltGenerator) => Promise<string>;
542
+ //#endregion
543
+ //#region src/present/present.d.ts
544
+ export declare const presentableKeys: (rawPayload: Record<string, unknown>, disclosures: Array<Disclosure>, hasher: Hasher) => Promise<string[]>;
545
+ export declare const presentableKeysSync: (rawPayload: Record<string, unknown>, disclosures: Array<Disclosure>, hasher: HasherSync) => string[];
546
+ export declare const present: <T extends Record<string, unknown>>(sdJwt: string, presentFrame: PresentationFrame<T>, hasher: Hasher) => Promise<string>;
547
+ export declare const presentSync: <T extends Record<string, unknown>>(sdJwt: string, presentFrame: PresentationFrame<T>, hasher: HasherSync) => string;
548
+ /**
549
+ * Transform the object keys into an array of strings. We are not sorting the array in any way.
550
+ * @param obj The object to transform
551
+ * @param prefix The prefix to add to the keys
552
+ * @returns
553
+ */
554
+ export declare const transformPresentationFrame: (obj: PresentationFrame<Extensible>, prefix?: string[]) => string[];
555
+ export type SerializedDisclosure = {
556
+ digest: string;
557
+ encoded: string;
558
+ salt: string;
559
+ key: string | undefined;
560
+ value: unknown;
561
+ };
562
+ export declare const createHashMappingForSerializedDisclosure: (disclosures: SerializedDisclosure[]) => Record<string, Disclosure<unknown>>;
563
+ /**
564
+ * This function selects the serialized disclosures from the payload
565
+ * and array of serialized disclosure based on the presentation frame.
566
+ * If you want to know what is serialized disclosures, check type SerializedDisclosure.
567
+ * @param payload: Record<string, unknown>
568
+ * @param disclosures: SerializedDisclosure[]
569
+ * @param presentationFrame: PresentationFrame<T>
570
+ */
571
+ export declare const selectDisclosures: <T extends Record<string, unknown>>(payload: Record<string, unknown>, disclosures: SerializedDisclosure[], presentationFrame: PresentationFrame<T>) => SerializedDisclosure[];
572
+ //#endregion
573
+ //#region src/index.d.ts
574
+ export type SdJwtPayload = Record<string, unknown>;
575
+ export declare class SDJwtInstance<ExtendedPayload extends SdJwtPayload, T = unknown> {
576
+ protected type?: string;
577
+ static readonly DEFAULT_hashAlg = "sha-256";
578
+ protected userConfig: SDJWTConfig<T>;
579
+ constructor(userConfig?: SDJWTConfig<T>);
580
+ private createKBJwt;
581
+ private SignJwt;
582
+ private VerifyJwt;
583
+ issue<Payload extends ExtendedPayload>(payload: Payload, disclosureFrame?: DisclosureFrame<Payload>, options?: {
584
+ header?: object;
585
+ }): Promise<SDJWTCompact>;
586
+ /**
587
+ * Validates if the payload contains any reserved claim names. If so it will throw an error.
588
+ * @param payload
589
+ * @returns
590
+ */
591
+ protected validateReservedFields<T extends ExtendedPayload>(payload: T): void;
592
+ protected validateDisclosureFrame<T extends ExtendedPayload>(_disclosureFrame?: DisclosureFrame<T>): void;
593
+ present<T extends Record<string, unknown>>(encodedSDJwt: string, presentationFrame?: PresentationFrame<T>, options?: {
594
+ kb?: KBOptions;
595
+ }): Promise<SDJWTCompact>;
596
+ verify(encodedSDJwt: string, options?: T & VerifierOptions): Promise<{
597
+ payload: ExtendedPayload;
598
+ header: Record<string, unknown> | undefined;
599
+ kb?: undefined;
600
+ } | {
601
+ payload: ExtendedPayload;
602
+ header: Record<string, unknown> | undefined;
603
+ kb: {
604
+ payload: kbPayload;
605
+ header: kbHeader;
606
+ };
607
+ }>;
608
+ /**
609
+ * Safe verification that collects all errors instead of failing fast.
610
+ * Returns a result object with either the verified data or an array of all errors.
611
+ *
612
+ * @param encodedSDJwt - The encoded SD-JWT to verify
613
+ * @param options - Verification options
614
+ * @returns A SafeVerifyResult containing either success data or collected errors
615
+ */
616
+ safeVerify(encodedSDJwt: string, options?: T & VerifierOptions): Promise<SafeVerifyResult<{
617
+ payload: ExtendedPayload;
618
+ header: Record<string, unknown> | undefined;
619
+ kb?: {
620
+ payload: Record<string, unknown>;
621
+ header: Record<string, unknown>;
622
+ };
623
+ }>>;
624
+ private calculateSDHash;
625
+ /**
626
+ * This function is for validating the SD JWT
627
+ * Checking signature, if provided the iat and exp when provided and return its the claims
628
+ * @param encodedSDJwt
629
+ * @param options
630
+ * @returns
631
+ */
632
+ validate(encodedSDJwt: string, options?: T & VerifierOptions): Promise<{
633
+ payload: ExtendedPayload;
634
+ header: Record<string, unknown> | undefined;
635
+ }>;
636
+ config(newConfig: SDJWTConfig): void;
637
+ encode(sdJwt: SDJwt): SDJWTCompact;
638
+ decode(endcodedSDJwt: SDJWTCompact): Promise<SDJwt<Record<string, unknown>, Record<string, unknown>, kbHeader, kbPayload>>;
639
+ keys(endcodedSDJwt: SDJWTCompact): Promise<string[]>;
640
+ presentableKeys(endcodedSDJwt: SDJWTCompact): Promise<string[]>;
641
+ getClaims(endcodedSDJwt: SDJWTCompact): Promise<unknown>;
642
+ toFlattenJSON(endcodedSDJwt: SDJWTCompact): FlattenJSON;
643
+ toGeneralJSON(endcodedSDJwt: SDJWTCompact): GeneralJSON;
644
+ }
645
+ export declare class SDJwtGeneralJSONInstance<ExtendedPayload extends SdJwtPayload> {
646
+ protected type?: string;
647
+ static readonly DEFAULT_hashAlg = "sha-256";
648
+ protected userConfig: SDJWTConfig;
649
+ constructor(userConfig?: SDJWTConfig);
650
+ private createKBJwt;
651
+ private encodeObj;
652
+ issue<Payload extends ExtendedPayload>(payload: Payload, disclosureFrame: DisclosureFrame<Payload> | undefined, options: {
653
+ sigs: Array<{
654
+ signer: Signer;
655
+ alg: string;
656
+ kid: string;
657
+ header?: Record<string, unknown>;
658
+ }>;
659
+ }): Promise<GeneralJSON>;
660
+ /**
661
+ * Validates if the payload contains any reserved claim names. If so it will throw an error.
662
+ * @param payload
663
+ * @returns
664
+ */
665
+ protected validateReservedFields<T extends ExtendedPayload>(payload: T): void;
666
+ protected validateDisclosureFrame<T extends ExtendedPayload>(_disclosureFrame?: DisclosureFrame<T>): void;
667
+ present<T extends Record<string, unknown>>(generalJSON: GeneralJSON, presentationFrame?: PresentationFrame<T>, options?: {
668
+ kb?: KBOptions;
669
+ }): Promise<GeneralJSON>;
670
+ verify(generalJSON: GeneralJSON, options?: VerifierOptions): Promise<{
671
+ payload: ExtendedPayload;
672
+ headers: Record<string, unknown>[];
673
+ kb?: undefined;
674
+ } | {
675
+ payload: ExtendedPayload;
676
+ headers: Record<string, unknown>[];
677
+ kb: {
678
+ payload: kbPayload;
679
+ header: kbHeader;
680
+ };
681
+ }>;
682
+ private calculateSDHash;
683
+ validate(generalJSON: GeneralJSON, options?: VerifierOptions): Promise<{
684
+ payload: ExtendedPayload;
685
+ headers: Record<string, unknown>[];
686
+ }>;
687
+ config(newConfig: SDJWTConfig): void;
688
+ encode(sdJwt: GeneralJSON, index: number): SDJWTCompact;
689
+ decode(endcodedSDJwt: SDJWTCompact): GeneralJSON;
690
+ keys(generalSdjwt: GeneralJSON): Promise<string[]>;
691
+ presentableKeys(generalSdjwt: GeneralJSON): Promise<string[]>;
692
+ getClaims(generalSdjwt: GeneralJSON): Promise<unknown>;
693
+ }
694
+ //#endregion
695
+ export { base64UrlToUint8Array, base64urlDecode, base64urlEncode, uint8ArrayToBase64Url };
696
+ //# sourceMappingURL=index.d.cts.map