@reclaimprotocol/attestor-core 5.0.1-beta.13 → 5.0.1-beta.16
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/lib/external-rpc/index.js +17321 -3
- package/lib/index.d.ts +1 -0
- package/lib/index.js +15391 -11
- package/lib/scripts/build-browser-debug.d.ts +1 -0
- package/package.json +1 -1
- 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/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/build-browser.js +0 -38
- package/lib/scripts/build-jsc.js +0 -47
- package/lib/scripts/build-lib.js +0 -47
- 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/utils/generics.js
DELETED
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
areUint8ArraysEqual,
|
|
3
|
-
CONTENT_TYPE_MAP,
|
|
4
|
-
crypto,
|
|
5
|
-
decryptWrappedRecord,
|
|
6
|
-
PACKET_TYPE,
|
|
7
|
-
SUPPORTED_CIPHER_SUITE_MAP,
|
|
8
|
-
uint8ArrayToBinaryStr,
|
|
9
|
-
uint8ArrayToDataView
|
|
10
|
-
} from "@reclaimprotocol/tls";
|
|
11
|
-
import { REDACTION_CHAR_CODE } from "@reclaimprotocol/zk-symmetric-crypto";
|
|
12
|
-
import { RPCMessage, RPCMessages } from "#src/proto/api.js";
|
|
13
|
-
const DEFAULT_REDACTION_DATA = new Uint8Array(4).fill(REDACTION_CHAR_CODE);
|
|
14
|
-
function uint8ArrayToStr(arr) {
|
|
15
|
-
return new TextDecoder().decode(arr);
|
|
16
|
-
}
|
|
17
|
-
function strToUint8Array(str) {
|
|
18
|
-
return new TextEncoder().encode(str);
|
|
19
|
-
}
|
|
20
|
-
function getTranscriptString(receipt) {
|
|
21
|
-
const applMsgs = extractApplicationDataFromTranscript(receipt);
|
|
22
|
-
const strList = [];
|
|
23
|
-
for (const { message, sender } of applMsgs) {
|
|
24
|
-
const content = uint8ArrayToStr(message);
|
|
25
|
-
if (strList[strList.length - 1]?.startsWith(sender)) {
|
|
26
|
-
strList[strList.length - 1] += content;
|
|
27
|
-
} else {
|
|
28
|
-
strList.push(`${sender}: ${content}`);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return strList.join("\n");
|
|
32
|
-
}
|
|
33
|
-
const unixTimestampSeconds = () => Math.floor(Date.now() / 1e3);
|
|
34
|
-
function findIndexInUint8Array(haystack, needle) {
|
|
35
|
-
for (let i = 0; i < haystack.length; i++) {
|
|
36
|
-
if (areUint8ArraysEqual(haystack.slice(i, i + needle.length), needle)) {
|
|
37
|
-
return i;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return -1;
|
|
41
|
-
}
|
|
42
|
-
function getZkAlgorithmForCipherSuite(cipherSuite) {
|
|
43
|
-
if (cipherSuite.includes("CHACHA20")) {
|
|
44
|
-
return "chacha20";
|
|
45
|
-
}
|
|
46
|
-
if (cipherSuite.includes("AES_256_GCM")) {
|
|
47
|
-
return "aes-256-ctr";
|
|
48
|
-
}
|
|
49
|
-
if (cipherSuite.includes("AES_128_GCM")) {
|
|
50
|
-
return "aes-128-ctr";
|
|
51
|
-
}
|
|
52
|
-
throw new Error(`${cipherSuite} not supported for ZK ops`);
|
|
53
|
-
}
|
|
54
|
-
function getPureCiphertext(content, cipherSuite) {
|
|
55
|
-
getZkAlgorithmForCipherSuite(cipherSuite);
|
|
56
|
-
content = content.slice(0, -16);
|
|
57
|
-
const {
|
|
58
|
-
ivLength: fixedIvLength
|
|
59
|
-
} = SUPPORTED_CIPHER_SUITE_MAP[cipherSuite];
|
|
60
|
-
const recordIvLength = 12 - fixedIvLength;
|
|
61
|
-
content = content.slice(recordIvLength);
|
|
62
|
-
return content;
|
|
63
|
-
}
|
|
64
|
-
function getRecordIV(content, cipherSuite) {
|
|
65
|
-
getZkAlgorithmForCipherSuite(cipherSuite);
|
|
66
|
-
const {
|
|
67
|
-
ivLength: fixedIvLength
|
|
68
|
-
} = SUPPORTED_CIPHER_SUITE_MAP[cipherSuite];
|
|
69
|
-
const recordIvLength = 12 - fixedIvLength;
|
|
70
|
-
return content.slice(0, recordIvLength);
|
|
71
|
-
}
|
|
72
|
-
function getProviderValue(params, fn, secretParams) {
|
|
73
|
-
return typeof fn === "function" ? fn(params, secretParams) : fn;
|
|
74
|
-
}
|
|
75
|
-
function generateRpcMessageId() {
|
|
76
|
-
return uint8ArrayToDataView(crypto.randomBytes(4)).getUint32(0);
|
|
77
|
-
}
|
|
78
|
-
function generateSessionId() {
|
|
79
|
-
return generateRpcMessageId();
|
|
80
|
-
}
|
|
81
|
-
function generateTunnelId() {
|
|
82
|
-
return generateRpcMessageId();
|
|
83
|
-
}
|
|
84
|
-
function makeRpcEvent(type, data) {
|
|
85
|
-
const ev = new Event(type);
|
|
86
|
-
ev.data = data;
|
|
87
|
-
return ev;
|
|
88
|
-
}
|
|
89
|
-
function getRpcTypeFromKey(key) {
|
|
90
|
-
if (key.endsWith("Request")) {
|
|
91
|
-
return {
|
|
92
|
-
type: key.slice(0, -7),
|
|
93
|
-
direction: "request"
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
if (key.endsWith("Response")) {
|
|
97
|
-
return {
|
|
98
|
-
type: key.slice(0, -8),
|
|
99
|
-
direction: "response"
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
function getRpcResponseType(type) {
|
|
104
|
-
return `${type}Response`;
|
|
105
|
-
}
|
|
106
|
-
function getRpcRequestType(type) {
|
|
107
|
-
return `${type}Request`;
|
|
108
|
-
}
|
|
109
|
-
function isApplicationData(packet, tlsVersion) {
|
|
110
|
-
return packet.type === "ciphertext" && (packet.contentType === "APPLICATION_DATA" || packet.data[0] === PACKET_TYPE.WRAPPED_RECORD && tlsVersion === "TLS1_2");
|
|
111
|
-
}
|
|
112
|
-
async function extractArrayBufferFromWsData(data) {
|
|
113
|
-
if (data instanceof ArrayBuffer) {
|
|
114
|
-
return new Uint8Array(data);
|
|
115
|
-
}
|
|
116
|
-
if (data instanceof Uint8Array || typeof data === "object" && data && "buffer" in data) {
|
|
117
|
-
return data;
|
|
118
|
-
}
|
|
119
|
-
if (typeof data === "string") {
|
|
120
|
-
return strToUint8Array(data);
|
|
121
|
-
}
|
|
122
|
-
if (typeof Blob !== "undefined" && data instanceof Blob) {
|
|
123
|
-
return new Uint8Array(await data.arrayBuffer());
|
|
124
|
-
}
|
|
125
|
-
throw new Error("unsupported data: " + String(data));
|
|
126
|
-
}
|
|
127
|
-
function getRpcRequest(msg) {
|
|
128
|
-
if (msg.requestError) {
|
|
129
|
-
return {
|
|
130
|
-
direction: "response",
|
|
131
|
-
type: "error"
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
for (const key in msg) {
|
|
135
|
-
if (!msg[key]) {
|
|
136
|
-
continue;
|
|
137
|
-
}
|
|
138
|
-
const rpcType = getRpcTypeFromKey(key);
|
|
139
|
-
if (!rpcType) {
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
return rpcType;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
function extractApplicationDataFromTranscript({ transcript, tlsVersion }) {
|
|
146
|
-
const msgs = [];
|
|
147
|
-
for (const m of transcript) {
|
|
148
|
-
let message;
|
|
149
|
-
if (m.redacted) {
|
|
150
|
-
if (!m.plaintextLength) {
|
|
151
|
-
message = DEFAULT_REDACTION_DATA;
|
|
152
|
-
} else {
|
|
153
|
-
const len = tlsVersion === "TLS1_3" ? m.plaintextLength - 1 : m.plaintextLength;
|
|
154
|
-
message = new Uint8Array(len).fill(REDACTION_CHAR_CODE);
|
|
155
|
-
}
|
|
156
|
-
} else if (tlsVersion === "TLS1_3") {
|
|
157
|
-
const contentType = m.message[m.message.length - 1];
|
|
158
|
-
if (contentType !== CONTENT_TYPE_MAP["APPLICATION_DATA"]) {
|
|
159
|
-
continue;
|
|
160
|
-
}
|
|
161
|
-
message = m.message.slice(0, -1);
|
|
162
|
-
} else if (m.recordHeader[0] === PACKET_TYPE.WRAPPED_RECORD) {
|
|
163
|
-
message = m.message;
|
|
164
|
-
} else {
|
|
165
|
-
continue;
|
|
166
|
-
}
|
|
167
|
-
msgs.push({ message, sender: m.sender });
|
|
168
|
-
}
|
|
169
|
-
return msgs;
|
|
170
|
-
}
|
|
171
|
-
function extractHandshakeFromTranscript({ transcript, tlsVersion }) {
|
|
172
|
-
const msgs = [];
|
|
173
|
-
for (const [i, m] of transcript.entries()) {
|
|
174
|
-
if (m.redacted) {
|
|
175
|
-
break;
|
|
176
|
-
}
|
|
177
|
-
let message;
|
|
178
|
-
if (m.recordHeader[0] === PACKET_TYPE.HELLO) {
|
|
179
|
-
message = m.message;
|
|
180
|
-
} else if (m.recordHeader[0] === PACKET_TYPE.WRAPPED_RECORD) {
|
|
181
|
-
if (tlsVersion === "TLS1_3") {
|
|
182
|
-
const contentType = m.message[m.message.length - 1];
|
|
183
|
-
if (contentType !== CONTENT_TYPE_MAP["HANDSHAKE"]) {
|
|
184
|
-
break;
|
|
185
|
-
}
|
|
186
|
-
message = m.message.slice(0, -1);
|
|
187
|
-
} else {
|
|
188
|
-
break;
|
|
189
|
-
}
|
|
190
|
-
} else {
|
|
191
|
-
continue;
|
|
192
|
-
}
|
|
193
|
-
if (!message.length) {
|
|
194
|
-
throw new Error("unsupported handshake message");
|
|
195
|
-
}
|
|
196
|
-
msgs.push({ message, sender: m.sender, index: i });
|
|
197
|
-
}
|
|
198
|
-
return msgs;
|
|
199
|
-
}
|
|
200
|
-
async function decryptDirect(directReveal, cipherSuite, recordHeader, serverTlsVersion, content) {
|
|
201
|
-
const { key, iv, recordNumber } = directReveal;
|
|
202
|
-
const { cipher } = SUPPORTED_CIPHER_SUITE_MAP[cipherSuite];
|
|
203
|
-
const importedKey = await crypto.importKey(cipher, key);
|
|
204
|
-
return await decryptWrappedRecord(
|
|
205
|
-
content,
|
|
206
|
-
{
|
|
207
|
-
iv,
|
|
208
|
-
key: importedKey,
|
|
209
|
-
recordHeader,
|
|
210
|
-
recordNumber,
|
|
211
|
-
version: serverTlsVersion,
|
|
212
|
-
cipherSuite
|
|
213
|
-
}
|
|
214
|
-
);
|
|
215
|
-
}
|
|
216
|
-
function packRpcMessages(...msgs) {
|
|
217
|
-
return RPCMessages.create({
|
|
218
|
-
messages: msgs.map((msg) => RPCMessage.create({
|
|
219
|
-
...msg,
|
|
220
|
-
id: msg.id || generateRpcMessageId()
|
|
221
|
-
}))
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
function ethersStructToPlainObject(struct) {
|
|
225
|
-
if (!Array.isArray(struct)) {
|
|
226
|
-
return struct;
|
|
227
|
-
}
|
|
228
|
-
const namedKeys = Object.keys(struct).filter((key) => isNaN(Number(key)));
|
|
229
|
-
if (!namedKeys.length) {
|
|
230
|
-
return struct.map(ethersStructToPlainObject);
|
|
231
|
-
}
|
|
232
|
-
const obj = {};
|
|
233
|
-
for (const key of namedKeys) {
|
|
234
|
-
obj[key] = ethersStructToPlainObject(struct[key]);
|
|
235
|
-
}
|
|
236
|
-
return obj;
|
|
237
|
-
}
|
|
238
|
-
function isTls13Suite(suite) {
|
|
239
|
-
return suite === "TLS_AES_128_GCM_SHA256" || suite === "TLS_AES_256_GCM_SHA384" || suite === "TLS_CHACHA20_POLY1305_SHA256";
|
|
240
|
-
}
|
|
241
|
-
export {
|
|
242
|
-
decryptDirect,
|
|
243
|
-
ethersStructToPlainObject,
|
|
244
|
-
extractApplicationDataFromTranscript,
|
|
245
|
-
extractArrayBufferFromWsData,
|
|
246
|
-
extractHandshakeFromTranscript,
|
|
247
|
-
findIndexInUint8Array,
|
|
248
|
-
generateRpcMessageId,
|
|
249
|
-
generateSessionId,
|
|
250
|
-
generateTunnelId,
|
|
251
|
-
getProviderValue,
|
|
252
|
-
getPureCiphertext,
|
|
253
|
-
getRecordIV,
|
|
254
|
-
getRpcRequest,
|
|
255
|
-
getRpcRequestType,
|
|
256
|
-
getRpcResponseType,
|
|
257
|
-
getRpcTypeFromKey,
|
|
258
|
-
getTranscriptString,
|
|
259
|
-
getZkAlgorithmForCipherSuite,
|
|
260
|
-
isApplicationData,
|
|
261
|
-
isTls13Suite,
|
|
262
|
-
makeRpcEvent,
|
|
263
|
-
packRpcMessages,
|
|
264
|
-
strToUint8Array,
|
|
265
|
-
uint8ArrayToBinaryStr,
|
|
266
|
-
uint8ArrayToStr,
|
|
267
|
-
unixTimestampSeconds
|
|
268
|
-
};
|
package/lib/utils/http-parser.js
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import { asciiToUint8Array, concatenateUint8Arrays } from "@reclaimprotocol/tls";
|
|
2
|
-
import { findIndexInUint8Array, uint8ArrayToStr } from "#src/utils/generics.js";
|
|
3
|
-
import { REDACTION_CHAR_CODE } from "#src/utils/redactions.js";
|
|
4
|
-
const HTTP_HEADER_LINE_END = asciiToUint8Array("\r\n");
|
|
5
|
-
function makeHttpResponseParser() {
|
|
6
|
-
const res = {
|
|
7
|
-
statusCode: 0,
|
|
8
|
-
statusMessage: "",
|
|
9
|
-
headers: {},
|
|
10
|
-
body: new Uint8Array(),
|
|
11
|
-
complete: false,
|
|
12
|
-
headersComplete: false,
|
|
13
|
-
headerIndices: /* @__PURE__ */ new Map(),
|
|
14
|
-
headerEndIdx: 0
|
|
15
|
-
};
|
|
16
|
-
let remainingBodyBytes = 0;
|
|
17
|
-
let isChunked = false;
|
|
18
|
-
let remaining = new Uint8Array();
|
|
19
|
-
let currentByteIdx = 0;
|
|
20
|
-
return {
|
|
21
|
-
res,
|
|
22
|
-
/**
|
|
23
|
-
* Parse the next chunk of data
|
|
24
|
-
* @param data the data to parse
|
|
25
|
-
*/
|
|
26
|
-
onChunk(data) {
|
|
27
|
-
remaining = concatenateUint8Arrays([remaining, data]);
|
|
28
|
-
if (!res.headersComplete) {
|
|
29
|
-
for (let line = getLine(); typeof line !== "undefined"; line = getLine()) {
|
|
30
|
-
if (!res.statusCode) {
|
|
31
|
-
const [, statusCode, statusMessage] = line.match(/HTTP\/\d\.\d (\d+) (.*)/) || [];
|
|
32
|
-
res.statusCode = Number(statusCode);
|
|
33
|
-
res.statusMessage = statusMessage;
|
|
34
|
-
res.statusLineEndIndex = currentByteIdx - HTTP_HEADER_LINE_END.length;
|
|
35
|
-
} else if (line === "") {
|
|
36
|
-
res.headersComplete = true;
|
|
37
|
-
res.headerEndIdx = currentByteIdx - 4;
|
|
38
|
-
if (res.headers["transfer-encoding"]?.includes("chunked")) {
|
|
39
|
-
isChunked = true;
|
|
40
|
-
res.chunks = [];
|
|
41
|
-
break;
|
|
42
|
-
} else if (res.headers["content-length"]) {
|
|
43
|
-
remainingBodyBytes = Number(res.headers["content-length"]);
|
|
44
|
-
break;
|
|
45
|
-
} else {
|
|
46
|
-
remainingBodyBytes = -1;
|
|
47
|
-
break;
|
|
48
|
-
}
|
|
49
|
-
} else if (!res.complete) {
|
|
50
|
-
const [key, value] = line.split(": ");
|
|
51
|
-
res.headers[key.toLowerCase()] = value;
|
|
52
|
-
res.headerIndices[key.toLowerCase()] = {
|
|
53
|
-
fromIndex: currentByteIdx - line.length - HTTP_HEADER_LINE_END.length,
|
|
54
|
-
toIndex: currentByteIdx - HTTP_HEADER_LINE_END.length
|
|
55
|
-
};
|
|
56
|
-
} else {
|
|
57
|
-
throw new Error("got more data after response was complete");
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
if (res.headersComplete) {
|
|
62
|
-
if (remainingBodyBytes) {
|
|
63
|
-
readBody();
|
|
64
|
-
if (!remainingBodyBytes && !isChunked) {
|
|
65
|
-
res.complete = true;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
if (res.headers["content-length"] === "0") {
|
|
69
|
-
res.complete = true;
|
|
70
|
-
}
|
|
71
|
-
if (isChunked) {
|
|
72
|
-
for (let line = getLine(); typeof line !== "undefined"; line = getLine()) {
|
|
73
|
-
if (line === "") {
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
const chunkSize = Number.parseInt(line, 16);
|
|
77
|
-
if (!chunkSize) {
|
|
78
|
-
res.complete = true;
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
res.chunks?.push({
|
|
82
|
-
fromIndex: currentByteIdx,
|
|
83
|
-
toIndex: currentByteIdx + chunkSize
|
|
84
|
-
});
|
|
85
|
-
remainingBodyBytes = chunkSize;
|
|
86
|
-
readBody();
|
|
87
|
-
if (remainingBodyBytes) {
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
/**
|
|
95
|
-
* Call to prevent further parsing; indicating the end of the request
|
|
96
|
-
* Checks that the response is valid & complete, otherwise throws an error
|
|
97
|
-
*/
|
|
98
|
-
streamEnded() {
|
|
99
|
-
if (!res.headersComplete) {
|
|
100
|
-
throw new Error("stream ended before headers were complete");
|
|
101
|
-
}
|
|
102
|
-
if (remaining.length) {
|
|
103
|
-
throw new Error("stream ended before remaining data arrived");
|
|
104
|
-
}
|
|
105
|
-
if (remainingBodyBytes > 0) {
|
|
106
|
-
throw new Error("stream ended before all body bytes were received");
|
|
107
|
-
}
|
|
108
|
-
res.complete = true;
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
function readBody() {
|
|
112
|
-
if (res.complete) {
|
|
113
|
-
throw new Error("got more data after response was complete");
|
|
114
|
-
}
|
|
115
|
-
if (!res.bodyStartIndex) {
|
|
116
|
-
res.bodyStartIndex = currentByteIdx;
|
|
117
|
-
}
|
|
118
|
-
let bytesToCopy;
|
|
119
|
-
if (remainingBodyBytes === -1) {
|
|
120
|
-
bytesToCopy = remaining.length;
|
|
121
|
-
} else {
|
|
122
|
-
bytesToCopy = Math.min(remainingBodyBytes, remaining.length);
|
|
123
|
-
remainingBodyBytes -= bytesToCopy;
|
|
124
|
-
}
|
|
125
|
-
res.body = concatenateUint8Arrays([
|
|
126
|
-
res.body,
|
|
127
|
-
remaining.slice(0, bytesToCopy)
|
|
128
|
-
]);
|
|
129
|
-
remaining = remaining.slice(bytesToCopy);
|
|
130
|
-
currentByteIdx += bytesToCopy;
|
|
131
|
-
}
|
|
132
|
-
function getLine() {
|
|
133
|
-
const idx = findIndexInUint8Array(remaining, HTTP_HEADER_LINE_END);
|
|
134
|
-
if (idx === -1) {
|
|
135
|
-
return void 0;
|
|
136
|
-
}
|
|
137
|
-
const line = uint8ArrayToStr(remaining.slice(0, idx));
|
|
138
|
-
remaining = remaining.slice(idx + HTTP_HEADER_LINE_END.length);
|
|
139
|
-
currentByteIdx += idx + HTTP_HEADER_LINE_END.length;
|
|
140
|
-
return line;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
function getHttpRequestDataFromTranscript(receipt) {
|
|
144
|
-
const clientMsgs = receipt.filter((s) => s.sender === "client");
|
|
145
|
-
if (clientMsgs[0].message[0] === REDACTION_CHAR_CODE) {
|
|
146
|
-
throw new Error("First client message request is redacted. Cannot parse");
|
|
147
|
-
}
|
|
148
|
-
const request = {
|
|
149
|
-
method: "",
|
|
150
|
-
url: "",
|
|
151
|
-
protocol: "",
|
|
152
|
-
headers: {}
|
|
153
|
-
};
|
|
154
|
-
let requestBuffer = concatenateUint8Arrays(clientMsgs.map((m) => m.message));
|
|
155
|
-
for (let line = getLine(); typeof line !== "undefined"; line = getLine()) {
|
|
156
|
-
if (line === "") {
|
|
157
|
-
break;
|
|
158
|
-
}
|
|
159
|
-
if (!request.method) {
|
|
160
|
-
const [, method, url, protocol] = line.match(/(\w+) (.*) (.*)/) || [];
|
|
161
|
-
request.method = method.toLowerCase();
|
|
162
|
-
request.url = url;
|
|
163
|
-
request.protocol = protocol;
|
|
164
|
-
} else {
|
|
165
|
-
let keyIdx = line.indexOf(":");
|
|
166
|
-
if (keyIdx === -1) {
|
|
167
|
-
keyIdx = line.length - 1;
|
|
168
|
-
}
|
|
169
|
-
const key = line.slice(0, keyIdx).toLowerCase().trim();
|
|
170
|
-
const value = line.slice(keyIdx + 1).trim();
|
|
171
|
-
const oldValue = request.headers[key];
|
|
172
|
-
if (typeof oldValue === "string") {
|
|
173
|
-
request.headers[key] = [oldValue, value];
|
|
174
|
-
} else if (Array.isArray(oldValue)) {
|
|
175
|
-
oldValue.push(value);
|
|
176
|
-
} else {
|
|
177
|
-
request.headers[key] = value;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
if (requestBuffer.length) {
|
|
182
|
-
request.body = requestBuffer;
|
|
183
|
-
}
|
|
184
|
-
if (!request.method) {
|
|
185
|
-
throw new Error("Client request is incomplete");
|
|
186
|
-
}
|
|
187
|
-
return request;
|
|
188
|
-
function getLine() {
|
|
189
|
-
const idx = findIndexInUint8Array(requestBuffer, HTTP_HEADER_LINE_END);
|
|
190
|
-
if (idx === -1) {
|
|
191
|
-
return void 0;
|
|
192
|
-
}
|
|
193
|
-
const line = uint8ArrayToStr(requestBuffer.slice(0, idx));
|
|
194
|
-
requestBuffer = requestBuffer.slice(idx + HTTP_HEADER_LINE_END.length);
|
|
195
|
-
return line;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
export {
|
|
199
|
-
getHttpRequestDataFromTranscript,
|
|
200
|
-
makeHttpResponseParser
|
|
201
|
-
};
|
package/lib/utils/index.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export * from "./generics.js";
|
|
2
|
-
export * from "./logger.js";
|
|
3
|
-
export * from "./redactions.js";
|
|
4
|
-
export * from "./http-parser.js";
|
|
5
|
-
export * from "./zk.js";
|
|
6
|
-
export * from "./claims.js";
|
|
7
|
-
export * from "./error.js";
|
|
8
|
-
export * from "./prepare-packets.js";
|
|
9
|
-
export * from "./signatures/index.js";
|
|
10
|
-
export * from "./auth.js";
|
|
11
|
-
export * from "./b64-json.js";
|
|
12
|
-
export * from "./bgp-listener.js";
|
|
13
|
-
export * from "./tls.js";
|
package/lib/utils/logger.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { pino, stdTimeFunctions } from "pino";
|
|
2
|
-
import { getEnvVariable } from "#src/utils/env.js";
|
|
3
|
-
const PII_PROPERTIES = ["ownerPrivateKey", "secretParams"];
|
|
4
|
-
const redactedText = "[REDACTED]";
|
|
5
|
-
const envLevel = getEnvVariable("LOG_LEVEL");
|
|
6
|
-
let logger = pino();
|
|
7
|
-
makeLogger(false, envLevel);
|
|
8
|
-
function makeLogger(redactPii, level, onLog) {
|
|
9
|
-
const opts = {
|
|
10
|
-
// Log human readable time stamps instead of epoch time
|
|
11
|
-
timestamp: stdTimeFunctions.isoTime
|
|
12
|
-
};
|
|
13
|
-
if (redactPii) {
|
|
14
|
-
opts.formatters = { log: redact };
|
|
15
|
-
opts.serializers = { redact };
|
|
16
|
-
opts.browser = {
|
|
17
|
-
write: {
|
|
18
|
-
fatal: (log) => writeLog("fatal", log),
|
|
19
|
-
error: (log) => writeLog("error", log),
|
|
20
|
-
warn: (log) => writeLog("warn", log),
|
|
21
|
-
info: (log) => writeLog("info", log),
|
|
22
|
-
debug: (log) => writeLog("debug", log),
|
|
23
|
-
trace: (log) => writeLog("trace", log)
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
const pLogger = pino(opts);
|
|
28
|
-
pLogger.level = level || "info";
|
|
29
|
-
logger = pLogger;
|
|
30
|
-
return pLogger;
|
|
31
|
-
function writeLog(level2, log) {
|
|
32
|
-
log = redact(log);
|
|
33
|
-
const { msg, ...obj } = log;
|
|
34
|
-
if (console[level2]) {
|
|
35
|
-
console[level2](obj, msg);
|
|
36
|
-
} else {
|
|
37
|
-
console.log(obj, msg);
|
|
38
|
-
}
|
|
39
|
-
onLog?.(level2, log);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
function isObjectProperty(property) {
|
|
43
|
-
return typeof property === "object" && !Array.isArray(property) && property !== null;
|
|
44
|
-
}
|
|
45
|
-
function getReplacer() {
|
|
46
|
-
const references = /* @__PURE__ */ new WeakSet();
|
|
47
|
-
return function(key, value) {
|
|
48
|
-
const isObject = typeof value === "object" && value !== null;
|
|
49
|
-
if (isObject) {
|
|
50
|
-
if (references.has(value)) {
|
|
51
|
-
return "[CIRCULAR]";
|
|
52
|
-
}
|
|
53
|
-
references.add(value);
|
|
54
|
-
}
|
|
55
|
-
return value;
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
function redact(json) {
|
|
59
|
-
const isObject = isObjectProperty(json);
|
|
60
|
-
if (!isObject && !Array.isArray(json)) {
|
|
61
|
-
return json;
|
|
62
|
-
}
|
|
63
|
-
const redacted = JSON.parse(JSON.stringify(json, getReplacer()));
|
|
64
|
-
for (const prop in redacted) {
|
|
65
|
-
if (PII_PROPERTIES.includes(prop)) {
|
|
66
|
-
redacted[prop] = redactedText;
|
|
67
|
-
}
|
|
68
|
-
if (Array.isArray(redacted[prop])) {
|
|
69
|
-
for (const [index, value] of redacted[prop].entries()) {
|
|
70
|
-
redacted[prop][index] = redact(value);
|
|
71
|
-
}
|
|
72
|
-
} else if (isObjectProperty(redacted[prop])) {
|
|
73
|
-
redacted[prop] = redact(redacted[prop]);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return redacted;
|
|
77
|
-
}
|
|
78
|
-
export {
|
|
79
|
-
logger,
|
|
80
|
-
makeLogger,
|
|
81
|
-
redact
|
|
82
|
-
};
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { concatenateUint8Arrays, crypto } from "@reclaimprotocol/tls";
|
|
2
|
-
import {
|
|
3
|
-
TranscriptMessageSenderType
|
|
4
|
-
} from "#src/proto/api.js";
|
|
5
|
-
import { makeZkProofGenerator } from "#src/utils/zk.js";
|
|
6
|
-
async function preparePacketsForReveal(tlsTranscript, reveals, { onZkProgress, ...opts }) {
|
|
7
|
-
const transcript = [];
|
|
8
|
-
const proofGenerator = await makeZkProofGenerator(opts);
|
|
9
|
-
let zkPacketsDone = 0;
|
|
10
|
-
await Promise.all(tlsTranscript.map(async ({ message, sender }, i) => {
|
|
11
|
-
const msg = {
|
|
12
|
-
sender: sender === "client" ? TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_CLIENT : TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_SERVER,
|
|
13
|
-
message: message.data,
|
|
14
|
-
reveal: void 0
|
|
15
|
-
};
|
|
16
|
-
transcript.push(msg);
|
|
17
|
-
const reveal = reveals.get(message);
|
|
18
|
-
if (!reveal || message.type === "plaintext") {
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
switch (reveal?.type) {
|
|
22
|
-
case "complete":
|
|
23
|
-
msg.reveal = {
|
|
24
|
-
directReveal: {
|
|
25
|
-
key: await crypto.exportKey(message.encKey),
|
|
26
|
-
iv: message.fixedIv,
|
|
27
|
-
recordNumber: message.recordNumber
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
break;
|
|
31
|
-
case "zk": {
|
|
32
|
-
reveal.redactedPlaintext = concatenateUint8Arrays([
|
|
33
|
-
reveal.redactedPlaintext,
|
|
34
|
-
message.plaintext.slice(reveal.redactedPlaintext.length)
|
|
35
|
-
]);
|
|
36
|
-
const oprfRawMarkers = reveal.oprfRawMarkers?.map((m) => ({
|
|
37
|
-
dataLocation: m.dataLocation
|
|
38
|
-
})) || [];
|
|
39
|
-
const overshotOprfRawLength = reveal.overshotOprfRawFromPrevBlock?.length ?? 0;
|
|
40
|
-
await proofGenerator.addPacketToProve(
|
|
41
|
-
message,
|
|
42
|
-
reveal,
|
|
43
|
-
(proofs, toprfs) => msg.reveal = {
|
|
44
|
-
zkReveal: { proofs, toprfs, oprfRawMarkers, overshotOprfRawLength }
|
|
45
|
-
},
|
|
46
|
-
() => {
|
|
47
|
-
const next = tlsTranscript.slice(i + 1).find((t) => t.sender === sender);
|
|
48
|
-
return next?.message;
|
|
49
|
-
}
|
|
50
|
-
);
|
|
51
|
-
break;
|
|
52
|
-
}
|
|
53
|
-
default:
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
}));
|
|
57
|
-
const zkPacketsTotal = proofGenerator.getTotalChunksToProve();
|
|
58
|
-
onZkProgress?.(zkPacketsDone, zkPacketsTotal);
|
|
59
|
-
await proofGenerator.generateProofs(
|
|
60
|
-
() => {
|
|
61
|
-
zkPacketsDone += 1;
|
|
62
|
-
onZkProgress?.(zkPacketsDone, zkPacketsTotal);
|
|
63
|
-
}
|
|
64
|
-
);
|
|
65
|
-
return transcript;
|
|
66
|
-
}
|
|
67
|
-
export {
|
|
68
|
-
preparePacketsForReveal
|
|
69
|
-
};
|