@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.
- package/README.md +198 -0
- package/dist/abis/acl.abi.d.ts +379 -0
- package/dist/abis/acl.abi.js +495 -0
- package/dist/abis/acl.abi.js.map +1 -0
- package/dist/abis/alphatrion_reward.abi.d.ts +407 -0
- package/dist/abis/alphatrion_reward.abi.js +532 -0
- package/dist/abis/alphatrion_reward.abi.js.map +1 -0
- package/dist/abis/ciphertext_digests.abi.d.ts +336 -0
- package/dist/abis/ciphertext_digests.abi.js +444 -0
- package/dist/abis/ciphertext_digests.abi.js.map +1 -0
- package/dist/abis/ciphertext_verification.abi.d.ts +637 -0
- package/dist/abis/ciphertext_verification.abi.js +830 -0
- package/dist/abis/ciphertext_verification.abi.js.map +1 -0
- package/dist/abis/convert_token.abi.d.ts +922 -0
- package/dist/abis/convert_token.abi.js +1208 -0
- package/dist/abis/convert_token.abi.js.map +1 -0
- package/dist/abis/decryption.abi.d.ts +956 -0
- package/dist/abis/decryption.abi.js +1244 -0
- package/dist/abis/decryption.abi.js.map +1 -0
- package/dist/abis/erc20.abi.d.ts +265 -0
- package/dist/abis/erc20.abi.js +350 -0
- package/dist/abis/erc20.abi.js.map +1 -0
- package/dist/abis/fhe_executor.abi.d.ts +1535 -0
- package/dist/abis/fhe_executor.abi.js +1962 -0
- package/dist/abis/fhe_executor.abi.js.map +1 -0
- package/dist/abis/space_bridge_config.abi.d.ts +792 -0
- package/dist/abis/space_bridge_config.abi.js +1032 -0
- package/dist/abis/space_bridge_config.abi.js.map +1 -0
- package/dist/abis/token.abi.d.ts +630 -0
- package/dist/abis/token.abi.js +828 -0
- package/dist/abis/token.abi.js.map +1 -0
- package/dist/cli/eusdc.d.ts +2 -0
- package/dist/cli/eusdc.js +41 -0
- package/dist/cli/eusdc.js.map +1 -0
- package/dist/contract/callbacks.d.ts +59 -0
- package/dist/contract/callbacks.js +2 -0
- package/dist/contract/callbacks.js.map +1 -0
- package/dist/contract/convert-token.d.ts +107 -0
- package/dist/contract/convert-token.js +249 -0
- package/dist/contract/convert-token.js.map +1 -0
- package/dist/contract/token.d.ts +167 -0
- package/dist/contract/token.js +404 -0
- package/dist/contract/token.js.map +1 -0
- package/dist/contract/transaction.d.ts +29 -0
- package/dist/contract/transaction.js +2 -0
- package/dist/contract/transaction.js.map +1 -0
- package/dist/core/address.d.ts +118 -0
- package/dist/core/address.js +200 -0
- package/dist/core/address.js.map +1 -0
- package/dist/core/auth.d.ts +68 -0
- package/dist/core/auth.js +58 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/bytes.d.ts +48 -0
- package/dist/core/bytes.js +117 -0
- package/dist/core/bytes.js.map +1 -0
- package/dist/core/cache-manager.d.ts +138 -0
- package/dist/core/cache-manager.js +440 -0
- package/dist/core/cache-manager.js.map +1 -0
- package/dist/core/chain.d.ts +41 -0
- package/dist/core/chain.js +59 -0
- package/dist/core/chain.js.map +1 -0
- package/dist/core/constants.d.ts +24 -0
- package/dist/core/constants.js +25 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/error.d.ts +2 -0
- package/dist/core/error.js +14 -0
- package/dist/core/error.js.map +1 -0
- package/dist/core/errors/error-catalog.d.ts +29 -0
- package/dist/core/errors/error-catalog.js +84 -0
- package/dist/core/errors/error-catalog.js.map +1 -0
- package/dist/core/errors/error-codes.d.ts +52 -0
- package/dist/core/errors/error-codes.js +61 -0
- package/dist/core/errors/error-codes.js.map +1 -0
- package/dist/core/errors/error-utils.d.ts +27 -0
- package/dist/core/errors/error-utils.js +110 -0
- package/dist/core/errors/error-utils.js.map +1 -0
- package/dist/core/errors/fhe-error.d.ts +98 -0
- package/dist/core/errors/fhe-error.js +190 -0
- package/dist/core/errors/fhe-error.js.map +1 -0
- package/dist/core/errors/index.d.ts +4 -0
- package/dist/core/errors/index.js +5 -0
- package/dist/core/errors/index.js.map +1 -0
- package/dist/core/estimate.d.ts +39 -0
- package/dist/core/estimate.js +111 -0
- package/dist/core/estimate.js.map +1 -0
- package/dist/core/event.d.ts +212 -0
- package/dist/core/event.js +42 -0
- package/dist/core/event.js.map +1 -0
- package/dist/core/fhe-type.d.ts +75 -0
- package/dist/core/fhe-type.js +115 -0
- package/dist/core/fhe-type.js.map +1 -0
- package/dist/core/fhe.d.ts +11 -0
- package/dist/core/fhe.js +23 -0
- package/dist/core/fhe.js.map +1 -0
- package/dist/core/handle.d.ts +42 -0
- package/dist/core/handle.js +99 -0
- package/dist/core/handle.js.map +1 -0
- package/dist/core/json-utils.d.ts +18 -0
- package/dist/core/json-utils.js +37 -0
- package/dist/core/json-utils.js.map +1 -0
- package/dist/core/kms.d.ts +42 -0
- package/dist/core/kms.js +70 -0
- package/dist/core/kms.js.map +1 -0
- package/dist/core/logger.d.ts +3 -0
- package/dist/core/logger.js +11 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/pretty-print.d.ts +18 -0
- package/dist/core/pretty-print.js +84 -0
- package/dist/core/pretty-print.js.map +1 -0
- package/dist/core/primitives.d.ts +22 -0
- package/dist/core/primitives.js +2 -0
- package/dist/core/primitives.js.map +1 -0
- package/dist/core/retryable-handler.d.ts +74 -0
- package/dist/core/retryable-handler.js +227 -0
- package/dist/core/retryable-handler.js.map +1 -0
- package/dist/core/signer-address-info.d.ts +15 -0
- package/dist/core/signer-address-info.js +33 -0
- package/dist/core/signer-address-info.js.map +1 -0
- package/dist/core/string.d.ts +28 -0
- package/dist/core/string.js +33 -0
- package/dist/core/string.js.map +1 -0
- package/dist/core/swallow.d.ts +23 -0
- package/dist/core/swallow.js +37 -0
- package/dist/core/swallow.js.map +1 -0
- package/dist/core/system-contract-info.d.ts +17 -0
- package/dist/core/system-contract-info.js +41 -0
- package/dist/core/system-contract-info.js.map +1 -0
- package/dist/core/ttl-cache.d.ts +81 -0
- package/dist/core/ttl-cache.js +113 -0
- package/dist/core/ttl-cache.js.map +1 -0
- package/dist/core/tx-error-parser.d.ts +40 -0
- package/dist/core/tx-error-parser.js +83 -0
- package/dist/core/tx-error-parser.js.map +1 -0
- package/dist/core/utils.d.ts +62 -0
- package/dist/core/utils.js +143 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/jazz/encrypt-key-p.d.ts +65 -0
- package/dist/jazz/encrypt-key-p.js +283 -0
- package/dist/jazz/encrypt-key-p.js.map +1 -0
- package/dist/jazz/encrypt-p.d.ts +82 -0
- package/dist/jazz/encrypt-p.js +139 -0
- package/dist/jazz/encrypt-p.js.map +1 -0
- package/dist/jazz/encrypt.d.ts +58 -0
- package/dist/jazz/encrypt.js +155 -0
- package/dist/jazz/encrypt.js.map +1 -0
- package/dist/jazz/input-proof-p.d.ts +122 -0
- package/dist/jazz/input-proof-p.js +265 -0
- package/dist/jazz/input-proof-p.js.map +1 -0
- package/dist/jazz/jazz-client-i.d.ts +16 -0
- package/dist/jazz/jazz-client-i.js +2 -0
- package/dist/jazz/jazz-client-i.js.map +1 -0
- package/dist/jazz/jazz-client.d.ts +18 -0
- package/dist/jazz/jazz-client.js +24 -0
- package/dist/jazz/jazz-client.js.map +1 -0
- package/dist/jazz/key-pair.d.ts +50 -0
- package/dist/jazz/key-pair.js +166 -0
- package/dist/jazz/key-pair.js.map +1 -0
- package/dist/jazz/mock/fake.d.ts +3 -0
- package/dist/jazz/mock/fake.js +23 -0
- package/dist/jazz/mock/fake.js.map +1 -0
- package/dist/jazz/mock/fetch-input-proof.d.ts +4 -0
- package/dist/jazz/mock/fetch-input-proof.js +63 -0
- package/dist/jazz/mock/fetch-input-proof.js.map +1 -0
- package/dist/jazz/mock/fetch-key-url.d.ts +3 -0
- package/dist/jazz/mock/fetch-key-url.js +15 -0
- package/dist/jazz/mock/fetch-key-url.js.map +1 -0
- package/dist/jazz/mock/fetch-public-decrypt.d.ts +3 -0
- package/dist/jazz/mock/fetch-public-decrypt.js +81 -0
- package/dist/jazz/mock/fetch-public-decrypt.js.map +1 -0
- package/dist/jazz/mock/fetch-user-decrypt.d.ts +4 -0
- package/dist/jazz/mock/fetch-user-decrypt.js +174 -0
- package/dist/jazz/mock/fetch-user-decrypt.js.map +1 -0
- package/dist/jazz/module/fetch-input-proof.d.ts +19 -0
- package/dist/jazz/module/fetch-input-proof.js +72 -0
- package/dist/jazz/module/fetch-input-proof.js.map +1 -0
- package/dist/jazz/module/fetch-key-url.d.ts +17 -0
- package/dist/jazz/module/fetch-key-url.js +46 -0
- package/dist/jazz/module/fetch-key-url.js.map +1 -0
- package/dist/jazz/module/fetch-public-decrypt.d.ts +19 -0
- package/dist/jazz/module/fetch-public-decrypt.js +65 -0
- package/dist/jazz/module/fetch-public-decrypt.js.map +1 -0
- package/dist/jazz/module/fetch-user-decrypt.d.ts +19 -0
- package/dist/jazz/module/fetch-user-decrypt.js +109 -0
- package/dist/jazz/module/fetch-user-decrypt.js.map +1 -0
- package/dist/jazz/module/jazz-async-request.d.ts +102 -0
- package/dist/jazz/module/jazz-async-request.js +515 -0
- package/dist/jazz/module/jazz-async-request.js.map +1 -0
- package/dist/jazz/module/jazz-p.d.ts +61 -0
- package/dist/jazz/module/jazz-p.js +33 -0
- package/dist/jazz/module/jazz-p.js.map +1 -0
- package/dist/jazz/module/s3-download.d.ts +85 -0
- package/dist/jazz/module/s3-download.js +293 -0
- package/dist/jazz/module/s3-download.js.map +1 -0
- package/dist/jazz/permit.d.ts +200 -0
- package/dist/jazz/permit.js +319 -0
- package/dist/jazz/permit.js.map +1 -0
- package/dist/jazz/public-decrypt-p.d.ts +96 -0
- package/dist/jazz/public-decrypt-p.js +258 -0
- package/dist/jazz/public-decrypt-p.js.map +1 -0
- package/dist/jazz/public-decrypt.d.ts +48 -0
- package/dist/jazz/public-decrypt.js +156 -0
- package/dist/jazz/public-decrypt.js.map +1 -0
- package/dist/jazz/read-contract.d.ts +81 -0
- package/dist/jazz/read-contract.js +125 -0
- package/dist/jazz/read-contract.js.map +1 -0
- package/dist/jazz/types/common.d.ts +17 -0
- package/dist/jazz/types/common.js +2 -0
- package/dist/jazz/types/common.js.map +1 -0
- package/dist/jazz/types/input-proof.d.ts +76 -0
- package/dist/jazz/types/input-proof.js +2 -0
- package/dist/jazz/types/input-proof.js.map +1 -0
- package/dist/jazz/types/key-url.d.ts +68 -0
- package/dist/jazz/types/key-url.js +5 -0
- package/dist/jazz/types/key-url.js.map +1 -0
- package/dist/jazz/types/public-decrypt.d.ts +61 -0
- package/dist/jazz/types/public-decrypt.js +2 -0
- package/dist/jazz/types/public-decrypt.js.map +1 -0
- package/dist/jazz/types/user-decrypt.d.ts +123 -0
- package/dist/jazz/types/user-decrypt.js +2 -0
- package/dist/jazz/types/user-decrypt.js.map +1 -0
- package/dist/jazz/user-decrypt-p.d.ts +111 -0
- package/dist/jazz/user-decrypt-p.js +280 -0
- package/dist/jazz/user-decrypt-p.js.map +1 -0
- package/dist/jazz/user-decrypt.d.ts +74 -0
- package/dist/jazz/user-decrypt.js +143 -0
- package/dist/jazz/user-decrypt.js.map +1 -0
- package/dist/native/fhe-api.js +5959 -0
- package/dist/native/fhe-api.node.cjs +6167 -0
- package/dist/native/fhe-api.node.worker.cjs +210 -0
- package/dist/native/fhe-api.wasm +0 -0
- package/dist/native/fhe-api.worker.js +164 -0
- package/dist/native/kms/node/kms_lib.d.ts +38 -0
- package/dist/native/kms/node/kms_lib.js +356 -0
- package/dist/native/kms/node/kms_lib_bg.wasm +0 -0
- package/dist/native/kms/node/kms_lib_bg.wasm.d.ts +21 -0
- package/dist/native/kms/node/package.json +11 -0
- package/dist/native/kms/web/kms_lib.d.ts +84 -0
- package/dist/native/kms/web/kms_lib.js +443 -0
- package/dist/native/kms/web/kms_lib_bg.wasm +0 -0
- package/dist/native/kms/web/kms_lib_bg.wasm.d.ts +21 -0
- package/dist/native/kms/web/package.json +15 -0
- package/dist/runtime/browser.d.ts +36 -0
- package/dist/runtime/browser.js +115 -0
- package/dist/runtime/browser.js.map +1 -0
- package/dist/runtime/node.d.ts +30 -0
- package/dist/runtime/node.js +95 -0
- package/dist/runtime/node.js.map +1 -0
- package/dist/sdk/fhetransform-sdk-b.d.ts +102 -0
- package/dist/sdk/fhetransform-sdk-b.js +294 -0
- package/dist/sdk/fhetransform-sdk-b.js.map +1 -0
- package/dist/sdk/fhetransform-sdk.d.ts +87 -0
- package/dist/sdk/fhetransform-sdk.js +135 -0
- package/dist/sdk/fhetransform-sdk.js.map +1 -0
- package/dist/sdk/jazz-service.d.ts +13 -0
- package/dist/sdk/jazz-service.js +58 -0
- package/dist/sdk/jazz-service.js.map +1 -0
- package/dist/sdk/permit-service.d.ts +45 -0
- package/dist/sdk/permit-service.js +144 -0
- package/dist/sdk/permit-service.js.map +1 -0
- package/dist/wasm/fhe-wasm-client.d.ts +19 -0
- package/dist/wasm/fhe-wasm-client.js +23 -0
- package/dist/wasm/fhe-wasm-client.js.map +1 -0
- package/dist/wasm/fhe-wasm-module.d.ts +24 -0
- package/dist/wasm/fhe-wasm-module.js +141 -0
- package/dist/wasm/fhe-wasm-module.js.map +1 -0
- package/dist/wasm/fhe-wasm-type.d.ts +59 -0
- package/dist/wasm/fhe-wasm-type.js +244 -0
- package/dist/wasm/fhe-wasm-type.js.map +1 -0
- package/dist/wasm/wasm-loader.browser.d.ts +21 -0
- package/dist/wasm/wasm-loader.browser.js +143 -0
- package/dist/wasm/wasm-loader.browser.js.map +1 -0
- package/dist/wasm/wasm-loader.node.d.ts +24 -0
- package/dist/wasm/wasm-loader.node.js +114 -0
- package/dist/wasm/wasm-loader.node.js.map +1 -0
- package/dist/wasm/worker-client.browser.d.ts +6 -0
- package/dist/wasm/worker-client.browser.js +21 -0
- package/dist/wasm/worker-client.browser.js.map +1 -0
- package/dist/wasm/worker-client.d.ts +34 -0
- package/dist/wasm/worker-client.js +160 -0
- package/dist/wasm/worker-client.js.map +1 -0
- package/dist/wasm/worker-client.node.d.ts +6 -0
- package/dist/wasm/worker-client.node.js +20 -0
- package/dist/wasm/worker-client.node.js.map +1 -0
- package/dist/wasm/worker-message.d.ts +61 -0
- package/dist/wasm/worker-message.js +2 -0
- package/dist/wasm/worker-message.js.map +1 -0
- package/dist/wasm/worker-transport.browser.d.ts +15 -0
- package/dist/wasm/worker-transport.browser.js +35 -0
- package/dist/wasm/worker-transport.browser.js.map +1 -0
- package/dist/wasm/worker-transport.d.ts +6 -0
- package/dist/wasm/worker-transport.js +2 -0
- package/dist/wasm/worker-transport.js.map +1 -0
- package/dist/wasm/worker-transport.node.d.ts +17 -0
- package/dist/wasm/worker-transport.node.js +39 -0
- package/dist/wasm/worker-transport.node.js.map +1 -0
- package/dist/wasm/worker.d.ts +1 -0
- package/dist/wasm/worker.js +69 -0
- package/dist/wasm/worker.js.map +1 -0
- 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":"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"}
|
|
@@ -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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"}
|