@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,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isValidCountryCode = isValidCountryCode;
|
|
4
|
+
const countries = {
|
|
5
|
+
AF: 'Afghanistan',
|
|
6
|
+
AX: 'Åland Islands',
|
|
7
|
+
AL: 'Albania',
|
|
8
|
+
DZ: 'Algeria',
|
|
9
|
+
AS: 'American Samoa',
|
|
10
|
+
AD: 'Andorra',
|
|
11
|
+
AO: 'Angola',
|
|
12
|
+
AI: 'Anguilla',
|
|
13
|
+
AQ: 'Antarctica',
|
|
14
|
+
AG: 'Antigua and Barbuda',
|
|
15
|
+
AR: 'Argentina',
|
|
16
|
+
AM: 'Armenia',
|
|
17
|
+
AW: 'Aruba',
|
|
18
|
+
AU: 'Australia',
|
|
19
|
+
AT: 'Austria',
|
|
20
|
+
AZ: 'Azerbaijan',
|
|
21
|
+
BS: 'Bahamas',
|
|
22
|
+
BH: 'Bahrain',
|
|
23
|
+
BD: 'Bangladesh',
|
|
24
|
+
BB: 'Barbados',
|
|
25
|
+
BY: 'Belarus',
|
|
26
|
+
BE: 'Belgium',
|
|
27
|
+
BZ: 'Belize',
|
|
28
|
+
BJ: 'Benin',
|
|
29
|
+
BM: 'Bermuda',
|
|
30
|
+
BT: 'Bhutan',
|
|
31
|
+
BO: 'Bolivia, Plurinational State of',
|
|
32
|
+
BQ: 'Bonaire, Sint Eustatius and Saba',
|
|
33
|
+
BA: 'Bosnia and Herzegovina',
|
|
34
|
+
BW: 'Botswana',
|
|
35
|
+
BV: 'Bouvet Island',
|
|
36
|
+
BR: 'Brazil',
|
|
37
|
+
IO: 'British Indian Ocean Territory',
|
|
38
|
+
BN: 'Brunei Darussalam',
|
|
39
|
+
BG: 'Bulgaria',
|
|
40
|
+
BF: 'Burkina Faso',
|
|
41
|
+
BI: 'Burundi',
|
|
42
|
+
KH: 'Cambodia',
|
|
43
|
+
CM: 'Cameroon',
|
|
44
|
+
CA: 'Canada',
|
|
45
|
+
CV: 'Cape Verde',
|
|
46
|
+
KY: 'Cayman Islands',
|
|
47
|
+
CF: 'Central African Republic',
|
|
48
|
+
TD: 'Chad',
|
|
49
|
+
CL: 'Chile',
|
|
50
|
+
CN: 'China',
|
|
51
|
+
CX: 'Christmas Island',
|
|
52
|
+
CC: 'Cocos (Keeling) Islands',
|
|
53
|
+
CO: 'Colombia',
|
|
54
|
+
KM: 'Comoros',
|
|
55
|
+
CG: 'Congo',
|
|
56
|
+
CD: 'Congo, the Democratic Republic of the',
|
|
57
|
+
CK: 'Cook Islands',
|
|
58
|
+
CR: 'Costa Rica',
|
|
59
|
+
CI: "Côte d'Ivoire",
|
|
60
|
+
HR: 'Croatia',
|
|
61
|
+
CU: 'Cuba',
|
|
62
|
+
CW: 'Curaçao',
|
|
63
|
+
CY: 'Cyprus',
|
|
64
|
+
CZ: 'Czech Republic',
|
|
65
|
+
DK: 'Denmark',
|
|
66
|
+
DJ: 'Djibouti',
|
|
67
|
+
DM: 'Dominica',
|
|
68
|
+
DO: 'Dominican Republic',
|
|
69
|
+
EC: 'Ecuador',
|
|
70
|
+
EG: 'Egypt',
|
|
71
|
+
SV: 'El Salvador',
|
|
72
|
+
GQ: 'Equatorial Guinea',
|
|
73
|
+
ER: 'Eritrea',
|
|
74
|
+
EE: 'Estonia',
|
|
75
|
+
ET: 'Ethiopia',
|
|
76
|
+
FK: 'Falkland Islands (Malvinas)',
|
|
77
|
+
FO: 'Faroe Islands',
|
|
78
|
+
FJ: 'Fiji',
|
|
79
|
+
FI: 'Finland',
|
|
80
|
+
FR: 'France',
|
|
81
|
+
GF: 'French Guiana',
|
|
82
|
+
PF: 'French Polynesia',
|
|
83
|
+
TF: 'French Southern Territories',
|
|
84
|
+
GA: 'Gabon',
|
|
85
|
+
GM: 'Gambia',
|
|
86
|
+
GE: 'Georgia',
|
|
87
|
+
DE: 'Germany',
|
|
88
|
+
GH: 'Ghana',
|
|
89
|
+
GI: 'Gibraltar',
|
|
90
|
+
GR: 'Greece',
|
|
91
|
+
GL: 'Greenland',
|
|
92
|
+
GD: 'Grenada',
|
|
93
|
+
GP: 'Guadeloupe',
|
|
94
|
+
GU: 'Guam',
|
|
95
|
+
GT: 'Guatemala',
|
|
96
|
+
GG: 'Guernsey',
|
|
97
|
+
GN: 'Guinea',
|
|
98
|
+
GW: 'Guinea-Bissau',
|
|
99
|
+
GY: 'Guyana',
|
|
100
|
+
HT: 'Haiti',
|
|
101
|
+
HM: 'Heard Island and McDonald Mcdonald Islands',
|
|
102
|
+
VA: 'Holy See (Vatican City State)',
|
|
103
|
+
HN: 'Honduras',
|
|
104
|
+
HK: 'Hong Kong',
|
|
105
|
+
HU: 'Hungary',
|
|
106
|
+
IS: 'Iceland',
|
|
107
|
+
IN: 'India',
|
|
108
|
+
ID: 'Indonesia',
|
|
109
|
+
IR: 'Iran, Islamic Republic of',
|
|
110
|
+
IQ: 'Iraq',
|
|
111
|
+
IE: 'Ireland',
|
|
112
|
+
IM: 'Isle of Man',
|
|
113
|
+
IL: 'Israel',
|
|
114
|
+
IT: 'Italy',
|
|
115
|
+
JM: 'Jamaica',
|
|
116
|
+
JP: 'Japan',
|
|
117
|
+
JE: 'Jersey',
|
|
118
|
+
JO: 'Jordan',
|
|
119
|
+
KZ: 'Kazakhstan',
|
|
120
|
+
KE: 'Kenya',
|
|
121
|
+
KI: 'Kiribati',
|
|
122
|
+
XK: 'Kosovo',
|
|
123
|
+
KP: "Korea, Democratic People's Republic of",
|
|
124
|
+
KR: 'Korea, Republic of',
|
|
125
|
+
KW: 'Kuwait',
|
|
126
|
+
KG: 'Kyrgyzstan',
|
|
127
|
+
LA: "Lao People's Democratic Republic",
|
|
128
|
+
LV: 'Latvia',
|
|
129
|
+
LB: 'Lebanon',
|
|
130
|
+
LS: 'Lesotho',
|
|
131
|
+
LR: 'Liberia',
|
|
132
|
+
LY: 'Libya',
|
|
133
|
+
LI: 'Liechtenstein',
|
|
134
|
+
LT: 'Lithuania',
|
|
135
|
+
LU: 'Luxembourg',
|
|
136
|
+
MO: 'Macao',
|
|
137
|
+
MK: 'North Macedonia',
|
|
138
|
+
MG: 'Madagascar',
|
|
139
|
+
MW: 'Malawi',
|
|
140
|
+
MY: 'Malaysia',
|
|
141
|
+
MV: 'Maldives',
|
|
142
|
+
ML: 'Mali',
|
|
143
|
+
MT: 'Malta',
|
|
144
|
+
MH: 'Marshall Islands',
|
|
145
|
+
MQ: 'Martinique',
|
|
146
|
+
MR: 'Mauritania',
|
|
147
|
+
MU: 'Mauritius',
|
|
148
|
+
YT: 'Mayotte',
|
|
149
|
+
MX: 'Mexico',
|
|
150
|
+
FM: 'Micronesia, Federated States of',
|
|
151
|
+
MD: 'Moldova, Republic of',
|
|
152
|
+
MC: 'Monaco',
|
|
153
|
+
MN: 'Mongolia',
|
|
154
|
+
ME: 'Montenegro',
|
|
155
|
+
MS: 'Montserrat',
|
|
156
|
+
MA: 'Morocco',
|
|
157
|
+
MZ: 'Mozambique',
|
|
158
|
+
MM: 'Myanmar',
|
|
159
|
+
NA: 'Namibia',
|
|
160
|
+
NR: 'Nauru',
|
|
161
|
+
NP: 'Nepal',
|
|
162
|
+
NL: 'Netherlands',
|
|
163
|
+
AN: 'Netherlands Antilles',
|
|
164
|
+
NC: 'New Caledonia',
|
|
165
|
+
NZ: 'New Zealand',
|
|
166
|
+
NI: 'Nicaragua',
|
|
167
|
+
NE: 'Niger',
|
|
168
|
+
NG: 'Nigeria',
|
|
169
|
+
NU: 'Niue',
|
|
170
|
+
NF: 'Norfolk Island',
|
|
171
|
+
MP: 'Northern Mariana Islands',
|
|
172
|
+
NO: 'Norway',
|
|
173
|
+
OM: 'Oman',
|
|
174
|
+
PK: 'Pakistan',
|
|
175
|
+
PW: 'Palau',
|
|
176
|
+
PS: 'Palestine, State of',
|
|
177
|
+
PA: 'Panama',
|
|
178
|
+
PG: 'Papua New Guinea',
|
|
179
|
+
PY: 'Paraguay',
|
|
180
|
+
PE: 'Peru',
|
|
181
|
+
PH: 'Philippines',
|
|
182
|
+
PN: 'Pitcairn',
|
|
183
|
+
PL: 'Poland',
|
|
184
|
+
PT: 'Portugal',
|
|
185
|
+
PR: 'Puerto Rico',
|
|
186
|
+
QA: 'Qatar',
|
|
187
|
+
RE: 'Réunion',
|
|
188
|
+
RO: 'Romania',
|
|
189
|
+
RU: 'Russian Federation',
|
|
190
|
+
RW: 'Rwanda',
|
|
191
|
+
BL: 'Saint Barthélemy',
|
|
192
|
+
SH: 'Saint Helena, Ascension and Tristan da Cunha',
|
|
193
|
+
KN: 'Saint Kitts and Nevis',
|
|
194
|
+
LC: 'Saint Lucia',
|
|
195
|
+
MF: 'Saint Martin (French part)',
|
|
196
|
+
PM: 'Saint Pierre and Miquelon',
|
|
197
|
+
VC: 'Saint Vincent and the Grenadines',
|
|
198
|
+
WS: 'Samoa',
|
|
199
|
+
SM: 'San Marino',
|
|
200
|
+
ST: 'Sao Tome and Principe',
|
|
201
|
+
SA: 'Saudi Arabia',
|
|
202
|
+
SN: 'Senegal',
|
|
203
|
+
RS: 'Serbia',
|
|
204
|
+
SC: 'Seychelles',
|
|
205
|
+
SL: 'Sierra Leone',
|
|
206
|
+
SG: 'Singapore',
|
|
207
|
+
SX: 'Sint Maarten (Dutch part)',
|
|
208
|
+
SK: 'Slovakia',
|
|
209
|
+
SI: 'Slovenia',
|
|
210
|
+
SB: 'Solomon Islands',
|
|
211
|
+
SO: 'Somalia',
|
|
212
|
+
ZA: 'South Africa',
|
|
213
|
+
GS: 'South Georgia and the South Sandwich Islands',
|
|
214
|
+
SS: 'South Sudan',
|
|
215
|
+
ES: 'Spain',
|
|
216
|
+
LK: 'Sri Lanka',
|
|
217
|
+
SD: 'Sudan',
|
|
218
|
+
SR: 'Suriname',
|
|
219
|
+
SJ: 'Svalbard and Jan Mayen',
|
|
220
|
+
SZ: 'Swaziland',
|
|
221
|
+
SE: 'Sweden',
|
|
222
|
+
CH: 'Switzerland',
|
|
223
|
+
SY: 'Syrian Arab Republic',
|
|
224
|
+
TW: 'Taiwan, Province of China',
|
|
225
|
+
TJ: 'Tajikistan',
|
|
226
|
+
TZ: 'Tanzania, United Republic of',
|
|
227
|
+
TH: 'Thailand',
|
|
228
|
+
TL: 'Timor-Leste',
|
|
229
|
+
TG: 'Togo',
|
|
230
|
+
TK: 'Tokelau',
|
|
231
|
+
TO: 'Tonga',
|
|
232
|
+
TT: 'Trinidad and Tobago',
|
|
233
|
+
TN: 'Tunisia',
|
|
234
|
+
TR: 'Turkey',
|
|
235
|
+
TM: 'Turkmenistan',
|
|
236
|
+
TC: 'Turks and Caicos Islands',
|
|
237
|
+
TV: 'Tuvalu',
|
|
238
|
+
UG: 'Uganda',
|
|
239
|
+
UA: 'Ukraine',
|
|
240
|
+
AE: 'United Arab Emirates',
|
|
241
|
+
GB: 'United Kingdom',
|
|
242
|
+
US: 'United States',
|
|
243
|
+
UM: 'United States Minor Outlying Islands',
|
|
244
|
+
UY: 'Uruguay',
|
|
245
|
+
UZ: 'Uzbekistan',
|
|
246
|
+
VU: 'Vanuatu',
|
|
247
|
+
VE: 'Venezuela, Bolivarian Republic of',
|
|
248
|
+
VN: 'Viet Nam',
|
|
249
|
+
VG: 'Virgin Islands, British',
|
|
250
|
+
VI: 'Virgin Islands, U.S.',
|
|
251
|
+
WF: 'Wallis and Futuna',
|
|
252
|
+
EH: 'Western Sahara',
|
|
253
|
+
YE: 'Yemen',
|
|
254
|
+
ZM: 'Zambia',
|
|
255
|
+
ZW: 'Zimbabwe'
|
|
256
|
+
};
|
|
257
|
+
function isValidCountryCode(countryCode) {
|
|
258
|
+
return (countryCode.toUpperCase() in countries);
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci91dGlscy9pc28udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUErUEEsZ0RBRUM7QUFoUUQsTUFBTSxTQUFTLEdBQUc7SUFDakIsRUFBRSxFQUFFLGFBQWE7SUFDakIsRUFBRSxFQUFFLGVBQWU7SUFDbkIsRUFBRSxFQUFFLFNBQVM7SUFDYixFQUFFLEVBQUUsU0FBUztJQUNiLEVBQUUsRUFBRSxnQkFBZ0I7SUFDcEIsRUFBRSxFQUFFLFNBQVM7SUFDYixFQUFFLEVBQUUsUUFBUTtJQUNaLEVBQUUsRUFBRSxVQUFVO0lBQ2QsRUFBRSxFQUFFLFlBQVk7SUFDaEIsRUFBRSxFQUFFLHFCQUFxQjtJQUN6QixFQUFFLEVBQUUsV0FBVztJQUNmLEVBQUUsRUFBRSxTQUFTO0lBQ2IsRUFBRSxFQUFFLE9BQU87SUFDWCxFQUFFLEVBQUUsV0FBVztJQUNmLEVBQUUsRUFBRSxTQUFTO0lBQ2IsRUFBRSxFQUFFLFlBQVk7SUFDaEIsRUFBRSxFQUFFLFNBQVM7SUFDYixFQUFFLEVBQUUsU0FBUztJQUNiLEVBQUUsRUFBRSxZQUFZO0lBQ2hCLEVBQUUsRUFBRSxVQUFVO0lBQ2QsRUFBRSxFQUFFLFNBQVM7SUFDYixFQUFFLEVBQUUsU0FBUztJQUNiLEVBQUUsRUFBRSxRQUFRO0lBQ1osRUFBRSxFQUFFLE9BQU87SUFDWCxFQUFFLEVBQUUsU0FBUztJQUNiLEVBQUUsRUFBRSxRQUFRO0lBQ1osRUFBRSxFQUFFLGlDQUFpQztJQUNyQyxFQUFFLEVBQUUsa0NBQWtDO0lBQ3RDLEVBQUUsRUFBRSx3QkFBd0I7SUFDNUIsRUFBRSxFQUFFLFVBQVU7SUFDZCxFQUFFLEVBQUUsZUFBZTtJQUNuQixFQUFFLEVBQUUsUUFBUTtJQUNaLEVBQUUsRUFBRSxnQ0FBZ0M7SUFDcEMsRUFBRSxFQUFFLG1CQUFtQjtJQUN2QixFQUFFLEVBQUUsVUFBVTtJQUNkLEVBQUUsRUFBRSxjQUFjO0lB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
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addKeepAlive = addKeepAlive;
|
|
4
|
+
const config_1 = require("src/config");
|
|
5
|
+
/**
|
|
6
|
+
* Adds a keep-alive mechanism to the WebSocket
|
|
7
|
+
* client
|
|
8
|
+
*/
|
|
9
|
+
function addKeepAlive(ws, logger) {
|
|
10
|
+
let sendTimeout;
|
|
11
|
+
let killTimeout;
|
|
12
|
+
ws.on('message', () => {
|
|
13
|
+
logger.trace('data recv, resetting timer');
|
|
14
|
+
resetTimer();
|
|
15
|
+
});
|
|
16
|
+
ws.on('pong', () => {
|
|
17
|
+
logger.trace('pong received, resetting timer');
|
|
18
|
+
resetTimer();
|
|
19
|
+
});
|
|
20
|
+
ws.on('error', cleanup);
|
|
21
|
+
ws.on('close', cleanup);
|
|
22
|
+
function resetTimer() {
|
|
23
|
+
cleanup();
|
|
24
|
+
resetSendTimeout();
|
|
25
|
+
killTimeout = setTimeout(() => {
|
|
26
|
+
logger.warn('no data received in a while, closing connection');
|
|
27
|
+
ws.close();
|
|
28
|
+
}, config_1.MAX_NO_DATA_INTERVAL_MS);
|
|
29
|
+
}
|
|
30
|
+
function resetSendTimeout() {
|
|
31
|
+
// reset ping
|
|
32
|
+
sendTimeout = setTimeout(() => {
|
|
33
|
+
ws.ping();
|
|
34
|
+
resetSendTimeout();
|
|
35
|
+
}, config_1.PING_INTERVAL_MS);
|
|
36
|
+
}
|
|
37
|
+
function cleanup() {
|
|
38
|
+
clearTimeout(killTimeout);
|
|
39
|
+
clearTimeout(sendTimeout);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2VlcC1hbGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvdXRpbHMva2VlcC1hbGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVFBLG9DQXdDQztBQS9DRCx1Q0FBc0U7QUFHdEU7OztHQUdHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLEVBQWEsRUFBRSxNQUFjO0lBQ3pELElBQUksV0FBMkIsQ0FBQTtJQUMvQixJQUFJLFdBQTJCLENBQUE7SUFFL0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO1FBQ3JCLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtRQUMxQyxVQUFVLEVBQUUsQ0FBQTtJQUNiLENBQUMsQ0FBQyxDQUFBO0lBQ0YsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQ2xCLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQTtRQUM5QyxVQUFVLEVBQUUsQ0FBQTtJQUNiLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDdkIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFFdkIsU0FBUyxVQUFVO1FBQ2xCLE9BQU8sRUFBRSxDQUFBO1FBQ1QsZ0JBQWdCLEVBQUUsQ0FBQTtRQUVsQixXQUFXLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUM3QixNQUFNLENBQUMsSUFBSSxDQUNWLGlEQUFpRCxDQUNqRCxDQUFBO1lBQ0QsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ1gsQ0FBQyxFQUFFLGdDQUF1QixDQUFDLENBQUE7SUFDNUIsQ0FBQztJQUVELFNBQVMsZ0JBQWdCO1FBQ3hCLGFBQWE7UUFDYixXQUFXLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUM3QixFQUFFLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDVCxnQkFBZ0IsRUFBRSxDQUFBO1FBQ25CLENBQUMsRUFBRSx5QkFBZ0IsQ0FBQyxDQUFBO0lBQ3JCLENBQUM7SUFFRCxTQUFTLE9BQU87UUFDZixZQUFZLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDekIsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQzFCLENBQUM7QUFDRixDQUFDIn0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ClaimTunnelRequest } from 'src/proto/api';
|
|
2
|
+
import { Logger } from 'src/types';
|
|
3
|
+
/**
|
|
4
|
+
* Verifies server cert chain and removes handshake messages from transcript
|
|
5
|
+
* @param receipt
|
|
6
|
+
* @param logger
|
|
7
|
+
*/
|
|
8
|
+
export declare function processHandshake(receipt: ClaimTunnelRequest['transcript'], logger: Logger): Promise<{
|
|
9
|
+
tlsVersion: "TLS1_3" | "TLS1_2";
|
|
10
|
+
cipherSuite: "TLS_CHACHA20_POLY1305_SHA256" | "TLS_AES_256_GCM_SHA384" | "TLS_AES_128_GCM_SHA256" | "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256" | "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256" | "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" | "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" | "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" | "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" | "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA" | "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA";
|
|
11
|
+
hostname: string;
|
|
12
|
+
nextMsgIndex: number;
|
|
13
|
+
}>;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processHandshake = processHandshake;
|
|
4
|
+
const tls_1 = require("@reclaimprotocol/tls");
|
|
5
|
+
const parse_certificate_1 = require("@reclaimprotocol/tls/lib/utils/parse-certificate");
|
|
6
|
+
const api_1 = require("src/proto/api");
|
|
7
|
+
const utils_1 = require("src/utils");
|
|
8
|
+
const RECORD_LENGTH_BYTES = 3;
|
|
9
|
+
/**
|
|
10
|
+
* Verifies server cert chain and removes handshake messages from transcript
|
|
11
|
+
* @param receipt
|
|
12
|
+
* @param logger
|
|
13
|
+
*/
|
|
14
|
+
async function processHandshake(receipt, logger) {
|
|
15
|
+
//const handshakeMessages = extractHandshakeFromTranscript(receipt)
|
|
16
|
+
let currentPacketIdx = 0;
|
|
17
|
+
let readPacketIdx = 0;
|
|
18
|
+
let handshakeData;
|
|
19
|
+
let packetData;
|
|
20
|
+
const handshakeRawMessages = [];
|
|
21
|
+
const certificates = [];
|
|
22
|
+
let cipherSuite = undefined;
|
|
23
|
+
let tlsVersion = undefined;
|
|
24
|
+
let serverRandom = undefined;
|
|
25
|
+
let clientRandom = undefined;
|
|
26
|
+
let serverFinishedIdx = -1;
|
|
27
|
+
let clientFinishedIdx = -1;
|
|
28
|
+
let certVerified = false;
|
|
29
|
+
let hostname = undefined;
|
|
30
|
+
let clientChangeCipherSpecMsgIdx = -1;
|
|
31
|
+
let serverChangeCipherSpecMsgIdx = -1;
|
|
32
|
+
while ((packetData = await readPacket())) {
|
|
33
|
+
const { type, content } = packetData;
|
|
34
|
+
switch (type) {
|
|
35
|
+
case tls_1.SUPPORTED_RECORD_TYPE_MAP.CLIENT_HELLO:
|
|
36
|
+
const clientHello = (0, tls_1.parseClientHello)(handshakeRawMessages[0]);
|
|
37
|
+
clientRandom = clientHello.serverRandom;
|
|
38
|
+
const { SERVER_NAME: sni } = clientHello.extensions;
|
|
39
|
+
hostname = sni === null || sni === void 0 ? void 0 : sni.serverName;
|
|
40
|
+
if (!hostname) {
|
|
41
|
+
throw new Error('client hello has no SNI');
|
|
42
|
+
}
|
|
43
|
+
break;
|
|
44
|
+
case tls_1.SUPPORTED_RECORD_TYPE_MAP.SERVER_HELLO:
|
|
45
|
+
const serverHello = await (0, tls_1.parseServerHello)(content);
|
|
46
|
+
cipherSuite = serverHello.cipherSuite;
|
|
47
|
+
tlsVersion = serverHello.serverTlsVersion;
|
|
48
|
+
serverRandom = serverHello.serverRandom;
|
|
49
|
+
logger.info({ serverTLSVersion: tlsVersion, cipherSuite }, 'extracted server hello params');
|
|
50
|
+
break;
|
|
51
|
+
case tls_1.SUPPORTED_RECORD_TYPE_MAP.CERTIFICATE:
|
|
52
|
+
const parseResult = (0, tls_1.parseCertificates)(content, { version: tlsVersion });
|
|
53
|
+
certificates.push(...parseResult.certificates);
|
|
54
|
+
break;
|
|
55
|
+
case tls_1.SUPPORTED_RECORD_TYPE_MAP.CERTIFICATE_VERIFY:
|
|
56
|
+
const signature = (0, tls_1.parseServerCertificateVerify)(content);
|
|
57
|
+
if (!(certificates === null || certificates === void 0 ? void 0 : certificates.length)) {
|
|
58
|
+
throw new Error('No provider certificates received');
|
|
59
|
+
}
|
|
60
|
+
const signatureData = await (0, tls_1.getSignatureDataTls13)(handshakeRawMessages.slice(0, -1), cipherSuite);
|
|
61
|
+
await (0, tls_1.verifyCertificateSignature)({
|
|
62
|
+
...signature,
|
|
63
|
+
publicKey: certificates[0].getPublicKey(),
|
|
64
|
+
signatureData,
|
|
65
|
+
});
|
|
66
|
+
await (0, parse_certificate_1.verifyCertificateChain)(certificates, hostname);
|
|
67
|
+
logger.info({ host: hostname }, 'verified provider certificate chain');
|
|
68
|
+
certVerified = true;
|
|
69
|
+
break;
|
|
70
|
+
case tls_1.SUPPORTED_RECORD_TYPE_MAP.SERVER_KEY_SHARE:
|
|
71
|
+
if (!(certificates === null || certificates === void 0 ? void 0 : certificates.length)) {
|
|
72
|
+
throw new Error('No provider certificates received');
|
|
73
|
+
}
|
|
74
|
+
const keyShare = await (0, tls_1.processServerKeyShare)(content);
|
|
75
|
+
const signatureData12 = await (0, tls_1.getSignatureDataTls12)({
|
|
76
|
+
clientRandom: clientRandom,
|
|
77
|
+
serverRandom: serverRandom,
|
|
78
|
+
curveType: keyShare.publicKeyType,
|
|
79
|
+
publicKey: keyShare.publicKey,
|
|
80
|
+
});
|
|
81
|
+
// verify signature
|
|
82
|
+
await (0, tls_1.verifyCertificateSignature)({
|
|
83
|
+
signature: keyShare.signatureBytes,
|
|
84
|
+
algorithm: keyShare.signatureAlgorithm,
|
|
85
|
+
publicKey: certificates[0].getPublicKey(),
|
|
86
|
+
signatureData: signatureData12,
|
|
87
|
+
});
|
|
88
|
+
await (0, parse_certificate_1.verifyCertificateChain)(certificates, hostname);
|
|
89
|
+
logger.info({ host: hostname }, 'verified provider certificate chain');
|
|
90
|
+
certVerified = true;
|
|
91
|
+
break;
|
|
92
|
+
case tls_1.SUPPORTED_RECORD_TYPE_MAP.FINISHED:
|
|
93
|
+
if (receipt[readPacketIdx].sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_CLIENT) {
|
|
94
|
+
clientFinishedIdx = readPacketIdx;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
serverFinishedIdx = readPacketIdx;
|
|
98
|
+
}
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (!certVerified) {
|
|
103
|
+
throw new Error('No provider certificates received');
|
|
104
|
+
}
|
|
105
|
+
if (tlsVersion === 'TLS1_3' && serverFinishedIdx < 0) {
|
|
106
|
+
throw new Error('server finished message not found');
|
|
107
|
+
}
|
|
108
|
+
if (tlsVersion === 'TLS1_2' && (serverChangeCipherSpecMsgIdx < 0 || clientChangeCipherSpecMsgIdx < 0)) {
|
|
109
|
+
throw new Error('change cipher spec message not found');
|
|
110
|
+
}
|
|
111
|
+
async function readPacket() {
|
|
112
|
+
var _a;
|
|
113
|
+
if (currentPacketIdx > (receipt.length - 1)) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (certVerified && serverFinishedIdx > 0 && clientFinishedIdx > 0) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
readPacketIdx = currentPacketIdx;
|
|
120
|
+
if (!(handshakeData === null || handshakeData === void 0 ? void 0 : handshakeData.length)) {
|
|
121
|
+
const { message, reveal, sender } = receipt[currentPacketIdx];
|
|
122
|
+
const recordHeader = message.slice(0, 5);
|
|
123
|
+
const content = getWithoutHeader(message);
|
|
124
|
+
if (message[0] === tls_1.PACKET_TYPE['CHANGE_CIPHER_SPEC']) { //skip change cipher spec message
|
|
125
|
+
if (sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_CLIENT) {
|
|
126
|
+
clientChangeCipherSpecMsgIdx = currentPacketIdx;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
serverChangeCipherSpecMsgIdx = currentPacketIdx;
|
|
130
|
+
}
|
|
131
|
+
currentPacketIdx++;
|
|
132
|
+
return await readPacket();
|
|
133
|
+
}
|
|
134
|
+
if (message[0] === tls_1.PACKET_TYPE['WRAPPED_RECORD'] ||
|
|
135
|
+
(serverChangeCipherSpecMsgIdx > 0 && sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_SERVER) ||
|
|
136
|
+
(clientChangeCipherSpecMsgIdx > 0 && sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_CLIENT)) { // encrypted
|
|
137
|
+
if (!tlsVersion || !cipherSuite) {
|
|
138
|
+
throw new Error('Could not find cipherSuite to use');
|
|
139
|
+
}
|
|
140
|
+
if (!((_a = reveal === null || reveal === void 0 ? void 0 : reveal.directReveal) === null || _a === void 0 ? void 0 : _a.key)) {
|
|
141
|
+
throw new Error('no direct reveal for handshake packet');
|
|
142
|
+
}
|
|
143
|
+
const { plaintext } = await (0, utils_1.decryptDirect)(reveal === null || reveal === void 0 ? void 0 : reveal.directReveal, cipherSuite, recordHeader, tlsVersion, content);
|
|
144
|
+
handshakeData = plaintext;
|
|
145
|
+
if (tlsVersion === 'TLS1_3') {
|
|
146
|
+
handshakeData = handshakeData.slice(0, -1);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
handshakeData = content;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const type = handshakeData[0];
|
|
154
|
+
const content = (0, tls_1.readWithLength)(handshakeData.slice(1), RECORD_LENGTH_BYTES);
|
|
155
|
+
if (!content) {
|
|
156
|
+
logger.warn('missing bytes from packet');
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const totalLength = 1 + RECORD_LENGTH_BYTES + content.length;
|
|
160
|
+
handshakeRawMessages.push(handshakeData.slice(0, totalLength));
|
|
161
|
+
handshakeData = handshakeData.slice(totalLength);
|
|
162
|
+
if (!handshakeData.length) {
|
|
163
|
+
currentPacketIdx++;
|
|
164
|
+
}
|
|
165
|
+
return { type, content };
|
|
166
|
+
}
|
|
167
|
+
const nextMsgIndex = Math.max(serverFinishedIdx, clientFinishedIdx) + 1;
|
|
168
|
+
return {
|
|
169
|
+
tlsVersion: tlsVersion,
|
|
170
|
+
cipherSuite: cipherSuite,
|
|
171
|
+
hostname: hostname,
|
|
172
|
+
nextMsgIndex
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
function getWithoutHeader(message) {
|
|
176
|
+
// strip the record header (xx 03 03 xx xx)
|
|
177
|
+
return message.slice(5);
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1oYW5kc2hha2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3V0aWxzL3Byb2Nlc3MtaGFuZHNoYWtlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNkJBLDRDQXlNQztBQXRPRCw4Q0FlNkI7QUFDN0Isd0ZBQXlGO0FBQ3pGLHVDQUErRTtBQUUvRSxxQ0FBeUM7QUFHekMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUE7QUFFN0I7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxPQUF5QyxFQUFFLE1BQWM7SUFDL0YsbUVBQW1FO0lBQ25FLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO0lBQ3hCLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQTtJQUNyQixJQUFJLGFBQXlCLENBQUE7SUFDN0IsSUFBSSxVQUFrRCxDQUFBO0lBQ3RELE1BQU0sb0JBQW9CLEdBQWlCLEVBQUUsQ0FBQTtJQUM3QyxNQUFNLFlBQVksR0FBc0IsRUFBRSxDQUFBO0lBQzFDLElBQUksV0FBVyxHQUE0QixTQUFTLENBQUE7SUFDcEQsSUFBSSxVQUFVLEdBQW1DLFNBQVMsQ0FBQTtJQUMxRCxJQUFJLFlBQVksR0FBMkIsU0FBUyxDQUFBO0lBQ3BELElBQUksWUFBWSxHQUEyQixTQUFTLENBQUE7SUFDcEQsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUMxQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzFCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQTtJQUN4QixJQUFJLFFBQVEsR0FBdUIsU0FBUyxDQUFBO0lBQzVDLElBQUksNEJBQTRCLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDckMsSUFBSSw0QkFBNEIsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNyQyxPQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sRUFB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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { IDecryptedTranscript } from 'src/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>;
|
|
@@ -0,0 +1,102 @@
|
|
|
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("src/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
|
+
}
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5LXNlcnZlci1jZXJ0aWZpY2F0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3V0aWxzL3ZlcmlmeS1zZXJ2ZXItY2VydGlmaWNhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBbUJBLDREQWdIQztBQW5JRCw4Q0FNNkI7QUFDN0Isd0ZBQXlGO0FBRXpGLHFDQUEwRDtBQUcxRCxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQTtBQUU3Qjs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLHdCQUF3QixDQUFDLE9BQTZCLEVBQUUsTUFBTTtJQUNuRixNQUFNLGFBQWEsR0FBRyxJQUFBLHNDQUE4QixFQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzdELElBQUksYUFBYSxHQUFHLElBQUEsNEJBQXNCLEVBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUN0RixJQUFJLFVBQXlDLENBQUE7SUFDN0MsTUFBTSxvQkFBb0IsR0FBaUIsRUFBRSxDQUFBO0lBQzdDLE1BQU0sWUFBWSxHQUFzQixFQUFFLENBQUE7SUFDMUMsSUFBSSxXQUFXLEdBQTRCLFNBQVMsQ0FBQTtJQUNwRCxJQUFJLFlBQVksR0FBMkIsU0FBUyxDQUFBO0lBQ3BELElBQUksWUFBWSxHQUEyQixTQUFTLENBQUE7SUFFcEQsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFBO0lBQ3hCLE9BQU0sQ0FBQyxVQUFVLEdBQUcsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BELE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsVUFBVSxDQUFBO1FBRXBDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDZixLQUFLLCtCQUF5QixDQUFDLFlBQVk7Z0JBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUEsc0JBQWdCLEVBQUMs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
|