@kya-os/mcp 1.10.1 → 1.12.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 (297) hide show
  1. package/AUDITABILITY.md +441 -0
  2. package/CHANGELOG.md +108 -0
  3. package/CONFORMANCE.md +600 -0
  4. package/README.md +69 -6
  5. package/SPEC.md +1820 -0
  6. package/dist/audit/adapters/legacy-audit-log.d.ts +20 -0
  7. package/dist/audit/adapters/legacy-audit-log.d.ts.map +1 -0
  8. package/dist/audit/adapters/legacy-audit-log.js +56 -0
  9. package/dist/audit/adapters/legacy-audit-log.js.map +1 -0
  10. package/dist/audit/adapters/mcp.d.ts +105 -0
  11. package/dist/audit/adapters/mcp.d.ts.map +1 -0
  12. package/dist/audit/adapters/mcp.js +213 -0
  13. package/dist/audit/adapters/mcp.js.map +1 -0
  14. package/dist/audit/assurance.d.ts +22 -0
  15. package/dist/audit/assurance.d.ts.map +1 -0
  16. package/dist/audit/assurance.js +39 -0
  17. package/dist/audit/assurance.js.map +1 -0
  18. package/dist/audit/checkpoint-coordinator.d.ts +51 -0
  19. package/dist/audit/checkpoint-coordinator.d.ts.map +1 -0
  20. package/dist/audit/checkpoint-coordinator.js +112 -0
  21. package/dist/audit/checkpoint-coordinator.js.map +1 -0
  22. package/dist/audit/checkpoint.d.ts +59 -0
  23. package/dist/audit/checkpoint.d.ts.map +1 -0
  24. package/dist/audit/checkpoint.js +219 -0
  25. package/dist/audit/checkpoint.js.map +1 -0
  26. package/dist/audit/cli.d.ts +8 -0
  27. package/dist/audit/cli.d.ts.map +1 -0
  28. package/dist/audit/cli.js +85 -0
  29. package/dist/audit/cli.js.map +1 -0
  30. package/dist/audit/crypto.d.ts +37 -0
  31. package/dist/audit/crypto.d.ts.map +1 -0
  32. package/dist/audit/crypto.js +68 -0
  33. package/dist/audit/crypto.js.map +1 -0
  34. package/dist/audit/errors.d.ts +29 -0
  35. package/dist/audit/errors.d.ts.map +1 -0
  36. package/dist/audit/errors.js +33 -0
  37. package/dist/audit/errors.js.map +1 -0
  38. package/dist/audit/evidence.d.ts +45 -0
  39. package/dist/audit/evidence.d.ts.map +1 -0
  40. package/dist/audit/evidence.js +151 -0
  41. package/dist/audit/evidence.js.map +1 -0
  42. package/dist/audit/index.d.ts +30 -0
  43. package/dist/audit/index.d.ts.map +1 -0
  44. package/dist/audit/index.js +30 -0
  45. package/dist/audit/index.js.map +1 -0
  46. package/dist/audit/integrity.d.ts +19 -0
  47. package/dist/audit/integrity.d.ts.map +1 -0
  48. package/dist/audit/integrity.js +64 -0
  49. package/dist/audit/integrity.js.map +1 -0
  50. package/dist/audit/merkle.d.ts +31 -0
  51. package/dist/audit/merkle.d.ts.map +1 -0
  52. package/dist/audit/merkle.js +195 -0
  53. package/dist/audit/merkle.js.map +1 -0
  54. package/dist/audit/mirror-service.d.ts +19 -0
  55. package/dist/audit/mirror-service.d.ts.map +1 -0
  56. package/dist/audit/mirror-service.js +54 -0
  57. package/dist/audit/mirror-service.js.map +1 -0
  58. package/dist/audit/projection.d.ts +90 -0
  59. package/dist/audit/projection.d.ts.map +1 -0
  60. package/dist/audit/projection.js +142 -0
  61. package/dist/audit/projection.js.map +1 -0
  62. package/dist/audit/providers/anchor.d.ts +23 -0
  63. package/dist/audit/providers/anchor.d.ts.map +1 -0
  64. package/dist/audit/providers/anchor.js +25 -0
  65. package/dist/audit/providers/anchor.js.map +1 -0
  66. package/dist/audit/providers/evidence.d.ts +36 -0
  67. package/dist/audit/providers/evidence.d.ts.map +1 -0
  68. package/dist/audit/providers/evidence.js +2 -0
  69. package/dist/audit/providers/evidence.js.map +1 -0
  70. package/dist/audit/providers/journal.d.ts +35 -0
  71. package/dist/audit/providers/journal.d.ts.map +1 -0
  72. package/dist/audit/providers/journal.js +2 -0
  73. package/dist/audit/providers/journal.js.map +1 -0
  74. package/dist/audit/providers/memory-journal.d.ts +24 -0
  75. package/dist/audit/providers/memory-journal.d.ts.map +1 -0
  76. package/dist/audit/providers/memory-journal.js +73 -0
  77. package/dist/audit/providers/memory-journal.js.map +1 -0
  78. package/dist/audit/providers/observer.d.ts +30 -0
  79. package/dist/audit/providers/observer.d.ts.map +1 -0
  80. package/dist/audit/providers/observer.js +100 -0
  81. package/dist/audit/providers/observer.js.map +1 -0
  82. package/dist/audit/providers/outbox.d.ts +37 -0
  83. package/dist/audit/providers/outbox.d.ts.map +1 -0
  84. package/dist/audit/providers/outbox.js +52 -0
  85. package/dist/audit/providers/outbox.js.map +1 -0
  86. package/dist/audit/providers/recorder-client.d.ts +22 -0
  87. package/dist/audit/providers/recorder-client.d.ts.map +1 -0
  88. package/dist/audit/providers/recorder-client.js +17 -0
  89. package/dist/audit/providers/recorder-client.js.map +1 -0
  90. package/dist/audit/providers/source-state.d.ts +37 -0
  91. package/dist/audit/providers/source-state.d.ts.map +1 -0
  92. package/dist/audit/providers/source-state.js +94 -0
  93. package/dist/audit/providers/source-state.js.map +1 -0
  94. package/dist/audit/read-contract.d.ts +445 -0
  95. package/dist/audit/read-contract.d.ts.map +1 -0
  96. package/dist/audit/read-contract.js +126 -0
  97. package/dist/audit/read-contract.js.map +1 -0
  98. package/dist/audit/read-service.d.ts +99 -0
  99. package/dist/audit/read-service.d.ts.map +1 -0
  100. package/dist/audit/read-service.js +124 -0
  101. package/dist/audit/read-service.js.map +1 -0
  102. package/dist/audit/recorder-service.d.ts +78 -0
  103. package/dist/audit/recorder-service.d.ts.map +1 -0
  104. package/dist/audit/recorder-service.js +331 -0
  105. package/dist/audit/recorder-service.js.map +1 -0
  106. package/dist/audit/reference-recorder.d.ts +43 -0
  107. package/dist/audit/reference-recorder.d.ts.map +1 -0
  108. package/dist/audit/reference-recorder.js +131 -0
  109. package/dist/audit/reference-recorder.js.map +1 -0
  110. package/dist/audit/replay-bundle.d.ts +52 -0
  111. package/dist/audit/replay-bundle.d.ts.map +1 -0
  112. package/dist/audit/replay-bundle.js +551 -0
  113. package/dist/audit/replay-bundle.js.map +1 -0
  114. package/dist/audit/schemas.d.ts +1145 -0
  115. package/dist/audit/schemas.d.ts.map +1 -0
  116. package/dist/audit/schemas.js +483 -0
  117. package/dist/audit/schemas.js.map +1 -0
  118. package/dist/audit/service.d.ts +91 -0
  119. package/dist/audit/service.d.ts.map +1 -0
  120. package/dist/audit/service.js +222 -0
  121. package/dist/audit/service.js.map +1 -0
  122. package/dist/audit/testing/index.d.ts +2 -0
  123. package/dist/audit/testing/index.d.ts.map +1 -0
  124. package/dist/audit/testing/index.js +2 -0
  125. package/dist/audit/testing/index.js.map +1 -0
  126. package/dist/audit/testing/provider-contracts.d.ts +51 -0
  127. package/dist/audit/testing/provider-contracts.d.ts.map +1 -0
  128. package/dist/audit/testing/provider-contracts.js +391 -0
  129. package/dist/audit/testing/provider-contracts.js.map +1 -0
  130. package/dist/audit/types.d.ts +356 -0
  131. package/dist/audit/types.d.ts.map +1 -0
  132. package/dist/audit/types.js +49 -0
  133. package/dist/audit/types.js.map +1 -0
  134. package/dist/audit/verifier.d.ts +73 -0
  135. package/dist/audit/verifier.d.ts.map +1 -0
  136. package/dist/audit/verifier.js +322 -0
  137. package/dist/audit/verifier.js.map +1 -0
  138. package/dist/card/builder.d.ts +1 -1
  139. package/dist/card/builder.js +1 -1
  140. package/dist/card/emit.d.ts +3 -3
  141. package/dist/card/emit.d.ts.map +1 -1
  142. package/dist/card/emit.js.map +1 -1
  143. package/dist/card/index.d.ts +1 -1
  144. package/dist/card/index.js +1 -1
  145. package/dist/card/middleware.d.ts +6 -4
  146. package/dist/card/middleware.d.ts.map +1 -1
  147. package/dist/card/middleware.js +11 -7
  148. package/dist/card/middleware.js.map +1 -1
  149. package/dist/card/proof/build.d.ts +3 -3
  150. package/dist/card/proof/build.js +3 -3
  151. package/dist/card/proof/canonical.d.ts.map +1 -1
  152. package/dist/card/proof/canonical.js +19 -1
  153. package/dist/card/proof/canonical.js.map +1 -1
  154. package/dist/card/proof/http-sig.d.ts +1 -1
  155. package/dist/card/proof/http-sig.js +1 -1
  156. package/dist/card/proof/index.d.ts +2 -2
  157. package/dist/card/proof/index.js +2 -2
  158. package/dist/card/proof/nonce-cache.d.ts +1 -1
  159. package/dist/card/proof/nonce-cache.js +1 -1
  160. package/dist/card/proof/types.d.ts +16 -7
  161. package/dist/card/proof/types.d.ts.map +1 -1
  162. package/dist/card/proof/types.js +16 -7
  163. package/dist/card/proof/types.js.map +1 -1
  164. package/dist/card/proof/verify.d.ts +2 -2
  165. package/dist/card/proof/verify.js +2 -2
  166. package/dist/card/schema.d.ts +14 -6
  167. package/dist/card/schema.d.ts.map +1 -1
  168. package/dist/card/schema.js +14 -3
  169. package/dist/card/schema.js.map +1 -1
  170. package/dist/card/verify.d.ts +1 -1
  171. package/dist/card/verify.d.ts.map +1 -1
  172. package/dist/delegation/delegation-graph.d.ts +4 -0
  173. package/dist/delegation/delegation-graph.d.ts.map +1 -1
  174. package/dist/delegation/delegation-graph.js +28 -2
  175. package/dist/delegation/delegation-graph.js.map +1 -1
  176. package/dist/delegation/statuslist-manager.d.ts +5 -0
  177. package/dist/delegation/statuslist-manager.d.ts.map +1 -1
  178. package/dist/delegation/statuslist-manager.js.map +1 -1
  179. package/dist/delegation/storage/memory-graph-storage.d.ts +4 -2
  180. package/dist/delegation/storage/memory-graph-storage.d.ts.map +1 -1
  181. package/dist/delegation/storage/memory-graph-storage.js +18 -0
  182. package/dist/delegation/storage/memory-graph-storage.js.map +1 -1
  183. package/dist/delegation/storage/memory-statuslist-storage.d.ts +5 -2
  184. package/dist/delegation/storage/memory-statuslist-storage.d.ts.map +1 -1
  185. package/dist/delegation/storage/memory-statuslist-storage.js +21 -2
  186. package/dist/delegation/storage/memory-statuslist-storage.js.map +1 -1
  187. package/dist/delegation/utils.d.ts.map +1 -1
  188. package/dist/delegation/utils.js +2 -42
  189. package/dist/delegation/utils.js.map +1 -1
  190. package/dist/delegation/vc-verification-checks.d.ts.map +1 -1
  191. package/dist/delegation/vc-verification-checks.js +16 -1
  192. package/dist/delegation/vc-verification-checks.js.map +1 -1
  193. package/dist/delegation/vc-verifier.d.ts +4 -0
  194. package/dist/delegation/vc-verifier.d.ts.map +1 -1
  195. package/dist/delegation/vc-verifier.js +44 -13
  196. package/dist/delegation/vc-verifier.js.map +1 -1
  197. package/dist/errors.d.ts +1 -1
  198. package/dist/errors.js +1 -1
  199. package/dist/extension/declaration.d.ts +60 -0
  200. package/dist/extension/declaration.d.ts.map +1 -0
  201. package/dist/extension/declaration.js +75 -0
  202. package/dist/extension/declaration.js.map +1 -0
  203. package/dist/extension/gate.d.ts +110 -0
  204. package/dist/extension/gate.d.ts.map +1 -0
  205. package/dist/extension/gate.js +133 -0
  206. package/dist/extension/gate.js.map +1 -0
  207. package/dist/extension/index.d.ts +14 -0
  208. package/dist/extension/index.d.ts.map +1 -0
  209. package/dist/extension/index.js +14 -0
  210. package/dist/extension/index.js.map +1 -0
  211. package/dist/extension/settings.d.ts +70 -0
  212. package/dist/extension/settings.d.ts.map +1 -0
  213. package/dist/extension/settings.js +96 -0
  214. package/dist/extension/settings.js.map +1 -0
  215. package/dist/index.d.ts +4 -2
  216. package/dist/index.d.ts.map +1 -1
  217. package/dist/index.js +6 -2
  218. package/dist/index.js.map +1 -1
  219. package/dist/middleware/kya-os-transport.d.ts +1 -1
  220. package/dist/middleware/kya-os-transport.d.ts.map +1 -1
  221. package/dist/middleware/kya-os-transport.js +11 -4
  222. package/dist/middleware/kya-os-transport.js.map +1 -1
  223. package/dist/middleware/with-kya-os-server.d.ts +6 -0
  224. package/dist/middleware/with-kya-os-server.d.ts.map +1 -1
  225. package/dist/middleware/with-kya-os-server.js +2 -0
  226. package/dist/middleware/with-kya-os-server.js.map +1 -1
  227. package/dist/middleware/with-kya-os.config-types.d.ts +15 -0
  228. package/dist/middleware/with-kya-os.config-types.d.ts.map +1 -1
  229. package/dist/middleware/with-kya-os.config-types.js.map +1 -1
  230. package/dist/middleware/with-kya-os.d.ts.map +1 -1
  231. package/dist/middleware/with-kya-os.delegation-gate.d.ts.map +1 -1
  232. package/dist/middleware/with-kya-os.delegation-gate.js +96 -3
  233. package/dist/middleware/with-kya-os.delegation-gate.js.map +1 -1
  234. package/dist/middleware/with-kya-os.delegation-verify.d.ts.map +1 -1
  235. package/dist/middleware/with-kya-os.delegation-verify.js +2 -2
  236. package/dist/middleware/with-kya-os.delegation-verify.js.map +1 -1
  237. package/dist/middleware/with-kya-os.deps.d.ts +2 -0
  238. package/dist/middleware/with-kya-os.deps.d.ts.map +1 -1
  239. package/dist/middleware/with-kya-os.js +23 -0
  240. package/dist/middleware/with-kya-os.js.map +1 -1
  241. package/dist/middleware/with-kya-os.policy-gate.d.ts.map +1 -1
  242. package/dist/middleware/with-kya-os.policy-gate.js +29 -4
  243. package/dist/middleware/with-kya-os.policy-gate.js.map +1 -1
  244. package/dist/middleware/with-kya-os.protocol.d.ts.map +1 -1
  245. package/dist/middleware/with-kya-os.protocol.js +10 -0
  246. package/dist/middleware/with-kya-os.protocol.js.map +1 -1
  247. package/dist/middleware/with-kya-os.session.d.ts.map +1 -1
  248. package/dist/middleware/with-kya-os.session.js +208 -2
  249. package/dist/middleware/with-kya-os.session.js.map +1 -1
  250. package/dist/middleware/with-kya-os.types.d.ts +6 -0
  251. package/dist/middleware/with-kya-os.types.d.ts.map +1 -1
  252. package/dist/middleware/with-kya-os.types.js.map +1 -1
  253. package/dist/proof/generator.d.ts +14 -2
  254. package/dist/proof/generator.d.ts.map +1 -1
  255. package/dist/proof/generator.js +20 -7
  256. package/dist/proof/generator.js.map +1 -1
  257. package/dist/proof/index.d.ts +1 -1
  258. package/dist/proof/index.d.ts.map +1 -1
  259. package/dist/proof/index.js +1 -1
  260. package/dist/proof/index.js.map +1 -1
  261. package/dist/proof/verifier.d.ts +15 -2
  262. package/dist/proof/verifier.d.ts.map +1 -1
  263. package/dist/proof/verifier.js +48 -12
  264. package/dist/proof/verifier.js.map +1 -1
  265. package/dist/session/manager.js +1 -1
  266. package/dist/session/manager.js.map +1 -1
  267. package/dist/types/protocol.d.ts +22 -0
  268. package/dist/types/protocol.d.ts.map +1 -1
  269. package/dist/types/protocol.js +31 -5
  270. package/dist/types/protocol.js.map +1 -1
  271. package/dist/utils/canonical-json.d.ts +15 -0
  272. package/dist/utils/canonical-json.d.ts.map +1 -0
  273. package/dist/utils/canonical-json.js +109 -0
  274. package/dist/utils/canonical-json.js.map +1 -0
  275. package/dist/utils/crypto-service.d.ts.map +1 -1
  276. package/dist/utils/crypto-service.js +5 -0
  277. package/dist/utils/crypto-service.js.map +1 -1
  278. package/dist/utils/index.d.ts +1 -0
  279. package/dist/utils/index.d.ts.map +1 -1
  280. package/dist/utils/index.js +1 -0
  281. package/dist/utils/index.js.map +1 -1
  282. package/package.json +29 -11
  283. package/schemas/README.md +28 -1
  284. package/schemas/audit-anchor-receipt.schema.json +16 -0
  285. package/schemas/audit-bundle-manifest.schema.json +71 -0
  286. package/schemas/audit-checkpoint.schema.json +37 -0
  287. package/schemas/audit-consistency-proof.schema.json +17 -0
  288. package/schemas/audit-entry.schema.json +33 -0
  289. package/schemas/audit-event.schema.json +168 -0
  290. package/schemas/audit-inclusion-proof.schema.json +17 -0
  291. package/schemas/audit-observation.schema.json +40 -0
  292. package/schemas/audit-receipt.schema.json +32 -0
  293. package/schemas/audit-verification-policy.schema.json +71 -0
  294. package/schemas/audit-verification-report.schema.json +29 -0
  295. package/schemas/kya-os-card.schema.json +6 -6
  296. package/schemas/mcp-extension-settings.json +37 -0
  297. package/schemas/well-known-mcpi.json +17 -0
@@ -0,0 +1,112 @@
1
+ import { AUDIT_ERROR_CODES, AuditProtocolError } from './errors.js';
2
+ /**
3
+ * Coordinates post-commit checkpoint publication. A failed publication never
4
+ * rolls back or rewrites the already signed checkpoint.
5
+ */
6
+ export class AuditCheckpointCoordinator {
7
+ options;
8
+ observers;
9
+ anchors;
10
+ maxAttempts;
11
+ constructor(options) {
12
+ this.options = options;
13
+ this.observers = options.observers ?? [];
14
+ this.anchors = options.anchors ?? [];
15
+ this.maxAttempts = options.maxPublishAttempts ?? 1;
16
+ if (!Number.isSafeInteger(this.maxAttempts) || this.maxAttempts < 1) {
17
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.INVALID_CONFIGURATION, 'Checkpoint publication attempts must be a positive safe integer');
18
+ }
19
+ const requirements = options.requirements;
20
+ if (requirements !== undefined &&
21
+ (!Number.isSafeInteger(requirements.minimumObservers) ||
22
+ requirements.minimumObservers < 0)) {
23
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.INVALID_CONFIGURATION, 'Minimum checkpoint observers must be a non-negative safe integer');
24
+ }
25
+ }
26
+ async createAndPublish(ledger) {
27
+ const checkpoint = await this.options.checkpoints.createCheckpoint(ledger);
28
+ const observations = [];
29
+ const anchors = [];
30
+ const failures = [];
31
+ await Promise.all(this.observers.map(async (provider, providerIndex) => {
32
+ const outcome = await this.publishWithRetry('observer', providerIndex, () => provider.publish(checkpoint));
33
+ if (outcome.ok)
34
+ observations.push(outcome.value);
35
+ else
36
+ failures.push(outcome.failure);
37
+ }));
38
+ await Promise.all(this.anchors.map(async (provider, providerIndex) => {
39
+ const outcome = await this.publishWithRetry('anchor', providerIndex, () => provider.publish(checkpoint), provider.kind);
40
+ if (outcome.ok)
41
+ anchors.push(outcome.value);
42
+ else
43
+ failures.push(outcome.failure);
44
+ }));
45
+ observations.sort((left, right) => left.core.observerId.localeCompare(right.core.observerId));
46
+ anchors.sort((left, right) => left.kind.localeCompare(right.kind) || left.providerId.localeCompare(right.providerId));
47
+ failures.sort((left, right) => left.role.localeCompare(right.role) || left.providerIndex - right.providerIndex);
48
+ const result = { checkpoint, observations, anchors, failures };
49
+ this.assertRequirements(result);
50
+ await this.options.onPublished?.(result);
51
+ return result;
52
+ }
53
+ async publishWithRetry(role, providerIndex, publish, kind) {
54
+ let lastError;
55
+ for (let attempt = 1; attempt <= this.maxAttempts; attempt += 1) {
56
+ try {
57
+ return { ok: true, value: await publish() };
58
+ }
59
+ catch (error) {
60
+ lastError = error;
61
+ if (attempt < this.maxAttempts) {
62
+ try {
63
+ await this.options.backoff?.({ role, providerIndex, attempt, error });
64
+ }
65
+ catch (backoffError) {
66
+ return {
67
+ ok: false,
68
+ failure: {
69
+ role,
70
+ providerIndex,
71
+ ...(kind === undefined ? {} : { kind }),
72
+ attempts: attempt,
73
+ error: new AggregateError([error, backoffError], 'Checkpoint publication backoff failed'),
74
+ },
75
+ };
76
+ }
77
+ }
78
+ }
79
+ }
80
+ return {
81
+ ok: false,
82
+ failure: {
83
+ role,
84
+ providerIndex,
85
+ ...(kind === undefined ? {} : { kind }),
86
+ attempts: this.maxAttempts,
87
+ error: lastError,
88
+ },
89
+ };
90
+ }
91
+ assertRequirements(result) {
92
+ const requirements = this.options.requirements;
93
+ if (requirements === undefined)
94
+ return;
95
+ const missingKinds = [...new Set(requirements.requiredAnchorKinds)].filter((kind) => !result.anchors.some((receipt) => receipt.kind === kind));
96
+ if (result.observations.length < requirements.minimumObservers || missingKinds.length > 0) {
97
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_PUBLICATION_FAILED, 'Signed checkpoint did not obtain the required external publication evidence', {
98
+ checkpointDigest: result.checkpoint.checkpointDigest,
99
+ requiredObservers: requirements.minimumObservers,
100
+ publishedObservers: result.observations.length,
101
+ missingAnchorKinds: missingKinds,
102
+ failedProviders: result.failures.map(({ role, providerIndex, kind, attempts }) => ({
103
+ role,
104
+ providerIndex,
105
+ ...(kind === undefined ? {} : { kind }),
106
+ attempts,
107
+ })),
108
+ });
109
+ }
110
+ }
111
+ }
112
+ //# sourceMappingURL=checkpoint-coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-coordinator.js","sourceRoot":"","sources":["../../src/audit/checkpoint-coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA+CpE;;;GAGG;AACH,MAAM,OAAO,0BAA0B;IAKR;IAJZ,SAAS,CAA6C;IACtD,OAAO,CAAiC;IACxC,WAAW,CAAS;IAErC,YAA6B,OAA0C;QAA1C,YAAO,GAAP,OAAO,CAAmC;QACrE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,kBAAkB,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,kBAAkB,CAC1B,iBAAiB,CAAC,qBAAqB,EACvC,iEAAiE,CAClE,CAAC;QACJ,CAAC;QACD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,IAAI,YAAY,KAAK,SAAS;YAC5B,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,gBAAgB,CAAC;gBACnD,YAAY,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,kBAAkB,CAC1B,iBAAiB,CAAC,qBAAqB,EACvC,kEAAkE,CACnE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAsB;QAC3C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC3E,MAAM,YAAY,GAAgC,EAAE,CAAC;QACrD,MAAM,OAAO,GAAyB,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAwC,EAAE,CAAC;QAEzD,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE;YACrE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACzC,UAAU,EACV,aAAa,EACb,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CACnC,CAAC;YACF,IAAI,OAAO,CAAC,EAAE;gBAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;;gBAC5C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC,CAAC;QACJ,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE;YACnE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACzC,QAAQ,EACR,aAAa,EACb,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,EAClC,QAAQ,CAAC,IAAI,CACd,CAAC;YACF,IAAI,OAAO,CAAC,EAAE;gBAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;;gBACvC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC,CAAC;QAEJ,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1F,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC5B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;QACnF,MAAM,MAAM,GAAG,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC/D,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,IAA+C,EAC/C,aAAqB,EACrB,OAAyB,EACzB,IAAiC;QAKjC,IAAI,SAAkB,CAAC;QACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;YAChE,IAAI,CAAC;gBACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,OAAO,EAAE,EAAE,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAK,CAAC;gBAClB,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;oBAC/B,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBACxE,CAAC;oBAAC,OAAO,YAAY,EAAE,CAAC;wBACtB,OAAO;4BACL,EAAE,EAAE,KAAK;4BACT,OAAO,EAAE;gCACP,IAAI;gCACJ,aAAa;gCACb,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gCACvC,QAAQ,EAAE,OAAO;gCACjB,KAAK,EAAE,IAAI,cAAc,CACvB,CAAC,KAAK,EAAE,YAAY,CAAC,EACrB,uCAAuC,CACxC;6BACF;yBACF,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE;gBACP,IAAI;gBACJ,aAAa;gBACb,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBACvC,QAAQ,EAAE,IAAI,CAAC,WAAW;gBAC1B,KAAK,EAAE,SAAS;aACjB;SACF,CAAC;IACJ,CAAC;IAEO,kBAAkB,CAAC,MAAwC;QACjE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;QAC/C,IAAI,YAAY,KAAK,SAAS;YAAE,OAAO;QACvC,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAClF,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,gBAAgB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1F,MAAM,IAAI,kBAAkB,CAC1B,iBAAiB,CAAC,6BAA6B,EAC/C,6EAA6E,EAC7E;gBACE,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,gBAAgB;gBACpD,iBAAiB,EAAE,YAAY,CAAC,gBAAgB;gBAChD,kBAAkB,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM;gBAC9C,kBAAkB,EAAE,YAAY;gBAChC,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;oBACjF,IAAI;oBACJ,aAAa;oBACb,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;oBACvC,QAAQ;iBACT,CAAC,CAAC;aACJ,CACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,59 @@
1
+ import type { AuditHasher, AuditSigner } from './crypto.js';
2
+ import type { AuditJournalProvider } from './providers/journal.js';
3
+ import type { AuditLedgerRef, AuditMerkleConsistencyProofV1, AuditMerkleInclusionProofV1, DecimalString, Digest, SignedAuditCheckpointV1 } from './types.js';
4
+ export type AuditCheckpointPutResult = {
5
+ kind: 'inserted';
6
+ checkpoint: SignedAuditCheckpointV1;
7
+ } | {
8
+ kind: 'existing';
9
+ checkpoint: SignedAuditCheckpointV1;
10
+ } | {
11
+ kind: 'conflict';
12
+ checkpoint: SignedAuditCheckpointV1;
13
+ };
14
+ export interface AuditCheckpointStore {
15
+ getLatest(ledger: AuditLedgerRef): Promise<SignedAuditCheckpointV1 | null>;
16
+ getByTreeSize(ledger: AuditLedgerRef, treeSize: DecimalString): Promise<SignedAuditCheckpointV1 | null>;
17
+ putIfAbsent(checkpoint: SignedAuditCheckpointV1): Promise<AuditCheckpointPutResult>;
18
+ }
19
+ /** Ephemeral reference store; durable adapters must preserve the same CAS semantics. */
20
+ export declare class MemoryAuditCheckpointStore implements AuditCheckpointStore {
21
+ private readonly checkpoints;
22
+ private readonly latest;
23
+ getLatest(ledger: AuditLedgerRef): Promise<SignedAuditCheckpointV1 | null>;
24
+ getByTreeSize(ledger: AuditLedgerRef, treeSize: DecimalString): Promise<SignedAuditCheckpointV1 | null>;
25
+ putIfAbsent(checkpoint: SignedAuditCheckpointV1): Promise<AuditCheckpointPutResult>;
26
+ }
27
+ export interface AuditCheckpointBuilderOptions {
28
+ journal: AuditJournalProvider;
29
+ store: AuditCheckpointStore;
30
+ signer: AuditSigner;
31
+ hasher: AuditHasher;
32
+ clock?: {
33
+ now(): number;
34
+ };
35
+ onCheckpointCreated?: (checkpoint: SignedAuditCheckpointV1) => Promise<void> | void;
36
+ }
37
+ /** Creates append-only RFC 9162 checkpoints from a stable journal high-water mark. */
38
+ export declare class AuditCheckpointBuilder {
39
+ private readonly options;
40
+ private readonly tree;
41
+ private readonly clock;
42
+ constructor(options: AuditCheckpointBuilderOptions);
43
+ createCheckpoint(ledger: AuditLedgerRef): Promise<SignedAuditCheckpointV1>;
44
+ inclusionProof(ledger: AuditLedgerRef, sequence: DecimalString, checkpoint: SignedAuditCheckpointV1): Promise<AuditMerkleInclusionProofV1>;
45
+ consistencyProof(ledger: AuditLedgerRef, oldTreeSize: DecimalString, checkpoint: SignedAuditCheckpointV1): Promise<AuditMerkleConsistencyProofV1>;
46
+ rootForRange(ledger: AuditLedgerRef, treeSize: DecimalString): Promise<Digest>;
47
+ verifyInclusion(entryDigest: Digest, checkpoint: SignedAuditCheckpointV1, proof: AuditMerkleInclusionProofV1): Promise<boolean>;
48
+ verifyConsistency(input: {
49
+ oldTreeSize: DecimalString;
50
+ oldRoot: Digest;
51
+ checkpoint: SignedAuditCheckpointV1;
52
+ proof: AuditMerkleConsistencyProofV1;
53
+ }): Promise<boolean>;
54
+ private snapshotAtHead;
55
+ private entriesForCheckpoint;
56
+ private readEntries;
57
+ private assertCheckpointLedger;
58
+ }
59
+ //# sourceMappingURL=checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../src/audit/checkpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,219 @@
1
+ import { canonicalizeJsonBytes } from '../utils/canonical-json.js';
2
+ import { hashAuditValue } from './crypto.js';
3
+ import { AUDIT_DIGEST_DOMAINS } from './integrity.js';
4
+ import { AUDIT_ERROR_CODES, AuditProtocolError } from './errors.js';
5
+ import { Rfc9162MerkleTree } from './merkle.js';
6
+ import { parseAuditCheckpointCore } from './schemas.js';
7
+ const CHECKPOINT_SCHEMA = 'https://schema.kya-os.org/v1/protocol/audit/checkpoint/v1.0.0';
8
+ const CHECKPOINT_SUITE = 'KYA-AUDIT-RFC9162-SHA256-JWS-2026';
9
+ function ledgerKey(ledger) {
10
+ return `${ledger.ledgerId}\0${ledger.ledgerEpochId}`;
11
+ }
12
+ function checkpointKey(ledger, treeSize) {
13
+ return `${ledgerKey(ledger)}\0${treeSize}`;
14
+ }
15
+ function parseDecimal(value, label) {
16
+ if (!/^(0|[1-9][0-9]*)$/.test(value)) {
17
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_INVALID, `${label} must be a canonical non-negative decimal string`);
18
+ }
19
+ return BigInt(value);
20
+ }
21
+ function toSafeNumber(value, label) {
22
+ if (value > BigInt(Number.MAX_SAFE_INTEGER)) {
23
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_INVALID, `${label} exceeds this implementation's safe in-memory proof range`);
24
+ }
25
+ return Number(value);
26
+ }
27
+ function deepFreeze(value) {
28
+ if (typeof value !== 'object' || value === null || Object.isFrozen(value))
29
+ return value;
30
+ for (const child of Object.values(value))
31
+ deepFreeze(child);
32
+ return Object.freeze(value);
33
+ }
34
+ /** Ephemeral reference store; durable adapters must preserve the same CAS semantics. */
35
+ export class MemoryAuditCheckpointStore {
36
+ checkpoints = new Map();
37
+ latest = new Map();
38
+ async getLatest(ledger) {
39
+ return this.latest.get(ledgerKey(ledger)) ?? null;
40
+ }
41
+ async getByTreeSize(ledger, treeSize) {
42
+ return this.checkpoints.get(checkpointKey(ledger, treeSize)) ?? null;
43
+ }
44
+ async putIfAbsent(checkpoint) {
45
+ const ledger = checkpoint.core;
46
+ const key = checkpointKey(ledger, checkpoint.core.treeSize);
47
+ const existing = this.checkpoints.get(key);
48
+ if (existing !== undefined) {
49
+ return existing.checkpointDigest === checkpoint.checkpointDigest
50
+ ? { kind: 'existing', checkpoint: existing }
51
+ : { kind: 'conflict', checkpoint: existing };
52
+ }
53
+ const frozen = deepFreeze(checkpoint);
54
+ this.checkpoints.set(key, frozen);
55
+ const current = this.latest.get(ledgerKey(ledger));
56
+ if (current === undefined ||
57
+ BigInt(current.core.treeSize) < BigInt(checkpoint.core.treeSize)) {
58
+ this.latest.set(ledgerKey(ledger), frozen);
59
+ }
60
+ return { kind: 'inserted', checkpoint: frozen };
61
+ }
62
+ }
63
+ /** Creates append-only RFC 9162 checkpoints from a stable journal high-water mark. */
64
+ export class AuditCheckpointBuilder {
65
+ options;
66
+ tree;
67
+ clock;
68
+ constructor(options) {
69
+ this.options = options;
70
+ this.tree = new Rfc9162MerkleTree(options.hasher);
71
+ this.clock = options.clock ?? Date;
72
+ }
73
+ async createCheckpoint(ledger) {
74
+ const entries = await this.snapshotAtHead(ledger);
75
+ if (entries.length === 0) {
76
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_INVALID, 'Cannot checkpoint an empty audit epoch');
77
+ }
78
+ const treeSize = String(entries.length);
79
+ const previous = await this.options.store.getLatest(ledger);
80
+ if (previous !== null) {
81
+ const previousSize = parseDecimal(previous.core.treeSize, 'Previous tree size');
82
+ if (previousSize > BigInt(entries.length)) {
83
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_ROLLBACK, 'Journal tree size is behind the latest signed checkpoint');
84
+ }
85
+ if (previousSize === BigInt(entries.length)) {
86
+ const currentRoot = await this.tree.root(entries.map((entry) => entry.entryDigest));
87
+ if (previous.core.rootDigest !== currentRoot ||
88
+ previous.core.headEntryDigest !== entries[entries.length - 1].entryDigest) {
89
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_CONFLICT, 'Journal content forked at the latest checkpointed tree size');
90
+ }
91
+ return previous;
92
+ }
93
+ }
94
+ const first = entries[0];
95
+ const last = entries[entries.length - 1];
96
+ const core = parseAuditCheckpointCore({
97
+ schema: CHECKPOINT_SCHEMA,
98
+ checkpointId: `checkpoint:${ledger.ledgerId}:${ledger.ledgerEpochId}:${treeSize}`,
99
+ ...ledger,
100
+ treeSize,
101
+ firstSequence: first.core.sequence,
102
+ lastSequence: last.core.sequence,
103
+ rootDigest: await this.tree.root(entries.map((entry) => entry.entryDigest)),
104
+ headEntryDigest: last.entryDigest,
105
+ previousCheckpointDigest: previous?.checkpointDigest ?? null,
106
+ createdAt: this.clock.now(),
107
+ issuer: this.options.signer.ref,
108
+ integritySuite: CHECKPOINT_SUITE,
109
+ });
110
+ const checkpointDigest = await hashAuditValue(this.options.hasher, AUDIT_DIGEST_DOMAINS.checkpoint, core);
111
+ const candidate = deepFreeze({
112
+ core,
113
+ checkpointDigest,
114
+ jws: await this.options.signer.sign(canonicalizeJsonBytes(core)),
115
+ });
116
+ const result = await this.options.store.putIfAbsent(candidate);
117
+ if (result.kind === 'conflict') {
118
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_CONFLICT, 'A different checkpoint already exists at this tree size', { treeSize });
119
+ }
120
+ if (result.kind === 'inserted') {
121
+ await this.options.onCheckpointCreated?.(result.checkpoint);
122
+ }
123
+ return result.checkpoint;
124
+ }
125
+ async inclusionProof(ledger, sequence, checkpoint) {
126
+ this.assertCheckpointLedger(ledger, checkpoint);
127
+ const entries = await this.entriesForCheckpoint(ledger, checkpoint);
128
+ const index = entries.findIndex((entry) => entry.core.sequence === sequence);
129
+ if (index < 0) {
130
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_INVALID, 'Sequence is not included in the checkpoint', { sequence, treeSize: checkpoint.core.treeSize });
131
+ }
132
+ return deepFreeze({
133
+ leafIndex: String(index),
134
+ treeSize: checkpoint.core.treeSize,
135
+ auditPath: await this.tree.inclusionProof(entries.map((entry) => entry.entryDigest), index),
136
+ });
137
+ }
138
+ async consistencyProof(ledger, oldTreeSize, checkpoint) {
139
+ this.assertCheckpointLedger(ledger, checkpoint);
140
+ const entries = await this.entriesForCheckpoint(ledger, checkpoint);
141
+ const oldSize = toSafeNumber(parseDecimal(oldTreeSize, 'Old tree size'), 'Old tree size');
142
+ return deepFreeze({
143
+ oldTreeSize,
144
+ newTreeSize: checkpoint.core.treeSize,
145
+ auditPath: await this.tree.consistencyProof(entries.map((entry) => entry.entryDigest), oldSize),
146
+ });
147
+ }
148
+ async rootForRange(ledger, treeSize) {
149
+ const size = toSafeNumber(parseDecimal(treeSize, 'Tree size'), 'Tree size');
150
+ if (size === 0)
151
+ return this.tree.root([]);
152
+ const entries = await this.readEntries(ledger, size);
153
+ if (entries.length !== size) {
154
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_INVALID, 'Journal does not contain the requested tree range', { treeSize });
155
+ }
156
+ return this.tree.root(entries.map((entry) => entry.entryDigest));
157
+ }
158
+ async verifyInclusion(entryDigest, checkpoint, proof) {
159
+ if (proof.treeSize !== checkpoint.core.treeSize)
160
+ return false;
161
+ return this.tree.verifyInclusion({
162
+ leaf: entryDigest,
163
+ leafIndex: toSafeNumber(parseDecimal(proof.leafIndex, 'Leaf index'), 'Leaf index'),
164
+ treeSize: toSafeNumber(parseDecimal(proof.treeSize, 'Tree size'), 'Tree size'),
165
+ root: checkpoint.core.rootDigest,
166
+ auditPath: proof.auditPath,
167
+ });
168
+ }
169
+ async verifyConsistency(input) {
170
+ if (input.proof.oldTreeSize !== input.oldTreeSize ||
171
+ input.proof.newTreeSize !== input.checkpoint.core.treeSize)
172
+ return false;
173
+ return this.tree.verifyConsistency({
174
+ oldSize: toSafeNumber(parseDecimal(input.oldTreeSize, 'Old tree size'), 'Old tree size'),
175
+ newSize: toSafeNumber(parseDecimal(input.checkpoint.core.treeSize, 'New tree size'), 'New tree size'),
176
+ oldRoot: input.oldRoot,
177
+ newRoot: input.checkpoint.core.rootDigest,
178
+ auditPath: input.proof.auditPath,
179
+ });
180
+ }
181
+ async snapshotAtHead(ledger) {
182
+ const head = await this.options.journal.getHead(ledger);
183
+ if (head === null)
184
+ return [];
185
+ const expectedCount = toSafeNumber(parseDecimal(head.sequence, 'Journal head sequence') + 1n, 'Journal tree size');
186
+ const entries = await this.readEntries(ledger, expectedCount);
187
+ const last = entries[entries.length - 1];
188
+ if (entries.length !== expectedCount || last?.entryDigest !== head.entryDigest) {
189
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.JOURNAL_FAILURE, 'Journal could not provide a stable range through its reported head');
190
+ }
191
+ return entries;
192
+ }
193
+ async entriesForCheckpoint(ledger, checkpoint) {
194
+ const size = toSafeNumber(parseDecimal(checkpoint.core.treeSize, 'Checkpoint tree size'), 'Checkpoint tree size');
195
+ const entries = await this.readEntries(ledger, size);
196
+ if (entries.length !== size || entries[entries.length - 1]?.entryDigest !==
197
+ checkpoint.core.headEntryDigest) {
198
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_INVALID, 'Journal range does not match the signed checkpoint head');
199
+ }
200
+ return entries;
201
+ }
202
+ async readEntries(ledger, limit) {
203
+ const result = [];
204
+ for await (const entry of this.options.journal.readRange({ ...ledger, limit })) {
205
+ if (BigInt(entry.core.sequence) !== BigInt(result.length)) {
206
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.JOURNAL_FAILURE, 'Audit journal range is not contiguous from sequence zero');
207
+ }
208
+ result.push(entry);
209
+ }
210
+ return result;
211
+ }
212
+ assertCheckpointLedger(ledger, checkpoint) {
213
+ if (checkpoint.core.ledgerId !== ledger.ledgerId ||
214
+ checkpoint.core.ledgerEpochId !== ledger.ledgerEpochId) {
215
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.LEDGER_MISMATCH, 'Checkpoint belongs to a different ledger or epoch');
216
+ }
217
+ }
218
+ }
219
+ //# sourceMappingURL=checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/audit/checkpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export interface AuditCliIo {
3
+ readText(path: string): Promise<string>;
4
+ write(text: string): void;
5
+ writeError(text: string): void;
6
+ }
7
+ export declare function runAuditCli(args: readonly string[], io?: AuditCliIo): Promise<number>;
8
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/audit/cli.ts"],"names":[],"mappings":";AAwCA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAiBD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,GAAE,UAAsB,GACzB,OAAO,CAAC,MAAM,CAAC,CA2CjB"}
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env node
2
+ import { readFile } from 'node:fs/promises';
3
+ import { CryptoProviderAuditHasher } from './crypto.js';
4
+ import { CompactJwsAuditSignatureVerifier } from './crypto.js';
5
+ import { verifyAuditBundle } from './replay-bundle.js';
6
+ import { parseAuditVerificationPolicy } from './schemas.js';
7
+ import { NodeCryptoProvider } from '../providers/node-crypto.js';
8
+ import { z } from 'zod';
9
+ const auditCliKeyFileSchema = z.object({
10
+ keys: z.array(z.object({
11
+ kid: z.string().min(1).max(2304),
12
+ jwk: z.record(z.string(), z.unknown()),
13
+ }).strict()).max(10_000),
14
+ }).strict().superRefine((value, context) => {
15
+ const kids = value.keys.map((item) => item.kid);
16
+ if (new Set(kids).size !== kids.length) {
17
+ context.addIssue({ code: 'custom', path: ['keys'], message: 'Key IDs must be unique' });
18
+ }
19
+ for (const [index, item] of value.keys.entries()) {
20
+ if (typeof item.jwk['kid'] === 'string' && item.jwk['kid'] !== item.kid) {
21
+ context.addIssue({
22
+ code: 'custom',
23
+ path: ['keys', index, 'jwk', 'kid'],
24
+ message: 'JWK kid must match the key-file kid',
25
+ });
26
+ }
27
+ }
28
+ });
29
+ const defaultIo = {
30
+ readText: (path) => readFile(path, 'utf8'),
31
+ write: (text) => process.stdout.write(text),
32
+ writeError: (text) => process.stderr.write(text),
33
+ };
34
+ const usage = 'Usage: kya-audit verify <bundle.json> --policy <policy.json> --keys <keys.json>\n';
35
+ function option(args, name) {
36
+ const index = args.indexOf(name);
37
+ if (index < 0 || args.indexOf(name, index + 1) >= 0)
38
+ return undefined;
39
+ const value = args[index + 1];
40
+ return value === undefined || value.startsWith('-') ? undefined : value;
41
+ }
42
+ export async function runAuditCli(args, io = defaultIo) {
43
+ if (args[0] === '--help' || args[0] === '-h' || args[0] === 'help') {
44
+ io.write(usage);
45
+ return 0;
46
+ }
47
+ if (args[0] !== 'verify' || args[1] === undefined) {
48
+ io.writeError(usage);
49
+ return 2;
50
+ }
51
+ const policyPath = option(args, '--policy');
52
+ const keysPath = option(args, '--keys');
53
+ if (policyPath === undefined || keysPath === undefined) {
54
+ io.writeError('Both --policy and --keys are required; bundle contents cannot bootstrap trust.\n');
55
+ return 2;
56
+ }
57
+ try {
58
+ const [bundle, policy, keyFile] = await Promise.all([
59
+ io.readText(args[1]).then((value) => JSON.parse(value)),
60
+ io.readText(policyPath).then((value) => parseAuditVerificationPolicy(JSON.parse(value))),
61
+ io.readText(keysPath).then((value) => auditCliKeyFileSchema.parse(JSON.parse(value))),
62
+ ]);
63
+ const keys = new Map(keyFile.keys.map((item) => [item.kid, item.jwk]));
64
+ const signatures = new CompactJwsAuditSignatureVerifier({
65
+ async resolve(signer) {
66
+ return keys.get(signer.kid) ?? null;
67
+ },
68
+ });
69
+ const report = await verifyAuditBundle(bundle, policy, {
70
+ hasher: new CryptoProviderAuditHasher(new NodeCryptoProvider()),
71
+ signatures,
72
+ });
73
+ io.write(`${JSON.stringify(report, null, 2)}\n`);
74
+ const dimensions = Object.values(report).filter((value) => typeof value === 'object' && value !== null && 'verdict' in value);
75
+ return dimensions.some((dimension) => dimension.verdict === 'invalid') ? 1 : 0;
76
+ }
77
+ catch (error) {
78
+ io.writeError(`Audit verification failed: ${error instanceof Error ? error.message : String(error)}\n`);
79
+ return 2;
80
+ }
81
+ }
82
+ if (process.argv[1]?.endsWith('/audit/cli.js') || process.argv[1]?.endsWith('\\audit\\cli.js')) {
83
+ process.exitCode = await runAuditCli(process.argv.slice(2));
84
+ }
85
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/audit/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAM5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,MAAM,qBAAqB,GAA+B,CAAC,CAAC,MAAM,CAAC;IACjE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;KACvC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;CACzB,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;YACxE,OAAO,CAAC,QAAQ,CAAC;gBACf,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;gBACnC,OAAO,EAAE,qCAAqC;aAC/C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAQH,MAAM,SAAS,GAAe;IAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC1C,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IAC3C,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;CACjD,CAAC;AAEF,MAAM,KAAK,GAAG,mFAAmF,CAAC;AAElG,SAAS,MAAM,CAAC,IAAuB,EAAE,IAAY;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAuB,EACvB,KAAiB,SAAS;IAE1B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACnE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAClD,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxC,IAAI,UAAU,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACvD,EAAE,CAAC,UAAU,CAAC,kFAAkF,CAAC,CAAC;QAClG,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAClD,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAwB,CAAC;YAC9E,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACrC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAA8B,CAAC;YAC/E,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;SACtF,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,IAAI,gCAAgC,CAAC;YACtD,KAAK,CAAC,OAAO,CAAC,MAAiB;gBAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;YACtC,CAAC;SACF,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE;YACrD,MAAM,EAAE,IAAI,yBAAyB,CAAC,IAAI,kBAAkB,EAAE,CAAC;YAC/D,UAAU;SACX,CAAC,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAGpD,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,CAAC,CAAC;QACxE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,UAAU,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxG,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAC/F,OAAO,CAAC,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { type JWK } from 'jose';
2
+ import type { CryptoProvider } from '../providers/base.js';
3
+ import type { Digest, SignerRef } from './types.js';
4
+ export interface AuditHasher {
5
+ sha256(data: Uint8Array): Promise<Digest>;
6
+ }
7
+ export declare class CryptoProviderAuditHasher implements AuditHasher {
8
+ private readonly crypto;
9
+ constructor(crypto: CryptoProvider);
10
+ sha256(data: Uint8Array): Promise<Digest>;
11
+ }
12
+ export interface AuditSigner {
13
+ readonly ref: SignerRef;
14
+ sign(payload: Uint8Array): Promise<string>;
15
+ }
16
+ export interface AuditSignatureVerifier {
17
+ verify(payload: Uint8Array, jws: string, signer: SignerRef): Promise<boolean>;
18
+ }
19
+ export type AuditVerificationKey = CryptoKey | JWK | Uint8Array;
20
+ export interface AuditVerificationKeyResolver {
21
+ resolve(signer: SignerRef): Promise<AuditVerificationKey | null>;
22
+ }
23
+ /** Strict compact-JWS verifier with payload, algorithm, KID, and DID binding. */
24
+ export declare class CompactJwsAuditSignatureVerifier implements AuditSignatureVerifier {
25
+ private readonly keys;
26
+ constructor(keys: AuditVerificationKeyResolver);
27
+ verify(payload: Uint8Array, jws: string, signer: SignerRef): Promise<boolean>;
28
+ }
29
+ /** Reference JWS signer for local WebCrypto/KMS-compatible CryptoKey handles. */
30
+ export declare class CompactJwsAuditSigner implements AuditSigner {
31
+ readonly ref: SignerRef;
32
+ private readonly privateKey;
33
+ constructor(ref: SignerRef, privateKey: CryptoKey);
34
+ sign(payload: Uint8Array): Promise<string>;
35
+ }
36
+ export declare function hashAuditValue(hasher: AuditHasher, domain: string, value: unknown): Promise<Digest>;
37
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/audit/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAKpD,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,qBAAa,yBAA0B,YAAW,WAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAE7C,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAOhD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/E;AAED,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,GAAG,GAAG,UAAU,CAAC;AAEhE,MAAM,WAAW,4BAA4B;IAC3C,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;CAClE;AAED,iFAAiF;AACjF,qBAAa,gCAAiC,YAAW,sBAAsB;IACjE,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,4BAA4B;IAEzD,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;CAcpF;AAED,iFAAiF;AACjF,qBAAa,qBAAsB,YAAW,WAAW;IAErD,QAAQ,CAAC,GAAG,EAAE,SAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADlB,GAAG,EAAE,SAAS,EACN,UAAU,EAAE,SAAS;IAGlC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAKjD;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,MAAM,CAAC,CAUjB"}
@@ -0,0 +1,68 @@
1
+ import { CompactSign, compactVerify } from 'jose';
2
+ import { canonicalizeJsonBytes } from '../utils/canonical-json.js';
3
+ const encoder = new TextEncoder();
4
+ const DIGEST_PATTERN = /^sha256:[a-f0-9]{64}$/;
5
+ export class CryptoProviderAuditHasher {
6
+ crypto;
7
+ constructor(crypto) {
8
+ this.crypto = crypto;
9
+ }
10
+ async sha256(data) {
11
+ const digest = await this.crypto.hash(data);
12
+ if (!DIGEST_PATTERN.test(digest)) {
13
+ throw new TypeError('Audit hasher must return sha256:<lowercase-hex>');
14
+ }
15
+ return digest;
16
+ }
17
+ }
18
+ /** Strict compact-JWS verifier with payload, algorithm, KID, and DID binding. */
19
+ export class CompactJwsAuditSignatureVerifier {
20
+ keys;
21
+ constructor(keys) {
22
+ this.keys = keys;
23
+ }
24
+ async verify(payload, jws, signer) {
25
+ try {
26
+ if (!signer.kid.startsWith(`${signer.did}#`))
27
+ return false;
28
+ const key = await this.keys.resolve(signer);
29
+ if (key === null)
30
+ return false;
31
+ const result = await compactVerify(jws, key, { algorithms: [signer.alg] });
32
+ if (result.protectedHeader.alg !== signer.alg ||
33
+ result.protectedHeader.kid !== signer.kid ||
34
+ result.payload.length !== payload.length)
35
+ return false;
36
+ return result.payload.every((byte, index) => byte === payload[index]);
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ }
43
+ /** Reference JWS signer for local WebCrypto/KMS-compatible CryptoKey handles. */
44
+ export class CompactJwsAuditSigner {
45
+ ref;
46
+ privateKey;
47
+ constructor(ref, privateKey) {
48
+ this.ref = ref;
49
+ this.privateKey = privateKey;
50
+ }
51
+ async sign(payload) {
52
+ return new CompactSign(payload)
53
+ .setProtectedHeader({ alg: this.ref.alg, kid: this.ref.kid })
54
+ .sign(this.privateKey);
55
+ }
56
+ }
57
+ export async function hashAuditValue(hasher, domain, value) {
58
+ if (domain.length === 0 || domain.includes('\0')) {
59
+ throw new TypeError('Audit digest domain must be non-empty and cannot contain NUL');
60
+ }
61
+ const domainBytes = encoder.encode(`${domain}\0`);
62
+ const valueBytes = canonicalizeJsonBytes(value);
63
+ const input = new Uint8Array(domainBytes.length + valueBytes.length);
64
+ input.set(domainBytes);
65
+ input.set(valueBytes, domainBytes.length);
66
+ return hasher.sha256(input);
67
+ }
68
+ //# sourceMappingURL=crypto.js.map