@psavelis/enterprise-blockchain 0.1.0 → 1.1.1

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 (296) hide show
  1. package/README.md +15 -2
  2. package/dist/aid-settlement/application/reconciler.d.ts +13 -0
  3. package/dist/aid-settlement/application/reconciler.d.ts.map +1 -0
  4. package/dist/aid-settlement/application/reconciler.js +77 -0
  5. package/dist/aid-settlement/domain/entities.d.ts +24 -0
  6. package/dist/aid-settlement/domain/entities.d.ts.map +1 -0
  7. package/dist/aid-settlement/domain/entities.js +1 -0
  8. package/dist/aid-settlement/domain/ports.d.ts +10 -0
  9. package/dist/aid-settlement/domain/ports.d.ts.map +1 -0
  10. package/dist/aid-settlement/domain/ports.js +1 -0
  11. package/dist/aid-settlement/index.d.ts +19 -0
  12. package/dist/aid-settlement/index.d.ts.map +1 -0
  13. package/dist/aid-settlement/index.js +23 -0
  14. package/dist/aid-settlement/infrastructure/in-memory-store.d.ts +12 -0
  15. package/dist/aid-settlement/infrastructure/in-memory-store.d.ts.map +1 -0
  16. package/dist/aid-settlement/infrastructure/in-memory-store.js +17 -0
  17. package/dist/credentialing/application/clearance-evaluator.d.ts +10 -0
  18. package/dist/credentialing/application/clearance-evaluator.d.ts.map +1 -0
  19. package/dist/credentialing/application/clearance-evaluator.js +63 -0
  20. package/dist/credentialing/domain/entities.d.ts +28 -0
  21. package/dist/credentialing/domain/entities.d.ts.map +1 -0
  22. package/dist/credentialing/domain/entities.js +1 -0
  23. package/dist/credentialing/domain/ports.d.ts +9 -0
  24. package/dist/credentialing/domain/ports.d.ts.map +1 -0
  25. package/dist/credentialing/domain/ports.js +1 -0
  26. package/dist/credentialing/index.d.ts +19 -0
  27. package/dist/credentialing/index.d.ts.map +1 -0
  28. package/dist/credentialing/index.js +23 -0
  29. package/dist/credentialing/infrastructure/in-memory-store.d.ts +11 -0
  30. package/dist/credentialing/infrastructure/in-memory-store.d.ts.map +1 -0
  31. package/dist/credentialing/infrastructure/in-memory-store.js +14 -0
  32. package/dist/hsm/application/asymmetric-key-service.d.ts +23 -0
  33. package/dist/hsm/application/asymmetric-key-service.d.ts.map +1 -0
  34. package/dist/hsm/application/asymmetric-key-service.js +109 -0
  35. package/dist/hsm/application/envelope-encryption-service.d.ts +18 -0
  36. package/dist/hsm/application/envelope-encryption-service.d.ts.map +1 -0
  37. package/dist/hsm/application/envelope-encryption-service.js +59 -0
  38. package/dist/hsm/application/symmetric-key-service.d.ts +34 -0
  39. package/dist/hsm/application/symmetric-key-service.d.ts.map +1 -0
  40. package/dist/hsm/application/symmetric-key-service.js +107 -0
  41. package/dist/hsm/domain/entities.d.ts +104 -0
  42. package/dist/hsm/domain/entities.d.ts.map +1 -0
  43. package/dist/hsm/domain/entities.js +10 -0
  44. package/dist/hsm/domain/ports.d.ts +20 -0
  45. package/dist/hsm/domain/ports.d.ts.map +1 -0
  46. package/dist/hsm/domain/ports.js +1 -0
  47. package/dist/hsm/index.d.ts +48 -0
  48. package/dist/hsm/index.d.ts.map +1 -0
  49. package/dist/hsm/index.js +97 -0
  50. package/dist/hsm/infrastructure/audit-log-factory.d.ts +59 -0
  51. package/dist/hsm/infrastructure/audit-log-factory.d.ts.map +1 -0
  52. package/dist/hsm/infrastructure/audit-log-factory.js +95 -0
  53. package/dist/hsm/infrastructure/audit-log.d.ts +8 -0
  54. package/dist/hsm/infrastructure/audit-log.d.ts.map +1 -0
  55. package/dist/hsm/infrastructure/audit-log.js +18 -0
  56. package/dist/hsm/infrastructure/file-audit-log.d.ts +55 -0
  57. package/dist/hsm/infrastructure/file-audit-log.d.ts.map +1 -0
  58. package/dist/hsm/infrastructure/file-audit-log.js +128 -0
  59. package/dist/hsm/infrastructure/key-store.d.ts +9 -0
  60. package/dist/hsm/infrastructure/key-store.d.ts.map +1 -0
  61. package/dist/hsm/infrastructure/key-store.js +12 -0
  62. package/dist/hsm/infrastructure/syslog-audit-log.d.ts +64 -0
  63. package/dist/hsm/infrastructure/syslog-audit-log.d.ts.map +1 -0
  64. package/dist/hsm/infrastructure/syslog-audit-log.js +167 -0
  65. package/dist/index.d.ts +22 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +37 -0
  68. package/dist/integrations/besu-client/error-mapper.d.ts +9 -0
  69. package/dist/integrations/besu-client/error-mapper.d.ts.map +1 -0
  70. package/dist/integrations/besu-client/error-mapper.js +22 -0
  71. package/dist/integrations/besu-client/index.d.ts +65 -0
  72. package/dist/integrations/besu-client/index.d.ts.map +1 -0
  73. package/dist/integrations/besu-client/index.js +276 -0
  74. package/dist/integrations/besu-client/ports.d.ts +44 -0
  75. package/dist/integrations/besu-client/ports.d.ts.map +1 -0
  76. package/dist/integrations/besu-client/ports.js +1 -0
  77. package/dist/integrations/corda-gateway/index.d.ts +37 -0
  78. package/dist/integrations/corda-gateway/index.d.ts.map +1 -0
  79. package/dist/integrations/corda-gateway/index.js +234 -0
  80. package/dist/integrations/corda-gateway/ports.d.ts +33 -0
  81. package/dist/integrations/corda-gateway/ports.d.ts.map +1 -0
  82. package/dist/integrations/corda-gateway/ports.js +1 -0
  83. package/dist/integrations/fabric-gateway/index.d.ts +78 -0
  84. package/dist/integrations/fabric-gateway/index.d.ts.map +1 -0
  85. package/dist/integrations/fabric-gateway/index.js +214 -0
  86. package/dist/integrations/fabric-gateway/ports.d.ts +50 -0
  87. package/dist/integrations/fabric-gateway/ports.d.ts.map +1 -0
  88. package/dist/integrations/fabric-gateway/ports.js +1 -0
  89. package/dist/integrations/index.d.ts +19 -0
  90. package/dist/integrations/index.d.ts.map +1 -0
  91. package/dist/integrations/index.js +19 -0
  92. package/dist/integrations/shared/env.d.ts +4 -0
  93. package/dist/integrations/shared/env.d.ts.map +1 -0
  94. package/dist/integrations/shared/env.js +24 -0
  95. package/dist/integrations/shared/retry.d.ts +79 -0
  96. package/dist/integrations/shared/retry.d.ts.map +1 -0
  97. package/dist/integrations/shared/retry.js +315 -0
  98. package/dist/mpc/adapters.d.ts +36 -0
  99. package/dist/mpc/adapters.d.ts.map +1 -0
  100. package/dist/mpc/adapters.js +46 -0
  101. package/dist/mpc/crypto.d.ts +2 -0
  102. package/dist/mpc/crypto.d.ts.map +1 -0
  103. package/dist/mpc/crypto.js +2 -0
  104. package/dist/mpc/dsa.d.ts +134 -0
  105. package/dist/mpc/dsa.d.ts.map +1 -0
  106. package/dist/mpc/dsa.js +127 -0
  107. package/dist/mpc/field.d.ts +127 -0
  108. package/dist/mpc/field.d.ts.map +1 -0
  109. package/dist/mpc/field.js +209 -0
  110. package/dist/mpc/hybrid-kem.d.ts +96 -0
  111. package/dist/mpc/hybrid-kem.d.ts.map +1 -0
  112. package/dist/mpc/hybrid-kem.js +136 -0
  113. package/dist/mpc/index.d.ts +135 -0
  114. package/dist/mpc/index.d.ts.map +1 -0
  115. package/dist/mpc/index.js +348 -0
  116. package/dist/mpc/kyber.d.ts +134 -0
  117. package/dist/mpc/kyber.d.ts.map +1 -0
  118. package/dist/mpc/kyber.js +143 -0
  119. package/dist/mpc/ports.d.ts +67 -0
  120. package/dist/mpc/ports.d.ts.map +1 -0
  121. package/dist/mpc/ports.js +9 -0
  122. package/dist/mpc/quantum.d.ts +80 -0
  123. package/dist/mpc/quantum.d.ts.map +1 -0
  124. package/dist/mpc/quantum.js +180 -0
  125. package/dist/p2mr/adapters.d.ts +31 -0
  126. package/dist/p2mr/adapters.d.ts.map +1 -0
  127. package/dist/p2mr/adapters.js +35 -0
  128. package/dist/p2mr/index.d.ts +63 -0
  129. package/dist/p2mr/index.d.ts.map +1 -0
  130. package/dist/p2mr/index.js +59 -0
  131. package/dist/p2mr/merkle-tree.d.ts +109 -0
  132. package/dist/p2mr/merkle-tree.d.ts.map +1 -0
  133. package/dist/p2mr/merkle-tree.js +239 -0
  134. package/dist/p2mr/p2mr-output.d.ts +142 -0
  135. package/dist/p2mr/p2mr-output.d.ts.map +1 -0
  136. package/dist/p2mr/p2mr-output.js +150 -0
  137. package/dist/p2mr/ports.d.ts +52 -0
  138. package/dist/p2mr/ports.d.ts.map +1 -0
  139. package/dist/p2mr/ports.js +9 -0
  140. package/dist/p2mr/script-interpreter.d.ts +92 -0
  141. package/dist/p2mr/script-interpreter.d.ts.map +1 -0
  142. package/dist/p2mr/script-interpreter.js +535 -0
  143. package/dist/p2mr/script-leaf.d.ts +70 -0
  144. package/dist/p2mr/script-leaf.d.ts.map +1 -0
  145. package/dist/p2mr/script-leaf.js +203 -0
  146. package/dist/p2mr/spend-proof.d.ts +95 -0
  147. package/dist/p2mr/spend-proof.d.ts.map +1 -0
  148. package/dist/p2mr/spend-proof.js +358 -0
  149. package/dist/p2mr/types.d.ts +209 -0
  150. package/dist/p2mr/types.d.ts.map +1 -0
  151. package/dist/p2mr/types.js +9 -0
  152. package/dist/privacy/application/view-projector.d.ts +13 -0
  153. package/dist/privacy/application/view-projector.d.ts.map +1 -0
  154. package/dist/privacy/application/view-projector.js +85 -0
  155. package/dist/privacy/domain/entities.d.ts +26 -0
  156. package/dist/privacy/domain/entities.d.ts.map +1 -0
  157. package/dist/privacy/domain/entities.js +1 -0
  158. package/dist/privacy/domain/ports.d.ts +7 -0
  159. package/dist/privacy/domain/ports.d.ts.map +1 -0
  160. package/dist/privacy/domain/ports.js +1 -0
  161. package/dist/privacy/index.d.ts +21 -0
  162. package/dist/privacy/index.d.ts.map +1 -0
  163. package/dist/privacy/index.js +25 -0
  164. package/dist/privacy/infrastructure/in-memory-store.d.ts +8 -0
  165. package/dist/privacy/infrastructure/in-memory-store.d.ts.map +1 -0
  166. package/dist/privacy/infrastructure/in-memory-store.js +7 -0
  167. package/dist/protocols/besu-port.d.ts +80 -0
  168. package/dist/protocols/besu-port.d.ts.map +1 -0
  169. package/dist/protocols/besu-port.js +1 -0
  170. package/dist/protocols/corda-port.d.ts +103 -0
  171. package/dist/protocols/corda-port.d.ts.map +1 -0
  172. package/dist/protocols/corda-port.js +9 -0
  173. package/dist/protocols/credentialing-port.d.ts +11 -0
  174. package/dist/protocols/credentialing-port.d.ts.map +1 -0
  175. package/dist/protocols/credentialing-port.js +1 -0
  176. package/dist/protocols/fabric-port.d.ts +89 -0
  177. package/dist/protocols/fabric-port.d.ts.map +1 -0
  178. package/dist/protocols/fabric-port.js +9 -0
  179. package/dist/protocols/index.d.ts +14 -0
  180. package/dist/protocols/index.d.ts.map +1 -0
  181. package/dist/protocols/index.js +7 -0
  182. package/dist/protocols/p2mr-port.d.ts +159 -0
  183. package/dist/protocols/p2mr-port.d.ts.map +1 -0
  184. package/dist/protocols/p2mr-port.js +12 -0
  185. package/dist/protocols/privacy-port.d.ts +9 -0
  186. package/dist/protocols/privacy-port.d.ts.map +1 -0
  187. package/dist/protocols/privacy-port.js +1 -0
  188. package/dist/protocols/traceability-port.d.ts +12 -0
  189. package/dist/protocols/traceability-port.d.ts.map +1 -0
  190. package/dist/protocols/traceability-port.js +1 -0
  191. package/dist/shared/collection-store.d.ts +12 -0
  192. package/dist/shared/collection-store.d.ts.map +1 -0
  193. package/dist/shared/collection-store.js +26 -0
  194. package/dist/shared/commit.d.ts +24 -0
  195. package/dist/shared/commit.d.ts.map +1 -0
  196. package/dist/shared/commit.js +50 -0
  197. package/dist/shared/crypto.d.ts +2 -0
  198. package/dist/shared/crypto.d.ts.map +1 -0
  199. package/dist/shared/crypto.js +4 -0
  200. package/dist/shared/date.d.ts +2 -0
  201. package/dist/shared/date.d.ts.map +1 -0
  202. package/dist/shared/date.js +3 -0
  203. package/dist/shared/index.d.ts +9 -0
  204. package/dist/shared/index.d.ts.map +1 -0
  205. package/dist/shared/index.js +11 -0
  206. package/dist/shared/logger.d.ts +37 -0
  207. package/dist/shared/logger.d.ts.map +1 -0
  208. package/dist/shared/logger.js +45 -0
  209. package/dist/shared/store.d.ts +25 -0
  210. package/dist/shared/store.d.ts.map +1 -0
  211. package/dist/shared/store.js +18 -0
  212. package/dist/shared/telemetry-sdk.d.ts +26 -0
  213. package/dist/shared/telemetry-sdk.d.ts.map +1 -0
  214. package/dist/shared/telemetry-sdk.js +97 -0
  215. package/dist/shared/telemetry.d.ts +86 -0
  216. package/dist/shared/telemetry.d.ts.map +1 -0
  217. package/dist/shared/telemetry.js +137 -0
  218. package/dist/stark-settlement/application/aggregator-service.d.ts +112 -0
  219. package/dist/stark-settlement/application/aggregator-service.d.ts.map +1 -0
  220. package/dist/stark-settlement/application/aggregator-service.js +256 -0
  221. package/dist/stark-settlement/application/ledger-service.d.ts +114 -0
  222. package/dist/stark-settlement/application/ledger-service.d.ts.map +1 -0
  223. package/dist/stark-settlement/application/ledger-service.js +318 -0
  224. package/dist/stark-settlement/application/settlement-service.d.ts +104 -0
  225. package/dist/stark-settlement/application/settlement-service.d.ts.map +1 -0
  226. package/dist/stark-settlement/application/settlement-service.js +251 -0
  227. package/dist/stark-settlement/domain/entities.d.ts +365 -0
  228. package/dist/stark-settlement/domain/entities.d.ts.map +1 -0
  229. package/dist/stark-settlement/domain/entities.js +29 -0
  230. package/dist/stark-settlement/domain/ports.d.ts +485 -0
  231. package/dist/stark-settlement/domain/ports.d.ts.map +1 -0
  232. package/dist/stark-settlement/domain/ports.js +14 -0
  233. package/dist/stark-settlement/domain/value-objects.d.ts +268 -0
  234. package/dist/stark-settlement/domain/value-objects.d.ts.map +1 -0
  235. package/dist/stark-settlement/domain/value-objects.js +500 -0
  236. package/dist/stark-settlement/index.d.ts +172 -0
  237. package/dist/stark-settlement/index.d.ts.map +1 -0
  238. package/dist/stark-settlement/index.js +193 -0
  239. package/dist/stark-settlement/infrastructure/adapters/audit-adapter.d.ts +52 -0
  240. package/dist/stark-settlement/infrastructure/adapters/audit-adapter.d.ts.map +1 -0
  241. package/dist/stark-settlement/infrastructure/adapters/audit-adapter.js +154 -0
  242. package/dist/stark-settlement/infrastructure/adapters/bitcoin-adapter.d.ts +88 -0
  243. package/dist/stark-settlement/infrastructure/adapters/bitcoin-adapter.d.ts.map +1 -0
  244. package/dist/stark-settlement/infrastructure/adapters/bitcoin-adapter.js +187 -0
  245. package/dist/stark-settlement/infrastructure/adapters/clock-adapter.d.ts +59 -0
  246. package/dist/stark-settlement/infrastructure/adapters/clock-adapter.d.ts.map +1 -0
  247. package/dist/stark-settlement/infrastructure/adapters/clock-adapter.js +85 -0
  248. package/dist/stark-settlement/infrastructure/adapters/dilithium-adapter.d.ts +60 -0
  249. package/dist/stark-settlement/infrastructure/adapters/dilithium-adapter.d.ts.map +1 -0
  250. package/dist/stark-settlement/infrastructure/adapters/dilithium-adapter.js +104 -0
  251. package/dist/stark-settlement/infrastructure/adapters/event-emitter-adapter.d.ts +115 -0
  252. package/dist/stark-settlement/infrastructure/adapters/event-emitter-adapter.d.ts.map +1 -0
  253. package/dist/stark-settlement/infrastructure/adapters/event-emitter-adapter.js +191 -0
  254. package/dist/stark-settlement/infrastructure/adapters/fiat-adapter.d.ts +65 -0
  255. package/dist/stark-settlement/infrastructure/adapters/fiat-adapter.d.ts.map +1 -0
  256. package/dist/stark-settlement/infrastructure/adapters/fiat-adapter.js +207 -0
  257. package/dist/stark-settlement/infrastructure/adapters/mock-stark-adapter.d.ts +73 -0
  258. package/dist/stark-settlement/infrastructure/adapters/mock-stark-adapter.d.ts.map +1 -0
  259. package/dist/stark-settlement/infrastructure/adapters/mock-stark-adapter.js +287 -0
  260. package/dist/stark-settlement/infrastructure/adapters/solana-adapter.d.ts +78 -0
  261. package/dist/stark-settlement/infrastructure/adapters/solana-adapter.d.ts.map +1 -0
  262. package/dist/stark-settlement/infrastructure/adapters/solana-adapter.js +172 -0
  263. package/dist/stark-settlement/infrastructure/adapters/starknet-proof-adapter.d.ts +56 -0
  264. package/dist/stark-settlement/infrastructure/adapters/starknet-proof-adapter.d.ts.map +1 -0
  265. package/dist/stark-settlement/infrastructure/adapters/starknet-proof-adapter.js +261 -0
  266. package/dist/stark-settlement/infrastructure/adapters/stone-proof-adapter.d.ts +125 -0
  267. package/dist/stark-settlement/infrastructure/adapters/stone-proof-adapter.d.ts.map +1 -0
  268. package/dist/stark-settlement/infrastructure/adapters/stone-proof-adapter.js +416 -0
  269. package/dist/stark-settlement/infrastructure/persistence/ledger-store.d.ts +68 -0
  270. package/dist/stark-settlement/infrastructure/persistence/ledger-store.d.ts.map +1 -0
  271. package/dist/stark-settlement/infrastructure/persistence/ledger-store.js +238 -0
  272. package/dist/stark-settlement/infrastructure/persistence/offset-store.d.ts +30 -0
  273. package/dist/stark-settlement/infrastructure/persistence/offset-store.d.ts.map +1 -0
  274. package/dist/stark-settlement/infrastructure/persistence/offset-store.js +57 -0
  275. package/dist/stark-settlement/infrastructure/persistence/outbox-store.d.ts +45 -0
  276. package/dist/stark-settlement/infrastructure/persistence/outbox-store.d.ts.map +1 -0
  277. package/dist/stark-settlement/infrastructure/persistence/outbox-store.js +171 -0
  278. package/dist/traceability/application/recall-assessor.d.ts +13 -0
  279. package/dist/traceability/application/recall-assessor.d.ts.map +1 -0
  280. package/dist/traceability/application/recall-assessor.js +74 -0
  281. package/dist/traceability/domain/entities.d.ts +23 -0
  282. package/dist/traceability/domain/entities.d.ts.map +1 -0
  283. package/dist/traceability/domain/entities.js +1 -0
  284. package/dist/traceability/domain/ports.d.ts +23 -0
  285. package/dist/traceability/domain/ports.d.ts.map +1 -0
  286. package/dist/traceability/domain/ports.js +1 -0
  287. package/dist/traceability/domain/recall.d.ts +12 -0
  288. package/dist/traceability/domain/recall.d.ts.map +1 -0
  289. package/dist/traceability/domain/recall.js +1 -0
  290. package/dist/traceability/index.d.ts +22 -0
  291. package/dist/traceability/index.d.ts.map +1 -0
  292. package/dist/traceability/index.js +26 -0
  293. package/dist/traceability/infrastructure/in-memory-store.d.ts +13 -0
  294. package/dist/traceability/infrastructure/in-memory-store.d.ts.map +1 -0
  295. package/dist/traceability/infrastructure/in-memory-store.js +24 -0
  296. package/package.json +12 -9
@@ -0,0 +1,135 @@
1
+ import type { RandomnessProvider, CommitmentProvider } from "./ports.js";
2
+ export { FieldArithmetic, getFieldConfig, DEMO_PRIME, PRODUCTION_PRIME, productionField, } from "./field.js";
3
+ export type { FieldConfig, FieldMode } from "./field.js";
4
+ export interface PartyConfig {
5
+ id: string;
6
+ name: string;
7
+ endpoint: string;
8
+ }
9
+ export interface SecretShare {
10
+ partyId: string;
11
+ shareIndex: number;
12
+ shareCount: number;
13
+ value: number;
14
+ nonce: string;
15
+ commitment: string;
16
+ }
17
+ export type ComputationOp = "sum" | "threshold";
18
+ export interface SumResult {
19
+ computationId: string;
20
+ op: "sum";
21
+ participantCount: number;
22
+ aggregate: number;
23
+ meta: Record<string, string | number | boolean>;
24
+ integrityProof: string;
25
+ }
26
+ export interface ThresholdResult {
27
+ computationId: string;
28
+ op: "threshold";
29
+ participantCount: number;
30
+ exceeded: boolean;
31
+ meta: Record<string, string | number | boolean>;
32
+ integrityProof: string;
33
+ }
34
+ export type ComputationResult = SumResult | ThresholdResult;
35
+ export interface ResourceQuotaConfig {
36
+ /** Maximum active sessions per party. Default: 100 */
37
+ maxSessionsPerParty: number;
38
+ /** Maximum total active sessions. Default: 1000 */
39
+ maxTotalSessions: number;
40
+ /** Session TTL in milliseconds. Default: 5 minutes */
41
+ sessionTtlMs: number;
42
+ /** Maximum memory for shares in bytes. Default: 10MB */
43
+ maxMemoryBytes: number;
44
+ }
45
+ export declare const DEFAULT_QUOTA_CONFIG: ResourceQuotaConfig;
46
+ export interface ResourceQuotaManager {
47
+ checkSessionQuota(partyId: string): boolean;
48
+ checkTotalSessionQuota(): boolean;
49
+ checkMemoryQuota(additionalBytes: number): boolean;
50
+ recordSession(partyId: string, computationId: string): void;
51
+ releaseSession(computationId: string): void;
52
+ getUsage(): ResourceUsage;
53
+ }
54
+ export interface ResourceUsage {
55
+ totalSessions: number;
56
+ sessionsByParty: Map<string, number>;
57
+ estimatedMemoryBytes: number;
58
+ oldestSessionAgeMs: number;
59
+ }
60
+ export declare class InMemoryResourceQuotaManager implements ResourceQuotaManager {
61
+ private readonly config;
62
+ private readonly sessionsByParty;
63
+ private readonly sessionCreatedAt;
64
+ private estimatedMemoryBytes;
65
+ constructor(config?: Partial<ResourceQuotaConfig>);
66
+ checkSessionQuota(partyId: string): boolean;
67
+ checkTotalSessionQuota(): boolean;
68
+ checkMemoryQuota(additionalBytes: number): boolean;
69
+ recordSession(partyId: string, computationId: string): void;
70
+ releaseSession(computationId: string): void;
71
+ getUsage(): ResourceUsage;
72
+ /** Expire sessions older than TTL. Returns number of expired sessions. */
73
+ expireOldSessions(): number;
74
+ }
75
+ export interface MPCEngineConfig {
76
+ quotaManager?: ResourceQuotaManager;
77
+ /** Optional randomness provider for dependency injection (testing). */
78
+ randomnessProvider?: RandomnessProvider;
79
+ /** Optional commitment provider for dependency injection (testing). */
80
+ commitmentProvider?: CommitmentProvider;
81
+ }
82
+ export declare class MPCEngine {
83
+ private readonly parties;
84
+ private readonly rounds;
85
+ private readonly quotaManager;
86
+ private readonly randomness;
87
+ private readonly commitment;
88
+ constructor(config?: MPCEngineConfig);
89
+ registerParty(party: PartyConfig): void;
90
+ /**
91
+ * Split `secret` into `partyIds.length` additive shares.
92
+ * Any strict subset of shares reveals nothing about the secret;
93
+ * summing all shares reconstructs the original value.
94
+ */
95
+ splitSecret(secret: number, partyIds: string[]): SecretShare[];
96
+ submitShare(computationId: string, share: SecretShare): void;
97
+ /**
98
+ * - **sum**: reconstructs the aggregate value from all shares.
99
+ * - **threshold**: checks whether the aggregate meets a given
100
+ * limit supplied via the `threshold` parameter.
101
+ */
102
+ compute(computationId: string, op: "sum", opts?: {
103
+ threshold?: number;
104
+ }): SumResult;
105
+ compute(computationId: string, op: "threshold", opts?: {
106
+ threshold?: number;
107
+ }): ThresholdResult;
108
+ verifyIntegrity(computationId: string): boolean;
109
+ /**
110
+ * Release a completed computation and free associated resources.
111
+ * Call this after compute() to prevent memory accumulation.
112
+ */
113
+ releaseComputation(computationId: string): void;
114
+ /**
115
+ * Get current resource usage statistics.
116
+ * Returns null if no quota manager is configured.
117
+ */
118
+ getResourceUsage(): ResourceUsage | null;
119
+ /**
120
+ * Expire stale sessions that have exceeded TTL.
121
+ * Returns number of expired sessions.
122
+ */
123
+ expireStaleSessions(): number;
124
+ }
125
+ export type { RandomnessProvider, CommitmentProvider } from "./ports.js";
126
+ export { NodeRandomnessProvider, NodeCommitmentProvider, defaultRandomnessProvider, defaultCommitmentProvider, } from "./adapters.js";
127
+ export { KyberKem, ML_KEM_SIZES } from "./kyber.js";
128
+ export type { KyberKeyPair, KemEncapsulation, KemAuditRecord, MlKemParams, } from "./kyber.js";
129
+ export { HybridKem } from "./hybrid-kem.js";
130
+ export type { HybridKeyPairs, HybridEncapsulation, HybridDecapsulation, } from "./hybrid-kem.js";
131
+ export { MlDsaSigner, ML_DSA_SIZES } from "./dsa.js";
132
+ export type { DsaKeyPair, DsaSignatureResult, DsaAuditRecord, MlDsaParams, } from "./dsa.js";
133
+ export { QuantumResistantVault } from "./quantum.js";
134
+ export type { ThresholdShare, HashLadderKey, QuantumResistantAnchor, VaultConfig, } from "./quantum.js";
135
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mpc/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,348 @@
1
+ import { defaultRandomnessProvider, defaultCommitmentProvider, } from "./adapters.js";
2
+ /** Estimated bytes per share entry for memory quota tracking */
3
+ const BYTES_PER_SHARE = 200;
4
+ // Re-export field arithmetic for advanced use cases
5
+ // Note: demoField is intentionally NOT exported to prevent accidental use in production.
6
+ // Use `new FieldArithmetic({ mode: "demo", prime: DEMO_PRIME })` explicitly in tests.
7
+ export { FieldArithmetic, getFieldConfig, DEMO_PRIME, PRODUCTION_PRIME, productionField, } from "./field.js";
8
+ export const DEFAULT_QUOTA_CONFIG = {
9
+ maxSessionsPerParty: 100,
10
+ maxTotalSessions: 1000,
11
+ sessionTtlMs: 5 * 60 * 1000, // 5 minutes
12
+ maxMemoryBytes: 10 * 1024 * 1024, // 10MB
13
+ };
14
+ export class InMemoryResourceQuotaManager {
15
+ config;
16
+ sessionsByParty = new Map();
17
+ sessionCreatedAt = new Map();
18
+ estimatedMemoryBytes = 0;
19
+ constructor(config = {}) {
20
+ this.config = { ...DEFAULT_QUOTA_CONFIG, ...config };
21
+ }
22
+ checkSessionQuota(partyId) {
23
+ const partySessions = this.sessionsByParty.get(partyId);
24
+ if (!partySessions)
25
+ return true;
26
+ return partySessions.size < this.config.maxSessionsPerParty;
27
+ }
28
+ checkTotalSessionQuota() {
29
+ let total = 0;
30
+ for (const sessions of this.sessionsByParty.values()) {
31
+ total += sessions.size;
32
+ }
33
+ return total < this.config.maxTotalSessions;
34
+ }
35
+ checkMemoryQuota(additionalBytes) {
36
+ return (this.estimatedMemoryBytes + additionalBytes <= this.config.maxMemoryBytes);
37
+ }
38
+ recordSession(partyId, computationId) {
39
+ let partySessions = this.sessionsByParty.get(partyId);
40
+ if (!partySessions) {
41
+ partySessions = new Set();
42
+ this.sessionsByParty.set(partyId, partySessions);
43
+ }
44
+ partySessions.add(computationId);
45
+ this.sessionCreatedAt.set(computationId, Date.now());
46
+ this.estimatedMemoryBytes += BYTES_PER_SHARE;
47
+ }
48
+ releaseSession(computationId) {
49
+ for (const [partyId, sessions] of this.sessionsByParty.entries()) {
50
+ if (sessions.delete(computationId)) {
51
+ if (sessions.size === 0) {
52
+ this.sessionsByParty.delete(partyId);
53
+ }
54
+ break;
55
+ }
56
+ }
57
+ this.sessionCreatedAt.delete(computationId);
58
+ this.estimatedMemoryBytes = Math.max(0, this.estimatedMemoryBytes - BYTES_PER_SHARE);
59
+ }
60
+ getUsage() {
61
+ const sessionsByParty = new Map();
62
+ let totalSessions = 0;
63
+ let oldestAge = 0;
64
+ const now = Date.now();
65
+ for (const [partyId, sessions] of this.sessionsByParty.entries()) {
66
+ sessionsByParty.set(partyId, sessions.size);
67
+ totalSessions += sessions.size;
68
+ }
69
+ for (const createdAt of this.sessionCreatedAt.values()) {
70
+ const age = now - createdAt;
71
+ if (age > oldestAge)
72
+ oldestAge = age;
73
+ }
74
+ return {
75
+ totalSessions,
76
+ sessionsByParty,
77
+ estimatedMemoryBytes: this.estimatedMemoryBytes,
78
+ oldestSessionAgeMs: oldestAge,
79
+ };
80
+ }
81
+ /** Expire sessions older than TTL. Returns number of expired sessions. */
82
+ expireOldSessions() {
83
+ const now = Date.now();
84
+ const expired = [];
85
+ for (const [computationId, createdAt] of this.sessionCreatedAt.entries()) {
86
+ if (now - createdAt > this.config.sessionTtlMs) {
87
+ expired.push(computationId);
88
+ }
89
+ }
90
+ for (const computationId of expired) {
91
+ this.releaseSession(computationId);
92
+ }
93
+ return expired.length;
94
+ }
95
+ }
96
+ export class MPCEngine {
97
+ parties = new Map();
98
+ rounds = new Map();
99
+ quotaManager;
100
+ randomness;
101
+ commitment;
102
+ constructor(config = {}) {
103
+ this.quotaManager = config.quotaManager ?? null;
104
+ this.randomness = config.randomnessProvider ?? defaultRandomnessProvider;
105
+ this.commitment = config.commitmentProvider ?? defaultCommitmentProvider;
106
+ }
107
+ registerParty(party) {
108
+ this.parties.set(party.id, party);
109
+ }
110
+ /**
111
+ * Split `secret` into `partyIds.length` additive shares.
112
+ * Any strict subset of shares reveals nothing about the secret;
113
+ * summing all shares reconstructs the original value.
114
+ */
115
+ splitSecret(secret, partyIds) {
116
+ if (partyIds.length < 2) {
117
+ throw new Error("At least two parties are required for secret sharing");
118
+ }
119
+ const shares = [];
120
+ let remaining = secret;
121
+ // Use a range large enough to make individual shares
122
+ // statistically indistinguishable from random.
123
+ // Node.js randomInt supports a max span of 2^48 − 1.
124
+ const lo = -(2 ** 47) + 1;
125
+ const hi = 2 ** 47;
126
+ for (let i = 0; i < partyIds.length - 1; i++) {
127
+ const value = this.randomness.randomInt(lo, hi);
128
+ remaining -= value;
129
+ const nonce = this.randomness.randomBytes(16).toString("hex");
130
+ shares.push({
131
+ partyId: partyIds[i],
132
+ shareIndex: i,
133
+ shareCount: partyIds.length,
134
+ value,
135
+ nonce,
136
+ commitment: this.commitment.commitShare(partyIds[i], i, value, nonce),
137
+ });
138
+ }
139
+ const lastNonce = this.randomness.randomBytes(16).toString("hex");
140
+ shares.push({
141
+ partyId: partyIds[partyIds.length - 1],
142
+ shareIndex: partyIds.length - 1,
143
+ shareCount: partyIds.length,
144
+ value: remaining,
145
+ nonce: lastNonce,
146
+ commitment: this.commitment.commitShare(partyIds[partyIds.length - 1], partyIds.length - 1, remaining, lastNonce),
147
+ });
148
+ return shares;
149
+ }
150
+ submitShare(computationId, share) {
151
+ const party = this.parties.get(share.partyId);
152
+ if (!party) {
153
+ throw new Error(`Unknown party ${share.partyId}`);
154
+ }
155
+ // Check resource quotas before accepting new sessions
156
+ if (this.quotaManager) {
157
+ // For new sessions, verify quotas
158
+ if (!this.rounds.has(computationId)) {
159
+ if (!this.quotaManager.checkTotalSessionQuota()) {
160
+ throw new Error(`Resource quota exceeded: maximum total sessions reached`);
161
+ }
162
+ if (!this.quotaManager.checkSessionQuota(share.partyId)) {
163
+ throw new Error(`Resource quota exceeded: party ${share.partyId} has too many active sessions`);
164
+ }
165
+ if (!this.quotaManager.checkMemoryQuota(BYTES_PER_SHARE * share.shareCount)) {
166
+ throw new Error(`Resource quota exceeded: memory limit would be exceeded`);
167
+ }
168
+ }
169
+ }
170
+ // Verify commitment before accepting the share.
171
+ // This prevents a malicious party from submitting a bogus value
172
+ // with a valid-looking commitment, which would corrupt the result.
173
+ // Uses timing-safe comparison to prevent timing attacks that could
174
+ // leak information about valid commitment prefixes.
175
+ const expected = this.commitment.commitShare(share.partyId, share.shareIndex, share.value, share.nonce);
176
+ if (!this.commitment.timingSafeCompare(expected, share.commitment)) {
177
+ throw new Error(`Commitment verification failed for party ${share.partyId} in computation ${computationId}`);
178
+ }
179
+ let round = this.rounds.get(computationId);
180
+ if (!round) {
181
+ round = {
182
+ expectedShareCount: share.shareCount,
183
+ shares: new Map(),
184
+ createdAt: Date.now(),
185
+ usedNonces: new Set(),
186
+ };
187
+ this.rounds.set(computationId, round);
188
+ // Record session for quota tracking
189
+ if (this.quotaManager) {
190
+ this.quotaManager.recordSession(share.partyId, computationId);
191
+ }
192
+ }
193
+ if (share.shareCount !== round.expectedShareCount) {
194
+ throw new Error(`Inconsistent share count for computation ${computationId}`);
195
+ }
196
+ if (round.shares.has(share.partyId)) {
197
+ throw new Error(`Party ${share.partyId} already submitted a share for ${computationId}`);
198
+ }
199
+ // SECURITY: Prevent replay attacks within the same computation.
200
+ // Nonces must be unique per computation to prevent an attacker from
201
+ // submitting the same share twice (e.g., to corrupt the aggregate).
202
+ // Note: Cross-computation replay is prevented by commitment binding
203
+ // (partyId + shareIndex + value + nonce) which makes replayed shares
204
+ // fail commitment verification in a different computation context.
205
+ if (round.usedNonces.has(share.nonce)) {
206
+ throw new Error(`Replay attack detected: nonce already used in computation ${computationId}`);
207
+ }
208
+ round.usedNonces.add(share.nonce);
209
+ // Store a defensive copy to prevent callers from mutating the share
210
+ // after submission, which could corrupt the computation result.
211
+ round.shares.set(share.partyId, { ...share });
212
+ }
213
+ compute(computationId, op, opts) {
214
+ const round = this.rounds.get(computationId);
215
+ if (!round || round.shares.size === 0) {
216
+ throw new Error(`No shares submitted for computation ${computationId}`);
217
+ }
218
+ const participantCount = round.shares.size;
219
+ if (participantCount !== round.expectedShareCount) {
220
+ throw new Error(`Incomplete share set for computation ${computationId}: expected ${round.expectedShareCount}, got ${participantCount}`);
221
+ }
222
+ switch (op) {
223
+ case "sum": {
224
+ // Verify commitments BEFORE aggregating values to ensure
225
+ // no share was mutated between submitShare and compute.
226
+ const commitmentsVerified = this.verifyIntegrity(computationId);
227
+ if (!commitmentsVerified) {
228
+ throw new Error(`Commitment verification failed during computation ${computationId} — aborting to prevent corrupted result`);
229
+ }
230
+ let aggregate = 0;
231
+ for (const share of round.shares.values()) {
232
+ aggregate += share.value;
233
+ }
234
+ return {
235
+ computationId,
236
+ op: "sum",
237
+ participantCount,
238
+ aggregate,
239
+ meta: {
240
+ operation: "additive-reconstruction",
241
+ commitmentsVerified,
242
+ },
243
+ integrityProof: this.commitment.sha256hex(JSON.stringify({
244
+ computationId,
245
+ op: "sum",
246
+ participantCount,
247
+ aggregate,
248
+ commitmentsVerified,
249
+ })),
250
+ };
251
+ }
252
+ case "threshold": {
253
+ // Verify commitments BEFORE aggregating values to ensure
254
+ // no share was mutated between submitShare and compute.
255
+ const commitmentsVerified = this.verifyIntegrity(computationId);
256
+ if (!commitmentsVerified) {
257
+ throw new Error(`Commitment verification failed during computation ${computationId} — aborting to prevent corrupted result`);
258
+ }
259
+ const t = opts?.threshold ?? 0;
260
+ let total = 0;
261
+ for (const share of round.shares.values()) {
262
+ total += share.value;
263
+ }
264
+ const exceeded = total >= t;
265
+ return {
266
+ computationId,
267
+ op: "threshold",
268
+ participantCount,
269
+ exceeded,
270
+ meta: {
271
+ operation: "threshold-check",
272
+ threshold: t,
273
+ commitmentsVerified,
274
+ },
275
+ integrityProof: this.commitment.sha256hex(JSON.stringify({
276
+ computationId,
277
+ op: "threshold",
278
+ participantCount,
279
+ exceeded,
280
+ commitmentsVerified,
281
+ })),
282
+ };
283
+ }
284
+ }
285
+ }
286
+ verifyIntegrity(computationId) {
287
+ const round = this.rounds.get(computationId);
288
+ if (!round)
289
+ return false;
290
+ for (const share of round.shares.values()) {
291
+ const expected = this.commitment.commitShare(share.partyId, share.shareIndex, share.value, share.nonce);
292
+ // SECURITY: Use timing-safe comparison to prevent timing attacks
293
+ // that could leak information about valid commitment prefixes.
294
+ if (!this.commitment.timingSafeCompare(expected, share.commitment)) {
295
+ return false;
296
+ }
297
+ }
298
+ return true;
299
+ }
300
+ /**
301
+ * Release a completed computation and free associated resources.
302
+ * Call this after compute() to prevent memory accumulation.
303
+ */
304
+ releaseComputation(computationId) {
305
+ const round = this.rounds.get(computationId);
306
+ if (round) {
307
+ this.rounds.delete(computationId);
308
+ if (this.quotaManager) {
309
+ this.quotaManager.releaseSession(computationId);
310
+ }
311
+ }
312
+ }
313
+ /**
314
+ * Get current resource usage statistics.
315
+ * Returns null if no quota manager is configured.
316
+ */
317
+ getResourceUsage() {
318
+ return this.quotaManager?.getUsage() ?? null;
319
+ }
320
+ /**
321
+ * Expire stale sessions that have exceeded TTL.
322
+ * Returns number of expired sessions.
323
+ */
324
+ expireStaleSessions() {
325
+ if (!this.quotaManager)
326
+ return 0;
327
+ const manager = this.quotaManager;
328
+ if (typeof manager.expireOldSessions !== "function")
329
+ return 0;
330
+ const expiredCount = manager.expireOldSessions();
331
+ // Also clean up rounds map for expired sessions
332
+ const now = Date.now();
333
+ const config = DEFAULT_QUOTA_CONFIG;
334
+ for (const [computationId, round] of this.rounds.entries()) {
335
+ if (now - round.createdAt > config.sessionTtlMs) {
336
+ this.rounds.delete(computationId);
337
+ }
338
+ }
339
+ return expiredCount;
340
+ }
341
+ }
342
+ export { NodeRandomnessProvider, NodeCommitmentProvider, defaultRandomnessProvider, defaultCommitmentProvider, } from "./adapters.js";
343
+ // Re-export ML-KEM and Hybrid KEM so consumers can reach them via the module
344
+ // root without needing to know the internal file layout.
345
+ export { KyberKem, ML_KEM_SIZES } from "./kyber.js";
346
+ export { HybridKem } from "./hybrid-kem.js";
347
+ export { MlDsaSigner, ML_DSA_SIZES } from "./dsa.js";
348
+ export { QuantumResistantVault } from "./quantum.js";
@@ -0,0 +1,134 @@
1
+ /**
2
+ * ML-KEM (Kyber) — Key Encapsulation Mechanism
3
+ *
4
+ * Classical key exchange (ECDH, RSA) relies on the hardness of the discrete
5
+ * logarithm and integer factorisation problems. Shor's algorithm, running on
6
+ * a sufficiently large cryptographically-relevant quantum computer (CRQC),
7
+ * solves both in polynomial time — meaning today's encrypted traffic could be
8
+ * recorded now and decrypted later once CRQCs mature ("harvest-now,
9
+ * decrypt-later" attacks).
10
+ *
11
+ * ML-KEM is the NIST-standardised Key Encapsulation Mechanism designed to
12
+ * replace ECDH in key exchange. It is based on the Module-Lattice problem
13
+ * (MLWE), which has no known quantum speedup beyond Grover's algorithm
14
+ * (affecting only symmetric-key security, and only by halving the bit level).
15
+ *
16
+ * Standard: NIST FIPS 203 (finalised August 2024)
17
+ * Reference: https://csrc.nist.gov/pubs/fips/203/final
18
+ *
19
+ * This module wraps @noble/post-quantum, a pure-TypeScript implementation with
20
+ * zero native-code dependencies, which makes it platform-portable and easy to
21
+ * audit.
22
+ */
23
+ /**
24
+ * ML-KEM parameter sets standardised in FIPS 203.
25
+ *
26
+ * The number (512 / 768 / 1024) corresponds to the module dimension k:
27
+ * - 512 → k=2, ~128-bit post-quantum security (comparable to AES-128)
28
+ * - 768 → k=3, ~192-bit post-quantum security (comparable to AES-192)
29
+ * - 1024 → k=4, ~256-bit post-quantum security (comparable to AES-256)
30
+ *
31
+ * NIST recommends ML-KEM-768 as the general-purpose choice for new systems.
32
+ * ML-KEM-1024 is appropriate when the highest assurance level is required
33
+ * (e.g., protecting data that must stay secret for 30+ years).
34
+ */
35
+ export type MlKemParams = "ml-kem-512" | "ml-kem-768" | "ml-kem-1024";
36
+ /**
37
+ * Public key, secret key, and ciphertext lengths (in bytes) for each
38
+ * parameter set. Useful for validation and test assertions.
39
+ */
40
+ export declare const ML_KEM_SIZES: Record<MlKemParams, {
41
+ publicKey: number;
42
+ secretKey: number;
43
+ ciphertext: number;
44
+ sharedSecret: number;
45
+ }>;
46
+ export interface KyberKeyPair {
47
+ publicKey: Uint8Array;
48
+ secretKey: Uint8Array;
49
+ /** Which ML-KEM parameter set this keypair belongs to. */
50
+ params: MlKemParams;
51
+ }
52
+ export interface KemEncapsulation {
53
+ /**
54
+ * The ciphertext to send to the recipient. It contains everything needed
55
+ * to recover the sharedSecret with the matching secretKey.
56
+ */
57
+ ciphertext: Uint8Array;
58
+ /**
59
+ * The shared secret — 32 bytes of uniform randomness. The sender uses this
60
+ * to derive a symmetric key (e.g., AES-256) via HKDF. Never transmit this
61
+ * value; only transmit `ciphertext`.
62
+ */
63
+ sharedSecret: Uint8Array;
64
+ /**
65
+ * SHA-256 hex digest of the ciphertext's hex encoding.
66
+ *
67
+ * Computed as: sha256hex(Buffer.from(ciphertext).toString("hex"))
68
+ *
69
+ * This means the hash is over the hex-encoded string representation of the
70
+ * ciphertext bytes, not the raw bytes directly. Suitable for on-chain
71
+ * commitments or audit logs — proves a specific ciphertext was used without
72
+ * revealing the shared secret.
73
+ */
74
+ auditCommitment: string;
75
+ }
76
+ export interface KemAuditRecord {
77
+ params: MlKemParams;
78
+ /** SHA-256 of the public key — stable identifier for the recipient's keypair. */
79
+ publicKeyHash: string;
80
+ /** SHA-256 of the ciphertext — unique per session. */
81
+ ciphertextHash: string;
82
+ /** ISO-8601 timestamp of the encapsulation event. */
83
+ timestamp: string;
84
+ /** Byte length of the AES key derived from the shared secret via HKDF. */
85
+ derivedKeyLength: number;
86
+ }
87
+ export declare class KyberKem {
88
+ #private;
89
+ /**
90
+ * Generate a new ML-KEM keypair.
91
+ *
92
+ * The public key is shared with anyone who needs to send you an encrypted
93
+ * session key. The secret key must be stored securely — ideally in an HSM
94
+ * or hardware-backed key store.
95
+ */
96
+ generateKeyPair(params: MlKemParams): KyberKeyPair;
97
+ /**
98
+ * Sender-side operation: encapsulate a fresh random shared secret using
99
+ * the recipient's public key.
100
+ *
101
+ * Returns the ciphertext (to send) and the sharedSecret (to use locally for
102
+ * key derivation). The sharedSecret is never transmitted.
103
+ */
104
+ encapsulate(publicKey: Uint8Array, params: MlKemParams): KemEncapsulation;
105
+ /**
106
+ * Receiver-side operation: recover the sharedSecret from a ciphertext using
107
+ * the secret key.
108
+ *
109
+ * If the ciphertext was produced with a different public key, ML-KEM
110
+ * returns a pseudorandom value instead of the real shared secret — this is
111
+ * the implicit rejection property that prevents chosen-ciphertext attacks.
112
+ */
113
+ decapsulate(ciphertext: Uint8Array, secretKey: Uint8Array, params: MlKemParams): Uint8Array;
114
+ /**
115
+ * Derive a symmetric key from an ML-KEM shared secret using HKDF-SHA256.
116
+ *
117
+ * The shared secret from ML-KEM is already 32 bytes of uniform randomness,
118
+ * but running it through HKDF lets you bind context (e.g., session IDs,
119
+ * party identifiers) into the derived key — useful for domain separation.
120
+ *
121
+ * @param sharedSecret - Raw 32-byte output from encapsulate/decapsulate
122
+ * @param info - Optional context string bound into the derived key
123
+ * @param salt - Optional random salt (defaults to 32 zero bytes if omitted)
124
+ */
125
+ deriveAesKey(sharedSecret: Uint8Array, info?: string, salt?: Buffer): Buffer;
126
+ /**
127
+ * Build an audit record for a completed encapsulation round.
128
+ * Suitable for writing to an immutable ledger (Fabric, Besu, Corda) as
129
+ * proof that a particular key exchange occurred without revealing the
130
+ * shared secret.
131
+ */
132
+ auditRecord(encap: KemEncapsulation, publicKey: Uint8Array, params: MlKemParams): KemAuditRecord;
133
+ }
134
+ //# sourceMappingURL=kyber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kyber.d.ts","sourceRoot":"","sources":["../../src/mpc/kyber.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAgBH;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa,CAAC;AAMtE;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAC/B,WAAW,EACX;IACE,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAoBF,CAAC;AAMF,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,UAAU,CAAC;IACtB,SAAS,EAAE,UAAU,CAAC;IACtB,0DAA0D;IAC1D,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,UAAU,EAAE,UAAU,CAAC;IACvB;;;;OAIG;IACH,YAAY,EAAE,UAAU,CAAC;IACzB;;;;;;;;;OASG;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,CAAC;IACpB,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,cAAc,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAMD,qBAAa,QAAQ;;IACnB;;;;;;OAMG;IACH,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY;IAMlD;;;;;;OAMG;IACH,WAAW,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,gBAAgB;IAUzE;;;;;;;OAOG;IACH,WAAW,CACT,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,UAAU,EACrB,MAAM,EAAE,WAAW,GAClB,UAAU;IAKb;;;;;;;;;;OAUG;IACH,YAAY,CACV,YAAY,EAAE,UAAU,EACxB,IAAI,SAAsB,EAC1B,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM;IAgBT;;;;;OAKG;IACH,WAAW,CACT,KAAK,EAAE,gBAAgB,EACvB,SAAS,EAAE,UAAU,EACrB,MAAM,EAAE,WAAW,GAClB,cAAc;CAwBlB"}