@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
package/dist/index.d.cts
ADDED
|
@@ -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
|