@primuslabs/fhetransform-sdk 0.4.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 (302) hide show
  1. package/README.md +198 -0
  2. package/dist/abis/acl.abi.d.ts +379 -0
  3. package/dist/abis/acl.abi.js +495 -0
  4. package/dist/abis/acl.abi.js.map +1 -0
  5. package/dist/abis/alphatrion_reward.abi.d.ts +407 -0
  6. package/dist/abis/alphatrion_reward.abi.js +532 -0
  7. package/dist/abis/alphatrion_reward.abi.js.map +1 -0
  8. package/dist/abis/ciphertext_digests.abi.d.ts +336 -0
  9. package/dist/abis/ciphertext_digests.abi.js +444 -0
  10. package/dist/abis/ciphertext_digests.abi.js.map +1 -0
  11. package/dist/abis/ciphertext_verification.abi.d.ts +637 -0
  12. package/dist/abis/ciphertext_verification.abi.js +830 -0
  13. package/dist/abis/ciphertext_verification.abi.js.map +1 -0
  14. package/dist/abis/convert_token.abi.d.ts +922 -0
  15. package/dist/abis/convert_token.abi.js +1208 -0
  16. package/dist/abis/convert_token.abi.js.map +1 -0
  17. package/dist/abis/decryption.abi.d.ts +956 -0
  18. package/dist/abis/decryption.abi.js +1244 -0
  19. package/dist/abis/decryption.abi.js.map +1 -0
  20. package/dist/abis/erc20.abi.d.ts +265 -0
  21. package/dist/abis/erc20.abi.js +350 -0
  22. package/dist/abis/erc20.abi.js.map +1 -0
  23. package/dist/abis/fhe_executor.abi.d.ts +1535 -0
  24. package/dist/abis/fhe_executor.abi.js +1962 -0
  25. package/dist/abis/fhe_executor.abi.js.map +1 -0
  26. package/dist/abis/space_bridge_config.abi.d.ts +792 -0
  27. package/dist/abis/space_bridge_config.abi.js +1032 -0
  28. package/dist/abis/space_bridge_config.abi.js.map +1 -0
  29. package/dist/abis/token.abi.d.ts +630 -0
  30. package/dist/abis/token.abi.js +828 -0
  31. package/dist/abis/token.abi.js.map +1 -0
  32. package/dist/cli/eusdc.d.ts +2 -0
  33. package/dist/cli/eusdc.js +41 -0
  34. package/dist/cli/eusdc.js.map +1 -0
  35. package/dist/contract/callbacks.d.ts +59 -0
  36. package/dist/contract/callbacks.js +2 -0
  37. package/dist/contract/callbacks.js.map +1 -0
  38. package/dist/contract/convert-token.d.ts +107 -0
  39. package/dist/contract/convert-token.js +249 -0
  40. package/dist/contract/convert-token.js.map +1 -0
  41. package/dist/contract/token.d.ts +167 -0
  42. package/dist/contract/token.js +404 -0
  43. package/dist/contract/token.js.map +1 -0
  44. package/dist/contract/transaction.d.ts +29 -0
  45. package/dist/contract/transaction.js +2 -0
  46. package/dist/contract/transaction.js.map +1 -0
  47. package/dist/core/address.d.ts +118 -0
  48. package/dist/core/address.js +200 -0
  49. package/dist/core/address.js.map +1 -0
  50. package/dist/core/auth.d.ts +68 -0
  51. package/dist/core/auth.js +58 -0
  52. package/dist/core/auth.js.map +1 -0
  53. package/dist/core/bytes.d.ts +48 -0
  54. package/dist/core/bytes.js +117 -0
  55. package/dist/core/bytes.js.map +1 -0
  56. package/dist/core/cache-manager.d.ts +138 -0
  57. package/dist/core/cache-manager.js +440 -0
  58. package/dist/core/cache-manager.js.map +1 -0
  59. package/dist/core/chain.d.ts +41 -0
  60. package/dist/core/chain.js +59 -0
  61. package/dist/core/chain.js.map +1 -0
  62. package/dist/core/constants.d.ts +24 -0
  63. package/dist/core/constants.js +25 -0
  64. package/dist/core/constants.js.map +1 -0
  65. package/dist/core/error.d.ts +2 -0
  66. package/dist/core/error.js +14 -0
  67. package/dist/core/error.js.map +1 -0
  68. package/dist/core/errors/error-catalog.d.ts +29 -0
  69. package/dist/core/errors/error-catalog.js +84 -0
  70. package/dist/core/errors/error-catalog.js.map +1 -0
  71. package/dist/core/errors/error-codes.d.ts +52 -0
  72. package/dist/core/errors/error-codes.js +61 -0
  73. package/dist/core/errors/error-codes.js.map +1 -0
  74. package/dist/core/errors/error-utils.d.ts +27 -0
  75. package/dist/core/errors/error-utils.js +110 -0
  76. package/dist/core/errors/error-utils.js.map +1 -0
  77. package/dist/core/errors/fhe-error.d.ts +98 -0
  78. package/dist/core/errors/fhe-error.js +190 -0
  79. package/dist/core/errors/fhe-error.js.map +1 -0
  80. package/dist/core/errors/index.d.ts +4 -0
  81. package/dist/core/errors/index.js +5 -0
  82. package/dist/core/errors/index.js.map +1 -0
  83. package/dist/core/estimate.d.ts +39 -0
  84. package/dist/core/estimate.js +111 -0
  85. package/dist/core/estimate.js.map +1 -0
  86. package/dist/core/event.d.ts +212 -0
  87. package/dist/core/event.js +42 -0
  88. package/dist/core/event.js.map +1 -0
  89. package/dist/core/fhe-type.d.ts +75 -0
  90. package/dist/core/fhe-type.js +115 -0
  91. package/dist/core/fhe-type.js.map +1 -0
  92. package/dist/core/fhe.d.ts +11 -0
  93. package/dist/core/fhe.js +23 -0
  94. package/dist/core/fhe.js.map +1 -0
  95. package/dist/core/handle.d.ts +42 -0
  96. package/dist/core/handle.js +99 -0
  97. package/dist/core/handle.js.map +1 -0
  98. package/dist/core/json-utils.d.ts +18 -0
  99. package/dist/core/json-utils.js +37 -0
  100. package/dist/core/json-utils.js.map +1 -0
  101. package/dist/core/kms.d.ts +42 -0
  102. package/dist/core/kms.js +70 -0
  103. package/dist/core/kms.js.map +1 -0
  104. package/dist/core/logger.d.ts +3 -0
  105. package/dist/core/logger.js +11 -0
  106. package/dist/core/logger.js.map +1 -0
  107. package/dist/core/pretty-print.d.ts +18 -0
  108. package/dist/core/pretty-print.js +84 -0
  109. package/dist/core/pretty-print.js.map +1 -0
  110. package/dist/core/primitives.d.ts +22 -0
  111. package/dist/core/primitives.js +2 -0
  112. package/dist/core/primitives.js.map +1 -0
  113. package/dist/core/retryable-handler.d.ts +74 -0
  114. package/dist/core/retryable-handler.js +227 -0
  115. package/dist/core/retryable-handler.js.map +1 -0
  116. package/dist/core/signer-address-info.d.ts +15 -0
  117. package/dist/core/signer-address-info.js +33 -0
  118. package/dist/core/signer-address-info.js.map +1 -0
  119. package/dist/core/string.d.ts +28 -0
  120. package/dist/core/string.js +33 -0
  121. package/dist/core/string.js.map +1 -0
  122. package/dist/core/swallow.d.ts +23 -0
  123. package/dist/core/swallow.js +37 -0
  124. package/dist/core/swallow.js.map +1 -0
  125. package/dist/core/system-contract-info.d.ts +17 -0
  126. package/dist/core/system-contract-info.js +41 -0
  127. package/dist/core/system-contract-info.js.map +1 -0
  128. package/dist/core/ttl-cache.d.ts +81 -0
  129. package/dist/core/ttl-cache.js +113 -0
  130. package/dist/core/ttl-cache.js.map +1 -0
  131. package/dist/core/tx-error-parser.d.ts +40 -0
  132. package/dist/core/tx-error-parser.js +83 -0
  133. package/dist/core/tx-error-parser.js.map +1 -0
  134. package/dist/core/utils.d.ts +62 -0
  135. package/dist/core/utils.js +143 -0
  136. package/dist/core/utils.js.map +1 -0
  137. package/dist/index.d.ts +40 -0
  138. package/dist/index.js +48 -0
  139. package/dist/index.js.map +1 -0
  140. package/dist/jazz/encrypt-key-p.d.ts +65 -0
  141. package/dist/jazz/encrypt-key-p.js +283 -0
  142. package/dist/jazz/encrypt-key-p.js.map +1 -0
  143. package/dist/jazz/encrypt-p.d.ts +82 -0
  144. package/dist/jazz/encrypt-p.js +139 -0
  145. package/dist/jazz/encrypt-p.js.map +1 -0
  146. package/dist/jazz/encrypt.d.ts +58 -0
  147. package/dist/jazz/encrypt.js +155 -0
  148. package/dist/jazz/encrypt.js.map +1 -0
  149. package/dist/jazz/input-proof-p.d.ts +122 -0
  150. package/dist/jazz/input-proof-p.js +265 -0
  151. package/dist/jazz/input-proof-p.js.map +1 -0
  152. package/dist/jazz/jazz-client-i.d.ts +16 -0
  153. package/dist/jazz/jazz-client-i.js +2 -0
  154. package/dist/jazz/jazz-client-i.js.map +1 -0
  155. package/dist/jazz/jazz-client.d.ts +18 -0
  156. package/dist/jazz/jazz-client.js +24 -0
  157. package/dist/jazz/jazz-client.js.map +1 -0
  158. package/dist/jazz/key-pair.d.ts +50 -0
  159. package/dist/jazz/key-pair.js +166 -0
  160. package/dist/jazz/key-pair.js.map +1 -0
  161. package/dist/jazz/mock/fake.d.ts +3 -0
  162. package/dist/jazz/mock/fake.js +23 -0
  163. package/dist/jazz/mock/fake.js.map +1 -0
  164. package/dist/jazz/mock/fetch-input-proof.d.ts +4 -0
  165. package/dist/jazz/mock/fetch-input-proof.js +63 -0
  166. package/dist/jazz/mock/fetch-input-proof.js.map +1 -0
  167. package/dist/jazz/mock/fetch-key-url.d.ts +3 -0
  168. package/dist/jazz/mock/fetch-key-url.js +15 -0
  169. package/dist/jazz/mock/fetch-key-url.js.map +1 -0
  170. package/dist/jazz/mock/fetch-public-decrypt.d.ts +3 -0
  171. package/dist/jazz/mock/fetch-public-decrypt.js +81 -0
  172. package/dist/jazz/mock/fetch-public-decrypt.js.map +1 -0
  173. package/dist/jazz/mock/fetch-user-decrypt.d.ts +4 -0
  174. package/dist/jazz/mock/fetch-user-decrypt.js +174 -0
  175. package/dist/jazz/mock/fetch-user-decrypt.js.map +1 -0
  176. package/dist/jazz/module/fetch-input-proof.d.ts +19 -0
  177. package/dist/jazz/module/fetch-input-proof.js +72 -0
  178. package/dist/jazz/module/fetch-input-proof.js.map +1 -0
  179. package/dist/jazz/module/fetch-key-url.d.ts +17 -0
  180. package/dist/jazz/module/fetch-key-url.js +46 -0
  181. package/dist/jazz/module/fetch-key-url.js.map +1 -0
  182. package/dist/jazz/module/fetch-public-decrypt.d.ts +19 -0
  183. package/dist/jazz/module/fetch-public-decrypt.js +65 -0
  184. package/dist/jazz/module/fetch-public-decrypt.js.map +1 -0
  185. package/dist/jazz/module/fetch-user-decrypt.d.ts +19 -0
  186. package/dist/jazz/module/fetch-user-decrypt.js +109 -0
  187. package/dist/jazz/module/fetch-user-decrypt.js.map +1 -0
  188. package/dist/jazz/module/jazz-async-request.d.ts +102 -0
  189. package/dist/jazz/module/jazz-async-request.js +515 -0
  190. package/dist/jazz/module/jazz-async-request.js.map +1 -0
  191. package/dist/jazz/module/jazz-p.d.ts +61 -0
  192. package/dist/jazz/module/jazz-p.js +33 -0
  193. package/dist/jazz/module/jazz-p.js.map +1 -0
  194. package/dist/jazz/module/s3-download.d.ts +85 -0
  195. package/dist/jazz/module/s3-download.js +293 -0
  196. package/dist/jazz/module/s3-download.js.map +1 -0
  197. package/dist/jazz/permit.d.ts +200 -0
  198. package/dist/jazz/permit.js +319 -0
  199. package/dist/jazz/permit.js.map +1 -0
  200. package/dist/jazz/public-decrypt-p.d.ts +96 -0
  201. package/dist/jazz/public-decrypt-p.js +258 -0
  202. package/dist/jazz/public-decrypt-p.js.map +1 -0
  203. package/dist/jazz/public-decrypt.d.ts +48 -0
  204. package/dist/jazz/public-decrypt.js +156 -0
  205. package/dist/jazz/public-decrypt.js.map +1 -0
  206. package/dist/jazz/read-contract.d.ts +81 -0
  207. package/dist/jazz/read-contract.js +125 -0
  208. package/dist/jazz/read-contract.js.map +1 -0
  209. package/dist/jazz/types/common.d.ts +17 -0
  210. package/dist/jazz/types/common.js +2 -0
  211. package/dist/jazz/types/common.js.map +1 -0
  212. package/dist/jazz/types/input-proof.d.ts +76 -0
  213. package/dist/jazz/types/input-proof.js +2 -0
  214. package/dist/jazz/types/input-proof.js.map +1 -0
  215. package/dist/jazz/types/key-url.d.ts +68 -0
  216. package/dist/jazz/types/key-url.js +5 -0
  217. package/dist/jazz/types/key-url.js.map +1 -0
  218. package/dist/jazz/types/public-decrypt.d.ts +61 -0
  219. package/dist/jazz/types/public-decrypt.js +2 -0
  220. package/dist/jazz/types/public-decrypt.js.map +1 -0
  221. package/dist/jazz/types/user-decrypt.d.ts +123 -0
  222. package/dist/jazz/types/user-decrypt.js +2 -0
  223. package/dist/jazz/types/user-decrypt.js.map +1 -0
  224. package/dist/jazz/user-decrypt-p.d.ts +111 -0
  225. package/dist/jazz/user-decrypt-p.js +280 -0
  226. package/dist/jazz/user-decrypt-p.js.map +1 -0
  227. package/dist/jazz/user-decrypt.d.ts +74 -0
  228. package/dist/jazz/user-decrypt.js +143 -0
  229. package/dist/jazz/user-decrypt.js.map +1 -0
  230. package/dist/native/fhe-api.js +5959 -0
  231. package/dist/native/fhe-api.node.cjs +6167 -0
  232. package/dist/native/fhe-api.node.worker.cjs +210 -0
  233. package/dist/native/fhe-api.wasm +0 -0
  234. package/dist/native/fhe-api.worker.js +164 -0
  235. package/dist/native/kms/node/kms_lib.d.ts +38 -0
  236. package/dist/native/kms/node/kms_lib.js +356 -0
  237. package/dist/native/kms/node/kms_lib_bg.wasm +0 -0
  238. package/dist/native/kms/node/kms_lib_bg.wasm.d.ts +21 -0
  239. package/dist/native/kms/node/package.json +11 -0
  240. package/dist/native/kms/web/kms_lib.d.ts +84 -0
  241. package/dist/native/kms/web/kms_lib.js +443 -0
  242. package/dist/native/kms/web/kms_lib_bg.wasm +0 -0
  243. package/dist/native/kms/web/kms_lib_bg.wasm.d.ts +21 -0
  244. package/dist/native/kms/web/package.json +15 -0
  245. package/dist/runtime/browser.d.ts +36 -0
  246. package/dist/runtime/browser.js +115 -0
  247. package/dist/runtime/browser.js.map +1 -0
  248. package/dist/runtime/node.d.ts +30 -0
  249. package/dist/runtime/node.js +95 -0
  250. package/dist/runtime/node.js.map +1 -0
  251. package/dist/sdk/fhetransform-sdk-b.d.ts +102 -0
  252. package/dist/sdk/fhetransform-sdk-b.js +294 -0
  253. package/dist/sdk/fhetransform-sdk-b.js.map +1 -0
  254. package/dist/sdk/fhetransform-sdk.d.ts +87 -0
  255. package/dist/sdk/fhetransform-sdk.js +135 -0
  256. package/dist/sdk/fhetransform-sdk.js.map +1 -0
  257. package/dist/sdk/jazz-service.d.ts +13 -0
  258. package/dist/sdk/jazz-service.js +58 -0
  259. package/dist/sdk/jazz-service.js.map +1 -0
  260. package/dist/sdk/permit-service.d.ts +45 -0
  261. package/dist/sdk/permit-service.js +144 -0
  262. package/dist/sdk/permit-service.js.map +1 -0
  263. package/dist/wasm/fhe-wasm-client.d.ts +19 -0
  264. package/dist/wasm/fhe-wasm-client.js +23 -0
  265. package/dist/wasm/fhe-wasm-client.js.map +1 -0
  266. package/dist/wasm/fhe-wasm-module.d.ts +24 -0
  267. package/dist/wasm/fhe-wasm-module.js +141 -0
  268. package/dist/wasm/fhe-wasm-module.js.map +1 -0
  269. package/dist/wasm/fhe-wasm-type.d.ts +59 -0
  270. package/dist/wasm/fhe-wasm-type.js +244 -0
  271. package/dist/wasm/fhe-wasm-type.js.map +1 -0
  272. package/dist/wasm/wasm-loader.browser.d.ts +21 -0
  273. package/dist/wasm/wasm-loader.browser.js +143 -0
  274. package/dist/wasm/wasm-loader.browser.js.map +1 -0
  275. package/dist/wasm/wasm-loader.node.d.ts +24 -0
  276. package/dist/wasm/wasm-loader.node.js +114 -0
  277. package/dist/wasm/wasm-loader.node.js.map +1 -0
  278. package/dist/wasm/worker-client.browser.d.ts +6 -0
  279. package/dist/wasm/worker-client.browser.js +21 -0
  280. package/dist/wasm/worker-client.browser.js.map +1 -0
  281. package/dist/wasm/worker-client.d.ts +34 -0
  282. package/dist/wasm/worker-client.js +160 -0
  283. package/dist/wasm/worker-client.js.map +1 -0
  284. package/dist/wasm/worker-client.node.d.ts +6 -0
  285. package/dist/wasm/worker-client.node.js +20 -0
  286. package/dist/wasm/worker-client.node.js.map +1 -0
  287. package/dist/wasm/worker-message.d.ts +61 -0
  288. package/dist/wasm/worker-message.js +2 -0
  289. package/dist/wasm/worker-message.js.map +1 -0
  290. package/dist/wasm/worker-transport.browser.d.ts +15 -0
  291. package/dist/wasm/worker-transport.browser.js +35 -0
  292. package/dist/wasm/worker-transport.browser.js.map +1 -0
  293. package/dist/wasm/worker-transport.d.ts +6 -0
  294. package/dist/wasm/worker-transport.js +2 -0
  295. package/dist/wasm/worker-transport.js.map +1 -0
  296. package/dist/wasm/worker-transport.node.d.ts +17 -0
  297. package/dist/wasm/worker-transport.node.js +39 -0
  298. package/dist/wasm/worker-transport.node.js.map +1 -0
  299. package/dist/wasm/worker.d.ts +1 -0
  300. package/dist/wasm/worker.js +69 -0
  301. package/dist/wasm/worker.js.map +1 -0
  302. package/package.json +81 -0
@@ -0,0 +1,280 @@
1
+ import { ethers } from "ethers";
2
+ import { bytesToHex, fromHexString } from "../core/bytes.js";
3
+ import { kms_combine_secret, kms_unsigncrypt } from "../core/kms.js";
4
+ import { getHandleAbiType, getHandleFheType } from "../core/handle.js";
5
+ import { logger } from "../core/logger.js";
6
+ import { formatValue } from "../core/pretty-print.js";
7
+ import { readKmsSignersInfo } from "./read-contract.js";
8
+ import { aclAbi } from "../abis/acl.abi.js";
9
+ import { FheErrorCode } from "../core/errors/error-codes.js";
10
+ import { FheError } from "../core/errors/fhe-error.js";
11
+ // ============================================================================
12
+ // EIP-712 Constants
13
+ // ============================================================================
14
+ /**
15
+ * EIP-712 type definitions for KMS user decryption.
16
+ *
17
+ * CRITICAL: Field order is authoritative — it determines the EIP-712 type hash.
18
+ * Changing the order will produce a different signature and break on-chain verification.
19
+ * Must match the Solidity struct definition exactly.
20
+ */
21
+ export const kmsUserDecryptEip712Types = {
22
+ EIP712Domain: [
23
+ { name: 'name', type: 'string' },
24
+ { name: 'version', type: 'string' },
25
+ { name: 'chainId', type: 'uint256' },
26
+ { name: 'verifyingContract', type: 'address' },
27
+ ],
28
+ // CRITICAL: Field order is authoritative — it determines the EIP-712 type hash.
29
+ // Changing the order will produce a different signature and break on-chain verification.
30
+ // Must match the Solidity struct definition exactly.
31
+ ResponseUserDecryptSignData: [
32
+ { name: 'publicKey', type: 'bytes' },
33
+ { name: 'ctHandles', type: 'bytes32[]' },
34
+ { name: 'userDecryptedData', type: 'bytes' },
35
+ { name: 'extraData', type: 'bytes' },
36
+ ],
37
+ };
38
+ // ============================================================================
39
+ // Signature Verification
40
+ // ============================================================================
41
+ /**
42
+ * Verifies KMS user decryption EIP-712 signatures.
43
+ *
44
+ * This function:
45
+ * 1. Reconstructs the EIP-712 message from each share
46
+ * 2. Recovers the signer addresses from each signature
47
+ * 3. Verifies all recovered addresses are in the KMS signer set
48
+ * 4. Verifies the threshold is met
49
+ *
50
+ * @param client - The Jazz client instance
51
+ * @param params - Verification parameters (chainId, verifyingContract, handles, publicKey)
52
+ * @param shares - Array of KMS signcrypted shares
53
+ * @throws Error if verification fails (unknown signer, threshold not met, invalid signature)
54
+ */
55
+ export async function verifyUserDecryptionSignatures(client, params, shares) {
56
+ // Enter method
57
+ logger.debug(() => ['[verifyUserDecryptionSignatures] Enter', formatValue({ params, shares })]);
58
+ // ============================================================================
59
+ // Step 1: Build EIP-712 Domain and Types
60
+ // ============================================================================
61
+ const domain = {
62
+ name: 'Decryption',
63
+ version: '1',
64
+ chainId: params.chainId,
65
+ verifyingContract: params.verifyingContract,
66
+ };
67
+ const types = kmsUserDecryptEip712Types;
68
+ const primaryType = 'ResponseUserDecryptSignData';
69
+ const primaryTypeFields = types[primaryType];
70
+ if (primaryTypeFields === undefined) {
71
+ logger.error('[verifyUserDecryptionSignatures] Primary type not found', {
72
+ primaryType,
73
+ });
74
+ throw new FheError({ code: FheErrorCode.Internal, message: `Primary type "${primaryType}" not found in types` });
75
+ }
76
+ const typesToSign = {
77
+ [primaryType]: [...primaryTypeFields],
78
+ };
79
+ // ============================================================================
80
+ // Step 2: Recover Signer Addresses
81
+ // ============================================================================
82
+ logger.debug('[verifyUserDecryptionSignatures] Recovering signer addresses', {
83
+ shareCount: shares.length,
84
+ });
85
+ const recoveredAddresses = await Promise.all(shares.map(async (share, index) => {
86
+ // Build message from share data
87
+ const message = {
88
+ publicKey: params.publicKey,
89
+ ctHandles: params.handles,
90
+ userDecryptedData: `0x${share.payload}`,
91
+ extraData: `0x${share.extraData}`,
92
+ };
93
+ const signature = `0x${share.signature}`;
94
+ logger.trace('[verifyUserDecryptionSignatures] Verifying share', {
95
+ index,
96
+ payloadLength: share.payload.length,
97
+ signatureLength: share.signature.length,
98
+ extraDataLength: share.extraData.length,
99
+ });
100
+ try {
101
+ const signerAddress = ethers.verifyTypedData(domain, typesToSign, message, signature);
102
+ logger.debug('[verifyUserDecryptionSignatures] Signature recovered', {
103
+ index,
104
+ signature: signature.substring(0, 20) + '...',
105
+ signerAddress,
106
+ });
107
+ return signerAddress;
108
+ }
109
+ catch (error) {
110
+ logger.error('[verifyUserDecryptionSignatures] Failed to recover signature', {
111
+ index,
112
+ error: error.message,
113
+ });
114
+ throw error;
115
+ }
116
+ }));
117
+ logger.debug('[verifyUserDecryptionSignatures] Recovered addresses', {
118
+ addresses: recoveredAddresses,
119
+ });
120
+ // ============================================================================
121
+ // Step 3: Verify Against KMS Signer Set
122
+ // ============================================================================
123
+ const { kmsSigners, userDecryptionThreshold } = await readKmsSignersInfo(client);
124
+ // Verify all recovered signers are in the KMS signer set
125
+ const isInclude = recoveredAddresses.every(item => kmsSigners.includes(item));
126
+ if (!isInclude) {
127
+ logger.error('[verifyUserDecryptionSignatures] Unknown KMS signer detected', {
128
+ recoveredAddresses,
129
+ allowedSigners: kmsSigners,
130
+ });
131
+ throw new FheError({ code: FheErrorCode.UnknownSigner, message: 'Unknown KMS Signer' });
132
+ }
133
+ // Verify threshold is met
134
+ if (recoveredAddresses.length < userDecryptionThreshold) {
135
+ logger.error('[verifyUserDecryptionSignatures] Threshold not met', {
136
+ recoveredCount: recoveredAddresses.length,
137
+ threshold: userDecryptionThreshold,
138
+ });
139
+ throw new FheError({ code: FheErrorCode.ThresholdNotMet, message: 'recovered signer addresses should >= threshold' });
140
+ }
141
+ logger.info('[verifyUserDecryptionSignatures] All signatures verified successfully', {
142
+ recoveredCount: recoveredAddresses.length,
143
+ threshold: userDecryptionThreshold,
144
+ });
145
+ }
146
+ // ============================================================================
147
+ // KMS Decryption
148
+ // ============================================================================
149
+ /**
150
+ * Decrypts KMS signcrypted shares to recover plaintext values.
151
+ *
152
+ * This function:
153
+ * 1. Unsigncrypts each share using the KMS
154
+ * 2. Combines the shares to recover the secret
155
+ * 3. Decodes the recovered bytes to plaintext values
156
+ *
157
+ * @param handles - List of handles corresponding to the shares
158
+ * @param shares - Array of KMS signcrypted shares
159
+ * @param keypair - Transport key pair for decryption
160
+ * @returns Array of plaintext values
161
+ * @throws Error if decryption fails or shares are insufficient
162
+ */
163
+ export async function decryptKmsSignedcryptedShares(handles, shares, keypair, kmsDecryptionSignerAddress) {
164
+ // Enter method
165
+ logger.debug(() => ['[decryptKmsSignedcryptedShares] Enter', formatValue({ handles, shares })]);
166
+ // ============================================================================
167
+ // Step 1: Validate Inputs
168
+ // ============================================================================
169
+ if (handles.length === 0) {
170
+ logger.error('[decryptKmsSignedcryptedShares] No handles provided');
171
+ throw new FheError({ code: FheErrorCode.EmptyInput, message: 'No handles provided for decryption' });
172
+ }
173
+ if (shares.length === 0) {
174
+ logger.error('[decryptKmsSignedcryptedShares] No shares provided');
175
+ throw new FheError({ code: FheErrorCode.EmptyInput, message: 'No shares provided for decryption' });
176
+ }
177
+ // TODO: Check shares.length >= threshold
178
+ // ============================================================================
179
+ // Step 2: Prepare Keys
180
+ // ============================================================================
181
+ const sk = fromHexString(keypair.privateKey);
182
+ const pk = fromHexString(keypair.publicKey);
183
+ // ============================================================================
184
+ // Step 3: Unsigncrypt Each Share
185
+ // ============================================================================
186
+ logger.debug('[decryptKmsSignedcryptedShares] Unsigncrypting shares', {
187
+ shareCount: shares.length,
188
+ });
189
+ const sharedValues = [];
190
+ const kmsSignerAddress = fromHexString(kmsDecryptionSignerAddress);
191
+ for (let i = 0; i < shares.length; i++) {
192
+ const share = shares[i];
193
+ const encryptedShare = fromHexString(share.payload);
194
+ logger.trace('[decryptKmsSignedcryptedShares] Unsigncrypting share', {
195
+ index: i,
196
+ encryptedShareLength: encryptedShare.length,
197
+ });
198
+ const sharedValue = kms_unsigncrypt(encryptedShare, kmsSignerAddress, sk, pk);
199
+ logger.debug(() => ['[decryptKmsSignedcryptedShares] Share unsigncrypted', {
200
+ index: i,
201
+ sharedValue: formatValue(sharedValue),
202
+ }]);
203
+ sharedValues.push(sharedValue);
204
+ }
205
+ // ============================================================================
206
+ // Step 4: Combine Shares
207
+ // ============================================================================
208
+ logger.debug('[decryptKmsSignedcryptedShares] Combining shares', {
209
+ shareCount: sharedValues.length,
210
+ });
211
+ const recovered = kms_combine_secret(sharedValues);
212
+ logger.debug('[decryptKmsSignedcryptedShares] Shares combined', {
213
+ recovered: bytesToHex(recovered)
214
+ });
215
+ // ============================================================================
216
+ // Step 5: Decode Recovered Data
217
+ // ============================================================================
218
+ const abiTypes = handles.map(h => getHandleAbiType(h));
219
+ logger.trace('[decryptKmsSignedcryptedShares] Decoding recovered data', {
220
+ abiTypes,
221
+ recoveredLength: recovered.length,
222
+ });
223
+ const abiCoder = ethers.AbiCoder.defaultAbiCoder();
224
+ const decoded = abiCoder.decode(abiTypes, recovered);
225
+ if (decoded.length !== handles.length) {
226
+ throw new FheError({
227
+ code: FheErrorCode.DecryptionFailed,
228
+ message: `Decoded value count (${decoded.length}) does not match handles (${handles.length})`,
229
+ });
230
+ }
231
+ logger.debug('[decryptKmsSignedcryptedShares] Values decoded', {
232
+ decodedCount: decoded.length,
233
+ decodedValues: decoded.map((v) => v.toString()),
234
+ });
235
+ // ============================================================================
236
+ // Step 6: Build Plaintext Results
237
+ // ============================================================================
238
+ const results = [];
239
+ for (let i = 0; i < handles.length; i++) {
240
+ const plaintext = {
241
+ type: getHandleFheType(handles[i]),
242
+ value: decoded[i],
243
+ };
244
+ results.push(plaintext);
245
+ logger.trace('[decryptKmsSignedcryptedShares] Plaintext constructed', {
246
+ index: i,
247
+ type: plaintext.type,
248
+ value: plaintext.value.toString(),
249
+ });
250
+ }
251
+ logger.info('[decryptKmsSignedcryptedShares] Decryption completed successfully', { results });
252
+ return results;
253
+ }
254
+ export async function checkUserDecryptPermission(client, params) {
255
+ const { aclContractAddress, userAddress, ctHandles, sanitizedPairs } = params;
256
+ const provider = await client.sdk.requireProvider();
257
+ const contract = new ethers.Contract(aclContractAddress, aclAbi, provider);
258
+ // Check user permission
259
+ const userCheckPromises = ctHandles.map(async (ctHandle) => {
260
+ const isUserAllowed = await contract.isAllowed(ctHandle, userAddress);
261
+ if (!isUserAllowed) {
262
+ throw new FheError({ code: FheErrorCode.PermissionDenied, message: `UserDecryption: not allowed ${ctHandle} for user ${userAddress}`, context: { handle: ctHandle, userAddress } });
263
+ }
264
+ return ctHandle;
265
+ });
266
+ await Promise.all(userCheckPromises);
267
+ // Check contract (dapp) permission
268
+ const contractCheckPromises = sanitizedPairs.map(async ({ handle, contractAddress }) => {
269
+ const isContractAllowed = await contract.isAllowed(handle, contractAddress);
270
+ if (!isContractAllowed) {
271
+ throw new FheError({ code: FheErrorCode.PermissionDenied, message: `UserDecryption: not allowed ${handle} for dapp ${contractAddress}`, context: { handle, contractAddress } });
272
+ }
273
+ });
274
+ await Promise.all(contractCheckPromises);
275
+ logger.debug('[checkUserDecryptPermission] ACL permissions verified', {
276
+ userAddress,
277
+ handleCount: ctHandles.length
278
+ });
279
+ }
280
+ //# sourceMappingURL=user-decrypt-p.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-decrypt-p.js","sourceRoot":"","sources":["../../src/jazz/user-decrypt-p.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAsCvD,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAA8B;IAClE,YAAY,EAAE;QACZ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;QAChC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;QACnC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;QACpC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE;KACtC;IACV,gFAAgF;IAChF,yFAAyF;IACzF,qDAAqD;IACrD,2BAA2B,EAAE;QAC3B,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE;QACpC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE;QACxC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,OAAO,EAAE;QAC5C,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE;KAC5B;CACF,CAAC;AAEX,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,MAAmB,EACnB,MAKC,EACD,MAAsC;IAEtC,eAAe;IACf,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,wCAAwC,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAGhG,+EAA+E;IAC/E,yCAAyC;IACzC,+EAA+E;IAE/E,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;KACnC,CAAC;IAEX,MAAM,KAAK,GAAG,yBAAyB,CAAC;IACxC,MAAM,WAAW,GAAG,6BAA6B,CAAC;IAElD,MAAM,iBAAiB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,yDAAyD,EAAE;YACtE,WAAW;SACZ,CAAC,CAAC;QACH,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,iBAAiB,WAAW,sBAAsB,EAAE,CAAC,CAAC;IACnH,CAAC;IAED,MAAM,WAAW,GAAqC;QACpD,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC;KACtC,CAAC;IAEF,+EAA+E;IAC/E,mCAAmC;IACnC,+EAA+E;IAE/E,MAAM,CAAC,KAAK,CAAC,8DAA8D,EAAE;QAC3E,UAAU,EAAE,MAAM,CAAC,MAAM;KAC1B,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,GAAG,CAC1C,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAA0B,EAAE,KAAa,EAAE,EAAE;QAC7D,gCAAgC;QAChC,MAAM,OAAO,GAAgC;YAC3C,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,OAAO;YACzB,iBAAiB,EAAE,KAAK,KAAK,CAAC,OAAO,EAAc;YACnD,SAAS,EAAE,KAAK,KAAK,CAAC,SAAS,EAAc;SAC9C,CAAC;QAEF,MAAM,SAAS,GAAG,KAAK,KAAK,CAAC,SAAS,EAAc,CAAC;QAErD,MAAM,CAAC,KAAK,CAAC,kDAAkD,EAAE;YAC/D,KAAK;YACL,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;YACnC,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM;YACvC,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM;SACxC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YACtF,MAAM,CAAC,KAAK,CAAC,sDAAsD,EAAE;gBACnE,KAAK;gBACL,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;gBAC7C,aAAa;aACd,CAAC,CAAC;YACH,OAAO,aAAa,CAAC;QACvB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,8DAA8D,EAAE;gBAC3E,KAAK;gBACL,KAAK,EAAE,KAAK,CAAC,OAAO;aACrB,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,sDAAsD,EAAE;QACnE,SAAS,EAAE,kBAAkB;KAC9B,CAAC,CAAC;IAEH,+EAA+E;IAC/E,wCAAwC;IACxC,+EAA+E;IAC/E,MAAM,EAAE,UAAU,EAAE,uBAAuB,EAAE,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAEjF,yDAAyD;IACzD,MAAM,SAAS,GAAY,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACvF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,8DAA8D,EAAE;YAC3E,kBAAkB;YAClB,cAAc,EAAE,UAAU;SAC3B,CAAC,CAAC;QACH,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,aAAa,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,0BAA0B;IAC1B,IAAI,kBAAkB,CAAC,MAAM,GAAG,uBAAuB,EAAE,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,oDAAoD,EAAE;YACjE,cAAc,EAAE,kBAAkB,CAAC,MAAM;YACzC,SAAS,EAAE,uBAAuB;SACnC,CAAC,CAAC;QACH,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,eAAe,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC,CAAC;IACxH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,uEAAuE,EAAE;QACnF,cAAc,EAAE,kBAAkB,CAAC,MAAM;QACzC,SAAS,EAAE,uBAAuB;KACnC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,OAAqB,EACrB,MAA6B,EAC7B,OAAyB,EACzB,0BAAmC;IAEnC,eAAe;IACf,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,uCAAuC,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAEhG,+EAA+E;IAC/E,0BAA0B;IAC1B,+EAA+E;IAE/E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACpE,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,CAAC;IACvG,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACnE,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;IACtG,CAAC;IAED,yCAAyC;IAEzC,+EAA+E;IAC/E,uBAAuB;IACvB,+EAA+E;IAE/E,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE5C,+EAA+E;IAC/E,iCAAiC;IACjC,+EAA+E;IAE/E,MAAM,CAAC,KAAK,CAAC,uDAAuD,EAAE;QACpE,UAAU,EAAE,MAAM,CAAC,MAAM;KAC1B,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,EAAE,CAAC;IACxB,MAAM,gBAAgB,GAAG,aAAa,CAAC,0BAA0B,CAAC,CAAC;IAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEpD,MAAM,CAAC,KAAK,CAAC,sDAAsD,EAAE;YACnE,KAAK,EAAE,CAAC;YACR,oBAAoB,EAAE,cAAc,CAAC,MAAM;SAC5C,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,eAAe,CAAC,cAAc,EAAE,gBAAgB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAE9E,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,qDAAqD,EAAE;gBACzE,KAAK,EAAE,CAAC;gBACR,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC;aACtC,CAAC,CAAC,CAAC;QAEJ,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAED,+EAA+E;IAC/E,yBAAyB;IACzB,+EAA+E;IAE/E,MAAM,CAAC,KAAK,CAAC,kDAAkD,EAAE;QAC/D,UAAU,EAAE,YAAY,CAAC,MAAM;KAChC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,CAAC,iDAAiD,EAAE;QAC9D,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC;KACjC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,gCAAgC;IAChC,+EAA+E;IAE/E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,CAAC,yDAAyD,EAAE;QACtE,QAAQ;QACR,eAAe,EAAE,SAAS,CAAC,MAAM;KAClC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;IACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,IAAI,QAAQ,CAAC;YACjB,IAAI,EAAE,YAAY,CAAC,gBAAgB;YACnC,OAAO,EAAE,wBAAwB,OAAO,CAAC,MAAM,6BAA6B,OAAO,CAAC,MAAM,GAAG;SAC9F,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,gDAAgD,EAAE;QAC7D,YAAY,EAAE,OAAO,CAAC,MAAM;QAC5B,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;KACrD,CAAC,CAAC;IAEH,+EAA+E;IAC/E,kCAAkC;IAClC,+EAA+E;IAE/E,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,SAAS,GAAc;YAC3B,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;SAClB,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAExB,MAAM,CAAC,KAAK,CAAC,uDAAuD,EAAE;YACpE,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE;SAClC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,mEAAmE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAE9F,OAAO,OAAO,CAAC;AACjB,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAAmB,EACnB,MAQC;IAED,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;IAE9E,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,QAAQ,CAClC,kBAAkB,EAClB,MAAM,EACN,QAAQ,CACT,CAAC;IAEF,wBAAwB;IACxB,MAAM,iBAAiB,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QACzD,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACtE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,gBAAgB,EAAE,OAAO,EAAE,+BAA+B,QAAQ,aAAa,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QACtL,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAErC,mCAAmC;IACnC,MAAM,qBAAqB,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,EAAE;QACrF,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAC5E,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,gBAAgB,EAAE,OAAO,EAAE,+BAA+B,MAAM,aAAa,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;QAClL,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAEzC,MAAM,CAAC,KAAK,CAAC,uDAAuD,EAAE;QACpE,WAAW;QACX,WAAW,EAAE,SAAS,CAAC,MAAM;KAC9B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { HandleLike, Plaintext } from "../core/fhe-type.js";
2
+ import { Address } from "../core/primitives.js";
3
+ import type { IJazzClient } from "./jazz-client-i.js";
4
+ import { TransportKeyPair } from "./key-pair.js";
5
+ import { SignedDecryptionPermit } from "./permit.js";
6
+ import { JazzProcessOptions } from "./types/common.js";
7
+ /**
8
+ * Configuration options for user decryption operations.
9
+ */
10
+ export type UserDecryptOptions = JazzProcessOptions & {
11
+ checkPermissions?: boolean;
12
+ };
13
+ /**
14
+ * Input for user decryption: handle + contract address pair.
15
+ */
16
+ export type UserDecryptInput = {
17
+ /** Ciphertext handle to decrypt */
18
+ readonly handle: HandleLike;
19
+ /** Contract address associated with the handle */
20
+ readonly contractAddress: Address;
21
+ };
22
+ /**
23
+ * Payload can be a single input or an array of inputs.
24
+ */
25
+ export type UserDecryptPayload = UserDecryptInput | UserDecryptInput[];
26
+ /**
27
+ * Parameters for user decryption operations.
28
+ *
29
+ * This is the public API that internally fetches or creates the keypair and permit.
30
+ */
31
+ export type UserDecryptParameters<T extends UserDecryptPayload> = {
32
+ /** Handle-contract pairs to decrypt */
33
+ readonly payloads: T;
34
+ /** Additional options */
35
+ readonly options?: UserDecryptOptions;
36
+ };
37
+ /**
38
+ * Parameters for user decryption with pre-fetched keypair and permit.
39
+ *
40
+ * This is an internal variant used for testing/mock scenarios.
41
+ */
42
+ export type UserDecryptParameters2<T extends UserDecryptPayload> = {
43
+ /** Handle-contract pairs to decrypt */
44
+ readonly payloads: T;
45
+ /** Pre-fetched transport key pair */
46
+ readonly transportKeyPair: TransportKeyPair;
47
+ /** Pre-fetched signed decryption permit */
48
+ readonly signedPermit: SignedDecryptionPermit;
49
+ /** Additional options */
50
+ readonly options?: UserDecryptOptions;
51
+ };
52
+ /**
53
+ * Result of a user decryption operation.
54
+ */
55
+ export type UserDecryptResult<T extends UserDecryptPayload> = {
56
+ /** Decrypted plaintexts (single item or array matching input) */
57
+ readonly plaintexts: T extends HandleLike[] ? Plaintext[] : Plaintext;
58
+ };
59
+ /**
60
+ * Decrypts a value or batch of values using user decryption.
61
+ *
62
+ * This function handles the complete user decryption flow:
63
+ * 1. Gets or creates a transport key pair and decryption permit
64
+ * 2. Validates ACL permissions for each handle
65
+ * 3. Calls Jazz service for decryption shares
66
+ * 4. Verifies KMS signatures
67
+ * 5. Locally decrypts the shares to recover plaintexts
68
+ *
69
+ * @param client - The Jazz client instance
70
+ * @param parameters - User decryption parameters
71
+ * @returns UserDecryptResult containing plaintexts
72
+ * @throws Error if ACL check fails, decryption fails, or signature verification fails
73
+ */
74
+ export declare function decryptUserValue<T extends UserDecryptPayload>(client: IJazzClient, parameters: UserDecryptParameters<T>): Promise<UserDecryptResult<T>>;
@@ -0,0 +1,143 @@
1
+ import { formatValue } from "../core/pretty-print.js";
2
+ import { fetchUserDecrypt } from "./module/fetch-user-decrypt.js";
3
+ import { fetchUserDecrypt as fetchUserDecryptMock } from "./mock/fetch-user-decrypt.js";
4
+ import { getOrCreateTKeyPairWithPermit } from "./permit.js";
5
+ import { checkUserDecryptPermission, decryptKmsSignedcryptedShares, verifyUserDecryptionSignatures } from "./user-decrypt-p.js";
6
+ import { logger } from "../core/logger.js";
7
+ import { assertChecksumAddress } from "../core/address.js";
8
+ import { FheTransformSDKEvents } from "../core/event.js";
9
+ // ============================================================================
10
+ // Main User Decryption Function
11
+ // ============================================================================
12
+ /**
13
+ * Decrypts a value or batch of values using user decryption.
14
+ *
15
+ * This function handles the complete user decryption flow:
16
+ * 1. Gets or creates a transport key pair and decryption permit
17
+ * 2. Validates ACL permissions for each handle
18
+ * 3. Calls Jazz service for decryption shares
19
+ * 4. Verifies KMS signatures
20
+ * 5. Locally decrypts the shares to recover plaintexts
21
+ *
22
+ * @param client - The Jazz client instance
23
+ * @param parameters - User decryption parameters
24
+ * @returns UserDecryptResult containing plaintexts
25
+ * @throws Error if ACL check fails, decryption fails, or signature verification fails
26
+ */
27
+ export async function decryptUserValue(client, parameters) {
28
+ let t0;
29
+ // Enter method
30
+ logger.debug(() => ['[decryptUserValue] Enter', formatValue({ parameters })]);
31
+ const isArray = Array.isArray(parameters.payloads);
32
+ const items = (isArray ? parameters.payloads : [parameters.payloads]);
33
+ items.forEach(item => { assertChecksumAddress(item.contractAddress, "contractAddress"); });
34
+ const dappContractAddresses = items.map(item => item.contractAddress);
35
+ const ctHandles = items.map(item => item.handle);
36
+ const sanitizedPairs = items.map(item => ({
37
+ handle: item.handle,
38
+ contractAddress: item.contractAddress,
39
+ }));
40
+ logger.trace('[decryptUserValue] Sanitized pairs', { pairs: sanitizedPairs });
41
+ const isMock = client.sdk.isMock();
42
+ const chainId = await client.sdk.getChainID();
43
+ const sysContractInfo = await client.sdk.getSystemContractInfo();
44
+ // ============================================================================
45
+ // Step 0: Input Validation
46
+ // ============================================================================
47
+ // TODO: Add input validation here
48
+ // - Validate items are not empty
49
+ // - Validate each handle and contract address is valid
50
+ // ============================================================================
51
+ // Step 1: Get or Create Permit with Keypair
52
+ // ============================================================================
53
+ t0 = Date.now();
54
+ logger.debug('[decryptUserValue] Step 1: Getting or creating permit');
55
+ const { keypair, permit } = await getOrCreateTKeyPairWithPermit(client.sdk, dappContractAddresses);
56
+ logger.debug(() => ['[decryptUserValue] Permit and keypair ready', {
57
+ publicKey: formatValue(keypair.publicKey),
58
+ permit: formatValue(permit),
59
+ }]);
60
+ client.sdk.emitEvent({ type: FheTransformSDKEvents.GetOrCreateTKeyPairWithPermitEnd, durationMs: Date.now() - t0 });
61
+ // ============================================================================
62
+ // Step 2: Check ACL Permissions
63
+ // ============================================================================
64
+ if (parameters.options?.checkPermissions === true) {
65
+ logger.debug('[decryptUserValue] Step 2: Checking ACL permissions');
66
+ t0 = Date.now();
67
+ await checkUserDecryptPermission(client, {
68
+ aclContractAddress: sysContractInfo.aclContractAddress,
69
+ userAddress: permit.signerAddress,
70
+ ctHandles: [...ctHandles],
71
+ sanitizedPairs: sanitizedPairs,
72
+ });
73
+ client.sdk.emitEvent({ type: FheTransformSDKEvents.UserDecryptionPermissionCheckEnd, durationMs: Date.now() - t0 });
74
+ }
75
+ // ============================================================================
76
+ // Step 3: Call Jazz for Decryption
77
+ // ============================================================================
78
+ logger.debug('[decryptUserValue] Step 3: Fetching user decryption from Jazz');
79
+ const { signerAddress, signature } = permit;
80
+ const fetchUserDecryptParameters = {
81
+ payload: {
82
+ handleContractPairs: sanitizedPairs,
83
+ kmsDecryptEip712Signer: signerAddress,
84
+ kmsDecryptEip712Message: permit.eip712.message,
85
+ kmsDecryptEip712Signature: signature,
86
+ },
87
+ options: { ...parameters.options },
88
+ };
89
+ logger.debug(() => ['[decryptUserValue] User decryption fetch parameters', formatValue({ fetchUserDecryptParameters })]);
90
+ let result;
91
+ client.sdk.emitEvent({ type: FheTransformSDKEvents.FetchUserDecryptStart });
92
+ t0 = Date.now();
93
+ if (isMock) {
94
+ logger.trace('[decryptUserValue] Using mock mode for user decryption');
95
+ result = await fetchUserDecryptMock(client, fetchUserDecryptParameters, keypair);
96
+ }
97
+ else {
98
+ logger.trace('[decryptUserValue] Using production mode for user decryption');
99
+ result = await fetchUserDecrypt(client, fetchUserDecryptParameters);
100
+ }
101
+ client.sdk.emitEvent({ type: FheTransformSDKEvents.FetchUserDecryptEnd, durationMs: Date.now() - t0 });
102
+ logger.debug(() => ['[decryptUserValue] User decryption fetched', formatValue({ result })]);
103
+ // ============================================================================
104
+ // Step 4: Verify KMS Signatures
105
+ // ============================================================================
106
+ t0 = Date.now();
107
+ logger.debug('[decryptUserValue] Step 4: Verifying KMS signatures');
108
+ await verifyUserDecryptionSignatures(client, {
109
+ chainId: chainId,
110
+ verifyingContract: sysContractInfo.decryptionContractAddress,
111
+ handles: [...ctHandles],
112
+ publicKey: keypair.publicKey,
113
+ }, result);
114
+ logger.debug('[decryptUserValue] KMS signatures verified successfully');
115
+ client.sdk.emitEvent({ type: FheTransformSDKEvents.VerifyUserDecryptionSignaturesEnd, durationMs: Date.now() - t0 });
116
+ // ============================================================================
117
+ // Step 5: Local Decrypt
118
+ // ============================================================================
119
+ const signerAddressInfo = await client.sdk.getSignerAddressInfo();
120
+ t0 = Date.now();
121
+ logger.debug('[decryptUserValue] Step 5: Decrypting shares locally');
122
+ const results = await decryptKmsSignedcryptedShares(ctHandles, [...result], keypair, signerAddressInfo.kmsDecryptionSignerAddress);
123
+ logger.debug('[decryptUserValue] Shares decrypted locally', {
124
+ resultCount: results.length,
125
+ plaintexts: results.map((p, i) => ({
126
+ index: i,
127
+ type: p.type,
128
+ value: p.value.toString(),
129
+ })),
130
+ });
131
+ client.sdk.emitEvent({ type: FheTransformSDKEvents.DecryptKmsSignedcryptedSharessEnd, durationMs: Date.now() - t0 });
132
+ // ============================================================================
133
+ // Step 6: Return Result
134
+ // ============================================================================
135
+ logger.info('[decryptUserValue] User decryption completed successfully', {
136
+ resultCount: results.length,
137
+ isArray,
138
+ });
139
+ return {
140
+ plaintexts: isArray ? results : results[0],
141
+ };
142
+ }
143
+ //# sourceMappingURL=user-decrypt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-decrypt.js","sourceRoot":"","sources":["../../src/jazz/user-decrypt.ts"],"names":[],"mappings":"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"}