@inco/js 0.6.9 → 0.7.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 +8 -8
- package/dist/cjs/advancedacl/session-key.d.ts +39 -26
- package/dist/cjs/advancedacl/session-key.js +53 -136
- package/dist/cjs/attestedcompute/attested-compute.d.ts +6 -6
- package/dist/cjs/attestedcompute/attested-compute.js +5 -35
- package/dist/cjs/attesteddecrypt/attested-decrypt.d.ts +36 -21
- package/dist/cjs/attesteddecrypt/attested-decrypt.js +107 -108
- package/dist/cjs/attesteddecrypt/types.d.ts +4 -4
- package/dist/cjs/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +15 -1
- package/dist/cjs/generated/es/inco/covalidator/compute/v1/types_pb.js +1 -1
- package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +13 -5
- package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.js +3 -4
- package/dist/cjs/generated/lightning.d.ts +40 -0
- package/dist/cjs/generated/lightning.js +43 -1
- package/dist/cjs/generated/local-node.d.ts +11 -7
- package/dist/cjs/generated/local-node.js +28 -8
- package/dist/cjs/kms/client.d.ts +8 -4
- package/dist/cjs/kms/client.js +9 -4
- package/dist/cjs/kms/quorumClient.d.ts +58 -0
- package/dist/cjs/kms/quorumClient.js +378 -0
- package/dist/cjs/kms/thresholdPromises.d.ts +7 -0
- package/dist/cjs/kms/thresholdPromises.js +52 -0
- package/dist/cjs/lite/index.d.ts +0 -1
- package/dist/cjs/lite/index.js +1 -2
- package/dist/cjs/lite/lightning.d.ts +87 -67
- package/dist/cjs/lite/lightning.js +231 -100
- package/dist/cjs/local/local-node.d.ts +1 -2
- package/dist/cjs/local/local-node.js +2 -3
- package/dist/cjs/test/mocks.d.ts +3 -0
- package/dist/cjs/test/mocks.js +19 -1
- package/dist/esm/advancedacl/session-key.d.ts +39 -26
- package/dist/esm/advancedacl/session-key.js +44 -126
- package/dist/esm/attestedcompute/attested-compute.d.ts +6 -6
- package/dist/esm/attestedcompute/attested-compute.js +6 -36
- package/dist/esm/attesteddecrypt/attested-decrypt.d.ts +36 -21
- package/dist/esm/attesteddecrypt/attested-decrypt.js +106 -108
- package/dist/esm/attesteddecrypt/types.d.ts +4 -4
- package/dist/esm/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +15 -1
- package/dist/esm/generated/es/inco/covalidator/compute/v1/types_pb.js +1 -1
- package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +13 -5
- package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.js +2 -3
- package/dist/esm/generated/lightning.d.ts +40 -0
- package/dist/esm/generated/lightning.js +43 -1
- package/dist/esm/generated/local-node.d.ts +11 -7
- package/dist/esm/generated/local-node.js +28 -8
- package/dist/esm/kms/client.d.ts +8 -4
- package/dist/esm/kms/client.js +8 -4
- package/dist/esm/kms/quorumClient.d.ts +58 -0
- package/dist/esm/kms/quorumClient.js +374 -0
- package/dist/esm/kms/thresholdPromises.d.ts +7 -0
- package/dist/esm/kms/thresholdPromises.js +49 -0
- package/dist/esm/lite/index.d.ts +0 -1
- package/dist/esm/lite/index.js +1 -2
- package/dist/esm/lite/lightning.d.ts +87 -67
- package/dist/esm/lite/lightning.js +234 -103
- package/dist/esm/local/local-node.d.ts +1 -2
- package/dist/esm/local/local-node.js +2 -3
- package/dist/esm/test/mocks.d.ts +3 -0
- package/dist/esm/test/mocks.js +17 -1
- package/dist/types/advancedacl/session-key.d.ts +39 -26
- package/dist/types/attestedcompute/attested-compute.d.ts +6 -6
- package/dist/types/attesteddecrypt/attested-decrypt.d.ts +36 -21
- package/dist/types/attesteddecrypt/types.d.ts +4 -4
- package/dist/types/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +15 -1
- package/dist/types/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +13 -5
- package/dist/types/generated/lightning.d.ts +40 -0
- package/dist/types/generated/local-node.d.ts +11 -7
- package/dist/types/kms/client.d.ts +8 -4
- package/dist/types/kms/quorumClient.d.ts +58 -0
- package/dist/types/kms/thresholdPromises.d.ts +7 -0
- package/dist/types/lite/index.d.ts +0 -1
- package/dist/types/lite/lightning.d.ts +87 -67
- package/dist/types/local/local-node.d.ts +1 -2
- package/dist/types/test/mocks.d.ts +3 -0
- package/package.json +2 -2
- package/dist/cjs/attestedreveal/attested-reveal.d.ts +0 -21
- package/dist/cjs/attestedreveal/attested-reveal.js +0 -69
- package/dist/cjs/attestedreveal/index.d.ts +0 -1
- package/dist/cjs/attestedreveal/index.js +0 -18
- package/dist/cjs/attestedreveal/types.d.ts +0 -7
- package/dist/cjs/attestedreveal/types.js +0 -16
- package/dist/cjs/generated/es/cosmos_proto/cosmos_pb.d.ts +0 -174
- package/dist/cjs/generated/es/cosmos_proto/cosmos_pb.js +0 -118
- package/dist/cjs/generated/es/inco/fhe/v1/types_pb.d.ts +0 -419
- package/dist/cjs/generated/es/inco/fhe/v1/types_pb.js +0 -136
- package/dist/cjs/lite/reencrypt.d.ts +0 -21
- package/dist/cjs/lite/reencrypt.js +0 -141
- package/dist/esm/attestedreveal/attested-reveal.d.ts +0 -21
- package/dist/esm/attestedreveal/attested-reveal.js +0 -66
- package/dist/esm/attestedreveal/index.d.ts +0 -1
- package/dist/esm/attestedreveal/index.js +0 -2
- package/dist/esm/attestedreveal/types.d.ts +0 -7
- package/dist/esm/attestedreveal/types.js +0 -12
- package/dist/esm/generated/es/cosmos_proto/cosmos_pb.d.ts +0 -174
- package/dist/esm/generated/es/cosmos_proto/cosmos_pb.js +0 -115
- package/dist/esm/generated/es/inco/fhe/v1/types_pb.d.ts +0 -419
- package/dist/esm/generated/es/inco/fhe/v1/types_pb.js +0 -133
- package/dist/esm/lite/reencrypt.d.ts +0 -21
- package/dist/esm/lite/reencrypt.js +0 -131
- package/dist/types/attestedreveal/attested-reveal.d.ts +0 -21
- package/dist/types/attestedreveal/index.d.ts +0 -1
- package/dist/types/attestedreveal/types.d.ts +0 -7
- package/dist/types/generated/es/cosmos_proto/cosmos_pb.d.ts +0 -174
- package/dist/types/generated/es/inco/fhe/v1/types_pb.d.ts +0 -419
- package/dist/types/lite/reencrypt.d.ts +0 -21
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ A typical usage of `@inco/js` includes 3 steps:
|
|
|
24
24
|
|
|
25
25
|
1. Encrypting a value.
|
|
26
26
|
2. Posting the ciphertext to the contract, which will perform confidential computes on it.
|
|
27
|
-
3. Requesting
|
|
27
|
+
3. Requesting an attested decryption of the result of the computation.
|
|
28
28
|
|
|
29
29
|
### 1. Encrypt a value
|
|
30
30
|
|
|
@@ -66,13 +66,13 @@ import { Hex } from "viem";
|
|
|
66
66
|
|
|
67
67
|
// Request a re-encryption of the result ciphertext
|
|
68
68
|
const resultHandle = "0x..." as Hex; // Retrieve the handle from the contract, e.g. using viem
|
|
69
|
-
|
|
70
|
-
const resultPlaintext = await
|
|
69
|
+
// Use same walletClient as previous step
|
|
70
|
+
const resultPlaintext = await zap.attestedDecrypt(walletClient, [resultHandle]);
|
|
71
71
|
|
|
72
|
-
console.log(resultPlaintext.value); // The decrypted value
|
|
72
|
+
console.log(resultPlaintext[0].plaintext.value); // The decrypted value
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
-
Handles are processed asynchronously so you may need to wait for our covalidators to catch and compute the value. If you request
|
|
75
|
+
Handles are processed asynchronously so you may need to wait for our covalidators to catch and compute the value. If you request an attested decryption before it has been processed you will get an error. To help ameliorate this the `attestedDecrypt` has built-in retries, you can further customise by passing a `BackoffConfig` as an extra argument:
|
|
76
76
|
|
|
77
77
|
```ts
|
|
78
78
|
type BackoffConfig = {
|
|
@@ -82,15 +82,15 @@ type BackoffConfig = {
|
|
|
82
82
|
};
|
|
83
83
|
|
|
84
84
|
const resultHandle = "0x..." as Hex;
|
|
85
|
-
const reencryptor = await zap.getReencryptor(walletClient);
|
|
86
85
|
// Default backoff config shown for reference
|
|
87
86
|
const backoffConfig: BackoffConfig = {
|
|
88
87
|
maxRetries: 10,
|
|
89
88
|
baseDelayInMs: 1000,
|
|
90
89
|
backoffFactor: 1.5,
|
|
91
90
|
};
|
|
92
|
-
const resultPlaintext = await
|
|
93
|
-
|
|
91
|
+
const resultPlaintext = await zap.attestedDecrypt(
|
|
92
|
+
walletClient,
|
|
93
|
+
[resultHandle],
|
|
94
94
|
backoffConfig,
|
|
95
95
|
);
|
|
96
96
|
```
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import type { Client } from '@connectrpc/connect';
|
|
2
1
|
import { type Account, type Address, type Chain, type Hex, type Transport, type WalletClient } from 'viem';
|
|
3
|
-
import { DecryptionAttestation } from '../attesteddecrypt/index.js';
|
|
2
|
+
import { DecryptionAttestation, EncryptedDecryptionAttestation } from '../attesteddecrypt/index.js';
|
|
4
3
|
import { SupportedChainId } from '../chain.js';
|
|
5
4
|
import { type EciesScheme, SupportedFheType } from '../encryption/encryption.js';
|
|
6
5
|
import { HexString } from '../index.js';
|
|
7
|
-
import type {
|
|
8
|
-
import { type ReencryptFnArgs } from '../reencryption/index.js';
|
|
6
|
+
import type { Secp256k1Keypair } from '../lite/index.js';
|
|
9
7
|
import { BackoffConfig } from '../retry.js';
|
|
10
8
|
import type { AllowanceVoucher, AllowanceVoucherWithSig } from './types.js';
|
|
11
9
|
import { AttestedComputeOP } from '../attestedcompute/types.js';
|
|
10
|
+
import { KmsQuorumClient } from '../kms/quorumClient.js';
|
|
12
11
|
export interface Session {
|
|
13
12
|
decrypter: Address;
|
|
14
13
|
expiresAt: bigint;
|
|
@@ -23,42 +22,56 @@ export interface GrantSessionKeyArgs {
|
|
|
23
22
|
expiresAt: Date;
|
|
24
23
|
}
|
|
25
24
|
export declare function grantSessionKey({ chainId, incoLiteAddress, sessionVerifierContractAddress, granteeAddress, sharerWalletClient, expiresAt, }: GrantSessionKeyArgs): Promise<AllowanceVoucherWithSig>;
|
|
26
|
-
export interface SessionKeyReencryptorArgs {
|
|
27
|
-
chainId: bigint;
|
|
28
|
-
ephemeralKeypair: Secp256k1Keypair;
|
|
29
|
-
kmsConnectRpcEndpointOrClient: string | Client<typeof KmsService>;
|
|
30
|
-
allowanceVoucherWithSig: AllowanceVoucherWithSig;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* The sessionKeyReencryptor function is a reencryptor that uses a session key
|
|
34
|
-
* to reencrypt data.
|
|
35
|
-
*
|
|
36
|
-
*/
|
|
37
|
-
export declare function sessionKeyReencryptor({ chainId, kmsConnectRpcEndpointOrClient, ephemeralKeypair, allowanceVoucherWithSig, }: SessionKeyReencryptorArgs): Promise<(<T extends SupportedFheType>({ handle, }: ReencryptFnArgs<EciesScheme, T>) => Promise<import("../encryption/encryption.js").PlaintextOf<1, 0 | 5 | 7 | 8>>)>;
|
|
38
25
|
export declare function updateActiveVouchersSessionNonce(incoLiteAddress: Address, sharerWalletClient: WalletClient<Transport, Chain, Account>): Promise<`0x${string}`>;
|
|
39
26
|
export interface SessionKeyAttestedComputeArgs {
|
|
40
27
|
chainId: SupportedChainId;
|
|
41
28
|
ephemeralKeypair: Secp256k1Keypair;
|
|
42
|
-
|
|
29
|
+
kmsQuorumClient: KmsQuorumClient;
|
|
43
30
|
allowanceVoucherWithSig: AllowanceVoucherWithSig;
|
|
44
31
|
lhsHandle: HexString;
|
|
45
32
|
op: AttestedComputeOP;
|
|
46
33
|
rhsPlaintext: bigint | boolean;
|
|
47
34
|
backoffConfig?: Partial<BackoffConfig> | undefined;
|
|
48
35
|
}
|
|
49
|
-
export declare function sessionKeyAttestedCompute<T extends SupportedFheType>({ lhsHandle, op, rhsPlaintext, backoffConfig, chainId,
|
|
50
|
-
handle: HexString;
|
|
51
|
-
plaintext: import("../encryption/encryption.js").PlaintextOf<1, T>;
|
|
52
|
-
covalidatorSignature: Uint8Array<ArrayBufferLike>;
|
|
53
|
-
}>;
|
|
36
|
+
export declare function sessionKeyAttestedCompute<T extends SupportedFheType>({ lhsHandle, op, rhsPlaintext, backoffConfig, chainId, kmsQuorumClient, ephemeralKeypair, allowanceVoucherWithSig, }: SessionKeyAttestedComputeArgs): Promise<DecryptionAttestation<EciesScheme, SupportedFheType>>;
|
|
54
37
|
export interface SessionKeyAttestedDecryptArgs {
|
|
55
38
|
chainId: SupportedChainId;
|
|
56
39
|
ephemeralKeypair: Secp256k1Keypair;
|
|
57
|
-
|
|
40
|
+
kmsQuorumClient: KmsQuorumClient;
|
|
58
41
|
allowanceVoucherWithSig: AllowanceVoucherWithSig;
|
|
59
42
|
handles: HexString[];
|
|
60
43
|
backoffConfig?: Partial<BackoffConfig> | undefined;
|
|
61
|
-
reencryptPubKey?: Uint8Array;
|
|
62
|
-
reencryptKeypair?: Secp256k1Keypair;
|
|
44
|
+
reencryptPubKey?: Uint8Array | undefined;
|
|
45
|
+
reencryptKeypair?: Secp256k1Keypair | undefined;
|
|
63
46
|
}
|
|
64
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Performs attested decrypts using a voucher-backed session key.
|
|
49
|
+
*
|
|
50
|
+
* @example Plaintext results
|
|
51
|
+
* ```ts
|
|
52
|
+
* const attestations = await sessionKeyAttestedDecrypt({
|
|
53
|
+
* chainId,
|
|
54
|
+
* kmsConnectRpcEndpointOrClient: covalidatorUrl,
|
|
55
|
+
* allowanceVoucherWithSig: voucher,
|
|
56
|
+
* ephemeralKeypair,
|
|
57
|
+
* handles,
|
|
58
|
+
* });
|
|
59
|
+
* console.log(attestations[0].plaintext.value);
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* @example Encrypted results
|
|
63
|
+
* ```ts
|
|
64
|
+
* const encryptedResults = await sessionKeyAttestedDecrypt({
|
|
65
|
+
* chainId,
|
|
66
|
+
* kmsConnectRpcEndpointOrClient: covalidatorUrl,
|
|
67
|
+
* allowanceVoucherWithSig: voucher,
|
|
68
|
+
* ephemeralKeypair,
|
|
69
|
+
* handles,
|
|
70
|
+
* reencryptPubKey: recipientPubKey,
|
|
71
|
+
* });
|
|
72
|
+
* console.log(
|
|
73
|
+
* encryptedResults[0].encryptedPlaintext.ciphertext.value,
|
|
74
|
+
* );
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare function sessionKeyAttestedDecrypt({ chainId, kmsQuorumClient, handles, ephemeralKeypair, allowanceVoucherWithSig, backoffConfig, reencryptPubKey, reencryptKeypair, }: SessionKeyAttestedDecryptArgs): Promise<Array<DecryptionAttestation<EciesScheme, SupportedFheType> | EncryptedDecryptionAttestation<EciesScheme, SupportedFheType>>>;
|
|
@@ -2,26 +2,22 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createAllowanceVoucher = createAllowanceVoucher;
|
|
4
4
|
exports.grantSessionKey = grantSessionKey;
|
|
5
|
-
exports.sessionKeyReencryptor = sessionKeyReencryptor;
|
|
6
5
|
exports.updateActiveVouchersSessionNonce = updateActiveVouchersSessionNonce;
|
|
7
6
|
exports.sessionKeyAttestedCompute = sessionKeyAttestedCompute;
|
|
8
7
|
exports.sessionKeyAttestedDecrypt = sessionKeyAttestedDecrypt;
|
|
9
8
|
const protobuf_1 = require("@bufbuild/protobuf");
|
|
10
9
|
const viem_1 = require("viem");
|
|
11
10
|
const accounts_1 = require("viem/accounts");
|
|
12
|
-
const index_js_1 = require("../attesteddecrypt/index.js");
|
|
13
|
-
const chain_js_1 = require("../chain.js");
|
|
14
11
|
const encryption_js_1 = require("../encryption/encryption.js");
|
|
15
12
|
const lightning_preview_js_1 = require("../generated/abis/lightning-preview.js");
|
|
16
13
|
const lightning_js_1 = require("../generated/abis/lightning.js");
|
|
17
14
|
const verifier_js_1 = require("../generated/abis/verifier.js");
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
15
|
+
const index_js_1 = require("../index.js");
|
|
16
|
+
const index_js_2 = require("../lite/index.js");
|
|
17
|
+
const index_js_3 = require("../reencryption/index.js");
|
|
18
|
+
const attested_decrypt_js_1 = require("../attesteddecrypt/attested-decrypt.js");
|
|
22
19
|
const kms_service_pb_js_1 = require("../generated/es/inco/kms/lite/v1/kms_service_pb.js");
|
|
23
20
|
const types_pb_js_1 = require("../generated/es/inco/kms/lite/v1/types_pb.js");
|
|
24
|
-
const reencrypt_js_1 = require("../lite/reencrypt.js");
|
|
25
21
|
// Given a sharer's wallet client, an incoLite contract address, and a
|
|
26
22
|
// (verifyingContract, callFunction, sharerArgData) tuple, this function
|
|
27
23
|
// creates an AllowanceVoucher.
|
|
@@ -65,7 +61,7 @@ async function grantSessionKey({ chainId, incoLiteAddress, sessionVerifierContra
|
|
|
65
61
|
// Careful that the verifying contract here is the SessionVerifier contract,
|
|
66
62
|
// not the incoLite contract.
|
|
67
63
|
sessionVerifierContractAddress, (0, viem_1.toFunctionSelector)(getCanUseSessionAbi()), sharerArgData);
|
|
68
|
-
const eip712Payload = (0,
|
|
64
|
+
const eip712Payload = (0, index_js_3.createEIP712Payload)({
|
|
69
65
|
chainId,
|
|
70
66
|
primaryType: 'AllowanceVoucher',
|
|
71
67
|
primaryTypeFields: getAllowanceVoucherAbi(),
|
|
@@ -85,69 +81,6 @@ async function grantSessionKey({ chainId, incoLiteAddress, sessionVerifierContra
|
|
|
85
81
|
voucherSignature,
|
|
86
82
|
};
|
|
87
83
|
}
|
|
88
|
-
/**
|
|
89
|
-
* The sessionKeyReencryptor function is a reencryptor that uses a session key
|
|
90
|
-
* to reencrypt data.
|
|
91
|
-
*
|
|
92
|
-
*/
|
|
93
|
-
async function sessionKeyReencryptor({ chainId, kmsConnectRpcEndpointOrClient, ephemeralKeypair, allowanceVoucherWithSig, }) {
|
|
94
|
-
const kmsClient = (0, index_js_3.getKmsClient)(kmsConnectRpcEndpointOrClient ||
|
|
95
|
-
(0, index_js_3.defaultCovalidatorGrpc)((0, chain_js_1.getSupportedChain)(chainId)));
|
|
96
|
-
const requesterAccount = (0, accounts_1.privateKeyToAccount)(`0x${ephemeralKeypair.kp.getPrivate('hex')}`);
|
|
97
|
-
const ephemeralPubKey = ephemeralKeypair.encodePublicKey();
|
|
98
|
-
return async function reencrypt({ handle, }) {
|
|
99
|
-
const handles = [handle];
|
|
100
|
-
// Sign the EIP712 attesting that the requester has access to the private key
|
|
101
|
-
// corresponding to the ephemeral public key.
|
|
102
|
-
const eip712Payload = (0, index_js_4.createEIP712Payload)({
|
|
103
|
-
chainId,
|
|
104
|
-
primaryType: 'AttestedDecryptRequest',
|
|
105
|
-
primaryTypeFields: [
|
|
106
|
-
{ name: 'handles', type: 'bytes32[]' },
|
|
107
|
-
{ name: 'publicKey', type: 'bytes' },
|
|
108
|
-
],
|
|
109
|
-
message: {
|
|
110
|
-
handles: handles,
|
|
111
|
-
publicKey: (0, viem_1.bytesToHex)(ephemeralPubKey),
|
|
112
|
-
},
|
|
113
|
-
domainName: index_js_3.ATTESTED_DECRYPT_DOMAIN_NAME,
|
|
114
|
-
domainVersion: index_js_3.ATTESTED_DECRYPT_DOMAIN_VERSION,
|
|
115
|
-
});
|
|
116
|
-
// Since the account is an ephemeral keypair stored in memory (not in Metamask),
|
|
117
|
-
// this step will NOT prompt the user with a pop-up.
|
|
118
|
-
const eip712Signature = await requesterAccount.signTypedData(eip712Payload);
|
|
119
|
-
const reencryptRequest = (0, protobuf_1.create)(kms_service_pb_js_1.AttestedDecryptRequestSchema, {
|
|
120
|
-
userAddress: requesterAccount.address,
|
|
121
|
-
reencryptPubKey: ephemeralPubKey,
|
|
122
|
-
eip712Signature: (0, viem_1.hexToBytes)(eip712Signature),
|
|
123
|
-
handlesWithProofs: [
|
|
124
|
-
(0, protobuf_1.create)(types_pb_js_1.HandleWithProofSchema, {
|
|
125
|
-
handle,
|
|
126
|
-
aclProof: {
|
|
127
|
-
proof: {
|
|
128
|
-
case: 'incoLiteAdvancedAclProof',
|
|
129
|
-
value: (0, protobuf_1.create)(types_pb_js_1.IncoLiteAdvancedACLProofSchema, {
|
|
130
|
-
allowanceProof: (0, protobuf_1.create)(types_pb_js_1.AllowanceProofSchema, {
|
|
131
|
-
sharer: allowanceVoucherWithSig.sharer,
|
|
132
|
-
voucher: (0, protobuf_1.create)(types_pb_js_1.AllowanceVoucherSchema, {
|
|
133
|
-
sessionNonce: (0, viem_1.hexToBytes)(allowanceVoucherWithSig.voucher.sessionNonce),
|
|
134
|
-
verifyingContract: allowanceVoucherWithSig.voucher.verifyingContract,
|
|
135
|
-
callFunction: (0, viem_1.hexToBytes)(allowanceVoucherWithSig.voucher.callFunction),
|
|
136
|
-
sharerArgData: (0, viem_1.hexToBytes)(allowanceVoucherWithSig.voucher.sharerArgData),
|
|
137
|
-
}),
|
|
138
|
-
voucherSignature: (0, viem_1.hexToBytes)(allowanceVoucherWithSig.voucherSignature),
|
|
139
|
-
requesterArgData: new Uint8Array(),
|
|
140
|
-
}),
|
|
141
|
-
}),
|
|
142
|
-
},
|
|
143
|
-
},
|
|
144
|
-
}),
|
|
145
|
-
],
|
|
146
|
-
});
|
|
147
|
-
const response = await kmsClient.attestedDecrypt(reencryptRequest);
|
|
148
|
-
return (0, index_js_3.decryptGrpcResponse)(response, ephemeralKeypair, handle);
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
84
|
async function updateActiveVouchersSessionNonce(incoLiteAddress, sharerWalletClient) {
|
|
152
85
|
const verifier = await getIncoVerifier(incoLiteAddress, sharerWalletClient);
|
|
153
86
|
const txHash = await verifier.write.updateActiveVouchersSessionNonce();
|
|
@@ -155,15 +88,13 @@ async function updateActiveVouchersSessionNonce(incoLiteAddress, sharerWalletCli
|
|
|
155
88
|
}
|
|
156
89
|
// The sessionKeyAttestedCompute function is a decryptor that uses a session key
|
|
157
90
|
// to compute on a handle.
|
|
158
|
-
async function sessionKeyAttestedCompute({ lhsHandle, op, rhsPlaintext, backoffConfig, chainId,
|
|
159
|
-
const kmsClient = (0, index_js_3.getKmsClient)(kmsConnectRpcEndpointOrClient ||
|
|
160
|
-
(0, index_js_3.defaultCovalidatorGrpc)((0, chain_js_1.getSupportedChain)(chainId)));
|
|
91
|
+
async function sessionKeyAttestedCompute({ lhsHandle, op, rhsPlaintext, backoffConfig, chainId, kmsQuorumClient, ephemeralKeypair, allowanceVoucherWithSig, }) {
|
|
161
92
|
const requesterAccount = (0, accounts_1.privateKeyToAccount)(`0x${ephemeralKeypair.kp.getPrivate('hex')}`);
|
|
162
93
|
const rhsPlaintextBig = BigInt(rhsPlaintext);
|
|
163
|
-
const rhsValueBytes = (0, encryption_js_1.bigintToPlaintext)(encryption_js_1.encryptionSchemes.ecies, (0,
|
|
94
|
+
const rhsValueBytes = (0, encryption_js_1.bigintToPlaintext)(encryption_js_1.encryptionSchemes.ecies, (0, index_js_1.getHandleType)(lhsHandle), rhsPlaintextBig);
|
|
164
95
|
// Sign the EIP712 attesting that the requester has access to the private key
|
|
165
96
|
// corresponding to the ephemeral public key.
|
|
166
|
-
const eip712Payload = (0,
|
|
97
|
+
const eip712Payload = (0, index_js_3.createEIP712Payload)({
|
|
167
98
|
chainId: BigInt(chainId),
|
|
168
99
|
primaryType: 'AttestedComputeRequest',
|
|
169
100
|
primaryTypeFields: [
|
|
@@ -174,10 +105,10 @@ async function sessionKeyAttestedCompute({ lhsHandle, op, rhsPlaintext, backoffC
|
|
|
174
105
|
message: {
|
|
175
106
|
op: op,
|
|
176
107
|
lhsHandle: lhsHandle,
|
|
177
|
-
rhsPlaintext: (0,
|
|
108
|
+
rhsPlaintext: (0, index_js_1.bigintToBytes32)(rhsPlaintextBig),
|
|
178
109
|
},
|
|
179
|
-
domainName:
|
|
180
|
-
domainVersion:
|
|
110
|
+
domainName: index_js_2.ATTESTED_COMPUTE_DOMAIN_NAME,
|
|
111
|
+
domainVersion: index_js_2.ATTESTED_COMPUTE_DOMAIN_VERSION,
|
|
181
112
|
});
|
|
182
113
|
// Since the account is an ephemeral keypair stored in memory (not in Metamask),
|
|
183
114
|
// this step will NOT prompt the user with a pop-up.
|
|
@@ -208,36 +139,44 @@ async function sessionKeyAttestedCompute({ lhsHandle, op, rhsPlaintext, backoffC
|
|
|
208
139
|
},
|
|
209
140
|
},
|
|
210
141
|
});
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}, backoffConfig);
|
|
214
|
-
if (!response.decryptionAttestation) {
|
|
215
|
-
throw new Error('Failed to get decryption attestation from attested compute');
|
|
216
|
-
}
|
|
217
|
-
const decryptionAttestation = response.decryptionAttestation;
|
|
218
|
-
if (decryptionAttestation.value === undefined) {
|
|
219
|
-
throw new Error('No value in compute response');
|
|
220
|
-
}
|
|
221
|
-
if (decryptionAttestation.value.case !== 'plaintext') {
|
|
222
|
-
throw new Error(`Unexpected attestation type: ${decryptionAttestation.value.case}, expected 'plaintext'`);
|
|
223
|
-
}
|
|
224
|
-
const plaintext = decryptionAttestation.value.value;
|
|
225
|
-
const bigIntValue = (0, index_js_2.bytesToBigInt)(plaintext.value);
|
|
226
|
-
return {
|
|
227
|
-
handle: decryptionAttestation.handle,
|
|
228
|
-
plaintext: (0, encryption_js_1.bigintToPlaintext)(encryption_js_1.encryptionSchemes.ecies, (0, index_js_2.getHandleType)(lhsHandle), bigIntValue),
|
|
229
|
-
covalidatorSignature: decryptionAttestation.signature,
|
|
230
|
-
};
|
|
142
|
+
let response = await kmsQuorumClient.attestedCompute(attestedComputeRequest, backoffConfig);
|
|
143
|
+
return response;
|
|
231
144
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
145
|
+
/**
|
|
146
|
+
* Performs attested decrypts using a voucher-backed session key.
|
|
147
|
+
*
|
|
148
|
+
* @example Plaintext results
|
|
149
|
+
* ```ts
|
|
150
|
+
* const attestations = await sessionKeyAttestedDecrypt({
|
|
151
|
+
* chainId,
|
|
152
|
+
* kmsConnectRpcEndpointOrClient: covalidatorUrl,
|
|
153
|
+
* allowanceVoucherWithSig: voucher,
|
|
154
|
+
* ephemeralKeypair,
|
|
155
|
+
* handles,
|
|
156
|
+
* });
|
|
157
|
+
* console.log(attestations[0].plaintext.value);
|
|
158
|
+
* ```
|
|
159
|
+
*
|
|
160
|
+
* @example Encrypted results
|
|
161
|
+
* ```ts
|
|
162
|
+
* const encryptedResults = await sessionKeyAttestedDecrypt({
|
|
163
|
+
* chainId,
|
|
164
|
+
* kmsConnectRpcEndpointOrClient: covalidatorUrl,
|
|
165
|
+
* allowanceVoucherWithSig: voucher,
|
|
166
|
+
* ephemeralKeypair,
|
|
167
|
+
* handles,
|
|
168
|
+
* reencryptPubKey: recipientPubKey,
|
|
169
|
+
* });
|
|
170
|
+
* console.log(
|
|
171
|
+
* encryptedResults[0].encryptedPlaintext.ciphertext.value,
|
|
172
|
+
* );
|
|
173
|
+
* ```
|
|
174
|
+
*/
|
|
175
|
+
async function sessionKeyAttestedDecrypt({ chainId, kmsQuorumClient, handles, ephemeralKeypair, allowanceVoucherWithSig, backoffConfig, reencryptPubKey, reencryptKeypair, }) {
|
|
237
176
|
const requesterAccount = (0, accounts_1.privateKeyToAccount)(`0x${ephemeralKeypair.kp.getPrivate('hex')}`);
|
|
238
177
|
// Sign the EIP712 attesting that the requester has access to the private key
|
|
239
178
|
// corresponding to the ephemeral public key.
|
|
240
|
-
const eip712Payload = (0,
|
|
179
|
+
const eip712Payload = (0, index_js_3.createEIP712Payload)({
|
|
241
180
|
chainId: BigInt(chainId),
|
|
242
181
|
primaryType: 'AttestedDecryptRequest',
|
|
243
182
|
primaryTypeFields: [
|
|
@@ -248,8 +187,8 @@ async function sessionKeyAttestedDecrypt({ chainId, kmsConnectRpcEndpointOrClien
|
|
|
248
187
|
handles: handles,
|
|
249
188
|
publicKey: (0, viem_1.bytesToHex)(reencryptPubKey ? reencryptPubKey : Uint8Array.from([])),
|
|
250
189
|
},
|
|
251
|
-
domainName:
|
|
252
|
-
domainVersion:
|
|
190
|
+
domainName: index_js_2.ATTESTED_DECRYPT_DOMAIN_NAME,
|
|
191
|
+
domainVersion: index_js_2.ATTESTED_DECRYPT_DOMAIN_VERSION,
|
|
253
192
|
});
|
|
254
193
|
// Since the account is an ephemeral keypair stored in memory (not in Metamask),
|
|
255
194
|
// this step will NOT prompt the user with a pop-up.
|
|
@@ -283,34 +222,12 @@ async function sessionKeyAttestedDecrypt({ chainId, kmsConnectRpcEndpointOrClien
|
|
|
283
222
|
eip712Signature: (0, viem_1.hexToBytes)(eip712Signature),
|
|
284
223
|
reencryptPubKey: reencryptPubKey ? reencryptPubKey : Uint8Array.from([]),
|
|
285
224
|
});
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
response.decryptionAttestations.length === 0) {
|
|
291
|
-
throw new index_js_1.AttestedDecryptError('No decryption attestations in response');
|
|
225
|
+
let response = await kmsQuorumClient.attestedDecrypt(attestedDecryptRequest, backoffConfig);
|
|
226
|
+
// If reencryptPubKey is provided with a keypair, decrypt the encrypted attestations
|
|
227
|
+
if (reencryptPubKey !== undefined && reencryptKeypair) {
|
|
228
|
+
response = await (0, attested_decrypt_js_1.decryptEncryptedAttestations)(response, reencryptKeypair);
|
|
292
229
|
}
|
|
293
|
-
|
|
294
|
-
response = await (0, reencrypt_js_1.decryptGrpcDecryptResponse)(response, reencryptKeypair);
|
|
295
|
-
}
|
|
296
|
-
const results = response.decryptionAttestations.map((att) => {
|
|
297
|
-
if (att.value === undefined) {
|
|
298
|
-
throw new index_js_1.AttestedDecryptError('No value in attestation');
|
|
299
|
-
}
|
|
300
|
-
if (att.value.case !== 'plaintext') {
|
|
301
|
-
throw new Error(`Unexpected attestation type: ${att.value.case}, expected 'plaintext'`);
|
|
302
|
-
}
|
|
303
|
-
const plaintext = att.value.value;
|
|
304
|
-
const h = att.handle;
|
|
305
|
-
const handleType = (0, index_js_2.getHandleType)(h);
|
|
306
|
-
const bigIntValue = (0, index_js_2.bytesToBigInt)(plaintext.value);
|
|
307
|
-
return {
|
|
308
|
-
handle: h,
|
|
309
|
-
plaintext: (0, encryption_js_1.bigintToPlaintext)(encryption_js_1.encryptionSchemes.ecies, handleType, bigIntValue),
|
|
310
|
-
covalidatorSignature: att.signature,
|
|
311
|
-
};
|
|
312
|
-
});
|
|
313
|
-
return results;
|
|
230
|
+
return response;
|
|
314
231
|
}
|
|
315
232
|
// Below are helpers to get ABIs of functions/structs from the SessionVerifier
|
|
316
233
|
// contract.
|
|
@@ -375,4 +292,4 @@ async function getIncoVerifier(incoLiteAddress, walletClient) {
|
|
|
375
292
|
client: walletClient,
|
|
376
293
|
});
|
|
377
294
|
}
|
|
378
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWR2YW5jZWRhY2wvc2Vzc2lvbi1rZXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpR0Esd0RBcUJDO0FBd0JELDBDQWlFQztBQXlCRCxzREFtRkM7QUFFRCw0RUFPQztBQTZCRCw4REFxSEM7QUE4QkQsOERBZ0lDO0FBcG5CRCxpREFBNEM7QUFFNUMsK0JBWWM7QUFDZCw0Q0FBb0Q7QUFDcEQsMERBR3FDO0FBQ3JDLDBDQUFrRTtBQUNsRSwrREFLcUM7QUFDckMsaUZBR2dEO0FBQ2hELGlFQUd3QztBQUN4QywrREFBZ0U7QUFDaEUsMENBS3FCO0FBUXJCLCtDQVEwQjtBQUMxQix1REFHa0M7QUFDbEMsMENBQThEO0FBSTlELDBGQUk0RDtBQUM1RCw4RUFLc0Q7QUFDdEQsdURBQWtFO0FBaUJsRSxzRUFBc0U7QUFDdEUsd0VBQXdFO0FBQ3hFLCtCQUErQjtBQUN4QixLQUFLLFVBQVUsc0JBQXNCLENBQzFDLGVBQXdCLEVBQ3hCLGtCQUEyRCxFQUMzRCxpQkFBMEIsRUFDMUIsWUFBaUIsRUFDakIsYUFBa0I7SUFFbEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsZUFBZSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFFNUUsMEVBQTBFO0lBQzFFLHdDQUF3QztJQUN4QyxNQUFNLFlBQVksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUM7UUFDckUsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE9BQU87S0FDbkMsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLFlBQVk7UUFDWixpQkFBaUI7UUFDakIsWUFBWTtRQUNaLGFBQWE7S0FDZCxDQUFDO0FBQ0osQ0FBQztBQXVCRCxtREFBbUQ7QUFDNUMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxFQUNwQyxPQUFPLEVBQ1AsZUFBZSxFQUNmLDhCQUE4QixFQUM5QixjQUFjLEVBQ2Qsa0JB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
|
|
295
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWR2YW5jZWRhY2wvc2Vzc2lvbi1rZXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFvRkEsd0RBcUJDO0FBd0JELDBDQWlFQztBQUVELDRFQU9DO0FBMEJELDhEQXlGQztBQXVERCw4REE4RkM7QUFuZEQsaURBQTRDO0FBQzVDLCtCQVljO0FBQ2QsNENBQW9EO0FBTXBELCtEQUtxQztBQUNyQyxpRkFHZ0Q7QUFDaEQsaUVBR3dDO0FBQ3hDLCtEQUFnRTtBQUNoRSwwQ0FBd0U7QUFPeEUsK0NBSzBCO0FBQzFCLHVEQUErRDtBQUsvRCxnRkFBc0Y7QUFDdEYsMEZBRzREO0FBQzVELDhFQUtzRDtBQWtCdEQsc0VBQXNFO0FBQ3RFLHdFQUF3RTtBQUN4RSwrQkFBK0I7QUFDeEIsS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxlQUF3QixFQUN4QixrQkFBMkQsRUFDM0QsaUJBQTBCLEVBQzFCLFlBQWlCLEVBQ2pCLGFBQWtCO0lBRWxCLE1BQU0sUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLGVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBRTVFLDBFQUEwRTtJQUMxRSx3Q0FBd0M7SUFDeEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDO1FBQ3JFLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxPQUFPO0tBQ25DLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxZQUFZO1FBQ1osaUJBQWlCO1FBQ2pCLFlBQVk7UUFDWixhQUFhO0tBQ2QsQ0FBQztBQUNKLENBQUM7QUF1QkQsbURBQW1EO0FBQzVDLEtBQUssVUFBVSxlQUFlLENBQUMsRUFDcEMsT0FBTyxFQUNQLGVBQWUsRUFDZiw4QkFBOEIsRUFDOUIsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixTQUFTLEdBQ1c7SUFDcEIsTUFBTSxPQUFPLEdBQUc7UUFDZCxTQUFTLEVB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
|
|
@@ -3,19 +3,19 @@ import { DecryptionAttestation } from '../attesteddecrypt/types.js';
|
|
|
3
3
|
import { HexString } from '../binary.js';
|
|
4
4
|
import { SupportedChainId } from '../chain.js';
|
|
5
5
|
import { EciesScheme, SupportedFheType } from '../encryption/encryption.js';
|
|
6
|
-
import
|
|
6
|
+
import { KmsQuorumClient } from '../kms/quorumClient.js';
|
|
7
7
|
import type { BackoffConfig } from '../retry.js';
|
|
8
8
|
import { AttestedComputeOP } from './types.js';
|
|
9
9
|
export declare const ATTESTED_COMPUTE_DOMAIN_NAME = "IncoAttestedCompute";
|
|
10
|
-
export declare const ATTESTED_COMPUTE_DOMAIN_VERSION = "
|
|
10
|
+
export declare const ATTESTED_COMPUTE_DOMAIN_VERSION = "1";
|
|
11
11
|
/**
|
|
12
12
|
* Arguments for creating an attested compute.
|
|
13
13
|
*/
|
|
14
14
|
export interface IncoLiteAttestedComputeArgs {
|
|
15
15
|
/** The wallet used to interact with the blockchain and sign the compute request */
|
|
16
16
|
walletClient: WalletClient<Transport, Chain, Account>;
|
|
17
|
-
/** The KMS
|
|
18
|
-
|
|
17
|
+
/** The KMS quorum client instance */
|
|
18
|
+
kmsQuorumClient: KmsQuorumClient;
|
|
19
19
|
/** The chain ID to use */
|
|
20
20
|
chainId: SupportedChainId;
|
|
21
21
|
}
|
|
@@ -27,12 +27,12 @@ export interface IncoLiteAttestedComputeArgs {
|
|
|
27
27
|
*
|
|
28
28
|
* @todo Support multiple operations in a single request.
|
|
29
29
|
*/
|
|
30
|
-
export declare function attestedCompute<T extends SupportedFheType>({ lhsHandle, op, rhsPlaintext, backoffConfig, walletClient,
|
|
30
|
+
export declare function attestedCompute<T extends SupportedFheType>({ lhsHandle, op, rhsPlaintext, backoffConfig, walletClient, kmsQuorumClient, chainId, }: {
|
|
31
31
|
lhsHandle: HexString;
|
|
32
32
|
op: AttestedComputeOP;
|
|
33
33
|
rhsPlaintext: bigint | boolean;
|
|
34
34
|
backoffConfig?: Partial<BackoffConfig> | undefined;
|
|
35
35
|
walletClient: WalletClient<Transport, Chain, Account>;
|
|
36
|
-
|
|
36
|
+
kmsQuorumClient: KmsQuorumClient;
|
|
37
37
|
chainId: SupportedChainId;
|
|
38
38
|
}): Promise<DecryptionAttestation<EciesScheme, T>>;
|
|
@@ -6,16 +6,11 @@ const protobuf_1 = require("@bufbuild/protobuf");
|
|
|
6
6
|
const viem_1 = require("viem");
|
|
7
7
|
const attested_decrypt_js_1 = require("../attesteddecrypt/attested-decrypt.js");
|
|
8
8
|
const binary_js_1 = require("../binary.js");
|
|
9
|
-
const chain_js_1 = require("../chain.js");
|
|
10
|
-
const encryption_js_1 = require("../encryption/encryption.js");
|
|
11
9
|
const kms_service_pb_js_1 = require("../generated/es/inco/kms/lite/v1/kms_service_pb.js");
|
|
12
|
-
const handle_js_1 = require("../handle.js");
|
|
13
|
-
const client_js_1 = require("../kms/client.js");
|
|
14
10
|
const eip712_js_1 = require("../reencryption/eip712.js");
|
|
15
|
-
const retry_js_1 = require("../retry.js");
|
|
16
11
|
const types_js_1 = require("./types.js");
|
|
17
12
|
exports.ATTESTED_COMPUTE_DOMAIN_NAME = 'IncoAttestedCompute';
|
|
18
|
-
exports.ATTESTED_COMPUTE_DOMAIN_VERSION = '
|
|
13
|
+
exports.ATTESTED_COMPUTE_DOMAIN_VERSION = '1';
|
|
19
14
|
/**
|
|
20
15
|
* Creates an attested compute function that can decrypt handles with an attached attestation from the covalidator.
|
|
21
16
|
* @param args - The arguments for creating the attested compute function
|
|
@@ -24,10 +19,8 @@ exports.ATTESTED_COMPUTE_DOMAIN_VERSION = '0.1.0';
|
|
|
24
19
|
*
|
|
25
20
|
* @todo Support multiple operations in a single request.
|
|
26
21
|
*/
|
|
27
|
-
async function attestedCompute({ lhsHandle, op, rhsPlaintext, backoffConfig, walletClient,
|
|
22
|
+
async function attestedCompute({ lhsHandle, op, rhsPlaintext, backoffConfig, walletClient, kmsQuorumClient, chainId, }) {
|
|
28
23
|
try {
|
|
29
|
-
const kmsClient = (0, client_js_1.getKmsClient)(kmsConnectRpcEndpointOrClient ||
|
|
30
|
-
(0, client_js_1.defaultCovalidatorGrpc)((0, chain_js_1.getSupportedChain)(chainId)));
|
|
31
24
|
(0, attested_decrypt_js_1.validateHandle)(lhsHandle);
|
|
32
25
|
const rhsPlaintextBig = typeof rhsPlaintext === 'boolean'
|
|
33
26
|
? rhsPlaintext
|
|
@@ -66,31 +59,8 @@ async function attestedCompute({ lhsHandle, op, rhsPlaintext, backoffConfig, wal
|
|
|
66
59
|
},
|
|
67
60
|
},
|
|
68
61
|
});
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}, backoffConfig);
|
|
72
|
-
const decryptionAttestation = response.decryptionAttestation;
|
|
73
|
-
if (decryptionAttestation === undefined) {
|
|
74
|
-
throw new types_js_1.AttestedComputeError('No decryption attestation in response');
|
|
75
|
-
}
|
|
76
|
-
if (decryptionAttestation.value === undefined) {
|
|
77
|
-
throw new types_js_1.AttestedComputeError('No value in compute response');
|
|
78
|
-
}
|
|
79
|
-
if (decryptionAttestation.value.case !== 'plaintext') {
|
|
80
|
-
throw new types_js_1.AttestedComputeError(`Unexpected attestation type: ${decryptionAttestation.value.case}, expected 'plaintext'`);
|
|
81
|
-
}
|
|
82
|
-
const plaintext = decryptionAttestation.value.value;
|
|
83
|
-
const computeResultHandle = response.decryptionAttestation?.handle;
|
|
84
|
-
if (!computeResultHandle) {
|
|
85
|
-
throw new types_js_1.AttestedComputeError('No compute result handle in response');
|
|
86
|
-
}
|
|
87
|
-
const handleType = (0, handle_js_1.getHandleType)(computeResultHandle);
|
|
88
|
-
const bigIntValue = (0, binary_js_1.bytesToBigInt)(plaintext.value);
|
|
89
|
-
return {
|
|
90
|
-
handle: computeResultHandle,
|
|
91
|
-
plaintext: (0, encryption_js_1.bigintToPlaintext)(encryption_js_1.encryptionSchemes.ecies, handleType, bigIntValue),
|
|
92
|
-
covalidatorSignature: decryptionAttestation.signature,
|
|
93
|
-
};
|
|
62
|
+
let decryptionAttestation = await kmsQuorumClient.attestedCompute(attestedComputeRequest, backoffConfig);
|
|
63
|
+
return decryptionAttestation;
|
|
94
64
|
}
|
|
95
65
|
catch (error) {
|
|
96
66
|
if (error instanceof types_js_1.AttestedComputeError) {
|
|
@@ -99,4 +69,4 @@ async function attestedCompute({ lhsHandle, op, rhsPlaintext, backoffConfig, wal
|
|
|
99
69
|
throw new types_js_1.AttestedComputeError('Failed to perform attested compute', error);
|
|
100
70
|
}
|
|
101
71
|
}
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0ZWQtY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdHRlc3RlZGNvbXB1dGUvYXR0ZXN0ZWQtY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF3Q0EsMENBNkVDO0FBckhELGlEQUE0QztBQUU1QywrQkFBa0M7QUFDbEMsZ0ZBQXdFO0FBRXhFLDRDQUEwRDtBQUcxRCwwRkFHNEQ7QUFFNUQseURBQWdFO0FBRWhFLHlDQUFxRTtBQUV4RCxRQUFBLDRCQUE0QixHQUFHLHFCQUFxQixDQUFDO0FBQ3JELFFBQUEsK0JBQStCLEdBQUcsR0FBRyxDQUFDO0FBY25EOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsZUFBZSxDQUE2QixFQUNoRSxTQUFTLEVBQ1QsRUFBRSxFQUNGLFlBQVksRUFDWixhQUFhLEVBQ2IsWUFBWSxFQUNaLGVBQWUsRUFDZixPQUFPLEdBU1I7SUFDQyxJQUFJLENBQUM7UUFDSCxJQUFBLG9DQUFjLEVBQUMsU0FBUyxDQUFDLENBQUM7UUFFMUIsTUFBTSxlQUFlLEdBQ25CLE9BQU8sWUFBWSxLQUFLLFNBQVM7WUFDL0IsQ0FBQyxDQUFDLFlBQVk7Z0JBQ1osQ0FBQyxDQUFDLEVBQUU7Z0JBQ0osQ0FBQyxDQUFDLEVBQUU7WUFDTixDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTNCLHVEQUF1RDtRQUN2RCxNQUFNLGFBQWEsR0FBRyxJQUFBLCtCQUFtQixFQUFDO1lBQ3hDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ3hCLFdBQVcsRUFBRSx3QkFBd0I7WUFDckMsaUJBQWlCLEVBQUU7Z0JBQ2pCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO2dCQUM3QixFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtnQkFDdEMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7YUFDMUM7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLFlBQVksRUFBRSxJQUFBLDJCQUFlLEVBQUMsZUFBZSxDQUFDO2FBQy9DO1lBQ0QsVUFBVSxFQUFFLG9DQUE0QjtZQUN4QyxhQUFhLEVBQUUsdUNBQStCO1NBQy9DLENBQUMsQ0FBQztRQUVILDBCQUEwQjtRQUMxQixNQUFNLGVBQWUsR0FBRyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFeEUsTUFBTSxzQkFBc0IsR0FBMkIsSUFBQSxpQkFBTSxFQUMzRCxnREFBNEIsRUFDNUI7WUFDRSxXQUFXLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPO1lBQ3pDLEVBQUUsRUFBRSxFQUFFO1lBQ04sU0FBUyxFQUFFLFNBQVM7WUFDcEIsWUFBWSxFQUFFLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzFDLGVBQWUsRUFBRSxJQUFBLGlCQUFVLEVBQUMsZUFBZSxDQUFDO1lBQzVDLFFBQVEsRUFBRTtnQkFDUixLQUFLLEVBQUU7b0JBQ0wsSUFBSSxFQUFFLHVCQUF1QjtvQkFDN0IsS0FBSyxFQUFFLEVBQUU7aUJBQ1Y7YUFDRjtTQUNGLENBQ0YsQ0FBQztRQUVGLElBQUkscUJBQXFCLEdBQUcsTUFBTSxlQUFlLENBQUMsZUFBZSxDQUMvRCxzQkFBc0IsRUFDdEIsYUFBYSxDQUNkLENBQUM7UUFFRixPQUFPLHFCQUE4RCxDQUFDO0lBQ3hFLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLFlBQVksK0JBQW9CLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLElBQUksK0JBQW9CLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUUsQ0FBQztBQUNILENBQUMifQ==
|