@reclaimprotocol/attestor-core 3.0.1
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 +39 -0
- package/lib/avs/abis/avsDirectoryABI.d.ts +60 -0
- package/lib/avs/abis/avsDirectoryABI.js +344 -0
- package/lib/avs/abis/delegationABI.d.ts +126 -0
- package/lib/avs/abis/delegationABI.js +5 -0
- package/lib/avs/abis/registryABI.d.ts +136 -0
- package/lib/avs/abis/registryABI.js +729 -0
- package/lib/avs/client/create-claim-on-avs.d.ts +10 -0
- package/lib/avs/client/create-claim-on-avs.js +147 -0
- package/lib/avs/config.d.ts +7 -0
- package/lib/avs/config.js +24 -0
- package/lib/avs/contracts/ReclaimServiceManager.d.ts +697 -0
- package/lib/avs/contracts/ReclaimServiceManager.js +3 -0
- package/lib/avs/contracts/common.d.ts +21 -0
- package/lib/avs/contracts/common.js +3 -0
- package/lib/avs/contracts/factories/ReclaimServiceManager__factory.d.ts +888 -0
- package/lib/avs/contracts/factories/ReclaimServiceManager__factory.js +1174 -0
- package/lib/avs/contracts/factories/index.d.ts +1 -0
- package/lib/avs/contracts/factories/index.js +9 -0
- package/lib/avs/contracts/index.d.ts +3 -0
- package/lib/avs/contracts/index.js +30 -0
- package/lib/avs/tests/test.operator.d.ts +11 -0
- package/lib/avs/tests/test.operator.js +313 -0
- package/lib/avs/tests/utils.d.ts +2 -0
- package/lib/avs/tests/utils.js +50 -0
- package/lib/avs/types/index.d.ts +55 -0
- package/lib/avs/types/index.js +3 -0
- package/lib/avs/utils/contracts.d.ts +21 -0
- package/lib/avs/utils/contracts.js +38 -0
- package/lib/avs/utils/register.d.ts +27 -0
- package/lib/avs/utils/register.js +76 -0
- package/lib/avs/utils/tasks.d.ts +22 -0
- package/lib/avs/utils/tasks.js +45 -0
- package/lib/client/create-claim.d.ts +5 -0
- package/lib/client/create-claim.js +357 -0
- package/lib/client/index.d.ts +3 -0
- package/lib/client/index.js +20 -0
- package/lib/client/tunnels/make-rpc-tcp-tunnel.d.ts +16 -0
- package/lib/client/tunnels/make-rpc-tcp-tunnel.js +60 -0
- package/lib/client/tunnels/make-rpc-tls-tunnel.d.ts +25 -0
- package/lib/client/tunnels/make-rpc-tls-tunnel.js +135 -0
- package/lib/client/utils/attestor-pool.d.ts +6 -0
- package/lib/client/utils/attestor-pool.js +28 -0
- package/lib/client/utils/client-socket.d.ts +9 -0
- package/lib/client/utils/client-socket.js +77 -0
- package/lib/client/utils/message-handler.d.ts +4 -0
- package/lib/client/utils/message-handler.js +93 -0
- package/lib/config/index.d.ts +23 -0
- package/lib/config/index.js +35 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.js +39 -0
- package/lib/proto/api.d.ts +414 -0
- package/lib/proto/api.js +2756 -0
- package/lib/providers/http/index.d.ts +3 -0
- package/lib/providers/http/index.js +472 -0
- package/lib/providers/http/utils.d.ts +44 -0
- package/lib/providers/http/utils.js +302 -0
- package/lib/providers/index.d.ts +4 -0
- package/lib/providers/index.js +11 -0
- package/lib/scripts/check-avs-registration.d.ts +1 -0
- package/lib/scripts/check-avs-registration.js +28 -0
- package/lib/scripts/generate-provider-types.d.ts +5 -0
- package/lib/scripts/generate-provider-types.js +82 -0
- package/lib/scripts/generate-receipt.d.ts +9 -0
- package/lib/scripts/generate-receipt.js +93 -0
- package/lib/scripts/register-avs-operator.d.ts +1 -0
- package/lib/scripts/register-avs-operator.js +6 -0
- package/lib/scripts/start-server.d.ts +1 -0
- package/lib/scripts/start-server.js +6 -0
- package/lib/scripts/verify-root-ca.d.ts +1 -0
- package/lib/scripts/verify-root-ca.js +51 -0
- package/lib/server/create-server.d.ts +7 -0
- package/lib/server/create-server.js +85 -0
- package/lib/server/handlers/claimTunnel.d.ts +2 -0
- package/lib/server/handlers/claimTunnel.js +55 -0
- package/lib/server/handlers/completeClaimOnChain.d.ts +2 -0
- package/lib/server/handlers/completeClaimOnChain.js +28 -0
- package/lib/server/handlers/createClaimOnChain.d.ts +2 -0
- package/lib/server/handlers/createClaimOnChain.js +31 -0
- package/lib/server/handlers/createTunnel.d.ts +2 -0
- package/lib/server/handlers/createTunnel.js +65 -0
- package/lib/server/handlers/disconnectTunnel.d.ts +2 -0
- package/lib/server/handlers/disconnectTunnel.js +10 -0
- package/lib/server/handlers/index.d.ts +4 -0
- package/lib/server/handlers/index.js +18 -0
- package/lib/server/handlers/init.d.ts +2 -0
- package/lib/server/handlers/init.js +21 -0
- package/lib/server/index.d.ts +4 -0
- package/lib/server/index.js +21 -0
- package/lib/server/socket.d.ts +11 -0
- package/lib/server/socket.js +95 -0
- package/lib/server/tunnels/make-tcp-tunnel.d.ts +20 -0
- package/lib/server/tunnels/make-tcp-tunnel.js +182 -0
- package/lib/server/utils/apm.d.ts +11 -0
- package/lib/server/utils/apm.js +39 -0
- package/lib/server/utils/assert-valid-claim-request.d.ts +29 -0
- package/lib/server/utils/assert-valid-claim-request.js +189 -0
- package/lib/server/utils/config-env.d.ts +1 -0
- package/lib/server/utils/config-env.js +7 -0
- package/lib/server/utils/generics.d.ts +22 -0
- package/lib/server/utils/generics.js +59 -0
- package/lib/server/utils/iso.d.ts +1 -0
- package/lib/server/utils/iso.js +260 -0
- package/lib/server/utils/keep-alive.d.ts +7 -0
- package/lib/server/utils/keep-alive.js +42 -0
- package/lib/server/utils/process-handshake.d.ts +13 -0
- package/lib/server/utils/process-handshake.js +179 -0
- package/lib/server/utils/verify-server-certificates.d.ts +7 -0
- package/lib/server/utils/verify-server-certificates.js +102 -0
- package/lib/tests/describe-with-server.d.ts +21 -0
- package/lib/tests/describe-with-server.js +67 -0
- package/lib/tests/mock-provider-server.d.ts +13 -0
- package/lib/tests/mock-provider-server.js +65 -0
- package/lib/tests/mocks.d.ts +4 -0
- package/lib/tests/mocks.js +23 -0
- package/lib/tests/test.claim-creation.d.ts +1 -0
- package/lib/tests/test.claim-creation.js +187 -0
- package/lib/tests/test.http-parser.d.ts +1 -0
- package/lib/tests/test.http-parser.js +118 -0
- package/lib/tests/test.http-provider-utils.d.ts +1 -0
- package/lib/tests/test.http-provider-utils.js +1932 -0
- package/lib/tests/test.http-provider.d.ts +1 -0
- package/lib/tests/test.http-provider.js +43 -0
- package/lib/tests/test.rpc-communication.d.ts +1 -0
- package/lib/tests/test.rpc-communication.js +64 -0
- package/lib/tests/test.rpc-tunnel.d.ts +1 -0
- package/lib/tests/test.rpc-tunnel.js +168 -0
- package/lib/tests/test.signatures.d.ts +1 -0
- package/lib/tests/test.signatures.js +24 -0
- package/lib/tests/test.tcp-tunnel.d.ts +1 -0
- package/lib/tests/test.tcp-tunnel.js +64 -0
- package/lib/tests/test.zk.d.ts +1 -0
- package/lib/tests/test.zk.js +169 -0
- package/lib/tests/utils.d.ts +12 -0
- package/lib/tests/utils.js +49 -0
- package/lib/types/claims.d.ts +64 -0
- package/lib/types/claims.js +3 -0
- package/lib/types/client.d.ts +136 -0
- package/lib/types/client.js +3 -0
- package/lib/types/general.d.ts +39 -0
- package/lib/types/general.js +3 -0
- package/lib/types/handlers.d.ts +10 -0
- package/lib/types/handlers.js +3 -0
- package/lib/types/index.d.ts +9 -0
- package/lib/types/index.js +26 -0
- package/lib/types/providers.d.ts +135 -0
- package/lib/types/providers.gen.d.ts +414 -0
- package/lib/types/providers.gen.js +14 -0
- package/lib/types/providers.js +3 -0
- package/lib/types/rpc.d.ts +35 -0
- package/lib/types/rpc.js +3 -0
- package/lib/types/signatures.d.ts +28 -0
- package/lib/types/signatures.js +3 -0
- package/lib/types/tunnel.d.ts +18 -0
- package/lib/types/tunnel.js +3 -0
- package/lib/types/zk.d.ts +16 -0
- package/lib/types/zk.js +3 -0
- package/lib/utils/benchmark.d.ts +1 -0
- package/lib/utils/benchmark.js +70 -0
- package/lib/utils/claims.d.ts +33 -0
- package/lib/utils/claims.js +112 -0
- package/lib/utils/env.d.ts +3 -0
- package/lib/utils/env.js +20 -0
- package/lib/utils/error.d.ts +27 -0
- package/lib/utils/error.js +43 -0
- package/lib/utils/generics.d.ts +112 -0
- package/lib/utils/generics.js +348 -0
- package/lib/utils/http-parser.d.ts +55 -0
- package/lib/utils/http-parser.js +249 -0
- package/lib/utils/index.d.ts +10 -0
- package/lib/utils/index.js +27 -0
- package/lib/utils/logger.d.ts +13 -0
- package/lib/utils/logger.js +100 -0
- package/lib/utils/prepare-packets.d.ts +16 -0
- package/lib/utils/prepare-packets.js +61 -0
- package/lib/utils/redactions.d.ts +41 -0
- package/lib/utils/redactions.js +111 -0
- package/lib/utils/retries.d.ts +12 -0
- package/lib/utils/retries.js +28 -0
- package/lib/utils/signatures/eth.d.ts +2 -0
- package/lib/utils/signatures/eth.js +33 -0
- package/lib/utils/signatures/index.d.ts +5 -0
- package/lib/utils/signatures/index.js +11 -0
- package/lib/utils/socket-base.d.ts +21 -0
- package/lib/utils/socket-base.js +89 -0
- package/lib/utils/tls.d.ts +2 -0
- package/lib/utils/tls.js +32 -0
- package/lib/utils/validation.d.ts +2 -0
- package/lib/utils/validation.js +46 -0
- package/lib/utils/ws.d.ts +12 -0
- package/lib/utils/ws.js +21 -0
- package/lib/utils/zk.d.ts +50 -0
- package/lib/utils/zk.js +282 -0
- package/lib/window-rpc/index.d.ts +3 -0
- package/lib/window-rpc/index.js +20 -0
- package/lib/window-rpc/setup-window-rpc.d.ts +5 -0
- package/lib/window-rpc/setup-window-rpc.js +239 -0
- package/lib/window-rpc/types.d.ts +184 -0
- package/lib/window-rpc/types.js +3 -0
- package/lib/window-rpc/utils.d.ts +13 -0
- package/lib/window-rpc/utils.js +76 -0
- package/lib/window-rpc/window-rpc-zk.d.ts +11 -0
- package/lib/window-rpc/window-rpc-zk.js +72 -0
- package/package.json +117 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeTcpTunnel = void 0;
|
|
4
|
+
const dns_1 = require("dns");
|
|
5
|
+
const https_proxy_agent_1 = require("https-proxy-agent");
|
|
6
|
+
const net_1 = require("net");
|
|
7
|
+
const config_1 = require("src/config");
|
|
8
|
+
const iso_1 = require("src/server/utils/iso");
|
|
9
|
+
const utils_1 = require("src/utils");
|
|
10
|
+
const env_1 = require("src/utils/env");
|
|
11
|
+
const HTTPS_PROXY_URL = (0, env_1.getEnvVariable)('HTTPS_PROXY_URL');
|
|
12
|
+
/**
|
|
13
|
+
* Builds a TCP tunnel to the given host and port.
|
|
14
|
+
* If a geolocation is provided -- an HTTPS proxy is used
|
|
15
|
+
* to connect to the host.
|
|
16
|
+
*
|
|
17
|
+
* HTTPS proxy essentially creates an opaque tunnel to the
|
|
18
|
+
* host using the CONNECT method. Any data can be sent through
|
|
19
|
+
* this tunnel to the end host.
|
|
20
|
+
* https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/CONNECT
|
|
21
|
+
*
|
|
22
|
+
* The tunnel also retains a transcript of all messages sent and received.
|
|
23
|
+
*/
|
|
24
|
+
const makeTcpTunnel = async ({ onClose, onMessage, logger, ...opts }) => {
|
|
25
|
+
const transcript = [];
|
|
26
|
+
const socket = await connectTcp({ ...opts, logger });
|
|
27
|
+
socket.once('error', close);
|
|
28
|
+
socket.once('end', () => close(undefined));
|
|
29
|
+
socket.on('data', message => {
|
|
30
|
+
onMessage === null || onMessage === void 0 ? void 0 : onMessage(message);
|
|
31
|
+
transcript.push({ sender: 'server', message });
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
transcript,
|
|
35
|
+
createRequest: opts,
|
|
36
|
+
async write(data) {
|
|
37
|
+
transcript.push({ sender: 'client', message: data });
|
|
38
|
+
await new Promise((resolve, reject) => {
|
|
39
|
+
socket.write(data, err => {
|
|
40
|
+
if (err) {
|
|
41
|
+
reject(err);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
resolve();
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
close,
|
|
50
|
+
};
|
|
51
|
+
function close(error) {
|
|
52
|
+
if (socket.readableEnded) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
logger.debug({ err: error }, 'closing socket');
|
|
56
|
+
socket.end(() => {
|
|
57
|
+
// Do nothing
|
|
58
|
+
});
|
|
59
|
+
onClose === null || onClose === void 0 ? void 0 : onClose(error);
|
|
60
|
+
onClose = undefined;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
exports.makeTcpTunnel = makeTcpTunnel;
|
|
64
|
+
setDnsServers();
|
|
65
|
+
async function connectTcp({ host, port, geoLocation, logger }) {
|
|
66
|
+
let connectTimeout;
|
|
67
|
+
let socket;
|
|
68
|
+
try {
|
|
69
|
+
await new Promise(async (resolve, reject) => {
|
|
70
|
+
try {
|
|
71
|
+
// add a timeout to ensure the connection doesn't hang
|
|
72
|
+
// and cause our gateway to send out a 504
|
|
73
|
+
connectTimeout = setTimeout(() => reject(new utils_1.AttestorError('ERROR_NETWORK_ERROR', 'Server connection timed out')), config_1.CONNECTION_TIMEOUT_MS);
|
|
74
|
+
socket = await getSocket({
|
|
75
|
+
host,
|
|
76
|
+
port,
|
|
77
|
+
geoLocation,
|
|
78
|
+
logger
|
|
79
|
+
});
|
|
80
|
+
socket.once('connect', resolve);
|
|
81
|
+
socket.once('error', reject);
|
|
82
|
+
socket.once('end', () => (reject(new utils_1.AttestorError('ERROR_NETWORK_ERROR', 'connection closed'))));
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
reject(err);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
logger.debug({ addr: `${host}:${port}` }, 'connected');
|
|
89
|
+
return socket;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
socket === null || socket === void 0 ? void 0 : socket.end();
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
clearTimeout(connectTimeout);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function getSocket(opts) {
|
|
100
|
+
var _a;
|
|
101
|
+
const { logger } = opts;
|
|
102
|
+
try {
|
|
103
|
+
return await _getSocket(opts);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
// see if the proxy is blocking the connection
|
|
107
|
+
// due to their own arbitrary rules,
|
|
108
|
+
// if so -- we resolve hostname first &
|
|
109
|
+
// connect directly via address to
|
|
110
|
+
// avoid proxy knowing which host we're connecting to
|
|
111
|
+
if (!(err instanceof utils_1.AttestorError)
|
|
112
|
+
|| ((_a = err.data) === null || _a === void 0 ? void 0 : _a.code) !== 403) {
|
|
113
|
+
throw err;
|
|
114
|
+
}
|
|
115
|
+
const addrs = await resolveHostnames(opts.host);
|
|
116
|
+
logger.info({ addrs, host: opts.host }, 'failed to connect due to restricted IP, trying via raw addr');
|
|
117
|
+
for (const addr of addrs) {
|
|
118
|
+
try {
|
|
119
|
+
return await _getSocket({ ...opts, host: addr });
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
logger.error({ addr, err }, 'failed to connect to host');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
throw err;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function _getSocket({ host, port, geoLocation, logger }) {
|
|
129
|
+
const socket = new net_1.Socket();
|
|
130
|
+
if (geoLocation && !HTTPS_PROXY_URL) {
|
|
131
|
+
logger.warn({ geoLocation }, 'geoLocation provided but no proxy URL found');
|
|
132
|
+
geoLocation = '';
|
|
133
|
+
}
|
|
134
|
+
if (!geoLocation) {
|
|
135
|
+
socket.connect({ host, port, });
|
|
136
|
+
return socket;
|
|
137
|
+
}
|
|
138
|
+
if (!(0, iso_1.isValidCountryCode)(geoLocation)) {
|
|
139
|
+
throw utils_1.AttestorError.badRequest(`Geolocation "${geoLocation}" is invalid. Must be 2 letter ISO country code`, { geoLocation });
|
|
140
|
+
}
|
|
141
|
+
const agentUrl = HTTPS_PROXY_URL.replace('{{geoLocation}}', (geoLocation === null || geoLocation === void 0 ? void 0 : geoLocation.toLowerCase()) || '');
|
|
142
|
+
const agent = new https_proxy_agent_1.HttpsProxyAgent(agentUrl);
|
|
143
|
+
const waitForProxyRes = new Promise(resolve => {
|
|
144
|
+
// @ts-ignore
|
|
145
|
+
socket.once('proxyConnect', resolve);
|
|
146
|
+
});
|
|
147
|
+
const proxySocket = await agent.connect(
|
|
148
|
+
// ignore, because https-proxy-agent
|
|
149
|
+
// expects an http request object
|
|
150
|
+
// @ts-ignore
|
|
151
|
+
socket, { host, port, timeout: config_1.CONNECTION_TIMEOUT_MS });
|
|
152
|
+
const res = await waitForProxyRes;
|
|
153
|
+
if (res.statusCode !== 200) {
|
|
154
|
+
logger.error({ geoLocation, res }, 'Proxy geo location failed');
|
|
155
|
+
throw new utils_1.AttestorError('ERROR_PROXY_ERROR', `Proxy via geo location "${geoLocation}" failed with status code: ${res.statusCode}, message: ${res.statusText}`, {
|
|
156
|
+
code: res.statusCode,
|
|
157
|
+
message: res.statusText,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
process.nextTick(() => {
|
|
161
|
+
// ensure connect event is emitted
|
|
162
|
+
// so it can be captured by the caller
|
|
163
|
+
proxySocket.emit('connect');
|
|
164
|
+
});
|
|
165
|
+
return proxySocket;
|
|
166
|
+
}
|
|
167
|
+
async function resolveHostnames(hostname) {
|
|
168
|
+
return new Promise((_resolve, reject) => {
|
|
169
|
+
(0, dns_1.resolve)(hostname, (err, addresses) => {
|
|
170
|
+
if (err) {
|
|
171
|
+
reject(new Error(`Could not resolve hostname: ${hostname}, ${err.message}`));
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
_resolve(addresses);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function setDnsServers() {
|
|
180
|
+
(0, dns_1.setServers)(config_1.DNS_SERVERS);
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZS10Y3AtdHVubmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci90dW5uZWxzL21ha2UtdGNwLXR1bm5lbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBeUM7QUFDekMseURBQW1EO0FBRW5ELDZCQUE0QjtBQUM1Qix1Q0FBK0Q7QUFFL0QsOENBQXlEO0FBR3pELHFDQUF5QztBQUN6Qyx1Q0FBOEM7QUFFOUMsTUFBTSxlQUFlLEdBQUcsSUFBQSxvQkFBYyxFQUFDLGlCQUFpQixDQUFDLENBQUE7QUFLekQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSSxNQUFNLGFBQWEsR0FBaUQsS0FBSyxFQUFDLEVBQ2hGLE9BQU8sRUFDUCxTQUFTLEVBQ1QsTUFBTSxFQUNOLEdBQUcsSUFBSSxFQUNQLEVBQUUsRUFBRTtJQUNKLE1BQU0sVUFBVSxHQUFzQyxFQUFFLENBQUE7SUFDeEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBRXBELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQzFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1FBQzNCLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRyxPQUFPLENBQUMsQ0FBQTtRQUNwQixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLENBQUMsQ0FBQyxDQUFBO0lBRUYsT0FBTztRQUNOLFVBQVU7UUFDVixhQUFhLEVBQUUsSUFBSTtRQUNuQixLQUFLLENBQUMsS0FBSyxDQUFD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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Agent } from 'elastic-apm-node';
|
|
2
|
+
/**
|
|
3
|
+
* Initialises the APM agent if required,
|
|
4
|
+
* and returns it.
|
|
5
|
+
* If ELASTIC_APM_SERVER_URL & ELASTIC_APM_SECRET_TOKEN
|
|
6
|
+
* are not set will return undefined
|
|
7
|
+
*
|
|
8
|
+
* Utilises the standard env variables mentioned
|
|
9
|
+
* here: https://www.elastic.co/guide/en/apm/agent/nodejs/current/custom-stack.html#custom-stack-advanced-configuration
|
|
10
|
+
*/
|
|
11
|
+
export declare function getApm(): Agent | undefined;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getApm = getApm;
|
|
7
|
+
const elastic_apm_node_1 = __importDefault(require("elastic-apm-node"));
|
|
8
|
+
const env_1 = require("src/utils/env");
|
|
9
|
+
const logger_1 = require("src/utils/logger");
|
|
10
|
+
let apm;
|
|
11
|
+
/**
|
|
12
|
+
* Initialises the APM agent if required,
|
|
13
|
+
* and returns it.
|
|
14
|
+
* If ELASTIC_APM_SERVER_URL & ELASTIC_APM_SECRET_TOKEN
|
|
15
|
+
* are not set will return undefined
|
|
16
|
+
*
|
|
17
|
+
* Utilises the standard env variables mentioned
|
|
18
|
+
* here: https://www.elastic.co/guide/en/apm/agent/nodejs/current/custom-stack.html#custom-stack-advanced-configuration
|
|
19
|
+
*/
|
|
20
|
+
function getApm() {
|
|
21
|
+
if (!(0, env_1.getEnvVariable)('ELASTIC_APM_SERVER_URL') || !(0, env_1.getEnvVariable)('ELASTIC_APM_SECRET_TOKEN')) {
|
|
22
|
+
logger_1.logger.info('ELASTIC_APM_SERVER_URL or ELASTIC_APM_SECRET_TOKEN no found in env APM agent not initialised');
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
if (!apm) {
|
|
26
|
+
const sampleRate = +((0, env_1.getEnvVariable)('ELASTIC_APM_SAMPLE_RATE')
|
|
27
|
+
|| '0.1');
|
|
28
|
+
apm = elastic_apm_node_1.default.start({
|
|
29
|
+
serviceName: 'reclaim_attestor',
|
|
30
|
+
serviceVersion: '2.0.0',
|
|
31
|
+
transactionSampleRate: sampleRate,
|
|
32
|
+
instrumentIncomingHTTPRequests: false,
|
|
33
|
+
instrument: true,
|
|
34
|
+
});
|
|
35
|
+
logger_1.logger.info('initialised APM agent');
|
|
36
|
+
}
|
|
37
|
+
return apm;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci91dGlscy9hcG0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFlQSx3QkFzQkM7QUFyQ0Qsd0VBQW9EO0FBQ3BELHVDQUE4QztBQUM5Qyw2Q0FBeUM7QUFFekMsSUFBSSxHQUFzQixDQUFBO0FBRTFCOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsTUFBTTtJQUNyQixJQUFHLENBQUMsSUFBQSxvQkFBYyxFQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFBLG9CQUFjLEVBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDO1FBQzdGLGVBQU0sQ0FBQyxJQUFJLENBQUMsOEZBQThGLENBQUMsQ0FBQTtRQUMzRyxPQUFPLFNBQVMsQ0FBQTtJQUNqQixDQUFDO0lBRUQsSUFBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUNuQixJQUFBLG9CQUFjLEVBQUMseUJBQXlCLENBQUM7ZUFDdEMsS0FBSyxDQUNSLENBQUE7UUFDRCxHQUFHLEdBQUcsMEJBQVUsQ0FBQyxLQUFLLENBQUM7WUFDdEIsV0FBVyxFQUFFLGtCQUFrQjtZQUMvQixjQUFjLEVBQUUsT0FBTztZQUN2QixxQkFBcUIsRUFBRSxVQUFVO1lBQ2pDLDhCQUE4QixFQUFFLEtBQUs7WUFDckMsVUFBVSxFQUFFLElBQUk7U0FDaEIsQ0FBQyxDQUFBO1FBQ0YsZUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQTtBQUNYLENBQUMifQ==
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ClaimTunnelRequest, InitRequest, ProviderClaimInfo } from 'src/proto/api';
|
|
2
|
+
import { IDecryptedTranscript, Logger, TCPSocketProperties, Transcript, ZKEngine } from 'src/types';
|
|
3
|
+
/**
|
|
4
|
+
* Asserts that the claim request is valid.
|
|
5
|
+
*
|
|
6
|
+
* 1. We begin by verifying the signature of the claim request.
|
|
7
|
+
* 2. Next, we produce the transcript of the TLS exchange
|
|
8
|
+
* from the proofs provided by the client.
|
|
9
|
+
* 3. We then pull the provider the client is trying to claim
|
|
10
|
+
* from
|
|
11
|
+
* 4. We then use the provider's verification function to verify
|
|
12
|
+
* whether the claim is valid.
|
|
13
|
+
*
|
|
14
|
+
* If any of these steps fail, we throw an error.
|
|
15
|
+
*/
|
|
16
|
+
export declare function assertValidClaimRequest(request: ClaimTunnelRequest, metadata: InitRequest, logger: Logger): Promise<import("src/proto/api").ClaimRequestData>;
|
|
17
|
+
/**
|
|
18
|
+
* Verify that the transcript contains a valid claim
|
|
19
|
+
* for the provider.
|
|
20
|
+
*/
|
|
21
|
+
export declare function assertValidProviderTranscript<T extends ProviderClaimInfo>(applData: Transcript<Uint8Array>, info: T): Promise<T>;
|
|
22
|
+
/**
|
|
23
|
+
* Verify that the transcript provided by the client
|
|
24
|
+
* matches the transcript of the tunnel, the server
|
|
25
|
+
* has created.
|
|
26
|
+
*/
|
|
27
|
+
export declare function assertTranscriptsMatch(clientTranscript: ClaimTunnelRequest['transcript'], tunnelTranscript: TCPSocketProperties['transcript']): void;
|
|
28
|
+
export declare function decryptTranscript(transcript: ClaimTunnelRequest['transcript'], logger: Logger, zkEngine: ZKEngine, serverIV: Uint8Array, clientIV: Uint8Array): Promise<IDecryptedTranscript>;
|
|
29
|
+
export declare function getWithoutHeader(message: Uint8Array): Uint8Array;
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assertValidClaimRequest = assertValidClaimRequest;
|
|
4
|
+
exports.assertValidProviderTranscript = assertValidProviderTranscript;
|
|
5
|
+
exports.assertTranscriptsMatch = assertTranscriptsMatch;
|
|
6
|
+
exports.decryptTranscript = decryptTranscript;
|
|
7
|
+
exports.getWithoutHeader = getWithoutHeader;
|
|
8
|
+
const tls_1 = require("@reclaimprotocol/tls");
|
|
9
|
+
const api_1 = require("src/proto/api");
|
|
10
|
+
const providers_1 = require("src/providers");
|
|
11
|
+
const generics_1 = require("src/server/utils/generics");
|
|
12
|
+
const process_handshake_1 = require("src/server/utils/process-handshake");
|
|
13
|
+
const utils_1 = require("src/utils");
|
|
14
|
+
const signatures_1 = require("src/utils/signatures");
|
|
15
|
+
/**
|
|
16
|
+
* Asserts that the claim request is valid.
|
|
17
|
+
*
|
|
18
|
+
* 1. We begin by verifying the signature of the claim request.
|
|
19
|
+
* 2. Next, we produce the transcript of the TLS exchange
|
|
20
|
+
* from the proofs provided by the client.
|
|
21
|
+
* 3. We then pull the provider the client is trying to claim
|
|
22
|
+
* from
|
|
23
|
+
* 4. We then use the provider's verification function to verify
|
|
24
|
+
* whether the claim is valid.
|
|
25
|
+
*
|
|
26
|
+
* If any of these steps fail, we throw an error.
|
|
27
|
+
*/
|
|
28
|
+
async function assertValidClaimRequest(request, metadata, logger) {
|
|
29
|
+
var _a;
|
|
30
|
+
const { data, signatures: { requestSignature } = {}, zkEngine, fixedServerIV, fixedClientIV } = request;
|
|
31
|
+
if (!data) {
|
|
32
|
+
throw new utils_1.AttestorError('ERROR_INVALID_CLAIM', 'No info provided on claim request');
|
|
33
|
+
}
|
|
34
|
+
if (!(requestSignature === null || requestSignature === void 0 ? void 0 : requestSignature.length)) {
|
|
35
|
+
throw new utils_1.AttestorError('ERROR_INVALID_CLAIM', 'No signature provided on claim request');
|
|
36
|
+
}
|
|
37
|
+
// verify request signature
|
|
38
|
+
const serialisedReq = api_1.ClaimTunnelRequest
|
|
39
|
+
.encode({ ...request, signatures: undefined })
|
|
40
|
+
.finish();
|
|
41
|
+
const { verify: verifySig } = signatures_1.SIGNATURES[metadata.signatureType];
|
|
42
|
+
const verified = await verifySig(serialisedReq, requestSignature, data.owner);
|
|
43
|
+
if (!verified) {
|
|
44
|
+
throw new utils_1.AttestorError('ERROR_INVALID_CLAIM', 'Invalid signature on claim request');
|
|
45
|
+
}
|
|
46
|
+
const receipt = await decryptTranscript(request.transcript, logger, zkEngine === api_1.ZKProofEngine.ZK_ENGINE_GNARK ? 'gnark' : 'snarkJS', fixedServerIV, fixedClientIV);
|
|
47
|
+
const reqHost = (_a = request.request) === null || _a === void 0 ? void 0 : _a.host;
|
|
48
|
+
if (receipt.hostname !== reqHost) {
|
|
49
|
+
throw new Error(`Expected server name ${reqHost}, got ${receipt.hostname}`);
|
|
50
|
+
}
|
|
51
|
+
// get all application data messages
|
|
52
|
+
const applData = (0, utils_1.extractApplicationDataFromTranscript)(receipt);
|
|
53
|
+
const newData = await assertValidProviderTranscript(applData, data);
|
|
54
|
+
if (newData !== data) {
|
|
55
|
+
logger.info({ newData }, 'updated claim info');
|
|
56
|
+
}
|
|
57
|
+
return newData;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Verify that the transcript contains a valid claim
|
|
61
|
+
* for the provider.
|
|
62
|
+
*/
|
|
63
|
+
async function assertValidProviderTranscript(applData, info) {
|
|
64
|
+
var _a;
|
|
65
|
+
const providerName = info.provider;
|
|
66
|
+
const provider = providers_1.providers[providerName];
|
|
67
|
+
if (!provider) {
|
|
68
|
+
throw new utils_1.AttestorError('ERROR_INVALID_CLAIM', `Unsupported provider: ${providerName}`);
|
|
69
|
+
}
|
|
70
|
+
const params = (0, generics_1.niceParseJsonObject)(info.parameters, 'params');
|
|
71
|
+
const ctx = (0, generics_1.niceParseJsonObject)(info.context, 'context');
|
|
72
|
+
(0, utils_1.assertValidateProviderParams)(providerName, params);
|
|
73
|
+
const rslt = await provider.assertValidProviderReceipt(applData, params);
|
|
74
|
+
const extractedParameters = (rslt === null || rslt === void 0 ? void 0 : rslt.extractedParameters) || {};
|
|
75
|
+
if (!Object.keys(extractedParameters).length) {
|
|
76
|
+
return info;
|
|
77
|
+
}
|
|
78
|
+
const newInfo = { ...info };
|
|
79
|
+
ctx.extractedParameters = extractedParameters;
|
|
80
|
+
ctx.providerHash = (0, utils_1.hashProviderParams)(params);
|
|
81
|
+
newInfo.context = (_a = (0, utils_1.canonicalStringify)(ctx)) !== null && _a !== void 0 ? _a : '';
|
|
82
|
+
return newInfo;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Verify that the transcript provided by the client
|
|
86
|
+
* matches the transcript of the tunnel, the server
|
|
87
|
+
* has created.
|
|
88
|
+
*/
|
|
89
|
+
function assertTranscriptsMatch(clientTranscript, tunnelTranscript) {
|
|
90
|
+
const clientSends = (0, tls_1.concatenateUint8Arrays)(clientTranscript
|
|
91
|
+
.filter(m => m.sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_CLIENT)
|
|
92
|
+
.map(m => m.message));
|
|
93
|
+
const tunnelSends = (0, tls_1.concatenateUint8Arrays)(tunnelTranscript
|
|
94
|
+
.filter(m => m.sender === 'client')
|
|
95
|
+
.map(m => m.message));
|
|
96
|
+
if (!(0, tls_1.areUint8ArraysEqual)(clientSends, tunnelSends)) {
|
|
97
|
+
throw utils_1.AttestorError.badRequest('Outgoing messages from client do not match the tunnel transcript');
|
|
98
|
+
}
|
|
99
|
+
const clientRecvs = (0, tls_1.concatenateUint8Arrays)(clientTranscript
|
|
100
|
+
.filter(m => m.sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_SERVER)
|
|
101
|
+
.map(m => m.message));
|
|
102
|
+
const tunnelRecvs = (0, tls_1.concatenateUint8Arrays)(tunnelTranscript
|
|
103
|
+
.filter(m => m.sender === 'server')
|
|
104
|
+
.map(m => m.message))
|
|
105
|
+
// We only need to compare the first N messages
|
|
106
|
+
// that the client claims to have received
|
|
107
|
+
// the rest are not relevant -- so even if they're
|
|
108
|
+
// not present in the tunnel transcript, it's fine
|
|
109
|
+
.slice(0, clientRecvs.length);
|
|
110
|
+
if (!(0, tls_1.areUint8ArraysEqual)(clientRecvs, tunnelRecvs)) {
|
|
111
|
+
throw utils_1.AttestorError.badRequest('Incoming messages from server do not match the tunnel transcript');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function decryptTranscript(transcript, logger, zkEngine, serverIV, clientIV) {
|
|
115
|
+
const { tlsVersion, cipherSuite, hostname, nextMsgIndex } = await (0, process_handshake_1.processHandshake)(transcript, logger);
|
|
116
|
+
let clientRecordNumber = tlsVersion === 'TLS1_3' ? -1 : 0; // TLS 1.3 has already one record encrypted at this point
|
|
117
|
+
let serverRecordNumber = clientRecordNumber;
|
|
118
|
+
transcript = transcript.slice(nextMsgIndex);
|
|
119
|
+
const decryptedTranscript = [];
|
|
120
|
+
for (const [i, { sender, message, reveal: { zkReveal, directReveal } = {} }] of transcript.entries()) { //start with first message after last handshake message
|
|
121
|
+
await getDecryptedMessage(sender, message, directReveal, zkReveal, i);
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
transcript: decryptedTranscript,
|
|
125
|
+
hostname: hostname,
|
|
126
|
+
tlsVersion: tlsVersion,
|
|
127
|
+
};
|
|
128
|
+
async function getDecryptedMessage(sender, message, directReveal, zkReveal, i) {
|
|
129
|
+
var _a, _b;
|
|
130
|
+
try {
|
|
131
|
+
const isServer = sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_SERVER;
|
|
132
|
+
const recordHeader = message.slice(0, 5);
|
|
133
|
+
const content = getWithoutHeader(message);
|
|
134
|
+
if (isServer) {
|
|
135
|
+
serverRecordNumber++;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
clientRecordNumber++;
|
|
139
|
+
}
|
|
140
|
+
let redacted = true;
|
|
141
|
+
let plaintext = undefined;
|
|
142
|
+
let plaintextLength;
|
|
143
|
+
if ((_a = directReveal === null || directReveal === void 0 ? void 0 : directReveal.key) === null || _a === void 0 ? void 0 : _a.length) {
|
|
144
|
+
const result = await (0, utils_1.decryptDirect)(directReveal, cipherSuite, recordHeader, tlsVersion, content);
|
|
145
|
+
plaintext = result.plaintext;
|
|
146
|
+
redacted = false;
|
|
147
|
+
plaintextLength = plaintext.length;
|
|
148
|
+
}
|
|
149
|
+
else if ((_b = zkReveal === null || zkReveal === void 0 ? void 0 : zkReveal.proofs) === null || _b === void 0 ? void 0 : _b.length) {
|
|
150
|
+
const result = await (0, utils_1.verifyZkPacket)({
|
|
151
|
+
ciphertext: content,
|
|
152
|
+
zkReveal,
|
|
153
|
+
logger,
|
|
154
|
+
cipherSuite,
|
|
155
|
+
zkEngine: zkEngine,
|
|
156
|
+
iv: sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_SERVER ? serverIV : clientIV,
|
|
157
|
+
recordNumber: isServer ? serverRecordNumber : clientRecordNumber
|
|
158
|
+
});
|
|
159
|
+
plaintext = result.redactedPlaintext;
|
|
160
|
+
redacted = false;
|
|
161
|
+
plaintextLength = plaintext.length;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
plaintext = content;
|
|
165
|
+
plaintextLength = plaintext.length;
|
|
166
|
+
}
|
|
167
|
+
decryptedTranscript.push({
|
|
168
|
+
sender: sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_CLIENT
|
|
169
|
+
? 'client'
|
|
170
|
+
: 'server',
|
|
171
|
+
redacted,
|
|
172
|
+
message: plaintext,
|
|
173
|
+
recordHeader,
|
|
174
|
+
plaintextLength,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
throw new utils_1.AttestorError('ERROR_INVALID_CLAIM', `error in handling packet at idx ${i}: ${error}`, {
|
|
179
|
+
packetIdx: i,
|
|
180
|
+
error: error,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function getWithoutHeader(message) {
|
|
186
|
+
// strip the record header (xx 03 03 xx xx)
|
|
187
|
+
return message.slice(5);
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0LXZhbGlkLWNsYWltLXJlcXVlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3V0aWxzL2Fzc2VydC12YWxpZC1jbGFpbS1yZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNENBLDBEQWtFQztBQU1ELHNFQWtDQztBQU9ELHdEQTJDQztBQUVELDhDQThGQztBQUVELDRDQUdDO0FBN1NELDhDQUc2QjtBQUM3Qix1Q0FNc0I7QUFDdEIsNkNBQXlDO0FBQ3pDLHdEQUErRDtBQUMvRCwwRUFBcUU7QUFTckUscUNBTWtCO0FBQ2xCLHFEQUFpRDtBQUVqRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSSxLQUFLLFVBQVUsdUJBQXVCLENBQzVDLE9BQTJCLEVBQzNCLFFBQXFCLEVBQ3JCLE1BQWM7O0lBRWQsTUFBTSxFQUNMLElBQUksRUFDSixVQUFVLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsRUFDckMsUUFBUSxFQUNSLGFBQWEsRUFDYixhQUFhLEVBQ2IsR0FBRyxPQUFPLENBQUE7SUFDWCxJQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUkscUJBQWEsQ0FDdEIscUJBQXFCLEVBQ3JCLG1DQUFtQyxDQUNuQyxDQUFBO0lBQ0YsQ0FBQztJQUVELElBQUcsQ0FBQyxDQUFBLGdCQUFnQixhQUFoQixnQkFBZ0IsdUJBQWhCLGdCQUFnQixDQUFFLE1BQU0sQ0FBQSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLHFCQUFhLENBQ3RCLHFCQUFxQixFQUNyQix3Q0FBd0MsQ0FDeEMsQ0FBQTtJQUNGLENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsTUFBTSxhQUFhLEdBQUcsd0JBQWtCO1NBQ3RDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUM3QyxNQUFNLEVBQUUsQ0FBQTtJQUNWLE1BQU0sRUFBRSxNQUFNLEVBQUUs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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const dotenv_1 = require("dotenv");
|
|
4
|
+
const env_1 = require("src/utils/env");
|
|
5
|
+
const nodeEnv = (0, env_1.getEnvVariable)('NODE_ENV') || 'development';
|
|
6
|
+
(0, dotenv_1.config)({ path: `.env.${nodeEnv}` });
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLWVudi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvdXRpbHMvY29uZmlnLWVudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1DQUErQjtBQUMvQix1Q0FBOEM7QUFFOUMsTUFBTSxPQUFPLEdBQUcsSUFBQSxvQkFBYyxFQUFDLFVBQVUsQ0FBQyxJQUFJLGFBQWEsQ0FBQTtBQUMzRCxJQUFBLGVBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxRQUFRLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQSJ9
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { IncomingMessage } from 'http';
|
|
2
|
+
import { ServiceSignatureType } from 'src/proto/api';
|
|
3
|
+
/**
|
|
4
|
+
* Sign message using the PRIVATE_KEY env var.
|
|
5
|
+
*/
|
|
6
|
+
export declare function signAsAttestor(data: Uint8Array | string, scheme: ServiceSignatureType): Uint8Array | Promise<Uint8Array>;
|
|
7
|
+
/**
|
|
8
|
+
* Obtain the address on chain, from the PRIVATE_KEY env var.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getAttestorAddress(scheme: ServiceSignatureType): string;
|
|
11
|
+
/**
|
|
12
|
+
* Nice parse JSON with a key.
|
|
13
|
+
* If the data is empty, returns an empty object.
|
|
14
|
+
* And if the JSON is invalid, throws a bad request error,
|
|
15
|
+
* with the key in the error message.
|
|
16
|
+
*/
|
|
17
|
+
export declare function niceParseJsonObject(data: string, key: string): any;
|
|
18
|
+
/**
|
|
19
|
+
* Extract any initial messages sent via the query string,
|
|
20
|
+
* in the `messages` parameter.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getInitialMessagesFromQuery(req: IncomingMessage): import("src/proto/api").RPCMessage[];
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.signAsAttestor = signAsAttestor;
|
|
4
|
+
exports.getAttestorAddress = getAttestorAddress;
|
|
5
|
+
exports.niceParseJsonObject = niceParseJsonObject;
|
|
6
|
+
exports.getInitialMessagesFromQuery = getInitialMessagesFromQuery;
|
|
7
|
+
const tls_1 = require("@reclaimprotocol/tls");
|
|
8
|
+
const api_1 = require("src/proto/api");
|
|
9
|
+
const utils_1 = require("src/utils");
|
|
10
|
+
const env_1 = require("src/utils/env");
|
|
11
|
+
const signatures_1 = require("src/utils/signatures");
|
|
12
|
+
const PRIVATE_KEY = (0, env_1.getEnvVariable)('PRIVATE_KEY');
|
|
13
|
+
/**
|
|
14
|
+
* Sign message using the PRIVATE_KEY env var.
|
|
15
|
+
*/
|
|
16
|
+
function signAsAttestor(data, scheme) {
|
|
17
|
+
const { sign } = signatures_1.SIGNATURES[scheme];
|
|
18
|
+
return sign(typeof data === 'string' ? (0, tls_1.strToUint8Array)(data) : data, PRIVATE_KEY);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Obtain the address on chain, from the PRIVATE_KEY env var.
|
|
22
|
+
*/
|
|
23
|
+
function getAttestorAddress(scheme) {
|
|
24
|
+
const { getAddress, getPublicKey } = signatures_1.SIGNATURES[scheme];
|
|
25
|
+
const publicKey = getPublicKey(PRIVATE_KEY);
|
|
26
|
+
return getAddress(publicKey);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Nice parse JSON with a key.
|
|
30
|
+
* If the data is empty, returns an empty object.
|
|
31
|
+
* And if the JSON is invalid, throws a bad request error,
|
|
32
|
+
* with the key in the error message.
|
|
33
|
+
*/
|
|
34
|
+
function niceParseJsonObject(data, key) {
|
|
35
|
+
if (!data) {
|
|
36
|
+
return {};
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(data);
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
throw utils_1.AttestorError.badRequest(`Invalid JSON in ${key}: ${e.message}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Extract any initial messages sent via the query string,
|
|
47
|
+
* in the `messages` parameter.
|
|
48
|
+
*/
|
|
49
|
+
function getInitialMessagesFromQuery(req) {
|
|
50
|
+
const url = new URL(req.url, 'http://localhost');
|
|
51
|
+
const messagesB64 = url.searchParams.get('messages');
|
|
52
|
+
if (!(messagesB64 === null || messagesB64 === void 0 ? void 0 : messagesB64.length)) {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
const msgsBytes = Buffer.from(messagesB64, 'base64');
|
|
56
|
+
const msgs = api_1.RPCMessages.decode(msgsBytes);
|
|
57
|
+
return msgs.messages;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3V0aWxzL2dlbmVyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBWUEsd0NBU0M7QUFLRCxnREFJQztBQVFELGtEQVlDO0FBTUQsa0VBVUM7QUFsRUQsOENBQXNEO0FBRXRELHVDQUFpRTtBQUNqRSxxQ0FBeUM7QUFDekMsdUNBQThDO0FBQzlDLHFEQUFpRDtBQUVqRCxNQUFNLFdBQVcsR0FBRyxJQUFBLG9CQUFjLEVBQUMsYUFBYSxDQUFFLENBQUE7QUFFbEQ7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQzdCLElBQXlCLEVBQ3pCLE1BQTRCO0lBRTVCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ25DLE9BQU8sSUFBSSxDQUNWLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBQSxxQkFBZSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ3ZELFdBQVcsQ0FDWCxDQUFBO0FBQ0YsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsTUFBNEI7SUFDOUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsR0FBRyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMzQyxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUM3QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsR0FBVztJQUM1RCxJQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQTtJQUNWLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUFDLE9BQU0sQ0FBQyxFQUFFLENBQUM7UUFDWCxNQUFNLHFCQUFhLENBQUMsVUFBVSxDQUM3QixtQkFBbUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FDdEMsQ0FBQTtJQUNGLENBQUM7QUFDRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsMkJBQTJCLENBQUMsR0FBb0I7SUFDL0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQ2pELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3BELElBQUcsQ0FBQyxDQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxNQUFNLENBQUEsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxDQUFBO0lBQ1YsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3BELE1BQU0sSUFBSSxHQUFHLGlCQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtBQUNyQixDQUFDIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isValidCountryCode(countryCode: string): boolean;
|