@inco/lightning-js 0.0.0-bootstrap.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 (283) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +587 -0
  3. package/dist/cjs/advancedacl/index.d.ts +2 -0
  4. package/dist/cjs/advancedacl/index.js +19 -0
  5. package/dist/cjs/advancedacl/session-key.d.ts +95 -0
  6. package/dist/cjs/advancedacl/session-key.js +376 -0
  7. package/dist/cjs/advancedacl/types.d.ts +16 -0
  8. package/dist/cjs/advancedacl/types.js +3 -0
  9. package/dist/cjs/attestedcompute/attested-compute.d.ts +65 -0
  10. package/dist/cjs/attestedcompute/attested-compute.js +80 -0
  11. package/dist/cjs/attestedcompute/types.d.ts +35 -0
  12. package/dist/cjs/attestedcompute/types.js +46 -0
  13. package/dist/cjs/attesteddecrypt/attested-decrypt.d.ts +61 -0
  14. package/dist/cjs/attesteddecrypt/attested-decrypt.js +118 -0
  15. package/dist/cjs/attesteddecrypt/index.d.ts +1 -0
  16. package/dist/cjs/attesteddecrypt/index.js +18 -0
  17. package/dist/cjs/attesteddecrypt/types.d.ts +27 -0
  18. package/dist/cjs/attesteddecrypt/types.js +16 -0
  19. package/dist/cjs/attestedreveal/attested-reveal.d.ts +21 -0
  20. package/dist/cjs/attestedreveal/attested-reveal.js +31 -0
  21. package/dist/cjs/attestedreveal/index.d.ts +2 -0
  22. package/dist/cjs/attestedreveal/index.js +21 -0
  23. package/dist/cjs/attestedreveal/types.d.ts +4 -0
  24. package/dist/cjs/attestedreveal/types.js +13 -0
  25. package/dist/cjs/binary.d.ts +104 -0
  26. package/dist/cjs/binary.js +171 -0
  27. package/dist/cjs/chain.d.ts +50 -0
  28. package/dist/cjs/chain.js +62 -0
  29. package/dist/cjs/eip712/eip712.d.ts +18 -0
  30. package/dist/cjs/eip712/eip712.js +51 -0
  31. package/dist/cjs/eip712/index.d.ts +1 -0
  32. package/dist/cjs/eip712/index.js +8 -0
  33. package/dist/cjs/elistattesteddecrypt/elist-attested-decrypt.d.ts +51 -0
  34. package/dist/cjs/elistattesteddecrypt/elist-attested-decrypt.js +94 -0
  35. package/dist/cjs/elistattesteddecrypt/index.d.ts +2 -0
  36. package/dist/cjs/elistattesteddecrypt/index.js +22 -0
  37. package/dist/cjs/elistattesteddecrypt/types.d.ts +31 -0
  38. package/dist/cjs/elistattesteddecrypt/types.js +16 -0
  39. package/dist/cjs/encryption/encryption.d.ts +235 -0
  40. package/dist/cjs/encryption/encryption.js +226 -0
  41. package/dist/cjs/encryption/index.d.ts +1 -0
  42. package/dist/cjs/encryption/index.js +19 -0
  43. package/dist/cjs/generated/abis/add-two.d.ts +117 -0
  44. package/dist/cjs/generated/abis/add-two.js +80 -0
  45. package/dist/cjs/generated/abis/lightning.d.ts +3362 -0
  46. package/dist/cjs/generated/abis/lightning.js +2445 -0
  47. package/dist/cjs/generated/abis/test-elist.d.ts +276 -0
  48. package/dist/cjs/generated/abis/test-elist.js +168 -0
  49. package/dist/cjs/generated/abis/verifier.d.ts +1353 -0
  50. package/dist/cjs/generated/abis/verifier.js +954 -0
  51. package/dist/cjs/generated/es/inco/covalidator/compute/v1/server_pb.d.ts +1494 -0
  52. package/dist/cjs/generated/es/inco/covalidator/compute/v1/server_pb.js +395 -0
  53. package/dist/cjs/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +247 -0
  54. package/dist/cjs/generated/es/inco/covalidator/compute/v1/types_pb.js +80 -0
  55. package/dist/cjs/generated/es/inco/helioswrapper/v1/helioswrapper_pb.d.ts +77 -0
  56. package/dist/cjs/generated/es/inco/helioswrapper/v1/helioswrapper_pb.js +28 -0
  57. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +685 -0
  58. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.js +100 -0
  59. package/dist/cjs/generated/es/inco/kms/lite/v1/types_pb.d.ts +289 -0
  60. package/dist/cjs/generated/es/inco/kms/lite/v1/types_pb.js +136 -0
  61. package/dist/cjs/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.d.ts +371 -0
  62. package/dist/cjs/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.js +88 -0
  63. package/dist/cjs/generated/lightning.d.ts +830 -0
  64. package/dist/cjs/generated/lightning.js +872 -0
  65. package/dist/cjs/generated/local-node.d.ts +50 -0
  66. package/dist/cjs/generated/local-node.js +107 -0
  67. package/dist/cjs/handle.d.ts +123 -0
  68. package/dist/cjs/handle.js +221 -0
  69. package/dist/cjs/index.d.ts +5 -0
  70. package/dist/cjs/index.js +31 -0
  71. package/dist/cjs/kms/client.d.ts +12 -0
  72. package/dist/cjs/kms/client.js +47 -0
  73. package/dist/cjs/kms/quorumClient.d.ts +65 -0
  74. package/dist/cjs/kms/quorumClient.js +463 -0
  75. package/dist/cjs/kms/quorumConsistency.d.ts +82 -0
  76. package/dist/cjs/kms/quorumConsistency.js +269 -0
  77. package/dist/cjs/kms/signatureVerification.d.ts +35 -0
  78. package/dist/cjs/kms/signatureVerification.js +88 -0
  79. package/dist/cjs/kms/thresholdPromises.d.ts +8 -0
  80. package/dist/cjs/kms/thresholdPromises.js +62 -0
  81. package/dist/cjs/lite/attested-compute.d.ts +6 -0
  82. package/dist/cjs/lite/attested-compute.js +8 -0
  83. package/dist/cjs/lite/attested-decrypt.d.ts +4 -0
  84. package/dist/cjs/lite/attested-decrypt.js +6 -0
  85. package/dist/cjs/lite/deployments.d.ts +24 -0
  86. package/dist/cjs/lite/deployments.js +21 -0
  87. package/dist/cjs/lite/hadu.d.ts +4 -0
  88. package/dist/cjs/lite/hadu.js +28 -0
  89. package/dist/cjs/lite/index.d.ts +13 -0
  90. package/dist/cjs/lite/index.js +31 -0
  91. package/dist/cjs/lite/lightning.d.ts +459 -0
  92. package/dist/cjs/lite/lightning.js +696 -0
  93. package/dist/cjs/lite/types.d.ts +47 -0
  94. package/dist/cjs/lite/types.js +3 -0
  95. package/dist/cjs/lite/xwing.d.ts +154 -0
  96. package/dist/cjs/lite/xwing.js +326 -0
  97. package/dist/cjs/local/index.d.ts +1 -0
  98. package/dist/cjs/local/index.js +18 -0
  99. package/dist/cjs/local/local-node.d.ts +37 -0
  100. package/dist/cjs/local/local-node.js +80 -0
  101. package/dist/cjs/reencryption/eip712.d.ts +56 -0
  102. package/dist/cjs/reencryption/eip712.js +90 -0
  103. package/dist/cjs/reencryption/index.d.ts +2 -0
  104. package/dist/cjs/reencryption/index.js +19 -0
  105. package/dist/cjs/reencryption/types.d.ts +48 -0
  106. package/dist/cjs/reencryption/types.js +3 -0
  107. package/dist/cjs/retry.d.ts +30 -0
  108. package/dist/cjs/retry.js +87 -0
  109. package/dist/cjs/schema.d.ts +4 -0
  110. package/dist/cjs/schema.js +19 -0
  111. package/dist/cjs/test/mocks.d.ts +20 -0
  112. package/dist/cjs/test/mocks.js +72 -0
  113. package/dist/cjs/viem.d.ts +1141 -0
  114. package/dist/cjs/viem.js +36 -0
  115. package/dist/esm/advancedacl/index.d.ts +2 -0
  116. package/dist/esm/advancedacl/index.js +3 -0
  117. package/dist/esm/advancedacl/session-key.d.ts +95 -0
  118. package/dist/esm/advancedacl/session-key.js +367 -0
  119. package/dist/esm/advancedacl/types.d.ts +16 -0
  120. package/dist/esm/advancedacl/types.js +2 -0
  121. package/dist/esm/attestedcompute/attested-compute.d.ts +65 -0
  122. package/dist/esm/attestedcompute/attested-compute.js +76 -0
  123. package/dist/esm/attestedcompute/types.d.ts +35 -0
  124. package/dist/esm/attestedcompute/types.js +42 -0
  125. package/dist/esm/attesteddecrypt/attested-decrypt.d.ts +61 -0
  126. package/dist/esm/attesteddecrypt/attested-decrypt.js +112 -0
  127. package/dist/esm/attesteddecrypt/index.d.ts +1 -0
  128. package/dist/esm/attesteddecrypt/index.js +2 -0
  129. package/dist/esm/attesteddecrypt/types.d.ts +27 -0
  130. package/dist/esm/attesteddecrypt/types.js +12 -0
  131. package/dist/esm/attestedreveal/attested-reveal.d.ts +21 -0
  132. package/dist/esm/attestedreveal/attested-reveal.js +28 -0
  133. package/dist/esm/attestedreveal/index.d.ts +2 -0
  134. package/dist/esm/attestedreveal/index.js +3 -0
  135. package/dist/esm/attestedreveal/types.d.ts +4 -0
  136. package/dist/esm/attestedreveal/types.js +9 -0
  137. package/dist/esm/binary.d.ts +104 -0
  138. package/dist/esm/binary.js +155 -0
  139. package/dist/esm/chain.d.ts +50 -0
  140. package/dist/esm/chain.js +58 -0
  141. package/dist/esm/eip712/eip712.d.ts +18 -0
  142. package/dist/esm/eip712/eip712.js +46 -0
  143. package/dist/esm/eip712/index.d.ts +1 -0
  144. package/dist/esm/eip712/index.js +2 -0
  145. package/dist/esm/elistattesteddecrypt/elist-attested-decrypt.d.ts +51 -0
  146. package/dist/esm/elistattesteddecrypt/elist-attested-decrypt.js +89 -0
  147. package/dist/esm/elistattesteddecrypt/index.d.ts +2 -0
  148. package/dist/esm/elistattesteddecrypt/index.js +3 -0
  149. package/dist/esm/elistattesteddecrypt/types.d.ts +31 -0
  150. package/dist/esm/elistattesteddecrypt/types.js +12 -0
  151. package/dist/esm/encryption/encryption.d.ts +235 -0
  152. package/dist/esm/encryption/encryption.js +214 -0
  153. package/dist/esm/encryption/index.d.ts +1 -0
  154. package/dist/esm/encryption/index.js +2 -0
  155. package/dist/esm/generated/abis/add-two.d.ts +117 -0
  156. package/dist/esm/generated/abis/add-two.js +77 -0
  157. package/dist/esm/generated/abis/lightning.d.ts +3362 -0
  158. package/dist/esm/generated/abis/lightning.js +2442 -0
  159. package/dist/esm/generated/abis/test-elist.d.ts +276 -0
  160. package/dist/esm/generated/abis/test-elist.js +165 -0
  161. package/dist/esm/generated/abis/verifier.d.ts +1353 -0
  162. package/dist/esm/generated/abis/verifier.js +951 -0
  163. package/dist/esm/generated/es/inco/covalidator/compute/v1/server_pb.d.ts +1494 -0
  164. package/dist/esm/generated/es/inco/covalidator/compute/v1/server_pb.js +392 -0
  165. package/dist/esm/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +247 -0
  166. package/dist/esm/generated/es/inco/covalidator/compute/v1/types_pb.js +77 -0
  167. package/dist/esm/generated/es/inco/helioswrapper/v1/helioswrapper_pb.d.ts +77 -0
  168. package/dist/esm/generated/es/inco/helioswrapper/v1/helioswrapper_pb.js +25 -0
  169. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +685 -0
  170. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.js +97 -0
  171. package/dist/esm/generated/es/inco/kms/lite/v1/types_pb.d.ts +289 -0
  172. package/dist/esm/generated/es/inco/kms/lite/v1/types_pb.js +133 -0
  173. package/dist/esm/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.d.ts +371 -0
  174. package/dist/esm/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.js +85 -0
  175. package/dist/esm/generated/lightning.d.ts +830 -0
  176. package/dist/esm/generated/lightning.js +869 -0
  177. package/dist/esm/generated/local-node.d.ts +50 -0
  178. package/dist/esm/generated/local-node.js +104 -0
  179. package/dist/esm/handle.d.ts +123 -0
  180. package/dist/esm/handle.js +212 -0
  181. package/dist/esm/index.d.ts +5 -0
  182. package/dist/esm/index.js +6 -0
  183. package/dist/esm/kms/client.d.ts +12 -0
  184. package/dist/esm/kms/client.js +40 -0
  185. package/dist/esm/kms/quorumClient.d.ts +65 -0
  186. package/dist/esm/kms/quorumClient.js +459 -0
  187. package/dist/esm/kms/quorumConsistency.d.ts +82 -0
  188. package/dist/esm/kms/quorumConsistency.js +260 -0
  189. package/dist/esm/kms/signatureVerification.d.ts +35 -0
  190. package/dist/esm/kms/signatureVerification.js +84 -0
  191. package/dist/esm/kms/thresholdPromises.d.ts +8 -0
  192. package/dist/esm/kms/thresholdPromises.js +59 -0
  193. package/dist/esm/lite/attested-compute.d.ts +6 -0
  194. package/dist/esm/lite/attested-compute.js +4 -0
  195. package/dist/esm/lite/attested-decrypt.d.ts +4 -0
  196. package/dist/esm/lite/attested-decrypt.js +3 -0
  197. package/dist/esm/lite/deployments.d.ts +24 -0
  198. package/dist/esm/lite/deployments.js +17 -0
  199. package/dist/esm/lite/hadu.d.ts +4 -0
  200. package/dist/esm/lite/hadu.js +24 -0
  201. package/dist/esm/lite/index.d.ts +13 -0
  202. package/dist/esm/lite/index.js +10 -0
  203. package/dist/esm/lite/lightning.d.ts +459 -0
  204. package/dist/esm/lite/lightning.js +692 -0
  205. package/dist/esm/lite/types.d.ts +47 -0
  206. package/dist/esm/lite/types.js +2 -0
  207. package/dist/esm/lite/xwing.d.ts +154 -0
  208. package/dist/esm/lite/xwing.js +311 -0
  209. package/dist/esm/local/index.d.ts +1 -0
  210. package/dist/esm/local/index.js +2 -0
  211. package/dist/esm/local/local-node.d.ts +37 -0
  212. package/dist/esm/local/local-node.js +76 -0
  213. package/dist/esm/reencryption/eip712.d.ts +56 -0
  214. package/dist/esm/reencryption/eip712.js +87 -0
  215. package/dist/esm/reencryption/index.d.ts +2 -0
  216. package/dist/esm/reencryption/index.js +3 -0
  217. package/dist/esm/reencryption/types.d.ts +48 -0
  218. package/dist/esm/reencryption/types.js +2 -0
  219. package/dist/esm/retry.d.ts +30 -0
  220. package/dist/esm/retry.js +82 -0
  221. package/dist/esm/schema.d.ts +4 -0
  222. package/dist/esm/schema.js +15 -0
  223. package/dist/esm/test/mocks.d.ts +20 -0
  224. package/dist/esm/test/mocks.js +64 -0
  225. package/dist/esm/viem.d.ts +1141 -0
  226. package/dist/esm/viem.js +32 -0
  227. package/dist/types/advancedacl/index.d.ts +2 -0
  228. package/dist/types/advancedacl/session-key.d.ts +95 -0
  229. package/dist/types/advancedacl/types.d.ts +16 -0
  230. package/dist/types/attestedcompute/attested-compute.d.ts +65 -0
  231. package/dist/types/attestedcompute/types.d.ts +35 -0
  232. package/dist/types/attesteddecrypt/attested-decrypt.d.ts +61 -0
  233. package/dist/types/attesteddecrypt/index.d.ts +1 -0
  234. package/dist/types/attesteddecrypt/types.d.ts +27 -0
  235. package/dist/types/attestedreveal/attested-reveal.d.ts +21 -0
  236. package/dist/types/attestedreveal/index.d.ts +2 -0
  237. package/dist/types/attestedreveal/types.d.ts +4 -0
  238. package/dist/types/binary.d.ts +104 -0
  239. package/dist/types/chain.d.ts +50 -0
  240. package/dist/types/eip712/eip712.d.ts +18 -0
  241. package/dist/types/eip712/index.d.ts +1 -0
  242. package/dist/types/elistattesteddecrypt/elist-attested-decrypt.d.ts +51 -0
  243. package/dist/types/elistattesteddecrypt/index.d.ts +2 -0
  244. package/dist/types/elistattesteddecrypt/types.d.ts +31 -0
  245. package/dist/types/encryption/encryption.d.ts +235 -0
  246. package/dist/types/encryption/index.d.ts +1 -0
  247. package/dist/types/generated/abis/add-two.d.ts +117 -0
  248. package/dist/types/generated/abis/lightning.d.ts +3362 -0
  249. package/dist/types/generated/abis/test-elist.d.ts +276 -0
  250. package/dist/types/generated/abis/verifier.d.ts +1353 -0
  251. package/dist/types/generated/es/inco/covalidator/compute/v1/server_pb.d.ts +1494 -0
  252. package/dist/types/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +247 -0
  253. package/dist/types/generated/es/inco/helioswrapper/v1/helioswrapper_pb.d.ts +77 -0
  254. package/dist/types/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +685 -0
  255. package/dist/types/generated/es/inco/kms/lite/v1/types_pb.d.ts +289 -0
  256. package/dist/types/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.d.ts +371 -0
  257. package/dist/types/generated/lightning.d.ts +830 -0
  258. package/dist/types/generated/local-node.d.ts +50 -0
  259. package/dist/types/handle.d.ts +123 -0
  260. package/dist/types/index.d.ts +5 -0
  261. package/dist/types/kms/client.d.ts +12 -0
  262. package/dist/types/kms/quorumClient.d.ts +65 -0
  263. package/dist/types/kms/quorumConsistency.d.ts +82 -0
  264. package/dist/types/kms/signatureVerification.d.ts +35 -0
  265. package/dist/types/kms/thresholdPromises.d.ts +8 -0
  266. package/dist/types/lite/attested-compute.d.ts +6 -0
  267. package/dist/types/lite/attested-decrypt.d.ts +4 -0
  268. package/dist/types/lite/deployments.d.ts +24 -0
  269. package/dist/types/lite/hadu.d.ts +4 -0
  270. package/dist/types/lite/index.d.ts +13 -0
  271. package/dist/types/lite/lightning.d.ts +459 -0
  272. package/dist/types/lite/types.d.ts +47 -0
  273. package/dist/types/lite/xwing.d.ts +154 -0
  274. package/dist/types/local/index.d.ts +1 -0
  275. package/dist/types/local/local-node.d.ts +37 -0
  276. package/dist/types/reencryption/eip712.d.ts +56 -0
  277. package/dist/types/reencryption/index.d.ts +2 -0
  278. package/dist/types/reencryption/types.d.ts +48 -0
  279. package/dist/types/retry.d.ts +30 -0
  280. package/dist/types/schema.d.ts +4 -0
  281. package/dist/types/test/mocks.d.ts +20 -0
  282. package/dist/types/viem.d.ts +1141 -0
  283. package/package.json +129 -0
@@ -0,0 +1,65 @@
1
+ import { type Address } from 'viem';
2
+ import type { DecryptionAttestation, EncryptedDecryptionAttestation } from '../attesteddecrypt/types.js';
3
+ import { type EListDecryptionAttestation, type EncryptedEListDecryptionAttestation } from '../elistattesteddecrypt/types.js';
4
+ import type { EncryptionScheme, SupportedTeeType } from '../encryption/encryption.js';
5
+ import type { AttestedComputeRequest, AttestedDecryptRequest, AttestedRevealRequest, EListAttestedDecryptRequest, EListAttestedRevealRequest } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
6
+ import { type XwingKeypair } from '../lite/xwing.js';
7
+ import type { BackoffConfig } from '../retry.js';
8
+ import { type KmsClient } from './client.js';
9
+ import type { ViemClient } from '../viem.js';
10
+ export declare class KmsQuorumClient {
11
+ private readonly kmss;
12
+ private readonly threshold;
13
+ private constructor();
14
+ private constructor();
15
+ /**
16
+ * Creates a KmsQuorumClient from an array of URLs.
17
+ * Requires signer addresses and threshold to be explicitly provided.
18
+ *
19
+ * @param urls - Array of KMS endpoint URLs
20
+ * @param signers - Array of signer addresses, must match the length of URLs
21
+ * @param threshold - Number of successful responses required (must be between 1 and urls.length)
22
+ * @throws {Error} If URLs array is empty, signers length doesn't match URLs length, or threshold is invalid
23
+ */
24
+ static fromUrls(urls: string[], signers: Address[], threshold: number): KmsQuorumClient;
25
+ /**
26
+ * Creates a KmsQuorumClient from an array of KmsClient instances.
27
+ * Each KmsClient must have a signerAddress property.
28
+ *
29
+ * @param kmsClients - Array of KMS client instances
30
+ * @param threshold - Number of successful responses required (must be between 1 and kmsClients.length)
31
+ * @throws {Error} If KMS clients array is empty or threshold is invalid
32
+ */
33
+ static fromKmsClients(kmsClients: KmsClient[], threshold: number): KmsQuorumClient;
34
+ attestedDecrypt(request: AttestedDecryptRequest, executorAddress: Address, client: ViemClient, backoffConfig?: Partial<BackoffConfig>, reencryptKeypair?: XwingKeypair): Promise<(DecryptionAttestation<EncryptionScheme, SupportedTeeType> | EncryptedDecryptionAttestation<EncryptionScheme, SupportedTeeType>)[]>;
35
+ attestedCompute(request: AttestedComputeRequest, executorAddress: Address, client: ViemClient, backoffConfig?: Partial<BackoffConfig>, reencryptKeypair?: XwingKeypair): Promise<DecryptionAttestation<EncryptionScheme, SupportedTeeType> | EncryptedDecryptionAttestation<EncryptionScheme, SupportedTeeType>>;
36
+ attestedReveal(request: AttestedRevealRequest, executorAddress: Address, client: ViemClient, backoffConfig?: Partial<BackoffConfig>): Promise<(DecryptionAttestation<EncryptionScheme, SupportedTeeType> | EncryptedDecryptionAttestation<EncryptionScheme, SupportedTeeType>)[]>;
37
+ eListAttestedDecrypt(request: EListAttestedDecryptRequest, executorAddress: Address, client: ViemClient, backoffConfig?: Partial<BackoffConfig>, reencryptKeypair?: XwingKeypair): Promise<EListDecryptionAttestation<EncryptionScheme, SupportedTeeType> | EncryptedEListDecryptionAttestation<EncryptionScheme, SupportedTeeType>>;
38
+ eListAttestedReveal(request: EListAttestedRevealRequest, executorAddress: Address, client: ViemClient, backoffConfig?: Partial<BackoffConfig>): Promise<EListDecryptionAttestation<EncryptionScheme, SupportedTeeType>>;
39
+ /**
40
+ * Generic method to execute a KMS operation across all clients with retry and threshold logic.
41
+ * Returns results with both the response and signer address.
42
+ */
43
+ private executeKmsOperationWithThreshold;
44
+ /**
45
+ * Collects signatures from responses and sorts them by signer address (ascending).
46
+ * This is required by SignatureVerifier.
47
+ */
48
+ private collectAndSortSignatures;
49
+ /**
50
+ * Builds a plaintext attestation from a DecryptionAttestation proto message.
51
+ */
52
+ private buildPlaintextAttestation;
53
+ private buildAggregatedAttestations;
54
+ private buildAggregatedComputeAttestation;
55
+ private buildAggregatedEListAttestation;
56
+ /**
57
+ * Verifies proof hashes at two levels:
58
+ * 1. Aggregate: keccak256(concat(proofHashes)) must equal the attested commitmentProof
59
+ * 2. Per-element:
60
+ * - For plaintext (reveal): proofHash[i] = keccak256(value[i])
61
+ * - For reencryption (decrypt): proofHash[i] = keccak256(commitment[i] || plaintext[i])
62
+ * — requires reencryptKeypair to decrypt the ciphertext first.
63
+ */
64
+ private verifyElementProofHashes;
65
+ }
@@ -0,0 +1,463 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KmsQuorumClient = void 0;
4
+ const viem_1 = require("viem");
5
+ const binary_js_1 = require("../binary.js");
6
+ const types_js_1 = require("../elistattesteddecrypt/types.js");
7
+ const encryption_js_1 = require("../encryption/encryption.js");
8
+ const handle_js_1 = require("../handle.js");
9
+ const xwing_js_1 = require("../lite/xwing.js");
10
+ const retry_js_1 = require("../retry.js");
11
+ const client_js_1 = require("./client.js");
12
+ const quorumConsistency_js_1 = require("./quorumConsistency.js");
13
+ const signatureVerification_js_1 = require("./signatureVerification.js");
14
+ const thresholdPromises_js_1 = require("./thresholdPromises.js");
15
+ /**
16
+ * Checks if the threshold is at least a majority of signers and throws an error if not.
17
+ * This is important to ensure that the quorum client provides the expected security guarantees.
18
+ */
19
+ function checkMajorityThreshold(threshold, signerCount) {
20
+ const majority = Math.floor(signerCount / 2) + 1;
21
+ if (threshold < majority) {
22
+ throw new Error(`Threshold (${threshold}) must be at least a majority (${majority}) of ${signerCount} signers to ensure security guarantees.`);
23
+ }
24
+ }
25
+ class KmsQuorumClient {
26
+ kmss;
27
+ threshold;
28
+ // Implementation
29
+ constructor(attestersOrClients, threshold) {
30
+ if (attestersOrClients.length === 0) {
31
+ throw new Error('At least one attester or KMS client is required');
32
+ }
33
+ if (threshold < 1 || threshold > attestersOrClients.length) {
34
+ throw new Error(`Threshold must be between 1 and ${attestersOrClients.length}`);
35
+ }
36
+ checkMajorityThreshold(threshold, attestersOrClients.length);
37
+ // Check if first element is a KmsClient (has attestedDecrypt method) or an attester object
38
+ if (attestersOrClients.length > 0 &&
39
+ 'attestedDecrypt' in attestersOrClients[0]) {
40
+ // Handle KmsClient[] case
41
+ const kmsClients = attestersOrClients;
42
+ this.kmss = kmsClients.map((client) => ({
43
+ client,
44
+ signer: client.signerAddress,
45
+ }));
46
+ }
47
+ else {
48
+ // Handle { url: string; signer: Address }[] case
49
+ const attesters = attestersOrClients;
50
+ this.kmss = attesters.map((attester) => {
51
+ return {
52
+ client: (0, client_js_1.getKmsClient)(attester.url, attester.signer),
53
+ signer: attester.signer,
54
+ };
55
+ });
56
+ }
57
+ this.threshold = threshold;
58
+ }
59
+ /**
60
+ * Creates a KmsQuorumClient from an array of URLs.
61
+ * Requires signer addresses and threshold to be explicitly provided.
62
+ *
63
+ * @param urls - Array of KMS endpoint URLs
64
+ * @param signers - Array of signer addresses, must match the length of URLs
65
+ * @param threshold - Number of successful responses required (must be between 1 and urls.length)
66
+ * @throws {Error} If URLs array is empty, signers length doesn't match URLs length, or threshold is invalid
67
+ */
68
+ static fromUrls(urls, signers, threshold) {
69
+ if (urls.length === 0) {
70
+ throw new Error('At least one URL is required');
71
+ }
72
+ if (signers.length !== urls.length) {
73
+ throw new Error(`Signers array length (${signers.length}) must match URLs array length (${urls.length})`);
74
+ }
75
+ if (threshold < 1 || threshold > urls.length) {
76
+ throw new Error(`Threshold must be between 1 and ${urls.length} (number of URLs)`);
77
+ }
78
+ const attesters = urls.map((url, index) => {
79
+ return { url, signer: signers[index] };
80
+ });
81
+ return new KmsQuorumClient(attesters, threshold);
82
+ }
83
+ /**
84
+ * Creates a KmsQuorumClient from an array of KmsClient instances.
85
+ * Each KmsClient must have a signerAddress property.
86
+ *
87
+ * @param kmsClients - Array of KMS client instances
88
+ * @param threshold - Number of successful responses required (must be between 1 and kmsClients.length)
89
+ * @throws {Error} If KMS clients array is empty or threshold is invalid
90
+ */
91
+ static fromKmsClients(kmsClients, threshold) {
92
+ if (kmsClients.length === 0) {
93
+ throw new Error('At least one KMS client is required');
94
+ }
95
+ if (threshold < 1 || threshold > kmsClients.length) {
96
+ throw new Error(`Threshold must be between 1 and ${kmsClients.length} (number of KMS clients)`);
97
+ }
98
+ return new KmsQuorumClient(kmsClients, threshold);
99
+ }
100
+ async attestedDecrypt(request, executorAddress, client, backoffConfig, reencryptKeypair) {
101
+ const thresholdResults = await this.executeKmsOperationWithThreshold(async (kms) => {
102
+ return await kms.client.attestedDecrypt(request);
103
+ }, backoffConfig);
104
+ // Verify that responses are consistent across quorum (plaintext or ciphertext)
105
+ const { reference, winningResults } = await (0, quorumConsistency_js_1.verifyDecryptResponseConsistency)(thresholdResults, this.threshold, reencryptKeypair);
106
+ return this.buildAggregatedAttestations(reference, winningResults.map((r) => r.response), winningResults.map((r) => r.signer), executorAddress, client);
107
+ }
108
+ async attestedCompute(request, executorAddress, client, backoffConfig, reencryptKeypair) {
109
+ const thresholdResults = await this.executeKmsOperationWithThreshold(async (kms) => {
110
+ return await kms.client.attestedCompute(request);
111
+ }, backoffConfig);
112
+ // Verify that responses are consistent across quorum
113
+ const { reference, winningResults } = await (0, quorumConsistency_js_1.verifyComputeResponseConsistency)(thresholdResults, this.threshold, request, reencryptKeypair);
114
+ return this.buildAggregatedComputeAttestation(reference, winningResults.map((r) => r.response), winningResults.map((r) => r.signer), executorAddress, client);
115
+ }
116
+ async attestedReveal(request, executorAddress, client, backoffConfig) {
117
+ const thresholdResults = await this.executeKmsOperationWithThreshold(async (kms) => {
118
+ return await kms.client.attestedReveal(request);
119
+ }, backoffConfig);
120
+ // Verify that responses are consistent across quorum (plaintext only for reveal)
121
+ const { reference, winningResults } = await (0, quorumConsistency_js_1.verifyDecryptResponseConsistency)(thresholdResults, this.threshold);
122
+ return this.buildAggregatedAttestations(reference, winningResults.map((r) => r.response), winningResults.map((r) => r.signer), executorAddress, client);
123
+ }
124
+ async eListAttestedDecrypt(request, executorAddress, client, backoffConfig, reencryptKeypair) {
125
+ const thresholdResults = await this.executeKmsOperationWithThreshold(async (kms) => {
126
+ return await kms.client.eListAttestedDecrypt(request);
127
+ }, backoffConfig);
128
+ const { reference, winningResults } = await (0, quorumConsistency_js_1.verifyEListResponseConsistency)(thresholdResults, this.threshold, reencryptKeypair);
129
+ const elistHandle = request.elistHandleWithProof?.handle;
130
+ if (!elistHandle) {
131
+ throw new types_js_1.EListAttestedDecryptError('Missing elistHandleWithProof.handle in request');
132
+ }
133
+ return this.buildAggregatedEListAttestation(elistHandle, reference, winningResults.map((r) => r.response), winningResults.map((r) => r.signer), executorAddress, client, reencryptKeypair);
134
+ }
135
+ async eListAttestedReveal(request, executorAddress, client, backoffConfig) {
136
+ const thresholdResults = await this.executeKmsOperationWithThreshold(async (kms) => {
137
+ return await kms.client.eListAttestedReveal(request);
138
+ }, backoffConfig);
139
+ const { reference, winningResults } = await (0, quorumConsistency_js_1.verifyEListResponseConsistency)(thresholdResults, this.threshold);
140
+ return this.buildAggregatedEListAttestation(request.handle, reference, winningResults.map((r) => r.response), winningResults.map((r) => r.signer), executorAddress, client);
141
+ }
142
+ /**
143
+ * Generic method to execute a KMS operation across all clients with retry and threshold logic.
144
+ * Returns results with both the response and signer address.
145
+ */
146
+ async executeKmsOperationWithThreshold(operation, backoffConfig) {
147
+ // Create promises for all KMS clients, tracking signer addresses
148
+ // Each client call is wrapped with retry logic
149
+ const promises = this.kmss.map(async (kms, index) => {
150
+ try {
151
+ const response = await (0, retry_js_1.retryWithBackoff)(async () => {
152
+ return await operation(kms);
153
+ }, backoffConfig);
154
+ return { response, signer: kms.signer };
155
+ }
156
+ catch (error) {
157
+ throw new Error(`KMS client ${index} (signer: ${kms.signer}) failed: ${error}`);
158
+ }
159
+ });
160
+ return await (0, thresholdPromises_js_1.executeWithThreshold)(promises, this.threshold);
161
+ }
162
+ /**
163
+ * Collects signatures from responses and sorts them by signer address (ascending).
164
+ * This is required by SignatureVerifier.
165
+ */
166
+ collectAndSortSignatures(signatures, signers) {
167
+ const signaturesWithSigners = signatures.map((signature, idx) => ({
168
+ signature,
169
+ signer: signers[idx],
170
+ }));
171
+ // Sort by signer address in ascending order (as required by SignatureVerifier)
172
+ signaturesWithSigners.sort((a, b) => {
173
+ const aBigInt = BigInt(a.signer);
174
+ const bBigInt = BigInt(b.signer);
175
+ if (aBigInt < bBigInt)
176
+ return -1;
177
+ if (aBigInt > bBigInt)
178
+ return 1;
179
+ return 0;
180
+ });
181
+ // Extract sorted signatures
182
+ return signaturesWithSigners.map((item) => item.signature);
183
+ }
184
+ /**
185
+ * Builds a plaintext attestation from a DecryptionAttestation proto message.
186
+ */
187
+ buildPlaintextAttestation(decryptionAttestation, covalidatorSignatures) {
188
+ if (!decryptionAttestation.value ||
189
+ decryptionAttestation.value.case !== 'plaintext') {
190
+ throw new Error('Expected plaintext attestation');
191
+ }
192
+ const plaintextBytes = decryptionAttestation.value.value.value;
193
+ const handle = decryptionAttestation.handle;
194
+ const handleType = (0, handle_js_1.getHandleType)(handle);
195
+ const bigIntValue = (0, binary_js_1.bytesToBigInt)(plaintextBytes);
196
+ const plaintext = (0, encryption_js_1.bigintToPlaintext)(encryption_js_1.encryptionSchemes.xwing, handleType, bigIntValue);
197
+ return {
198
+ handle,
199
+ plaintext,
200
+ covalidatorSignatures,
201
+ };
202
+ }
203
+ async buildAggregatedAttestations(reference, thresholdResponses, signers, executorAddress, client) {
204
+ const attestationCount = reference.decryptionAttestations.length;
205
+ const results = [];
206
+ for (let i = 0; i < attestationCount; i++) {
207
+ const refAtt = reference.decryptionAttestations[i];
208
+ if (!refAtt.value) {
209
+ throw new Error('No value in attestation');
210
+ }
211
+ // Collect signatures and sort by signer address
212
+ const signatures = thresholdResponses.map((resp) => resp.decryptionAttestations[i].signature);
213
+ const covalidatorSignatures = this.collectAndSortSignatures(signatures, signers);
214
+ if (refAtt.value.case === 'plaintext') {
215
+ // Verify covalidator signatures over the plaintext attestation
216
+ // executorAddress and client are only undefined when using a non-real client (e.g. in tests)
217
+ if (executorAddress && client) {
218
+ await (0, signatureVerification_js_1.verifyPlaintextAttestationSignatures)(refAtt.handle, refAtt.value.value.value, covalidatorSignatures, executorAddress, client);
219
+ }
220
+ results.push(this.buildPlaintextAttestation(refAtt, covalidatorSignatures));
221
+ }
222
+ else if (refAtt.value.case === 'reencryption') {
223
+ // Collect per-covalidator encrypted signatures and ciphertexts
224
+ const encryptedSignatures = [];
225
+ const perCovalidatorCiphertexts = [];
226
+ for (const resp of thresholdResponses) {
227
+ const attValue = resp.decryptionAttestations[i].value;
228
+ if (attValue?.case === 'reencryption') {
229
+ encryptedSignatures.push(attValue.value.encryptedSignature);
230
+ perCovalidatorCiphertexts.push(attValue.value.userCiphertext);
231
+ }
232
+ else {
233
+ throw new Error(`Expected reencryption attestation but received '${attValue?.case}'`);
234
+ }
235
+ }
236
+ const encryptedCovalidatorSignatures = this.collectAndSortSignatures(encryptedSignatures, signers);
237
+ const sortedCiphertexts = this.collectAndSortSignatures(perCovalidatorCiphertexts, signers);
238
+ // executorAddress and client are only undefined when using a non-real client (e.g. in tests)
239
+ if (executorAddress && client) {
240
+ await (0, signatureVerification_js_1.verifyReencryptionAttestationSignatures)(refAtt.handle, sortedCiphertexts, encryptedCovalidatorSignatures, covalidatorSignatures, executorAddress, client);
241
+ }
242
+ const reencryption = refAtt.value.value;
243
+ const ct = reencryption.userCiphertext;
244
+ const handleType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(refAtt.handle));
245
+ results.push({
246
+ handle: refAtt.handle,
247
+ encryptedPlaintext: {
248
+ ciphertext: {
249
+ value: (0, binary_js_1.bytesToHex)(ct),
250
+ scheme: encryption_js_1.encryptionSchemes.xwing, // EncryptionScheme: XWING
251
+ type: handleType,
252
+ },
253
+ },
254
+ encryptedSignatures: encryptedCovalidatorSignatures,
255
+ covalidatorSignatures,
256
+ });
257
+ }
258
+ else {
259
+ throw new Error(`Unexpected attestation type: ${refAtt.value.case}, expected 'plaintext' or 'reencryption'`);
260
+ }
261
+ }
262
+ return results;
263
+ }
264
+ async buildAggregatedComputeAttestation(reference, thresholdResponses, signers, executorAddress, client) {
265
+ const refAtt = reference.decryptionAttestation;
266
+ if (!refAtt) {
267
+ throw new Error('No decryption attestation in reference response');
268
+ }
269
+ if (!refAtt.value) {
270
+ throw new Error('No value in reference attestation');
271
+ }
272
+ // Collect signatures and sort by signer address
273
+ // All responses are guaranteed to have decryption attestations by verifyComputeResponseConsistency
274
+ const signatures = [];
275
+ for (const resp of thresholdResponses) {
276
+ const att = resp.decryptionAttestation;
277
+ if (!att)
278
+ throw new Error('Missing decryption attestation in winning response');
279
+ signatures.push(att.signature);
280
+ }
281
+ const covalidatorSignatures = this.collectAndSortSignatures(signatures, signers);
282
+ if (refAtt.value.case === 'plaintext') {
283
+ // Verify covalidator signatures over the plaintext attestation
284
+ // executorAddress and client are only undefined when using a non-real client (e.g. in tests)
285
+ if (executorAddress && client) {
286
+ await (0, signatureVerification_js_1.verifyPlaintextAttestationSignatures)(refAtt.handle, refAtt.value.value.value, covalidatorSignatures, executorAddress, client);
287
+ }
288
+ return this.buildPlaintextAttestation(refAtt, covalidatorSignatures);
289
+ }
290
+ if (refAtt.value.case === 'reencryption') {
291
+ // Reencryption envelope signatures are verified per-covalidator via
292
+ // isValidReencryptionAttestation on-chain (each has a unique digest).
293
+ const reencryption = refAtt.value.value;
294
+ const ct = reencryption.userCiphertext;
295
+ if (!ct) {
296
+ throw new Error('No ciphertext in reencryption');
297
+ }
298
+ const handleType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(refAtt.handle));
299
+ // Collect per-covalidator encrypted signatures and ciphertexts
300
+ const encryptedSignatures = [];
301
+ const perCovalidatorCiphertexts = [];
302
+ for (const resp of thresholdResponses) {
303
+ if (resp.decryptionAttestation?.value.case === 'reencryption') {
304
+ const reenc = resp.decryptionAttestation.value.value;
305
+ encryptedSignatures.push(reenc.encryptedSignature);
306
+ perCovalidatorCiphertexts.push(reenc.userCiphertext);
307
+ }
308
+ else {
309
+ throw new Error(`Expected reencryption attestation but received '${resp.decryptionAttestation?.value.case}'`);
310
+ }
311
+ }
312
+ const encryptedCovalidatorSignatures = this.collectAndSortSignatures(encryptedSignatures, signers);
313
+ const sortedCiphertexts = this.collectAndSortSignatures(perCovalidatorCiphertexts, signers);
314
+ // executorAddress and client are only undefined when using a non-real client (e.g. in tests)
315
+ if (executorAddress && client) {
316
+ await (0, signatureVerification_js_1.verifyReencryptionAttestationSignatures)(refAtt.handle, sortedCiphertexts, encryptedCovalidatorSignatures, covalidatorSignatures, executorAddress, client);
317
+ }
318
+ return {
319
+ handle: refAtt.handle,
320
+ encryptedPlaintext: {
321
+ ciphertext: {
322
+ value: (0, binary_js_1.bytesToHex)(ct),
323
+ scheme: encryption_js_1.encryptionSchemes.xwing, // EncryptionScheme: XWING
324
+ type: handleType,
325
+ },
326
+ },
327
+ encryptedSignatures: encryptedCovalidatorSignatures,
328
+ covalidatorSignatures,
329
+ };
330
+ }
331
+ throw new Error(`Unexpected attestation type: ${refAtt.value.case}, expected 'plaintext' or 'reencryption'`);
332
+ }
333
+ async buildAggregatedEListAttestation(elistHandle, reference, thresholdResponses, signers, executorAddress, client, reencryptKeypair) {
334
+ const refProofAtt = reference.commitmentProofAttestation;
335
+ if (!refProofAtt) {
336
+ throw new Error('No commitmentProofAttestation in reference response');
337
+ }
338
+ if (!refProofAtt.value) {
339
+ throw new Error('No value in commitmentProofAttestation');
340
+ }
341
+ // Collect and sort commitment proof signatures
342
+ const proofSignatures = thresholdResponses.map((resp) => resp.commitmentProofAttestation.signature);
343
+ const covalidatorSignatures = this.collectAndSortSignatures(proofSignatures, signers);
344
+ // Build commitment proof from the attestation
345
+ // The commitment proof is always a keccak256 hash (uint256), regardless of the elist handle type.
346
+ let commitmentProof;
347
+ if (refProofAtt.value.case === 'plaintext') {
348
+ const proofBytes = refProofAtt.value.value.value;
349
+ const proofHandle = refProofAtt.handle;
350
+ // Verify commitment proof signatures
351
+ if (executorAddress && client) {
352
+ await (0, signatureVerification_js_1.verifyPlaintextAttestationSignatures)(proofHandle, proofBytes, covalidatorSignatures, executorAddress, client);
353
+ }
354
+ commitmentProof = (0, encryption_js_1.bigintToPlaintext)(encryption_js_1.encryptionSchemes.xwing, handle_js_1.handleTypes.euint256, (0, binary_js_1.bytesToBigInt)(proofBytes));
355
+ }
356
+ else {
357
+ throw new Error(`Unexpected commitmentProofAttestation type: ${refProofAtt.value.case}`);
358
+ }
359
+ // Verify proof hashes: per-element and aggregate
360
+ await this.verifyElementProofHashes(reference, refProofAtt.value.value.value, reencryptKeypair);
361
+ // Build values and commitments from EListElements
362
+ const elementType = (0, handle_js_1.getEListElementType)(elistHandle);
363
+ const commitments = [];
364
+ const isReencryption = reference.values.length > 0 &&
365
+ reference.values[0].value.case === 'reencryption';
366
+ if (isReencryption) {
367
+ const values = [];
368
+ for (const elem of reference.values) {
369
+ commitments.push(elem.commitment);
370
+ if (elem.value.case !== 'reencryption') {
371
+ throw new Error(`Expected reencryption elist element but got '${elem.value.case}'`);
372
+ }
373
+ const ct = elem.value.value.userCiphertext;
374
+ values.push({
375
+ ciphertext: {
376
+ value: (0, binary_js_1.bytesToHex)(ct),
377
+ scheme: encryption_js_1.encryptionSchemes.xwing,
378
+ type: elementType,
379
+ },
380
+ });
381
+ }
382
+ return {
383
+ handle: elistHandle,
384
+ commitmentProof,
385
+ values,
386
+ covalidatorSignatures,
387
+ commitments,
388
+ };
389
+ }
390
+ else {
391
+ const values = [];
392
+ for (const elem of reference.values) {
393
+ commitments.push(elem.commitment);
394
+ if (elem.value.case !== 'plaintext') {
395
+ throw new Error(`Expected plaintext elist element but got '${elem.value.case}'`);
396
+ }
397
+ const plaintextBytes = elem.value.value.value;
398
+ values.push((0, encryption_js_1.bigintToPlaintext)(encryption_js_1.encryptionSchemes.xwing, elementType, (0, binary_js_1.bytesToBigInt)(plaintextBytes)));
399
+ }
400
+ return {
401
+ handle: elistHandle,
402
+ commitmentProof,
403
+ values,
404
+ covalidatorSignatures,
405
+ commitments,
406
+ };
407
+ }
408
+ }
409
+ /**
410
+ * Verifies proof hashes at two levels:
411
+ * 1. Aggregate: keccak256(concat(proofHashes)) must equal the attested commitmentProof
412
+ * 2. Per-element:
413
+ * - For plaintext (reveal): proofHash[i] = keccak256(value[i])
414
+ * - For reencryption (decrypt): proofHash[i] = keccak256(commitment[i] || plaintext[i])
415
+ * — requires reencryptKeypair to decrypt the ciphertext first.
416
+ */
417
+ async verifyElementProofHashes(reference, commitmentProofBytes, reencryptKeypair) {
418
+ // Aggregate check: keccak256(concat(proofHashes)) must match the attested commitment proof
419
+ const proofHashesConcat = new Uint8Array(reference.proofHashes.reduce((acc, h) => acc + h.length, 0));
420
+ let offset = 0;
421
+ for (const h of reference.proofHashes) {
422
+ proofHashesConcat.set(h, offset);
423
+ offset += h.length;
424
+ }
425
+ const computedProof = (0, viem_1.keccak256)((0, binary_js_1.bytesToHex)(proofHashesConcat));
426
+ const attestedProof = (0, binary_js_1.bytesToHex)(commitmentProofBytes);
427
+ if (computedProof !== attestedProof) {
428
+ throw new types_js_1.EListAttestedDecryptError(`Commitment proof verification failed: computed ${computedProof} but attested value is ${attestedProof}`);
429
+ }
430
+ // Per-element check
431
+ if (reference.proofHashes.length !== reference.values.length) {
432
+ throw new types_js_1.EListAttestedDecryptError(`proofHashes length (${reference.proofHashes.length}) does not match values length (${reference.values.length})`);
433
+ }
434
+ for (let i = 0; i < reference.values.length; i++) {
435
+ const elem = reference.values[i];
436
+ let preimage;
437
+ if (elem.value.case === 'reencryption') {
438
+ if (!reencryptKeypair) {
439
+ // Can't verify without keypair; aggregate check + signatures still hold
440
+ continue;
441
+ }
442
+ const plaintext = await (0, xwing_js_1.decrypt)(reencryptKeypair, elem.value.value.userCiphertext);
443
+ const combined = new Uint8Array(elem.commitment.length + plaintext.length);
444
+ combined.set(elem.commitment, 0);
445
+ combined.set(plaintext, elem.commitment.length);
446
+ preimage = combined;
447
+ }
448
+ else if (elem.value.case === 'plaintext') {
449
+ preimage = elem.value.value.value;
450
+ }
451
+ else {
452
+ throw new types_js_1.EListAttestedDecryptError(`Unexpected elist element type at index ${i}: ${elem.value.case}`);
453
+ }
454
+ const computedHash = (0, viem_1.keccak256)((0, binary_js_1.bytesToHex)(preimage));
455
+ const expectedHash = (0, binary_js_1.bytesToHex)(reference.proofHashes[i]);
456
+ if (computedHash !== expectedHash) {
457
+ throw new types_js_1.EListAttestedDecryptError(`Element proof hash mismatch at index ${i}: computed ${computedHash} but expected ${expectedHash}`);
458
+ }
459
+ }
460
+ }
461
+ }
462
+ exports.KmsQuorumClient = KmsQuorumClient;
463
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvcnVtQ2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ttcy9xdW9ydW1DbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStDO0FBSy9DLDRDQUtzQjtBQUN0QiwrREFJMEM7QUFNMUMsK0RBR3FDO0FBY3JDLDRDQUErRTtBQUMvRSwrQ0FBOEQ7QUFFOUQsMENBQStDO0FBQy9DLDJDQUEyRDtBQUMzRCxpRUFJZ0M7QUFHaEMseUVBR29DO0FBQ3BDLGlFQUE4RDtBQU85RDs7O0dBR0c7QUFDSCxTQUFTLHNCQUFzQixDQUFDLFNBQWlCLEVBQUUsV0FBbUI7SUFDcEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELElBQUksU0FBUyxHQUFHLFFBQVEsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ2IsY0FBYyxTQUFTLGtDQUFrQyxRQUFRLFFBQVEsV0FBVyx5Q0FBeUMsQ0FDOUgsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBYSxlQUFlO0lBQ1QsSUFBSSxDQUFRO0lBQ1osU0FBUyxDQUFTO0lBUW5DLGlCQUFpQjtJQUNqQixZQUNFLGtCQUFvRSxFQUNwRSxTQUFpQjtRQUVqQixJQUFJLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0QsTUFBTSxJQUFJLEtBQUssQ0FDYixtQ0FBbUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQy9ELENBQUM7UUFDSixDQUFDO1FBRUQsc0JBQXNCLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFD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
@@ -0,0 +1,82 @@
1
+ import type { Address } from 'viem';
2
+ import type { AttestedComputeRequest, AttestedComputeResponse, AttestedDecryptResponse, AttestedRevealResponse, EListAttestedDecryptResponse, EListAttestedRevealResponse, DecryptionAttestation as ProtoDecryptionAttestation } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
3
+ import type { XwingKeypair } from '../lite/xwing.js';
4
+ /**
5
+ * Computes a canonical key for a single attestation.
6
+ * For plaintext/reencryption+keypair, the key is handle:hex(value).
7
+ * For reencryption without a keypair (XWing ciphertexts are non-deterministic),
8
+ * falls back to handle:op-type as a structural stand-in.
9
+ */
10
+ export declare function computeAttestationKey(att: ProtoDecryptionAttestation, reencryptKeypair?: XwingKeypair): Promise<string>;
11
+ /**
12
+ * Validates that all responses in a winning bucket have the same attestation
13
+ * count and types as the quorum-elected reference (bucket[0]).
14
+ */
15
+ export declare function validateDecryptResponseStructure<T extends AttestedDecryptResponse | AttestedRevealResponse>(bucket: Array<{
16
+ response: T;
17
+ signer: Address;
18
+ }>): void;
19
+ /**
20
+ * Validates that all responses in a winning bucket have a decryption
21
+ * attestation with the same case as the quorum-elected reference (bucket[0]),
22
+ * and that the case is consistent with the request's reencryptPubKey.
23
+ */
24
+ export declare function validateComputeResponseStructure(bucket: Array<{
25
+ response: AttestedComputeResponse;
26
+ signer: Address;
27
+ }>, request?: AttestedComputeRequest): void;
28
+ /**
29
+ * Verifies decrypt/reveal response consistency using hash-bucket voting.
30
+ * Collects all N responses, buckets them by content key, and returns the
31
+ * winning bucket (the first one with >= threshold votes).
32
+ *
33
+ * This is robust against a faulty first-responding node: even if responses[0]
34
+ * disagrees, a quorum of agreeing responses will form a winning bucket.
35
+ */
36
+ export declare function verifyDecryptResponseConsistency<T extends AttestedDecryptResponse | AttestedRevealResponse>(allResults: Array<{
37
+ response: T;
38
+ signer: Address;
39
+ }>, threshold: number, reencryptKeypair?: XwingKeypair): Promise<{
40
+ reference: T;
41
+ winningResults: Array<{
42
+ response: T;
43
+ signer: Address;
44
+ }>;
45
+ }>;
46
+ type EListResponse = EListAttestedDecryptResponse | EListAttestedRevealResponse;
47
+ /**
48
+ * Validates that all elist responses in a winning bucket have the same
49
+ * number of values and matching indices.
50
+ */
51
+ export declare function validateEListResponseStructure<T extends EListResponse>(bucket: Array<{
52
+ response: T;
53
+ signer: Address;
54
+ }>): void;
55
+ /**
56
+ * Verifies elist response consistency using hash-bucket voting.
57
+ * Works for both EListAttestedDecryptResponse and EListAttestedRevealResponse.
58
+ */
59
+ export declare function verifyEListResponseConsistency<T extends EListResponse>(allResults: Array<{
60
+ response: T;
61
+ signer: Address;
62
+ }>, threshold: number, reencryptKeypair?: XwingKeypair): Promise<{
63
+ reference: T;
64
+ winningResults: Array<{
65
+ response: T;
66
+ signer: Address;
67
+ }>;
68
+ }>;
69
+ /**
70
+ * Verifies compute response consistency using hash-bucket voting.
71
+ */
72
+ export declare function verifyComputeResponseConsistency(allResults: Array<{
73
+ response: AttestedComputeResponse;
74
+ signer: Address;
75
+ }>, threshold: number, request?: AttestedComputeRequest, reencryptKeypair?: XwingKeypair): Promise<{
76
+ reference: AttestedComputeResponse;
77
+ winningResults: Array<{
78
+ response: AttestedComputeResponse;
79
+ signer: Address;
80
+ }>;
81
+ }>;
82
+ export {};