@sd-jwt/core 0.1.0 → 0.1.1-next.0

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 (170) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +201 -0
  3. package/README.md +106 -0
  4. package/dist/index.d.mts +659 -0
  5. package/dist/index.d.ts +659 -0
  6. package/dist/index.js +1906 -0
  7. package/dist/index.mjs +1846 -0
  8. package/package.json +59 -47
  9. package/src/decode/decode.ts +376 -0
  10. package/src/decode/index.ts +1 -0
  11. package/src/decoy.ts +15 -0
  12. package/src/flattenJSON.ts +99 -0
  13. package/src/generalJSON.ts +148 -0
  14. package/src/index.ts +945 -0
  15. package/src/jwt.ts +190 -0
  16. package/src/kbjwt.ts +81 -0
  17. package/src/present/index.ts +1 -0
  18. package/src/present/present.ts +210 -0
  19. package/src/sdjwt.ts +354 -0
  20. package/src/test/decode/decode.spec.ts +202 -0
  21. package/src/test/decoy.spec.ts +30 -0
  22. package/src/test/flattenJSON.spec.ts +122 -0
  23. package/src/test/generalJSON.spec.ts +198 -0
  24. package/src/test/index.spec.ts +974 -0
  25. package/src/test/jwt.spec.ts +301 -0
  26. package/src/test/kbjwt.spec.ts +565 -0
  27. package/src/test/pass.spec.ts +7 -0
  28. package/src/test/present/present.spec.ts +305 -0
  29. package/src/test/sdjwt.spec.ts +384 -0
  30. package/src/test/types/type.spec.ts +88 -0
  31. package/src/test/utils/base64url.spec.ts +33 -0
  32. package/src/test/utils/disclosure.spec.ts +170 -0
  33. package/src/test/utils/error.spec.ts +15 -0
  34. package/src/types/index.ts +2 -0
  35. package/src/types/type.ts +249 -0
  36. package/src/types/verification-error.ts +55 -0
  37. package/src/utils/base64url.ts +6 -0
  38. package/src/utils/disclosure.ts +101 -0
  39. package/src/utils/error.ts +25 -0
  40. package/src/utils/index.ts +3 -0
  41. package/src/utils/strict-json.ts +17 -0
  42. package/test/app-e2e.spec.ts +292 -0
  43. package/test/array_data_types.json +31 -0
  44. package/test/array_full_sd.json +21 -0
  45. package/test/array_in_sd.json +13 -0
  46. package/test/array_nested_in_plain.json +29 -0
  47. package/test/array_none_disclosed.json +17 -0
  48. package/test/array_of_nulls.json +15 -0
  49. package/test/array_of_objects.json +65 -0
  50. package/test/array_of_scalars.json +19 -0
  51. package/test/array_recursive_sd.json +35 -0
  52. package/test/array_recursive_sd_some_disclosed.json +63 -0
  53. package/test/complex.json +43 -0
  54. package/test/header_mod.json +48 -0
  55. package/test/json_serialization.json +48 -0
  56. package/test/key_binding.json +48 -0
  57. package/test/no_sd.json +36 -0
  58. package/test/object_data_types.json +62 -0
  59. package/test/recursions.json +117 -0
  60. package/test/rfc9901-validation.spec.ts +150 -0
  61. package/tsconfig.json +7 -0
  62. package/vitest.config.mts +4 -0
  63. package/build/base64url.d.ts +0 -28
  64. package/build/base64url.js +0 -40
  65. package/build/base64url.js.map +0 -1
  66. package/build/hasherAlgorithm.d.ts +0 -70
  67. package/build/hasherAlgorithm.js +0 -75
  68. package/build/hasherAlgorithm.js.map +0 -1
  69. package/build/index.d.ts +0 -11
  70. package/build/index.js +0 -20
  71. package/build/index.js.map +0 -1
  72. package/build/jwt/compact.d.ts +0 -6
  73. package/build/jwt/compact.js +0 -27
  74. package/build/jwt/compact.js.map +0 -1
  75. package/build/jwt/error.d.ts +0 -2
  76. package/build/jwt/error.js +0 -7
  77. package/build/jwt/error.js.map +0 -1
  78. package/build/jwt/index.d.ts +0 -3
  79. package/build/jwt/index.js +0 -20
  80. package/build/jwt/index.js.map +0 -1
  81. package/build/jwt/jwt.d.ts +0 -204
  82. package/build/jwt/jwt.js +0 -324
  83. package/build/jwt/jwt.js.map +0 -1
  84. package/build/keyBinding/index.d.ts +0 -1
  85. package/build/keyBinding/index.js +0 -18
  86. package/build/keyBinding/index.js.map +0 -1
  87. package/build/keyBinding/keyBinding.d.ts +0 -56
  88. package/build/keyBinding/keyBinding.js +0 -99
  89. package/build/keyBinding/keyBinding.js.map +0 -1
  90. package/build/sdJwt/compact.d.ts +0 -8
  91. package/build/sdJwt/compact.js +0 -39
  92. package/build/sdJwt/compact.js.map +0 -1
  93. package/build/sdJwt/decoys.d.ts +0 -2
  94. package/build/sdJwt/decoys.js +0 -35
  95. package/build/sdJwt/decoys.js.map +0 -1
  96. package/build/sdJwt/disclosureFrame.d.ts +0 -7
  97. package/build/sdJwt/disclosureFrame.js +0 -89
  98. package/build/sdJwt/disclosureFrame.js.map +0 -1
  99. package/build/sdJwt/disclosureMapping.d.ts +0 -44
  100. package/build/sdJwt/disclosureMapping.js +0 -289
  101. package/build/sdJwt/disclosureMapping.js.map +0 -1
  102. package/build/sdJwt/disclosures.d.ts +0 -14
  103. package/build/sdJwt/disclosures.js +0 -59
  104. package/build/sdJwt/disclosures.js.map +0 -1
  105. package/build/sdJwt/error.d.ts +0 -2
  106. package/build/sdJwt/error.js +0 -7
  107. package/build/sdJwt/error.js.map +0 -1
  108. package/build/sdJwt/index.d.ts +0 -7
  109. package/build/sdJwt/index.js +0 -24
  110. package/build/sdJwt/index.js.map +0 -1
  111. package/build/sdJwt/presentationFrame.d.ts +0 -4
  112. package/build/sdJwt/presentationFrame.js +0 -73
  113. package/build/sdJwt/presentationFrame.js.map +0 -1
  114. package/build/sdJwt/sdJwt.d.ts +0 -204
  115. package/build/sdJwt/sdJwt.js +0 -383
  116. package/build/sdJwt/sdJwt.js.map +0 -1
  117. package/build/sdJwt/swapClaim.d.ts +0 -3
  118. package/build/sdJwt/swapClaim.js +0 -90
  119. package/build/sdJwt/swapClaim.js.map +0 -1
  120. package/build/sdJwt/types.d.ts +0 -5
  121. package/build/sdJwt/types.js +0 -3
  122. package/build/sdJwt/types.js.map +0 -1
  123. package/build/sdJwtVc/error.d.ts +0 -2
  124. package/build/sdJwtVc/error.js +0 -7
  125. package/build/sdJwtVc/error.js.map +0 -1
  126. package/build/sdJwtVc/index.d.ts +0 -2
  127. package/build/sdJwtVc/index.js +0 -19
  128. package/build/sdJwtVc/index.js.map +0 -1
  129. package/build/sdJwtVc/sdJwtVc.d.ts +0 -47
  130. package/build/sdJwtVc/sdJwtVc.js +0 -125
  131. package/build/sdJwtVc/sdJwtVc.js.map +0 -1
  132. package/build/signatureAndEncryptionAlgorithm.d.ts +0 -105
  133. package/build/signatureAndEncryptionAlgorithm.js +0 -110
  134. package/build/signatureAndEncryptionAlgorithm.js.map +0 -1
  135. package/build/types/disclosure.d.ts +0 -5
  136. package/build/types/disclosure.js +0 -3
  137. package/build/types/disclosure.js.map +0 -1
  138. package/build/types/frame.d.ts +0 -5
  139. package/build/types/frame.js +0 -3
  140. package/build/types/frame.js.map +0 -1
  141. package/build/types/hasher.d.ts +0 -14
  142. package/build/types/hasher.js +0 -3
  143. package/build/types/hasher.js.map +0 -1
  144. package/build/types/index.d.ts +0 -6
  145. package/build/types/index.js +0 -23
  146. package/build/types/index.js.map +0 -1
  147. package/build/types/present.d.ts +0 -2
  148. package/build/types/present.js +0 -3
  149. package/build/types/present.js.map +0 -1
  150. package/build/types/saltGenerator.d.ts +0 -17
  151. package/build/types/saltGenerator.js +0 -3
  152. package/build/types/saltGenerator.js.map +0 -1
  153. package/build/types/signer.d.ts +0 -2
  154. package/build/types/signer.js +0 -3
  155. package/build/types/signer.js.map +0 -1
  156. package/build/types/utils.d.ts +0 -5
  157. package/build/types/utils.js +0 -3
  158. package/build/types/utils.js.map +0 -1
  159. package/build/types/verifier.d.ts +0 -14
  160. package/build/types/verifier.js +0 -3
  161. package/build/types/verifier.js.map +0 -1
  162. package/build/utils/index.d.ts +0 -2
  163. package/build/utils/index.js +0 -19
  164. package/build/utils/index.js.map +0 -1
  165. package/build/utils/traverse.d.ts +0 -8
  166. package/build/utils/traverse.js +0 -29
  167. package/build/utils/traverse.js.map +0 -1
  168. package/build/utils/utils.d.ts +0 -7
  169. package/build/utils/utils.js +0 -109
  170. package/build/utils/utils.js.map +0 -1
@@ -0,0 +1,148 @@
1
+ import { splitSdJwt } from './decode';
2
+ import { SD_SEPARATOR, type Signer } from './types';
3
+ import { base64urlEncode, SDJWTException } from './utils';
4
+
5
+ export type GeneralJSONData = {
6
+ payload: string;
7
+ disclosures: Array<string>;
8
+ kb_jwt?: string;
9
+ signatures: Array<{
10
+ protected: string;
11
+ signature: string;
12
+ kid?: string;
13
+ }>;
14
+ };
15
+
16
+ export type GeneralJSONSerialized = {
17
+ payload: string;
18
+ signatures: Array<{
19
+ header: {
20
+ disclosures?: Array<string>;
21
+ kid?: string;
22
+ kb_jwt?: string;
23
+ };
24
+ protected: string;
25
+ signature: string;
26
+ }>;
27
+ };
28
+
29
+ export class GeneralJSON {
30
+ public payload: string;
31
+ public disclosures: Array<string>;
32
+ public kb_jwt?: string;
33
+ public signatures: Array<{
34
+ protected: string;
35
+ signature: string;
36
+ kid?: string;
37
+ }>;
38
+
39
+ constructor(data: GeneralJSONData) {
40
+ this.payload = data.payload;
41
+ this.disclosures = data.disclosures;
42
+ this.kb_jwt = data.kb_jwt;
43
+ this.signatures = data.signatures;
44
+ }
45
+
46
+ public static fromEncode(encodedSdJwt: string) {
47
+ const { jwt, disclosures, kbJwt } = splitSdJwt(encodedSdJwt);
48
+
49
+ const { 0: protectedHeader, 1: payload, 2: signature } = jwt.split('.');
50
+ if (!protectedHeader || !payload || !signature) {
51
+ throw new SDJWTException('Invalid JWT');
52
+ }
53
+
54
+ return new GeneralJSON({
55
+ payload,
56
+ disclosures,
57
+ kb_jwt: kbJwt,
58
+ signatures: [
59
+ {
60
+ protected: protectedHeader,
61
+ signature,
62
+ },
63
+ ],
64
+ });
65
+ }
66
+
67
+ public static fromSerialized(json: GeneralJSONSerialized) {
68
+ if (!json.signatures[0]) {
69
+ throw new SDJWTException('Invalid JSON');
70
+ }
71
+ const disclosures = json.signatures[0].header?.disclosures ?? [];
72
+ const kb_jwt = json.signatures[0].header?.kb_jwt;
73
+ return new GeneralJSON({
74
+ payload: json.payload,
75
+ disclosures,
76
+ kb_jwt,
77
+ signatures: json.signatures.map((s) => {
78
+ return {
79
+ protected: s.protected,
80
+ signature: s.signature,
81
+ kid: s.header?.kid,
82
+ };
83
+ }),
84
+ });
85
+ }
86
+
87
+ public toJson() {
88
+ return {
89
+ payload: this.payload,
90
+ signatures: this.signatures.map((s, i) => {
91
+ if (i !== 0) {
92
+ // If present, disclosures and kb_jwt, MUST be included in the first unprotected header and
93
+ // MUST NOT be present in any following unprotected headers.
94
+ return {
95
+ header: {
96
+ kid: s.kid,
97
+ },
98
+ protected: s.protected,
99
+ signature: s.signature,
100
+ };
101
+ }
102
+ return {
103
+ header: {
104
+ disclosures: this.disclosures,
105
+ kid: s.kid,
106
+ kb_jwt: this.kb_jwt,
107
+ },
108
+ protected: s.protected,
109
+ signature: s.signature,
110
+ };
111
+ }),
112
+ };
113
+ }
114
+
115
+ public toEncoded(index: number) {
116
+ if (index < 0 || index >= this.signatures.length) {
117
+ throw new SDJWTException('Index out of bounds');
118
+ }
119
+ const data: string[] = [];
120
+
121
+ const { protected: protectedHeader, signature } = this.signatures[index];
122
+ const jwt = `${protectedHeader}.${this.payload}.${signature}`;
123
+ data.push(jwt);
124
+
125
+ if (this.disclosures && this.disclosures.length > 0) {
126
+ const disclosures = this.disclosures.join(SD_SEPARATOR);
127
+ data.push(disclosures);
128
+ }
129
+
130
+ const kb = this.kb_jwt ?? '';
131
+ data.push(kb);
132
+ return data.join(SD_SEPARATOR);
133
+ }
134
+
135
+ public async addSignature(
136
+ protectedHeader: Record<string, unknown>,
137
+ signer: Signer,
138
+ kid?: string,
139
+ ) {
140
+ const header = base64urlEncode(JSON.stringify(protectedHeader));
141
+ const signature = await signer(`${header}.${this.payload}`);
142
+ this.signatures.push({
143
+ protected: header,
144
+ signature,
145
+ kid,
146
+ });
147
+ }
148
+ }