@reclaimprotocol/attestor-core 4.0.0 → 4.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/lib/avs/tests/test.operator.js +4 -4
- package/lib/client/create-claim.js +19 -9
- package/lib/client/tunnels/make-rpc-tcp-tunnel.js +3 -3
- package/lib/client/tunnels/make-rpc-tls-tunnel.js +3 -3
- package/lib/client/utils/message-handler.js +2 -2
- package/lib/config/index.d.ts +5 -2
- package/lib/config/index.js +5 -4
- package/lib/proto/api.d.ts +1 -0
- package/lib/proto/api.js +7 -1
- package/lib/providers/http/index.js +43 -10
- package/lib/scripts/check-avs-registration.js +2 -2
- package/lib/scripts/generate-provider-types.js +2 -2
- package/lib/scripts/generate-toprf-keys.js +2 -2
- package/lib/scripts/register-avs-operator.js +2 -2
- package/lib/scripts/start-server.js +10 -3
- package/lib/scripts/update-avs-metadata.js +2 -2
- package/lib/scripts/verify-root-ca.js +2 -2
- package/lib/scripts/whitelist-operator.js +2 -2
- package/lib/server/handlers/claimTunnel.js +2 -2
- package/lib/server/handlers/createTunnel.js +3 -3
- package/lib/server/socket.js +4 -4
- package/lib/server/tunnels/make-tcp-tunnel.js +15 -8
- package/lib/server/utils/apm.js +8 -4
- package/lib/server/utils/assert-valid-claim-request.d.ts +2 -2
- package/lib/server/utils/assert-valid-claim-request.js +14 -11
- package/lib/tests/test.claim-creation.js +2 -2
- package/lib/tests/test.http-provider-utils.js +382 -229
- package/lib/tests/test.http-provider.js +30 -2
- package/lib/tests/test.rpc-tunnel.js +10 -6
- package/lib/tests/test.zk.d.ts +1 -1
- package/lib/tests/test.zk.js +127 -9
- package/lib/types/providers.d.ts +18 -3
- package/lib/types/providers.gen.d.ts +2 -3
- package/lib/types/providers.gen.js +2 -2
- package/lib/types/tunnel.d.ts +2 -2
- package/lib/types/zk.d.ts +0 -1
- package/lib/utils/http-parser.d.ts +4 -0
- package/lib/utils/http-parser.js +4 -2
- package/lib/utils/zk.d.ts +1 -1
- package/lib/utils/zk.js +94 -55
- package/lib/window-rpc/utils.js +2 -2
- package/package.json +4 -3
- package/lib/providers/httpb64/index.d.ts +0 -3
- package/lib/providers/httpb64/index.js +0 -209
- package/lib/providers/httpb64/utils.d.ts +0 -77
- package/lib/providers/httpb64/utils.js +0 -358
- package/lib/server/utils/verify-server-certificates.d.ts +0 -7
- package/lib/server/utils/verify-server-certificates.js +0 -101
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { ArraySlice, CompleteTLSPacket, ProviderParams, Transcript } from '../../types';
|
|
2
|
-
import { HttpRequest, HttpResponse } from '../../utils';
|
|
3
|
-
export type JSONIndex = {
|
|
4
|
-
start: number;
|
|
5
|
-
end: number;
|
|
6
|
-
};
|
|
7
|
-
type HTTPProviderParams = ProviderParams<'http'>;
|
|
8
|
-
/**
|
|
9
|
-
* Returns only first extracted element
|
|
10
|
-
* @param html
|
|
11
|
-
* @param xpathExpression
|
|
12
|
-
* @param contentsOnly
|
|
13
|
-
*/
|
|
14
|
-
export declare function extractHTMLElement(html: string, xpathExpression: string, contentsOnly: boolean): string;
|
|
15
|
-
/**
|
|
16
|
-
* Returns all extracted elements
|
|
17
|
-
* @param html
|
|
18
|
-
* @param xpathExpression
|
|
19
|
-
* @param contentsOnly
|
|
20
|
-
*/
|
|
21
|
-
export declare function extractHTMLElements(html: string, xpathExpression: string, contentsOnly: boolean): string[];
|
|
22
|
-
/**
|
|
23
|
-
* returns a single index of extracted element
|
|
24
|
-
* @param html
|
|
25
|
-
* @param xpathExpression
|
|
26
|
-
* @param contentsOnly
|
|
27
|
-
*/
|
|
28
|
-
export declare function extractHTMLElementIndex(html: string, xpathExpression: string, contentsOnly: boolean): {
|
|
29
|
-
start: number;
|
|
30
|
-
end: number;
|
|
31
|
-
};
|
|
32
|
-
/**
|
|
33
|
-
* Returns indexes of all extracted elements
|
|
34
|
-
* @param html
|
|
35
|
-
* @param xpathExpression
|
|
36
|
-
* @param contentsOnly
|
|
37
|
-
*/
|
|
38
|
-
export declare function extractHTMLElementsIndexes(html: string, xpathExpression: string, contentsOnly: boolean): {
|
|
39
|
-
start: number;
|
|
40
|
-
end: number;
|
|
41
|
-
}[];
|
|
42
|
-
export declare function extractJSONValueIndex(json: string, jsonPath: string): {
|
|
43
|
-
start: number;
|
|
44
|
-
end: number;
|
|
45
|
-
};
|
|
46
|
-
export declare function extractJSONValueIndexes(json: string, jsonPath: string): {
|
|
47
|
-
start: number;
|
|
48
|
-
end: number;
|
|
49
|
-
}[];
|
|
50
|
-
export declare function buildHeaders(input: HTTPProviderParams['headers']): string[];
|
|
51
|
-
/**
|
|
52
|
-
* Converts position in HTTP response body to an absolute position in TLS transcript considering chunked encoding
|
|
53
|
-
* @param pos
|
|
54
|
-
* @param bodyStartIdx
|
|
55
|
-
* @param chunks
|
|
56
|
-
*/
|
|
57
|
-
export declare function convertResponsePosToAbsolutePos(pos: number, bodyStartIdx: number, chunks?: ArraySlice[]): number;
|
|
58
|
-
/**
|
|
59
|
-
* Returns parts of response which contain chunk headers and must be redacted out
|
|
60
|
-
* of revealed response part
|
|
61
|
-
* @param from
|
|
62
|
-
* @param to
|
|
63
|
-
* @param chunks
|
|
64
|
-
*/
|
|
65
|
-
export declare function getRedactionsForChunkHeaders(from: any, to: number, chunks?: ArraySlice[]): ArraySlice[];
|
|
66
|
-
export declare function parseHttpResponse(buff: Uint8Array): HttpResponse;
|
|
67
|
-
export declare function makeRegex(str: string): any;
|
|
68
|
-
/**
|
|
69
|
-
* Try to match strings that contain templates like {{param}}
|
|
70
|
-
* against redacted string that has *** instead of that param
|
|
71
|
-
*/
|
|
72
|
-
export declare function matchRedactedStrings(templateString: Uint8Array, redactedString?: Uint8Array): boolean;
|
|
73
|
-
export declare function generateRequstAndResponseFromTranscript(transcript: Transcript<CompleteTLSPacket>, tlsVersion: string): {
|
|
74
|
-
req: HttpRequest;
|
|
75
|
-
res: HttpResponse;
|
|
76
|
-
};
|
|
77
|
-
export {};
|
|
@@ -1,358 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// noinspection ExceptionCaughtLocallyJS
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.extractHTMLElement = extractHTMLElement;
|
|
5
|
-
exports.extractHTMLElements = extractHTMLElements;
|
|
6
|
-
exports.extractHTMLElementIndex = extractHTMLElementIndex;
|
|
7
|
-
exports.extractHTMLElementsIndexes = extractHTMLElementsIndexes;
|
|
8
|
-
exports.extractJSONValueIndex = extractJSONValueIndex;
|
|
9
|
-
exports.extractJSONValueIndexes = extractJSONValueIndexes;
|
|
10
|
-
exports.buildHeaders = buildHeaders;
|
|
11
|
-
exports.convertResponsePosToAbsolutePos = convertResponsePosToAbsolutePos;
|
|
12
|
-
exports.getRedactionsForChunkHeaders = getRedactionsForChunkHeaders;
|
|
13
|
-
exports.parseHttpResponse = parseHttpResponse;
|
|
14
|
-
exports.makeRegex = makeRegex;
|
|
15
|
-
exports.matchRedactedStrings = matchRedactedStrings;
|
|
16
|
-
exports.generateRequstAndResponseFromTranscript = generateRequstAndResponseFromTranscript;
|
|
17
|
-
const tls_1 = require("@reclaimprotocol/tls");
|
|
18
|
-
const esprima_next_1 = require("esprima-next");
|
|
19
|
-
const jsonpath_plus_1 = require("jsonpath-plus");
|
|
20
|
-
const utils_1 = require("../../utils");
|
|
21
|
-
let RE2;
|
|
22
|
-
try {
|
|
23
|
-
RE2 = require('re2');
|
|
24
|
-
if (!Object.keys(RE2).length) {
|
|
25
|
-
RE2 = undefined;
|
|
26
|
-
throw new Error();
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
catch (_a) {
|
|
30
|
-
console.log('RE2 not found. Using standard regex');
|
|
31
|
-
}
|
|
32
|
-
let jsd;
|
|
33
|
-
if (typeof window !== 'undefined') {
|
|
34
|
-
// @ts-ignore
|
|
35
|
-
jsd = window.jsdom;
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
jsd = require('jsdom');
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Returns only first extracted element
|
|
42
|
-
* @param html
|
|
43
|
-
* @param xpathExpression
|
|
44
|
-
* @param contentsOnly
|
|
45
|
-
*/
|
|
46
|
-
function extractHTMLElement(html, xpathExpression, contentsOnly) {
|
|
47
|
-
const { start, end } = extractHTMLElementIndex(html, xpathExpression, contentsOnly);
|
|
48
|
-
return html.slice(start, end);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Returns all extracted elements
|
|
52
|
-
* @param html
|
|
53
|
-
* @param xpathExpression
|
|
54
|
-
* @param contentsOnly
|
|
55
|
-
*/
|
|
56
|
-
function extractHTMLElements(html, xpathExpression, contentsOnly) {
|
|
57
|
-
const indexes = extractHTMLElementsIndexes(html, xpathExpression, contentsOnly);
|
|
58
|
-
const res = [];
|
|
59
|
-
for (const { start, end } of indexes) {
|
|
60
|
-
res.push(html.slice(start, end));
|
|
61
|
-
}
|
|
62
|
-
return res;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* returns a single index of extracted element
|
|
66
|
-
* @param html
|
|
67
|
-
* @param xpathExpression
|
|
68
|
-
* @param contentsOnly
|
|
69
|
-
*/
|
|
70
|
-
function extractHTMLElementIndex(html, xpathExpression, contentsOnly) {
|
|
71
|
-
return extractHTMLElementsIndexes(html, xpathExpression, contentsOnly)[0];
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Returns indexes of all extracted elements
|
|
75
|
-
* @param html
|
|
76
|
-
* @param xpathExpression
|
|
77
|
-
* @param contentsOnly
|
|
78
|
-
*/
|
|
79
|
-
function extractHTMLElementsIndexes(html, xpathExpression, contentsOnly) {
|
|
80
|
-
const dom = new jsd.JSDOM(html, {
|
|
81
|
-
contentType: 'text/html',
|
|
82
|
-
includeNodeLocations: true
|
|
83
|
-
});
|
|
84
|
-
const document = dom.window.document;
|
|
85
|
-
const xpathResult = document.evaluate(xpathExpression, document, null, dom.window.XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
|
|
86
|
-
const nodes = [];
|
|
87
|
-
if ((xpathResult === null || xpathResult === void 0 ? void 0 : xpathResult.resultType) === dom.window.XPathResult.ORDERED_NODE_SNAPSHOT_TYPE &&
|
|
88
|
-
(xpathResult === null || xpathResult === void 0 ? void 0 : xpathResult.snapshotLength)) {
|
|
89
|
-
for (let i = 0; i < xpathResult.snapshotLength; ++i) {
|
|
90
|
-
nodes.push(xpathResult.snapshotItem(i));
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
if (!nodes.length) {
|
|
94
|
-
throw new Error(`Failed to find XPath: "${xpathExpression}"`);
|
|
95
|
-
}
|
|
96
|
-
const res = [];
|
|
97
|
-
for (const node of nodes) {
|
|
98
|
-
const nodeLocation = dom.nodeLocation(node);
|
|
99
|
-
if (!nodeLocation) {
|
|
100
|
-
throw new Error(`Failed to find XPath node location: "${xpathExpression}"`);
|
|
101
|
-
}
|
|
102
|
-
if (contentsOnly) {
|
|
103
|
-
const start = nodeLocation.startTag ? nodeLocation.startTag.endOffset : nodeLocation.startOffset;
|
|
104
|
-
const end = nodeLocation.endTag ? nodeLocation.endTag.startOffset : nodeLocation.endOffset;
|
|
105
|
-
res.push({ start, end });
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
res.push({ start: nodeLocation.startOffset, end: nodeLocation.endOffset });
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return res;
|
|
112
|
-
}
|
|
113
|
-
function extractJSONValueIndex(json, jsonPath) {
|
|
114
|
-
return extractJSONValueIndexes(json, jsonPath)[0];
|
|
115
|
-
}
|
|
116
|
-
function extractJSONValueIndexes(json, jsonPath) {
|
|
117
|
-
const pointers = (0, jsonpath_plus_1.JSONPath)({
|
|
118
|
-
path: jsonPath,
|
|
119
|
-
json: JSON.parse(json),
|
|
120
|
-
wrap: false,
|
|
121
|
-
resultType: 'pointer',
|
|
122
|
-
eval: 'safe',
|
|
123
|
-
// @ts-ignore
|
|
124
|
-
ignoreEvalErrors: true
|
|
125
|
-
});
|
|
126
|
-
if (!pointers) {
|
|
127
|
-
throw new Error('jsonPath not found');
|
|
128
|
-
}
|
|
129
|
-
const tree = (0, esprima_next_1.parseScript)('(' + json + ')', { range: true }); //wrap in parentheses for esprima to parse
|
|
130
|
-
if (tree.body[0] instanceof esprima_next_1.ExpressionStatement
|
|
131
|
-
&& (tree.body[0].expression instanceof esprima_next_1.ObjectExpression || tree.body[0].expression instanceof esprima_next_1.ArrayExpression)) {
|
|
132
|
-
const traversePointers = Array.isArray(pointers) ? pointers : [pointers];
|
|
133
|
-
const res = [];
|
|
134
|
-
for (const pointer of traversePointers) {
|
|
135
|
-
const index = traverse(tree.body[0].expression, '', [pointer]);
|
|
136
|
-
if (index) {
|
|
137
|
-
res.push({
|
|
138
|
-
start: index.start - 1, //account for '('
|
|
139
|
-
end: index.end - 1,
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return res;
|
|
144
|
-
}
|
|
145
|
-
throw new Error('jsonPath not found');
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* recursively go through AST tree and build a JSON path while it's not equal to the one we search for
|
|
149
|
-
* @param o - esprima expression for root object
|
|
150
|
-
* @param path - path that is being built
|
|
151
|
-
* @param pointers - JSON pointers to compare to
|
|
152
|
-
*/
|
|
153
|
-
function traverse(o, path, pointers) {
|
|
154
|
-
if (o instanceof esprima_next_1.ObjectExpression) {
|
|
155
|
-
for (const p of o.properties) {
|
|
156
|
-
if (!(p instanceof esprima_next_1.Property)) {
|
|
157
|
-
continue;
|
|
158
|
-
}
|
|
159
|
-
const localPath = p.key.type === esprima_next_1.Syntax.Literal
|
|
160
|
-
? path + '/' + p.key.value
|
|
161
|
-
: path;
|
|
162
|
-
if (pointers.includes(localPath) && 'range' in p && Array.isArray(p.range)) {
|
|
163
|
-
return {
|
|
164
|
-
start: p.range[0],
|
|
165
|
-
end: p.range[1],
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
if (p.value instanceof esprima_next_1.ObjectExpression
|
|
169
|
-
|| p.value instanceof esprima_next_1.ArrayExpression) {
|
|
170
|
-
const res = traverse(p.value, localPath, pointers);
|
|
171
|
-
if (res) {
|
|
172
|
-
return res;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
if (o instanceof esprima_next_1.ArrayExpression) {
|
|
178
|
-
for (let i = 0; i < o.elements.length; i++) {
|
|
179
|
-
const element = o.elements[i];
|
|
180
|
-
if (!element) {
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
const localPath = path + '/' + i;
|
|
184
|
-
if (pointers.includes(localPath) &&
|
|
185
|
-
'range' in element &&
|
|
186
|
-
Array.isArray(element.range)) {
|
|
187
|
-
return {
|
|
188
|
-
start: element.range[0],
|
|
189
|
-
end: element.range[1],
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
if (element instanceof esprima_next_1.ObjectExpression) {
|
|
193
|
-
const res = traverse(element, localPath, pointers);
|
|
194
|
-
if (res) {
|
|
195
|
-
return res;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
if (element instanceof esprima_next_1.ArrayExpression) {
|
|
199
|
-
const res = traverse(element, localPath, pointers);
|
|
200
|
-
if (res) {
|
|
201
|
-
return res;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
return null;
|
|
207
|
-
}
|
|
208
|
-
function buildHeaders(input) {
|
|
209
|
-
const headers = [];
|
|
210
|
-
for (const [key, value] of Object.entries(input || {})) {
|
|
211
|
-
headers.push(`${key}: ${value}`);
|
|
212
|
-
}
|
|
213
|
-
return headers;
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Converts position in HTTP response body to an absolute position in TLS transcript considering chunked encoding
|
|
217
|
-
* @param pos
|
|
218
|
-
* @param bodyStartIdx
|
|
219
|
-
* @param chunks
|
|
220
|
-
*/
|
|
221
|
-
function convertResponsePosToAbsolutePos(pos, bodyStartIdx, chunks) {
|
|
222
|
-
if (chunks === null || chunks === void 0 ? void 0 : chunks.length) {
|
|
223
|
-
let chunkBodyStart = 0;
|
|
224
|
-
for (const chunk of chunks) {
|
|
225
|
-
const chunkSize = chunk.toIndex - chunk.fromIndex;
|
|
226
|
-
if (pos >= chunkBodyStart && pos <= (chunkBodyStart + chunkSize)) {
|
|
227
|
-
return pos - chunkBodyStart + chunk.fromIndex;
|
|
228
|
-
}
|
|
229
|
-
chunkBodyStart += chunkSize;
|
|
230
|
-
}
|
|
231
|
-
throw new Error('position out of range');
|
|
232
|
-
}
|
|
233
|
-
return bodyStartIdx + pos;
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Returns parts of response which contain chunk headers and must be redacted out
|
|
237
|
-
* of revealed response part
|
|
238
|
-
* @param from
|
|
239
|
-
* @param to
|
|
240
|
-
* @param chunks
|
|
241
|
-
*/
|
|
242
|
-
function getRedactionsForChunkHeaders(from, to, chunks) {
|
|
243
|
-
const res = [];
|
|
244
|
-
if (chunks === null || chunks === void 0 ? void 0 : chunks.length) {
|
|
245
|
-
for (let i = 1; i < (chunks === null || chunks === void 0 ? void 0 : chunks.length); i++) {
|
|
246
|
-
if (chunks[i].fromIndex > from && chunks[i].fromIndex < to) {
|
|
247
|
-
res.push({ fromIndex: chunks[i - 1].toIndex, toIndex: chunks[i].fromIndex });
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
return res;
|
|
252
|
-
}
|
|
253
|
-
function parseHttpResponse(buff) {
|
|
254
|
-
const parser = (0, utils_1.makeHttpResponseParser)();
|
|
255
|
-
parser.onChunk(buff);
|
|
256
|
-
parser.streamEnded();
|
|
257
|
-
return parser.res;
|
|
258
|
-
}
|
|
259
|
-
function makeRegex(str) {
|
|
260
|
-
if (RE2 !== undefined) {
|
|
261
|
-
return RE2(str, 'sgiu');
|
|
262
|
-
}
|
|
263
|
-
return new RegExp(str, 'sgi');
|
|
264
|
-
}
|
|
265
|
-
const TEMPLATE_START_CHARCODE = '{'.charCodeAt(0);
|
|
266
|
-
const TEMPLATE_END_CHARCODE = '}'.charCodeAt(0);
|
|
267
|
-
/**
|
|
268
|
-
* Try to match strings that contain templates like {{param}}
|
|
269
|
-
* against redacted string that has *** instead of that param
|
|
270
|
-
*/
|
|
271
|
-
function matchRedactedStrings(templateString, redactedString) {
|
|
272
|
-
if (templateString.length === 0 && (redactedString === null || redactedString === void 0 ? void 0 : redactedString.length) === 0) {
|
|
273
|
-
return true;
|
|
274
|
-
}
|
|
275
|
-
if (!redactedString) {
|
|
276
|
-
return false;
|
|
277
|
-
}
|
|
278
|
-
let ts = -1;
|
|
279
|
-
let rs = -1;
|
|
280
|
-
while (ts < templateString.length && rs < redactedString.length) {
|
|
281
|
-
let ct = getTChar();
|
|
282
|
-
let cr = getRChar();
|
|
283
|
-
if (ct !== cr) {
|
|
284
|
-
// only valid if param contains "{" & redacted contains "*"
|
|
285
|
-
if (ct === TEMPLATE_START_CHARCODE && cr === utils_1.REDACTION_CHAR_CODE) {
|
|
286
|
-
//check that the char after first "{" is also "{"
|
|
287
|
-
if (getTChar() !== TEMPLATE_START_CHARCODE) {
|
|
288
|
-
return false;
|
|
289
|
-
}
|
|
290
|
-
//look for first closing bracket
|
|
291
|
-
while (((ct = getTChar()) !== TEMPLATE_END_CHARCODE) && ct !== -1) {
|
|
292
|
-
}
|
|
293
|
-
//look for second closing bracket
|
|
294
|
-
while (((ct = getTChar()) !== TEMPLATE_END_CHARCODE) && ct !== -1) {
|
|
295
|
-
}
|
|
296
|
-
if (ct === -1) {
|
|
297
|
-
return false;
|
|
298
|
-
}
|
|
299
|
-
//find the end of redaction
|
|
300
|
-
while (((cr = getRChar()) === utils_1.REDACTION_CHAR_CODE) && cr !== -1) {
|
|
301
|
-
}
|
|
302
|
-
if (cr === -1) {
|
|
303
|
-
//if there's nothing after template too then both ended at the end of strings
|
|
304
|
-
return getTChar() === -1;
|
|
305
|
-
}
|
|
306
|
-
//rewind redacted string position back 1 char because we read one extra
|
|
307
|
-
rs--;
|
|
308
|
-
}
|
|
309
|
-
else {
|
|
310
|
-
return false;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
function getTChar() {
|
|
315
|
-
ts++;
|
|
316
|
-
if (ts < templateString.length) {
|
|
317
|
-
return templateString[ts];
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
return -1;
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
function getRChar() {
|
|
324
|
-
if (!redactedString) {
|
|
325
|
-
return -1;
|
|
326
|
-
}
|
|
327
|
-
rs++;
|
|
328
|
-
if (rs < redactedString.length) {
|
|
329
|
-
return redactedString[rs];
|
|
330
|
-
}
|
|
331
|
-
else {
|
|
332
|
-
return -1;
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
return ts === templateString.length && rs === redactedString.length;
|
|
336
|
-
}
|
|
337
|
-
function generateRequstAndResponseFromTranscript(transcript, tlsVersion) {
|
|
338
|
-
const allPackets = transcript;
|
|
339
|
-
const packets = [];
|
|
340
|
-
for (const b of allPackets) {
|
|
341
|
-
if (b.message.type !== 'ciphertext'
|
|
342
|
-
|| !(0, utils_1.isApplicationData)(b.message, tlsVersion)) {
|
|
343
|
-
continue;
|
|
344
|
-
}
|
|
345
|
-
const plaintext = tlsVersion === 'TLS1_3'
|
|
346
|
-
? b.message.plaintext.slice(0, -1)
|
|
347
|
-
: b.message.plaintext;
|
|
348
|
-
packets.push({
|
|
349
|
-
message: plaintext,
|
|
350
|
-
sender: b.sender
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
const req = (0, utils_1.getHttpRequestDataFromTranscript)(packets);
|
|
354
|
-
const responsePackets = (0, tls_1.concatenateUint8Arrays)(packets.filter(p => p.sender === 'server').map(p => p.message).filter(b => !b.every(b => b === utils_1.REDACTION_CHAR_CODE)));
|
|
355
|
-
const res = parseHttpResponse(responsePackets);
|
|
356
|
-
return { req, res };
|
|
357
|
-
}
|
|
358
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2h0dHBiNjQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdDQUF3Qzs7QUFpRHhDLGdEQU9DO0FBUUQsa0RBWUM7QUFRRCwwREFNQztBQVFELGdFQTRDQztBQUVELHNEQUVDO0FBRUQsMERBa0NDO0FBaUZELG9DQVFDO0FBUUQsMEVBa0JDO0FBU0Qsb0VBV0M7QUFFRCw4Q0FLQztBQUVELDhCQU1DO0FBU0Qsb0RBNEVDO0FBRUQsMEZBMEJDO0FBM2JELDhDQUE2RDtBQUM3RCwrQ0FRcUI7QUFDckIsaURBQXdDO0FBRXhDLHFDQUF1SjtBQVN2SixJQUFJLEdBQUcsQ0FBQTtBQUNQLElBQUksQ0FBQztJQUNKLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDcEIsSUFBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsR0FBRyxHQUFHLFNBQVMsQ0FBQTtRQUNmLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQTtJQUNsQixDQUFDO0FBQ0YsQ0FBQztBQUFDLFdBQUssQ0FBQztJQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMscUNBQXFDLENBQUMsQ0FBQTtBQUNuRCxDQUFDO0FBRUQsSUFBSSxHQUFHLENBQUE7QUFFUCxJQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLGFBQWE7SUFDYixHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQTtBQUNuQixDQUFDO0tBQU0sQ0FBQztJQUNQLEdBQUcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDdkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQ2pDLElBQVksRUFDWixlQUF1QixFQUN2QixZQUFxQjtJQUVyQixNQUFNLEVBQUUsS0FBSyxFQUFFLEdB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
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { IDecryptedTranscript } from '../../types';
|
|
2
|
-
/**
|
|
3
|
-
* Verifies server cert chain and removes handshake messages from transcript, returning new one
|
|
4
|
-
* @param receipt
|
|
5
|
-
* @param logger
|
|
6
|
-
*/
|
|
7
|
-
export declare function verifyServerCertificates(receipt: IDecryptedTranscript, logger: any): Promise<IDecryptedTranscript>;
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.verifyServerCertificates = verifyServerCertificates;
|
|
4
|
-
const tls_1 = require("@reclaimprotocol/tls");
|
|
5
|
-
const parse_certificate_1 = require("@reclaimprotocol/tls/lib/utils/parse-certificate");
|
|
6
|
-
const utils_1 = require("../../utils");
|
|
7
|
-
const RECORD_LENGTH_BYTES = 3;
|
|
8
|
-
/**
|
|
9
|
-
* Verifies server cert chain and removes handshake messages from transcript, returning new one
|
|
10
|
-
* @param receipt
|
|
11
|
-
* @param logger
|
|
12
|
-
*/
|
|
13
|
-
async function verifyServerCertificates(receipt, logger) {
|
|
14
|
-
const handshakeMsgs = (0, utils_1.extractHandshakeFromTranscript)(receipt);
|
|
15
|
-
let handshakeData = (0, tls_1.concatenateUint8Arrays)(handshakeMsgs.messages.map(m => m.message));
|
|
16
|
-
let packetData;
|
|
17
|
-
const handshakeRawMessages = [];
|
|
18
|
-
const certificates = [];
|
|
19
|
-
let cipherSuite = undefined;
|
|
20
|
-
let serverRandom = undefined;
|
|
21
|
-
let clientRandom = undefined;
|
|
22
|
-
let certVerified = false;
|
|
23
|
-
while ((packetData = readPacket()) && !certVerified) {
|
|
24
|
-
const { type, content } = packetData;
|
|
25
|
-
switch (type) {
|
|
26
|
-
case tls_1.SUPPORTED_RECORD_TYPE_MAP.CLIENT_HELLO:
|
|
27
|
-
const clientHello = (0, tls_1.parseClientHello)(handshakeRawMessages[0]);
|
|
28
|
-
clientRandom = clientHello.serverRandom;
|
|
29
|
-
break;
|
|
30
|
-
case tls_1.SUPPORTED_RECORD_TYPE_MAP.SERVER_HELLO:
|
|
31
|
-
const serverHello = await (0, tls_1.parseServerHello)(content);
|
|
32
|
-
cipherSuite = serverHello.cipherSuite;
|
|
33
|
-
serverRandom = serverHello.serverRandom;
|
|
34
|
-
break;
|
|
35
|
-
case tls_1.SUPPORTED_RECORD_TYPE_MAP.CERTIFICATE:
|
|
36
|
-
const parseResult = (0, tls_1.parseCertificates)(content, { version: receipt.tlsVersion });
|
|
37
|
-
certificates.push(...parseResult.certificates);
|
|
38
|
-
break;
|
|
39
|
-
case tls_1.SUPPORTED_RECORD_TYPE_MAP.CERTIFICATE_VERIFY:
|
|
40
|
-
const signature = (0, tls_1.parseServerCertificateVerify)(content);
|
|
41
|
-
if (!(certificates === null || certificates === void 0 ? void 0 : certificates.length)) {
|
|
42
|
-
throw new Error('No provider certificates received');
|
|
43
|
-
}
|
|
44
|
-
const signatureData = await (0, tls_1.getSignatureDataTls13)(handshakeRawMessages.slice(0, -1), cipherSuite);
|
|
45
|
-
await (0, tls_1.verifyCertificateSignature)({
|
|
46
|
-
...signature,
|
|
47
|
-
publicKey: certificates[0].getPublicKey(),
|
|
48
|
-
signatureData,
|
|
49
|
-
});
|
|
50
|
-
await (0, parse_certificate_1.verifyCertificateChain)(certificates, receipt.hostname);
|
|
51
|
-
logger.info({ host: receipt.hostname }, 'verified provider certificate chain');
|
|
52
|
-
certVerified = true;
|
|
53
|
-
break;
|
|
54
|
-
case tls_1.SUPPORTED_RECORD_TYPE_MAP.SERVER_KEY_SHARE:
|
|
55
|
-
if (!(certificates === null || certificates === void 0 ? void 0 : certificates.length)) {
|
|
56
|
-
throw new Error('No provider certificates received');
|
|
57
|
-
}
|
|
58
|
-
const keyShare = await (0, tls_1.processServerKeyShare)(content);
|
|
59
|
-
const signatureData12 = await (0, tls_1.getSignatureDataTls12)({
|
|
60
|
-
clientRandom: clientRandom,
|
|
61
|
-
serverRandom: serverRandom,
|
|
62
|
-
curveType: keyShare.publicKeyType,
|
|
63
|
-
publicKey: keyShare.publicKey,
|
|
64
|
-
});
|
|
65
|
-
// verify signature
|
|
66
|
-
await (0, tls_1.verifyCertificateSignature)({
|
|
67
|
-
signature: keyShare.signatureBytes,
|
|
68
|
-
algorithm: keyShare.signatureAlgorithm,
|
|
69
|
-
publicKey: certificates[0].getPublicKey(),
|
|
70
|
-
signatureData: signatureData12,
|
|
71
|
-
});
|
|
72
|
-
await (0, parse_certificate_1.verifyCertificateChain)(certificates, receipt.hostname);
|
|
73
|
-
logger.info({ host: receipt.hostname }, 'verified provider certificate chain');
|
|
74
|
-
certVerified = true;
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
if (!certVerified) {
|
|
79
|
-
throw new Error('No provider certificates received');
|
|
80
|
-
}
|
|
81
|
-
function readPacket() {
|
|
82
|
-
if (!handshakeData.length) {
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
const type = handshakeData[0];
|
|
86
|
-
const content = (0, tls_1.readWithLength)(handshakeData.slice(1), RECORD_LENGTH_BYTES);
|
|
87
|
-
if (!content) {
|
|
88
|
-
logger.warn('missing bytes from packet');
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
const totalLength = 1 + RECORD_LENGTH_BYTES + content.length;
|
|
92
|
-
handshakeRawMessages.push(handshakeData.slice(0, totalLength));
|
|
93
|
-
handshakeData = handshakeData.slice(totalLength);
|
|
94
|
-
return { type, content };
|
|
95
|
-
}
|
|
96
|
-
return {
|
|
97
|
-
tlsVersion: receipt.tlsVersion,
|
|
98
|
-
hostname: receipt.hostname,
|
|
99
|
-
transcript: receipt.transcript.slice(handshakeMsgs.lastMsgIndex)
|
|
100
|
-
};
|
|
101
|
-
}
|