@reclaimprotocol/attestor-core 5.0.1-beta.2 → 5.0.1-beta.21
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/browser/resources/attestor-browser.min.mjs +4512 -0
- package/lib/external-rpc/index.js +10399 -3
- package/lib/index.js +8323 -10
- package/package.json +9 -4
- package/lib/avs/abis/avsDirectoryABI.js +0 -343
- package/lib/avs/abis/delegationABI.js +0 -4
- package/lib/avs/abis/registryABI.js +0 -728
- package/lib/avs/client/create-claim-on-avs.js +0 -168
- package/lib/avs/config.js +0 -26
- package/lib/avs/contracts/ReclaimServiceManager.js +0 -0
- package/lib/avs/contracts/common.js +0 -0
- package/lib/avs/contracts/factories/ReclaimServiceManager__factory.js +0 -1183
- package/lib/avs/contracts/factories/index.js +0 -4
- package/lib/avs/contracts/index.js +0 -6
- package/lib/avs/types/index.js +0 -0
- package/lib/avs/utils/contracts.js +0 -53
- package/lib/avs/utils/register.js +0 -74
- package/lib/avs/utils/tasks.js +0 -48
- package/lib/client/create-claim.js +0 -461
- package/lib/client/index.js +0 -3
- package/lib/client/tunnels/make-rpc-tcp-tunnel.js +0 -53
- package/lib/client/tunnels/make-rpc-tls-tunnel.js +0 -127
- package/lib/client/utils/attestor-pool.js +0 -24
- package/lib/client/utils/client-socket.js +0 -120
- package/lib/client/utils/message-handler.js +0 -97
- package/lib/config/index.js +0 -62
- package/lib/external-rpc/benchmark.js +0 -82
- package/lib/external-rpc/event-bus.js +0 -17
- package/lib/external-rpc/global.d.js +0 -0
- package/lib/external-rpc/handle-incoming-msg.js +0 -241
- package/lib/external-rpc/jsc-polyfills/1.js +0 -80
- package/lib/external-rpc/jsc-polyfills/2.js +0 -15
- package/lib/external-rpc/jsc-polyfills/event.js +0 -19
- package/lib/external-rpc/jsc-polyfills/index.js +0 -2
- package/lib/external-rpc/jsc-polyfills/ws.js +0 -83
- package/lib/external-rpc/setup-browser.js +0 -33
- package/lib/external-rpc/setup-jsc.js +0 -22
- package/lib/external-rpc/types.js +0 -0
- package/lib/external-rpc/utils.js +0 -100
- package/lib/external-rpc/zk.js +0 -58
- package/lib/mechain/abis/governanceABI.js +0 -461
- package/lib/mechain/abis/taskABI.js +0 -512
- package/lib/mechain/client/create-claim-on-mechain.js +0 -33
- package/lib/mechain/client/index.js +0 -1
- package/lib/mechain/constants/index.js +0 -8
- package/lib/mechain/index.js +0 -2
- package/lib/mechain/types/index.js +0 -0
- package/lib/proto/api.js +0 -4250
- package/lib/proto/tee-bundle.js +0 -1296
- package/lib/providers/http/index.js +0 -640
- package/lib/providers/http/patch-parse5-tree.js +0 -34
- package/lib/providers/http/utils.js +0 -283
- package/lib/providers/index.js +0 -7
- package/lib/scripts/check-avs-registration.js +0 -28
- package/lib/scripts/fallbacks/crypto.js +0 -4
- package/lib/scripts/fallbacks/empty.js +0 -4
- package/lib/scripts/fallbacks/re2.js +0 -7
- package/lib/scripts/fallbacks/snarkjs.js +0 -10
- package/lib/scripts/fallbacks/stwo.js +0 -159
- package/lib/scripts/generate-provider-types.js +0 -101
- package/lib/scripts/generate-receipt.js +0 -101
- package/lib/scripts/generate-toprf-keys.js +0 -24
- package/lib/scripts/jsc-cli-rpc.js +0 -35
- package/lib/scripts/register-avs-operator.js +0 -3
- package/lib/scripts/start-server.js +0 -11
- package/lib/scripts/update-avs-metadata.js +0 -20
- package/lib/scripts/utils.js +0 -10
- package/lib/scripts/whitelist-operator.js +0 -16
- package/lib/server/create-server.js +0 -105
- package/lib/server/handlers/claimTeeBundle.js +0 -232
- package/lib/server/handlers/claimTunnel.js +0 -80
- package/lib/server/handlers/completeClaimOnChain.js +0 -29
- package/lib/server/handlers/createClaimOnChain.js +0 -32
- package/lib/server/handlers/createTaskOnMechain.js +0 -57
- package/lib/server/handlers/createTunnel.js +0 -98
- package/lib/server/handlers/disconnectTunnel.js +0 -8
- package/lib/server/handlers/fetchCertificateBytes.js +0 -57
- package/lib/server/handlers/index.js +0 -25
- package/lib/server/handlers/init.js +0 -33
- package/lib/server/handlers/toprf.js +0 -19
- package/lib/server/index.js +0 -4
- package/lib/server/socket.js +0 -112
- package/lib/server/tunnels/make-tcp-tunnel.js +0 -202
- package/lib/server/utils/apm.js +0 -29
- package/lib/server/utils/assert-valid-claim-request.js +0 -354
- package/lib/server/utils/config-env.js +0 -4
- package/lib/server/utils/dns.js +0 -24
- package/lib/server/utils/gcp-attestation.js +0 -237
- package/lib/server/utils/generics.js +0 -45
- package/lib/server/utils/iso.js +0 -259
- package/lib/server/utils/keep-alive.js +0 -38
- package/lib/server/utils/nitro-attestation.js +0 -249
- package/lib/server/utils/oprf-raw.js +0 -61
- package/lib/server/utils/process-handshake.js +0 -233
- package/lib/server/utils/proxy-session.js +0 -6
- package/lib/server/utils/tee-oprf-mpc-verification.js +0 -86
- package/lib/server/utils/tee-oprf-verification.js +0 -151
- package/lib/server/utils/tee-transcript-reconstruction.js +0 -140
- package/lib/server/utils/tee-verification.js +0 -358
- package/lib/server/utils/validation.js +0 -45
- package/lib/types/bgp.js +0 -0
- package/lib/types/claims.js +0 -0
- package/lib/types/client.js +0 -0
- package/lib/types/general.js +0 -0
- package/lib/types/handlers.js +0 -0
- package/lib/types/index.js +0 -10
- package/lib/types/providers.gen.js +0 -16
- package/lib/types/providers.js +0 -0
- package/lib/types/rpc.js +0 -0
- package/lib/types/signatures.js +0 -0
- package/lib/types/tunnel.js +0 -0
- package/lib/types/zk.js +0 -0
- package/lib/utils/auth.js +0 -71
- package/lib/utils/b64-json.js +0 -17
- package/lib/utils/bgp-listener.js +0 -123
- package/lib/utils/claims.js +0 -89
- package/lib/utils/env.js +0 -19
- package/lib/utils/error.js +0 -54
- package/lib/utils/generics.js +0 -268
- package/lib/utils/http-parser.js +0 -201
- package/lib/utils/index.js +0 -13
- package/lib/utils/logger.js +0 -82
- package/lib/utils/prepare-packets.js +0 -69
- package/lib/utils/redactions.js +0 -135
- package/lib/utils/retries.js +0 -26
- package/lib/utils/signatures/eth.js +0 -31
- package/lib/utils/signatures/index.js +0 -12
- package/lib/utils/socket-base.js +0 -96
- package/lib/utils/tls.js +0 -58
- package/lib/utils/ws.js +0 -22
- package/lib/utils/zk.js +0 -625
package/lib/avs/types/index.js
DELETED
|
File without changes
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { Contract, JsonRpcProvider, Wallet } from "ethers";
|
|
2
|
-
import { avsDirectoryABI } from "../../avs/abis/avsDirectoryABI.js";
|
|
3
|
-
import { delegationABI } from "../../avs/abis/delegationABI.js";
|
|
4
|
-
import { registryABI } from "../../avs/abis/registryABI.js";
|
|
5
|
-
import { CHAIN_CONFIGS, PRIVATE_KEY, SELECTED_CHAIN_ID } from "../../avs/config.js";
|
|
6
|
-
import { ReclaimServiceManager__factory } from "../../avs/contracts/index.js";
|
|
7
|
-
const configs = {};
|
|
8
|
-
function getContracts(chainId = SELECTED_CHAIN_ID) {
|
|
9
|
-
const config = CHAIN_CONFIGS[chainId];
|
|
10
|
-
if (!config) {
|
|
11
|
-
throw new Error(`No config found for chain ID: ${chainId}`);
|
|
12
|
-
}
|
|
13
|
-
configs[chainId] ||= initialiseContracts(config);
|
|
14
|
-
return configs[chainId];
|
|
15
|
-
}
|
|
16
|
-
function initialiseContracts({
|
|
17
|
-
rpcUrl,
|
|
18
|
-
stakeRegistryAddress,
|
|
19
|
-
avsDirectoryAddress,
|
|
20
|
-
contractAddress,
|
|
21
|
-
delegationManagerAddress
|
|
22
|
-
}, privateKey = PRIVATE_KEY) {
|
|
23
|
-
const provider = new JsonRpcProvider(rpcUrl);
|
|
24
|
-
const wallet = privateKey ? new Wallet(privateKey, provider) : void 0;
|
|
25
|
-
return {
|
|
26
|
-
provider,
|
|
27
|
-
wallet,
|
|
28
|
-
delegationManager: new Contract(
|
|
29
|
-
delegationManagerAddress,
|
|
30
|
-
delegationABI,
|
|
31
|
-
wallet || provider
|
|
32
|
-
),
|
|
33
|
-
// eslint-disable-next-line camelcase
|
|
34
|
-
contract: ReclaimServiceManager__factory.connect(
|
|
35
|
-
contractAddress,
|
|
36
|
-
wallet || provider
|
|
37
|
-
),
|
|
38
|
-
registryContract: new Contract(
|
|
39
|
-
stakeRegistryAddress,
|
|
40
|
-
registryABI,
|
|
41
|
-
wallet || provider
|
|
42
|
-
),
|
|
43
|
-
avsDirectory: new Contract(
|
|
44
|
-
avsDirectoryAddress,
|
|
45
|
-
avsDirectoryABI,
|
|
46
|
-
wallet || provider
|
|
47
|
-
)
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
export {
|
|
51
|
-
getContracts,
|
|
52
|
-
initialiseContracts
|
|
53
|
-
};
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { hexlify, randomBytes, SigningKey } from "ethers";
|
|
2
|
-
import { RECLAIM_PUBLIC_URL, SELECTED_CHAIN_ID } from "../../avs/config.js";
|
|
3
|
-
import { getContracts } from "../../avs/utils/contracts.js";
|
|
4
|
-
import { logger as LOGGER } from "../../utils/index.js";
|
|
5
|
-
async function registerOperator({
|
|
6
|
-
logger = LOGGER,
|
|
7
|
-
chainId = SELECTED_CHAIN_ID,
|
|
8
|
-
wallet = getContracts(chainId).wallet,
|
|
9
|
-
reclaimRpcUrl = RECLAIM_PUBLIC_URL
|
|
10
|
-
} = {}) {
|
|
11
|
-
const contracts = getContracts(chainId);
|
|
12
|
-
const delegationManager = contracts.delegationManager.connect(wallet);
|
|
13
|
-
const avsDirectory = contracts.avsDirectory.connect(wallet);
|
|
14
|
-
const contract = contracts.contract.connect(wallet);
|
|
15
|
-
const registryContract = contracts.registryContract.connect(wallet);
|
|
16
|
-
const addr = wallet.address;
|
|
17
|
-
try {
|
|
18
|
-
const tx1 = await delegationManager.registerAsOperator({
|
|
19
|
-
earningsReceiver: addr,
|
|
20
|
-
delegationApprover: "0x0000000000000000000000000000000000000000",
|
|
21
|
-
stakerOptOutWindowBlocks: 0
|
|
22
|
-
}, "");
|
|
23
|
-
await tx1.wait();
|
|
24
|
-
logger.info("operator registered on DM successfully");
|
|
25
|
-
} catch (err) {
|
|
26
|
-
if (!err.message.includes("operator has already registered")) {
|
|
27
|
-
throw err;
|
|
28
|
-
}
|
|
29
|
-
logger.info("Operator already registered on EL");
|
|
30
|
-
}
|
|
31
|
-
const salt = hexlify(randomBytes(32));
|
|
32
|
-
const expiry = Math.floor(Date.now() / 1e3) + 3600;
|
|
33
|
-
const operatorSignature = {
|
|
34
|
-
expiry,
|
|
35
|
-
salt,
|
|
36
|
-
signature: ""
|
|
37
|
-
};
|
|
38
|
-
const contractAddress = await contract.getAddress();
|
|
39
|
-
const digestHash = await avsDirectory.calculateOperatorAVSRegistrationDigestHash(
|
|
40
|
-
addr,
|
|
41
|
-
contractAddress,
|
|
42
|
-
salt,
|
|
43
|
-
expiry
|
|
44
|
-
);
|
|
45
|
-
const signingKey = new SigningKey(
|
|
46
|
-
wallet.privateKey
|
|
47
|
-
);
|
|
48
|
-
const signature = signingKey.sign(digestHash);
|
|
49
|
-
operatorSignature.signature = signature.serialized;
|
|
50
|
-
logger.info("operator signature generated successfully");
|
|
51
|
-
if (!await registryContract.operatorRegistered(addr)) {
|
|
52
|
-
const tx2 = await registryContract.registerOperatorWithSignature(addr, operatorSignature);
|
|
53
|
-
await tx2.wait();
|
|
54
|
-
logger.info("operator registered on AVS successfully");
|
|
55
|
-
} else {
|
|
56
|
-
logger.info("Operator already registered on AVS");
|
|
57
|
-
}
|
|
58
|
-
const existingMetadata = await contract.getMetadataForOperator(addr).catch((err) => {
|
|
59
|
-
if (err.message.includes("Operator not found")) {
|
|
60
|
-
return void 0;
|
|
61
|
-
}
|
|
62
|
-
throw err;
|
|
63
|
-
});
|
|
64
|
-
const metadata = { addr, url: reclaimRpcUrl };
|
|
65
|
-
if (existingMetadata?.addr === metadata.addr && existingMetadata?.url === metadata.url) {
|
|
66
|
-
logger.info("operator metadata already up to date");
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
await contract.updateOperatorMetadata(metadata);
|
|
70
|
-
logger.info({ metadata }, "operator metadata updated successfully");
|
|
71
|
-
}
|
|
72
|
-
export {
|
|
73
|
-
registerOperator
|
|
74
|
-
};
|
package/lib/avs/utils/tasks.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { EventLog, getBytes } from "ethers";
|
|
2
|
-
import { getContracts } from "../../avs/utils/contracts.js";
|
|
3
|
-
async function createNewClaimRequestOnChain({
|
|
4
|
-
request,
|
|
5
|
-
payer,
|
|
6
|
-
chainId,
|
|
7
|
-
...rest
|
|
8
|
-
}) {
|
|
9
|
-
const contracts = getContracts(chainId);
|
|
10
|
-
const contract = contracts.contract.connect(payer);
|
|
11
|
-
const ownerAddress = typeof rest.owner === "string" ? rest.owner : rest.owner.address;
|
|
12
|
-
const fullRequest = {
|
|
13
|
-
...request,
|
|
14
|
-
owner: ownerAddress
|
|
15
|
-
};
|
|
16
|
-
const signature = await getSignature();
|
|
17
|
-
const task = await contract.createNewTask(fullRequest, signature || "0x00");
|
|
18
|
-
const rslt = await task.wait();
|
|
19
|
-
const logs = rslt?.logs ?? [];
|
|
20
|
-
const eventLogs = logs.filter((log) => log instanceof EventLog);
|
|
21
|
-
const ev = eventLogs[0];
|
|
22
|
-
const arg = ev?.args;
|
|
23
|
-
return { task: arg, tx: rslt };
|
|
24
|
-
function getSignature() {
|
|
25
|
-
if (ownerAddress.toLowerCase() === payer.address.toLowerCase()) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
if ("requestSignature" in rest) {
|
|
29
|
-
return rest.requestSignature;
|
|
30
|
-
}
|
|
31
|
-
if (typeof rest.owner !== "object") {
|
|
32
|
-
throw new Error(
|
|
33
|
-
"Owner wallet must be provided or requestSignature must be provided"
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
return signClaimRequest(fullRequest, rest.owner, chainId);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
async function signClaimRequest(request, owner, chainId) {
|
|
40
|
-
const contract = getContracts(chainId).contract;
|
|
41
|
-
const encoded = await contract.encodeClaimRequest(request);
|
|
42
|
-
const strSig = await owner.signMessage(getBytes(encoded));
|
|
43
|
-
return getBytes(strSig);
|
|
44
|
-
}
|
|
45
|
-
export {
|
|
46
|
-
createNewClaimRequestOnChain,
|
|
47
|
-
signClaimRequest
|
|
48
|
-
};
|
|
@@ -1,461 +0,0 @@
|
|
|
1
|
-
import { asciiToUint8Array } from "@reclaimprotocol/tls";
|
|
2
|
-
import { makeRpcTlsTunnel } from "../client/tunnels/make-rpc-tls-tunnel.js";
|
|
3
|
-
import { getAttestorClientFromPool } from "../client/utils/attestor-pool.js";
|
|
4
|
-
import { DEFAULT_HTTPS_PORT, PROVIDER_CTX, TOPRF_DOMAIN_SEPARATOR } from "../config/index.js";
|
|
5
|
-
import { ClaimTunnelRequest } from "../proto/api.js";
|
|
6
|
-
import { providers } from "../providers/index.js";
|
|
7
|
-
import {
|
|
8
|
-
AttestorError,
|
|
9
|
-
binaryHashToStr,
|
|
10
|
-
canonicalStringify,
|
|
11
|
-
generateTunnelId,
|
|
12
|
-
getBlocksToReveal,
|
|
13
|
-
getEngineProto,
|
|
14
|
-
getProviderValue,
|
|
15
|
-
isApplicationData,
|
|
16
|
-
logger as LOGGER,
|
|
17
|
-
makeDefaultOPRFOperator,
|
|
18
|
-
makeHttpResponseParser,
|
|
19
|
-
preparePacketsForReveal,
|
|
20
|
-
redactSlices,
|
|
21
|
-
uint8ArrayToStr,
|
|
22
|
-
unixTimestampSeconds
|
|
23
|
-
} from "../utils/index.js";
|
|
24
|
-
import { executeWithRetries } from "../utils/retries.js";
|
|
25
|
-
import { SIGNATURES } from "../utils/signatures/index.js";
|
|
26
|
-
import { getDefaultTlsOptions } from "../utils/tls.js";
|
|
27
|
-
function createClaimOnAttestor({
|
|
28
|
-
logger: _logger,
|
|
29
|
-
maxRetries = 3,
|
|
30
|
-
...opts
|
|
31
|
-
}) {
|
|
32
|
-
const logger = _logger || ("logger" in opts.client ? opts.client.logger : LOGGER);
|
|
33
|
-
return executeWithRetries(
|
|
34
|
-
(attempt) => _createClaimOnAttestor({
|
|
35
|
-
...opts,
|
|
36
|
-
logger: attempt ? logger.child({ attempt }) : logger
|
|
37
|
-
}),
|
|
38
|
-
{ maxRetries, logger, shouldRetry }
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
function shouldRetry(err) {
|
|
42
|
-
if (err instanceof TypeError) {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
if (err?.message?.includes("stream ended before")) {
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
return err instanceof AttestorError && err.code !== "ERROR_INVALID_CLAIM" && err.code !== "ERROR_BAD_REQUEST" && err.code !== "ERROR_AUTHENTICATION_FAILED" && err.code !== "ERROR_TOPRF_OUT_OF_BOUNDS";
|
|
49
|
-
}
|
|
50
|
-
async function _createClaimOnAttestor({
|
|
51
|
-
name,
|
|
52
|
-
params,
|
|
53
|
-
secretParams,
|
|
54
|
-
context,
|
|
55
|
-
onStep,
|
|
56
|
-
ownerPrivateKey,
|
|
57
|
-
client: clientInit,
|
|
58
|
-
logger = LOGGER,
|
|
59
|
-
timestampS,
|
|
60
|
-
updateProviderParams,
|
|
61
|
-
updateParametersFromOprfData = true,
|
|
62
|
-
...zkOpts
|
|
63
|
-
}) {
|
|
64
|
-
const provider = providers[name];
|
|
65
|
-
const hostPort = getProviderValue(params, provider.hostPort, secretParams);
|
|
66
|
-
const geoLocation = getProviderValue(params, provider.geoLocation, secretParams);
|
|
67
|
-
const proxySessionId = getProviderValue(params, provider.proxySessionId, secretParams);
|
|
68
|
-
const providerTlsOpts = getProviderValue(
|
|
69
|
-
params,
|
|
70
|
-
provider.additionalClientOptions
|
|
71
|
-
);
|
|
72
|
-
const tlsOpts = {
|
|
73
|
-
...getDefaultTlsOptions(),
|
|
74
|
-
fetchCertificateBytes: fetchCertificateBytesFromAttestor,
|
|
75
|
-
...providerTlsOpts
|
|
76
|
-
};
|
|
77
|
-
const { zkEngine = "snarkjs" } = zkOpts;
|
|
78
|
-
let redactionMode = getProviderValue(params, provider.writeRedactionMode);
|
|
79
|
-
const [host, port] = hostPort.split(":");
|
|
80
|
-
const resParser = makeHttpResponseParser();
|
|
81
|
-
let client;
|
|
82
|
-
let lastMsgRevealed = false;
|
|
83
|
-
const revealMap = /* @__PURE__ */ new Map();
|
|
84
|
-
onStep?.({ name: "connecting" });
|
|
85
|
-
let endedHttpRequest;
|
|
86
|
-
const createTunnelReq = {
|
|
87
|
-
host,
|
|
88
|
-
port: port ? +port : DEFAULT_HTTPS_PORT,
|
|
89
|
-
geoLocation,
|
|
90
|
-
proxySessionId,
|
|
91
|
-
id: generateTunnelId()
|
|
92
|
-
};
|
|
93
|
-
logger = logger.child({ tunnelId: createTunnelReq.id });
|
|
94
|
-
const authRequest = "authRequest" in clientInit ? typeof clientInit.authRequest === "function" ? await clientInit.authRequest() : clientInit.authRequest : void 0;
|
|
95
|
-
const tunnel = await makeRpcTlsTunnel({
|
|
96
|
-
tlsOpts,
|
|
97
|
-
connect: (connectMsgs) => {
|
|
98
|
-
let created = false;
|
|
99
|
-
if ("metadata" in clientInit) {
|
|
100
|
-
client = clientInit;
|
|
101
|
-
} else {
|
|
102
|
-
client = getAttestorClientFromPool(
|
|
103
|
-
clientInit.url,
|
|
104
|
-
() => {
|
|
105
|
-
created = true;
|
|
106
|
-
return {
|
|
107
|
-
authRequest,
|
|
108
|
-
initMessages: connectMsgs,
|
|
109
|
-
logger
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
if (!created) {
|
|
115
|
-
client.waitForInit().then(() => client.sendMessage(...connectMsgs)).catch((err) => {
|
|
116
|
-
logger.error(
|
|
117
|
-
{ err },
|
|
118
|
-
"error in sending init msgs"
|
|
119
|
-
);
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
return client;
|
|
123
|
-
},
|
|
124
|
-
logger,
|
|
125
|
-
request: createTunnelReq,
|
|
126
|
-
onMessage(data) {
|
|
127
|
-
logger.debug({ bytes: data.length }, "recv data from server");
|
|
128
|
-
resParser.onChunk(data);
|
|
129
|
-
if (resParser.res.complete) {
|
|
130
|
-
logger?.debug("got complete HTTP response from server");
|
|
131
|
-
setTimeout(() => {
|
|
132
|
-
endedHttpRequest?.();
|
|
133
|
-
}, 100);
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
onClose(err) {
|
|
137
|
-
const level = err ? "error" : "debug";
|
|
138
|
-
logger?.[level]({ err }, "tls session ended");
|
|
139
|
-
endedHttpRequest?.(err);
|
|
140
|
-
try {
|
|
141
|
-
resParser.streamEnded();
|
|
142
|
-
} catch {
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
const {
|
|
147
|
-
version: tlsVersion,
|
|
148
|
-
cipherSuite
|
|
149
|
-
} = tunnel.tls.getMetadata();
|
|
150
|
-
if (tlsVersion === "TLS1_2" && redactionMode !== "zk") {
|
|
151
|
-
redactionMode = "zk";
|
|
152
|
-
logger.info("TLS1.2 detected, defaulting to zk redaction mode");
|
|
153
|
-
}
|
|
154
|
-
const {
|
|
155
|
-
redactions,
|
|
156
|
-
data: requestStr
|
|
157
|
-
} = provider.createRequest(
|
|
158
|
-
// @ts-ignore
|
|
159
|
-
secretParams,
|
|
160
|
-
params,
|
|
161
|
-
logger
|
|
162
|
-
);
|
|
163
|
-
const requestData = typeof requestStr === "string" ? asciiToUint8Array(requestStr) : requestStr;
|
|
164
|
-
logger.debug(
|
|
165
|
-
{ redactions: redactions.length },
|
|
166
|
-
"generated request"
|
|
167
|
-
);
|
|
168
|
-
const waitForAllData = new Promise(
|
|
169
|
-
(resolve, reject) => {
|
|
170
|
-
endedHttpRequest = (err) => err ? reject(err) : resolve();
|
|
171
|
-
}
|
|
172
|
-
);
|
|
173
|
-
onStep?.({ name: "sending-request-data" });
|
|
174
|
-
try {
|
|
175
|
-
if (redactionMode === "zk") {
|
|
176
|
-
await writeRedactedZk();
|
|
177
|
-
} else {
|
|
178
|
-
await writeRedactedWithKeyUpdate();
|
|
179
|
-
}
|
|
180
|
-
logger.info("wrote request to server");
|
|
181
|
-
} catch (err) {
|
|
182
|
-
logger.error(
|
|
183
|
-
{ err },
|
|
184
|
-
"session errored during write, waiting for stream end"
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
onStep?.({ name: "waiting-for-response" });
|
|
188
|
-
await waitForAllData;
|
|
189
|
-
await tunnel.close();
|
|
190
|
-
logger.info("session closed, processing response");
|
|
191
|
-
if (updateProviderParams) {
|
|
192
|
-
const { params: updatedParms, secretParams: updatedSecretParms } = await updateProviderParams(tunnel.transcript, tlsVersion ?? "TLS1_2");
|
|
193
|
-
params = { ...params, ...updatedParms };
|
|
194
|
-
secretParams = { ...secretParams, ...updatedSecretParms };
|
|
195
|
-
}
|
|
196
|
-
const signatureAlg = SIGNATURES[client.metadata.signatureType];
|
|
197
|
-
let serverIV;
|
|
198
|
-
let clientIV;
|
|
199
|
-
const [serverBlock] = getLastBlocks("server", 1);
|
|
200
|
-
if (serverBlock?.message.type === "ciphertext") {
|
|
201
|
-
serverIV = serverBlock.message.fixedIv;
|
|
202
|
-
}
|
|
203
|
-
const [clientBlock] = getLastBlocks("client", 1);
|
|
204
|
-
if (clientBlock?.message.type === "ciphertext") {
|
|
205
|
-
clientIV = clientBlock.message.fixedIv;
|
|
206
|
-
}
|
|
207
|
-
const transcript = await generateTranscript();
|
|
208
|
-
const claimTunnelReq = ClaimTunnelRequest.create({
|
|
209
|
-
request: createTunnelReq,
|
|
210
|
-
data: {
|
|
211
|
-
provider: name,
|
|
212
|
-
parameters: canonicalStringify(params),
|
|
213
|
-
context: canonicalStringify(context),
|
|
214
|
-
timestampS: timestampS ?? unixTimestampSeconds(),
|
|
215
|
-
owner: getAddress()
|
|
216
|
-
},
|
|
217
|
-
transcript,
|
|
218
|
-
zkEngine: getEngineProto(zkEngine),
|
|
219
|
-
fixedServerIV: serverIV,
|
|
220
|
-
fixedClientIV: clientIV
|
|
221
|
-
});
|
|
222
|
-
onStep?.({ name: "waiting-for-verification" });
|
|
223
|
-
const claimTunnelBytes = ClaimTunnelRequest.encode(claimTunnelReq).finish();
|
|
224
|
-
const requestSignature = await signatureAlg.sign(claimTunnelBytes, ownerPrivateKey);
|
|
225
|
-
claimTunnelReq.signatures = { requestSignature };
|
|
226
|
-
const result = await client.rpc("claimTunnel", claimTunnelReq);
|
|
227
|
-
logger.info({ success: !!result.claim }, "recv claim response");
|
|
228
|
-
return result;
|
|
229
|
-
async function fetchCertificateBytesFromAttestor(url) {
|
|
230
|
-
if (!client) {
|
|
231
|
-
throw new Error("attestor client not initialized");
|
|
232
|
-
}
|
|
233
|
-
const result2 = await client.rpc("fetchCertificateBytes", { url });
|
|
234
|
-
return result2.bytes;
|
|
235
|
-
}
|
|
236
|
-
async function writeRedactedWithKeyUpdate() {
|
|
237
|
-
let currentIndex = 0;
|
|
238
|
-
for (const section of redactions) {
|
|
239
|
-
const block2 = requestData.slice(currentIndex, section.fromIndex);
|
|
240
|
-
if (block2.length) {
|
|
241
|
-
await writeWithReveal(block2, true);
|
|
242
|
-
}
|
|
243
|
-
const redacted = requestData.slice(section.fromIndex, section.toIndex);
|
|
244
|
-
await writeWithReveal(redacted, false);
|
|
245
|
-
currentIndex = section.toIndex;
|
|
246
|
-
}
|
|
247
|
-
const lastBlockStart = redactions?.[redactions.length - 1]?.toIndex || 0;
|
|
248
|
-
const block = requestData.slice(lastBlockStart);
|
|
249
|
-
if (block.length) {
|
|
250
|
-
await writeWithReveal(block, true);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
async function writeRedactedZk() {
|
|
254
|
-
let blocksWritten = tunnel.transcript.length;
|
|
255
|
-
await tunnel.tls.write(requestData);
|
|
256
|
-
blocksWritten = tunnel.transcript.length - blocksWritten;
|
|
257
|
-
setRevealOfLastSentBlocks(
|
|
258
|
-
{
|
|
259
|
-
type: "zk",
|
|
260
|
-
redactedPlaintext: redactSlices(requestData, redactions)
|
|
261
|
-
},
|
|
262
|
-
blocksWritten
|
|
263
|
-
);
|
|
264
|
-
}
|
|
265
|
-
async function writeWithReveal(data, reveal) {
|
|
266
|
-
if (reveal !== lastMsgRevealed) {
|
|
267
|
-
await tunnel.tls.updateTrafficKeys();
|
|
268
|
-
}
|
|
269
|
-
let blocksWritten = tunnel.transcript.length;
|
|
270
|
-
await tunnel.write(data);
|
|
271
|
-
blocksWritten = tunnel.transcript.length - blocksWritten;
|
|
272
|
-
setRevealOfLastSentBlocks(reveal ? { type: "complete" } : void 0, blocksWritten);
|
|
273
|
-
lastMsgRevealed = reveal;
|
|
274
|
-
}
|
|
275
|
-
function setRevealOfLastSentBlocks(reveal, nBlocks = 1) {
|
|
276
|
-
const lastBlocks = getLastBlocks("client", nBlocks);
|
|
277
|
-
if (!lastBlocks.length) {
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
for (const block of lastBlocks) {
|
|
281
|
-
setRevealOfMessage(block.message, reveal);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
function getLastBlocks(sender, nBlocks) {
|
|
285
|
-
const lastBlocks = [];
|
|
286
|
-
for (let i = tunnel.transcript.length - 1; i >= 0; i--) {
|
|
287
|
-
const block = tunnel.transcript[i];
|
|
288
|
-
if (block.sender === sender) {
|
|
289
|
-
lastBlocks.push(block);
|
|
290
|
-
if (lastBlocks.length === nBlocks) {
|
|
291
|
-
break;
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
return lastBlocks;
|
|
296
|
-
}
|
|
297
|
-
async function generateTranscript() {
|
|
298
|
-
await addServerSideReveals();
|
|
299
|
-
const startMs = Date.now();
|
|
300
|
-
const revealedMessages = await preparePacketsForReveal(
|
|
301
|
-
tunnel.transcript,
|
|
302
|
-
revealMap,
|
|
303
|
-
{
|
|
304
|
-
logger,
|
|
305
|
-
cipherSuite,
|
|
306
|
-
onZkProgress(done, total) {
|
|
307
|
-
const timeSinceStartMs = Date.now() - startMs;
|
|
308
|
-
const timePerBlockMs = timeSinceStartMs / done;
|
|
309
|
-
const timeLeftMs = timePerBlockMs * (total - done);
|
|
310
|
-
onStep?.({
|
|
311
|
-
name: "generating-zk-proofs",
|
|
312
|
-
proofsDone: done,
|
|
313
|
-
proofsTotal: total,
|
|
314
|
-
approxTimeLeftS: Math.round(timeLeftMs / 1e3)
|
|
315
|
-
});
|
|
316
|
-
},
|
|
317
|
-
...zkOpts
|
|
318
|
-
}
|
|
319
|
-
);
|
|
320
|
-
return revealedMessages;
|
|
321
|
-
}
|
|
322
|
-
async function addServerSideReveals() {
|
|
323
|
-
const allPackets = tunnel.transcript;
|
|
324
|
-
let serverPacketsToReveal = "all";
|
|
325
|
-
const packets = [];
|
|
326
|
-
const serverBlocks = [];
|
|
327
|
-
for (const b of allPackets) {
|
|
328
|
-
if (b.message.type !== "ciphertext" || !isApplicationData(b.message, tlsVersion)) {
|
|
329
|
-
continue;
|
|
330
|
-
}
|
|
331
|
-
const plaintext = tlsVersion === "TLS1_3" ? b.message.plaintext.slice(0, -1) : b.message.plaintext;
|
|
332
|
-
packets.push({
|
|
333
|
-
message: plaintext,
|
|
334
|
-
sender: b.sender
|
|
335
|
-
});
|
|
336
|
-
if (b.sender === "server") {
|
|
337
|
-
serverBlocks.push({
|
|
338
|
-
plaintext,
|
|
339
|
-
message: b.message
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
if (provider.getResponseRedactions) {
|
|
344
|
-
serverPacketsToReveal = await getBlocksToReveal(
|
|
345
|
-
serverBlocks,
|
|
346
|
-
(total) => provider.getResponseRedactions({
|
|
347
|
-
response: total,
|
|
348
|
-
params,
|
|
349
|
-
logger,
|
|
350
|
-
ctx: PROVIDER_CTX
|
|
351
|
-
}),
|
|
352
|
-
performOprf
|
|
353
|
-
);
|
|
354
|
-
}
|
|
355
|
-
const revealedPackets = packets.filter((p) => p.sender === "client");
|
|
356
|
-
if (serverPacketsToReveal === "all") {
|
|
357
|
-
for (const { message, sender } of allPackets) {
|
|
358
|
-
if (sender === "server") {
|
|
359
|
-
setRevealOfMessage(message, { type: "complete" });
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
revealedPackets.push(...packets.filter((p) => p.sender === "server"));
|
|
363
|
-
} else {
|
|
364
|
-
for (const {
|
|
365
|
-
block,
|
|
366
|
-
redactedPlaintext,
|
|
367
|
-
overshotToprfFromPrevBlock,
|
|
368
|
-
toprfs,
|
|
369
|
-
oprfRawMarkers
|
|
370
|
-
} of serverPacketsToReveal) {
|
|
371
|
-
setRevealOfMessage(block.message, {
|
|
372
|
-
type: "zk",
|
|
373
|
-
redactedPlaintext,
|
|
374
|
-
toprfs,
|
|
375
|
-
oprfRawMarkers,
|
|
376
|
-
overshotToprfFromPrevBlock
|
|
377
|
-
});
|
|
378
|
-
revealedPackets.push(
|
|
379
|
-
{ sender: "server", message: redactedPlaintext }
|
|
380
|
-
);
|
|
381
|
-
if (updateParametersFromOprfData && toprfs) {
|
|
382
|
-
let strParams = canonicalStringify(params);
|
|
383
|
-
for (const toprf of toprfs) {
|
|
384
|
-
const ogText = uint8ArrayToStr(toprf.plaintext);
|
|
385
|
-
const hashedText = binaryHashToStr(
|
|
386
|
-
toprf.nullifier,
|
|
387
|
-
toprf.dataLocation.length
|
|
388
|
-
);
|
|
389
|
-
strParams = strParams.replaceAll(ogText, hashedText);
|
|
390
|
-
}
|
|
391
|
-
params = JSON.parse(strParams);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
await provider.assertValidProviderReceipt({
|
|
396
|
-
receipt: revealedPackets,
|
|
397
|
-
params: {
|
|
398
|
-
...params,
|
|
399
|
-
// provide secret params for proper
|
|
400
|
-
// request body validation
|
|
401
|
-
secretParams
|
|
402
|
-
},
|
|
403
|
-
logger,
|
|
404
|
-
ctx: PROVIDER_CTX
|
|
405
|
-
});
|
|
406
|
-
for (const p of allPackets) {
|
|
407
|
-
if (p.message.type !== "ciphertext") {
|
|
408
|
-
continue;
|
|
409
|
-
}
|
|
410
|
-
if (isApplicationData(p.message, tlsVersion)) {
|
|
411
|
-
break;
|
|
412
|
-
}
|
|
413
|
-
setRevealOfMessage(p.message, { type: "complete" });
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
async function performOprf(plaintext) {
|
|
417
|
-
logger.info({ length: plaintext.length }, "generating OPRF...");
|
|
418
|
-
const oprfOperator = zkOpts.oprfOperators?.["chacha20"] || makeDefaultOPRFOperator(
|
|
419
|
-
"chacha20",
|
|
420
|
-
zkEngine,
|
|
421
|
-
logger
|
|
422
|
-
);
|
|
423
|
-
const reqData = await oprfOperator.generateOPRFRequestData(
|
|
424
|
-
plaintext,
|
|
425
|
-
TOPRF_DOMAIN_SEPARATOR,
|
|
426
|
-
logger
|
|
427
|
-
);
|
|
428
|
-
const res = await client.rpc("toprf", {
|
|
429
|
-
maskedData: reqData.maskedData,
|
|
430
|
-
engine: getEngineProto(zkEngine)
|
|
431
|
-
});
|
|
432
|
-
const nullifier = await oprfOperator.finaliseOPRF(
|
|
433
|
-
client.initResponse.toprfPublicKey,
|
|
434
|
-
reqData,
|
|
435
|
-
[res]
|
|
436
|
-
);
|
|
437
|
-
const data = {
|
|
438
|
-
nullifier,
|
|
439
|
-
responses: [res],
|
|
440
|
-
mask: reqData.mask,
|
|
441
|
-
dataLocation: void 0,
|
|
442
|
-
plaintext
|
|
443
|
-
};
|
|
444
|
-
return data;
|
|
445
|
-
}
|
|
446
|
-
function setRevealOfMessage(message, reveal) {
|
|
447
|
-
if (reveal) {
|
|
448
|
-
revealMap.set(message, reveal);
|
|
449
|
-
return;
|
|
450
|
-
}
|
|
451
|
-
revealMap.delete(message);
|
|
452
|
-
}
|
|
453
|
-
function getAddress() {
|
|
454
|
-
const { getAddress: getAddress2, getPublicKey } = signatureAlg;
|
|
455
|
-
const pubKey = getPublicKey(ownerPrivateKey);
|
|
456
|
-
return getAddress2(pubKey);
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
export {
|
|
460
|
-
createClaimOnAttestor
|
|
461
|
-
};
|
package/lib/client/index.js
DELETED