@reclaimprotocol/attestor-core 4.0.3 → 5.0.1-beta.2

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.
Files changed (297) hide show
  1. package/LICENSE +660 -660
  2. package/README.md +1 -2
  3. package/lib/avs/abis/avsDirectoryABI.js +341 -342
  4. package/lib/avs/abis/delegationABI.js +4 -5
  5. package/lib/avs/abis/registryABI.js +722 -723
  6. package/lib/avs/client/create-claim-on-avs.d.ts +5 -5
  7. package/lib/avs/client/create-claim-on-avs.js +160 -139
  8. package/lib/avs/config.d.ts +1 -1
  9. package/lib/avs/config.js +25 -23
  10. package/lib/avs/contracts/ReclaimServiceManager.d.ts +436 -532
  11. package/lib/avs/contracts/ReclaimServiceManager.js +0 -3
  12. package/lib/avs/contracts/common.d.ts +40 -11
  13. package/lib/avs/contracts/common.js +0 -3
  14. package/lib/avs/contracts/factories/ReclaimServiceManager__factory.d.ts +13 -11
  15. package/lib/avs/contracts/factories/ReclaimServiceManager__factory.js +1157 -1148
  16. package/lib/avs/contracts/factories/index.d.ts +1 -1
  17. package/lib/avs/contracts/factories/index.js +4 -9
  18. package/lib/avs/contracts/index.d.ts +3 -3
  19. package/lib/avs/contracts/index.js +6 -40
  20. package/lib/avs/types/index.d.ts +6 -6
  21. package/lib/avs/types/index.js +0 -3
  22. package/lib/avs/utils/contracts.d.ts +14 -14
  23. package/lib/avs/utils/contracts.js +50 -35
  24. package/lib/avs/utils/register.d.ts +3 -3
  25. package/lib/avs/utils/register.js +71 -79
  26. package/lib/avs/utils/tasks.d.ts +4 -4
  27. package/lib/avs/utils/tasks.js +44 -41
  28. package/lib/client/create-claim.d.ts +2 -2
  29. package/lib/client/create-claim.js +437 -400
  30. package/lib/client/index.d.ts +3 -3
  31. package/lib/client/index.js +3 -20
  32. package/lib/client/tunnels/make-rpc-tcp-tunnel.d.ts +2 -2
  33. package/lib/client/tunnels/make-rpc-tcp-tunnel.js +49 -56
  34. package/lib/client/tunnels/make-rpc-tls-tunnel.d.ts +4 -3
  35. package/lib/client/tunnels/make-rpc-tls-tunnel.js +123 -131
  36. package/lib/client/utils/attestor-pool.d.ts +3 -1
  37. package/lib/client/utils/attestor-pool.js +21 -25
  38. package/lib/client/utils/client-socket.d.ts +4 -4
  39. package/lib/client/utils/client-socket.js +114 -94
  40. package/lib/client/utils/message-handler.d.ts +2 -2
  41. package/lib/client/utils/message-handler.js +89 -86
  42. package/lib/config/index.d.ts +6 -3
  43. package/lib/config/index.js +60 -37
  44. package/lib/external-rpc/benchmark.d.ts +1 -0
  45. package/lib/external-rpc/benchmark.js +82 -0
  46. package/lib/external-rpc/event-bus.d.ts +7 -0
  47. package/lib/external-rpc/event-bus.js +17 -0
  48. package/lib/external-rpc/global.d.js +0 -0
  49. package/lib/external-rpc/handle-incoming-msg.d.ts +2 -0
  50. package/lib/external-rpc/handle-incoming-msg.js +241 -0
  51. package/lib/external-rpc/index.d.ts +3 -0
  52. package/lib/external-rpc/index.js +3 -0
  53. package/lib/external-rpc/jsc-polyfills/1.d.ts +14 -0
  54. package/lib/external-rpc/jsc-polyfills/1.js +80 -0
  55. package/lib/external-rpc/jsc-polyfills/2.js +15 -0
  56. package/lib/external-rpc/jsc-polyfills/event.d.ts +10 -0
  57. package/lib/external-rpc/jsc-polyfills/event.js +19 -0
  58. package/lib/external-rpc/jsc-polyfills/index.d.ts +2 -0
  59. package/lib/external-rpc/jsc-polyfills/index.js +2 -0
  60. package/lib/external-rpc/jsc-polyfills/ws.d.ts +21 -0
  61. package/lib/external-rpc/jsc-polyfills/ws.js +83 -0
  62. package/lib/external-rpc/setup-browser.d.ts +6 -0
  63. package/lib/external-rpc/setup-browser.js +33 -0
  64. package/lib/external-rpc/setup-jsc.d.ts +24 -0
  65. package/lib/external-rpc/setup-jsc.js +22 -0
  66. package/lib/{window-rpc → external-rpc}/types.d.ts +56 -35
  67. package/lib/external-rpc/types.js +0 -0
  68. package/lib/external-rpc/utils.d.ts +20 -0
  69. package/lib/external-rpc/utils.js +100 -0
  70. package/lib/external-rpc/zk.d.ts +14 -0
  71. package/lib/external-rpc/zk.js +58 -0
  72. package/lib/index.d.ts +8 -9
  73. package/lib/index.js +12 -49
  74. package/lib/mechain/abis/governanceABI.js +460 -461
  75. package/lib/mechain/abis/taskABI.js +505 -506
  76. package/lib/mechain/client/create-claim-on-mechain.d.ts +3 -3
  77. package/lib/mechain/client/create-claim-on-mechain.js +31 -30
  78. package/lib/mechain/client/index.d.ts +1 -1
  79. package/lib/mechain/client/index.js +1 -18
  80. package/lib/mechain/constants/index.js +8 -7
  81. package/lib/mechain/index.d.ts +2 -2
  82. package/lib/mechain/index.js +2 -19
  83. package/lib/mechain/types/index.d.ts +2 -2
  84. package/lib/mechain/types/index.js +0 -3
  85. package/lib/proto/api.d.ts +182 -39
  86. package/lib/proto/api.js +4105 -3555
  87. package/lib/proto/tee-bundle.d.ts +156 -0
  88. package/lib/proto/tee-bundle.js +1296 -0
  89. package/lib/providers/http/index.d.ts +16 -1
  90. package/lib/providers/http/index.js +603 -576
  91. package/lib/providers/http/patch-parse5-tree.d.ts +6 -0
  92. package/lib/providers/http/patch-parse5-tree.js +34 -0
  93. package/lib/providers/http/utils.d.ts +7 -4
  94. package/lib/providers/http/utils.js +240 -317
  95. package/lib/providers/index.d.ts +1 -1
  96. package/lib/providers/index.js +5 -9
  97. package/lib/scripts/check-avs-registration.d.ts +1 -1
  98. package/lib/scripts/check-avs-registration.js +24 -25
  99. package/lib/scripts/fallbacks/crypto.d.ts +1 -0
  100. package/lib/scripts/fallbacks/crypto.js +4 -0
  101. package/lib/scripts/fallbacks/empty.d.ts +3 -0
  102. package/lib/scripts/fallbacks/empty.js +4 -0
  103. package/lib/scripts/fallbacks/re2.d.ts +1 -0
  104. package/lib/scripts/fallbacks/re2.js +7 -0
  105. package/lib/scripts/fallbacks/snarkjs.d.ts +1 -0
  106. package/lib/scripts/fallbacks/snarkjs.js +10 -0
  107. package/lib/scripts/fallbacks/stwo.d.ts +6 -0
  108. package/lib/scripts/fallbacks/stwo.js +159 -0
  109. package/lib/scripts/generate-provider-types.js +92 -73
  110. package/lib/scripts/generate-receipt.d.ts +2 -2
  111. package/lib/scripts/generate-receipt.js +94 -83
  112. package/lib/scripts/generate-toprf-keys.js +17 -16
  113. package/lib/scripts/jsc-cli-rpc.d.ts +1 -0
  114. package/lib/scripts/jsc-cli-rpc.js +35 -0
  115. package/lib/scripts/register-avs-operator.d.ts +1 -1
  116. package/lib/scripts/register-avs-operator.js +3 -7
  117. package/lib/scripts/start-server.d.ts +1 -1
  118. package/lib/scripts/start-server.js +9 -11
  119. package/lib/scripts/update-avs-metadata.d.ts +1 -1
  120. package/lib/scripts/update-avs-metadata.js +17 -19
  121. package/lib/scripts/utils.js +8 -9
  122. package/lib/scripts/whitelist-operator.d.ts +1 -1
  123. package/lib/scripts/whitelist-operator.js +13 -15
  124. package/lib/server/create-server.d.ts +3 -2
  125. package/lib/server/create-server.js +98 -85
  126. package/lib/server/handlers/claimTeeBundle.d.ts +6 -0
  127. package/lib/server/handlers/claimTeeBundle.js +232 -0
  128. package/lib/server/handlers/claimTunnel.d.ts +1 -1
  129. package/lib/server/handlers/claimTunnel.js +75 -73
  130. package/lib/server/handlers/completeClaimOnChain.d.ts +1 -1
  131. package/lib/server/handlers/completeClaimOnChain.js +27 -26
  132. package/lib/server/handlers/createClaimOnChain.d.ts +1 -1
  133. package/lib/server/handlers/createClaimOnChain.js +30 -29
  134. package/lib/server/handlers/createTaskOnMechain.d.ts +1 -1
  135. package/lib/server/handlers/createTaskOnMechain.js +54 -49
  136. package/lib/server/handlers/createTunnel.d.ts +1 -1
  137. package/lib/server/handlers/createTunnel.js +91 -94
  138. package/lib/server/handlers/disconnectTunnel.d.ts +1 -1
  139. package/lib/server/handlers/disconnectTunnel.js +6 -8
  140. package/lib/server/handlers/fetchCertificateBytes.d.ts +2 -0
  141. package/lib/server/handlers/fetchCertificateBytes.js +57 -0
  142. package/lib/server/handlers/index.d.ts +1 -1
  143. package/lib/server/handlers/index.js +24 -21
  144. package/lib/server/handlers/init.d.ts +1 -1
  145. package/lib/server/handlers/init.js +31 -34
  146. package/lib/server/handlers/toprf.d.ts +1 -1
  147. package/lib/server/handlers/toprf.js +17 -19
  148. package/lib/server/index.d.ts +4 -4
  149. package/lib/server/index.js +4 -21
  150. package/lib/server/socket.d.ts +7 -7
  151. package/lib/server/socket.js +104 -106
  152. package/lib/server/tunnels/make-tcp-tunnel.d.ts +5 -3
  153. package/lib/server/tunnels/make-tcp-tunnel.js +189 -162
  154. package/lib/server/utils/apm.d.ts +1 -1
  155. package/lib/server/utils/apm.js +26 -40
  156. package/lib/server/utils/assert-valid-claim-request.d.ts +6 -5
  157. package/lib/server/utils/assert-valid-claim-request.js +339 -185
  158. package/lib/server/utils/config-env.js +4 -7
  159. package/lib/server/utils/dns.js +18 -16
  160. package/lib/server/utils/gcp-attestation.d.ts +17 -0
  161. package/lib/server/utils/gcp-attestation.js +237 -0
  162. package/lib/server/utils/generics.d.ts +3 -3
  163. package/lib/server/utils/generics.js +37 -51
  164. package/lib/server/utils/iso.js +255 -256
  165. package/lib/server/utils/keep-alive.d.ts +2 -2
  166. package/lib/server/utils/keep-alive.js +36 -40
  167. package/lib/server/utils/nitro-attestation.d.ts +33 -0
  168. package/lib/server/utils/nitro-attestation.js +249 -0
  169. package/lib/server/utils/oprf-raw.d.ts +21 -0
  170. package/lib/server/utils/oprf-raw.js +61 -0
  171. package/lib/server/utils/process-handshake.d.ts +3 -3
  172. package/lib/server/utils/process-handshake.js +217 -175
  173. package/lib/server/utils/proxy-session.d.ts +1 -0
  174. package/lib/server/utils/proxy-session.js +6 -0
  175. package/lib/server/utils/tee-oprf-mpc-verification.d.ts +16 -0
  176. package/lib/server/utils/tee-oprf-mpc-verification.js +86 -0
  177. package/lib/server/utils/tee-oprf-verification.d.ts +24 -0
  178. package/lib/server/utils/tee-oprf-verification.js +151 -0
  179. package/lib/server/utils/tee-transcript-reconstruction.d.ts +24 -0
  180. package/lib/server/utils/tee-transcript-reconstruction.js +140 -0
  181. package/lib/server/utils/tee-verification.d.ts +28 -0
  182. package/lib/server/utils/tee-verification.js +358 -0
  183. package/lib/{utils → server/utils}/validation.d.ts +1 -1
  184. package/lib/server/utils/validation.js +45 -0
  185. package/lib/types/bgp.js +0 -3
  186. package/lib/types/claims.d.ts +7 -10
  187. package/lib/types/claims.js +0 -3
  188. package/lib/types/client.d.ts +5 -5
  189. package/lib/types/client.js +0 -3
  190. package/lib/types/general.d.ts +29 -4
  191. package/lib/types/general.js +0 -3
  192. package/lib/types/handlers.d.ts +3 -3
  193. package/lib/types/handlers.js +0 -3
  194. package/lib/types/index.d.ts +10 -10
  195. package/lib/types/index.js +10 -27
  196. package/lib/types/providers.d.ts +15 -4
  197. package/lib/types/providers.gen.d.ts +15 -1
  198. package/lib/types/providers.gen.js +15 -13
  199. package/lib/types/providers.js +0 -3
  200. package/lib/types/rpc.d.ts +2 -2
  201. package/lib/types/rpc.js +0 -3
  202. package/lib/types/signatures.js +0 -3
  203. package/lib/types/tunnel.d.ts +2 -2
  204. package/lib/types/tunnel.js +0 -3
  205. package/lib/types/zk.d.ts +17 -2
  206. package/lib/types/zk.js +0 -3
  207. package/lib/utils/auth.d.ts +2 -1
  208. package/lib/utils/auth.js +66 -59
  209. package/lib/utils/b64-json.js +13 -19
  210. package/lib/utils/bgp-listener.d.ts +1 -1
  211. package/lib/utils/bgp-listener.js +111 -114
  212. package/lib/utils/claims.d.ts +3 -3
  213. package/lib/utils/claims.js +78 -101
  214. package/lib/utils/env.js +15 -16
  215. package/lib/utils/error.d.ts +6 -7
  216. package/lib/utils/error.js +50 -39
  217. package/lib/utils/generics.d.ts +15 -13
  218. package/lib/utils/generics.js +217 -297
  219. package/lib/utils/http-parser.d.ts +1 -1
  220. package/lib/utils/http-parser.js +186 -237
  221. package/lib/utils/index.d.ts +13 -12
  222. package/lib/utils/index.js +13 -29
  223. package/lib/utils/logger.d.ts +1 -1
  224. package/lib/utils/logger.js +69 -87
  225. package/lib/utils/prepare-packets.d.ts +3 -3
  226. package/lib/utils/prepare-packets.js +66 -58
  227. package/lib/utils/redactions.d.ts +20 -1
  228. package/lib/utils/redactions.js +116 -129
  229. package/lib/utils/retries.d.ts +1 -1
  230. package/lib/utils/retries.js +24 -26
  231. package/lib/utils/signatures/eth.d.ts +1 -1
  232. package/lib/utils/signatures/eth.js +28 -30
  233. package/lib/utils/signatures/index.d.ts +3 -3
  234. package/lib/utils/signatures/index.js +11 -10
  235. package/lib/utils/socket-base.d.ts +6 -5
  236. package/lib/utils/socket-base.js +89 -88
  237. package/lib/utils/tls.d.ts +1 -1
  238. package/lib/utils/tls.js +54 -28
  239. package/lib/utils/ws.d.ts +1 -6
  240. package/lib/utils/ws.js +17 -33
  241. package/lib/utils/zk.d.ts +28 -12
  242. package/lib/utils/zk.js +587 -406
  243. package/package.json +72 -60
  244. package/lib/avs/tests/test.operator.d.ts +0 -11
  245. package/lib/avs/tests/test.operator.js +0 -313
  246. package/lib/avs/tests/utils.d.ts +0 -2
  247. package/lib/avs/tests/utils.js +0 -50
  248. package/lib/scripts/verify-root-ca.d.ts +0 -1
  249. package/lib/scripts/verify-root-ca.js +0 -51
  250. package/lib/tests/describe-with-server.d.ts +0 -20
  251. package/lib/tests/describe-with-server.js +0 -64
  252. package/lib/tests/mock-provider-server.d.ts +0 -13
  253. package/lib/tests/mock-provider-server.js +0 -65
  254. package/lib/tests/mocks.d.ts +0 -4
  255. package/lib/tests/mocks.js +0 -23
  256. package/lib/tests/test.auth.js +0 -75
  257. package/lib/tests/test.bgp-listener.js +0 -169
  258. package/lib/tests/test.claim-creation.js +0 -280
  259. package/lib/tests/test.http-parser.d.ts +0 -1
  260. package/lib/tests/test.http-parser.js +0 -120
  261. package/lib/tests/test.http-provider-utils.js +0 -2416
  262. package/lib/tests/test.http-provider.d.ts +0 -1
  263. package/lib/tests/test.http-provider.js +0 -114
  264. package/lib/tests/test.rpc-communication.d.ts +0 -1
  265. package/lib/tests/test.rpc-communication.js +0 -64
  266. package/lib/tests/test.rpc-tunnel.d.ts +0 -1
  267. package/lib/tests/test.rpc-tunnel.js +0 -172
  268. package/lib/tests/test.signatures.d.ts +0 -1
  269. package/lib/tests/test.signatures.js +0 -24
  270. package/lib/tests/test.tcp-tunnel.d.ts +0 -1
  271. package/lib/tests/test.tcp-tunnel.js +0 -64
  272. package/lib/tests/test.zk.d.ts +0 -1
  273. package/lib/tests/test.zk.js +0 -337
  274. package/lib/tests/utils.d.ts +0 -18
  275. package/lib/tests/utils.js +0 -64
  276. package/lib/utils/atomic-operations.d.ts +0 -24
  277. package/lib/utils/atomic-operations.js +0 -65
  278. package/lib/utils/benchmark.d.ts +0 -1
  279. package/lib/utils/benchmark.js +0 -70
  280. package/lib/utils/connection-state-machine.d.ts +0 -43
  281. package/lib/utils/connection-state-machine.js +0 -129
  282. package/lib/utils/resource-monitor.d.ts +0 -61
  283. package/lib/utils/resource-monitor.js +0 -107
  284. package/lib/utils/validation.js +0 -46
  285. package/lib/window-rpc/index.d.ts +0 -3
  286. package/lib/window-rpc/index.js +0 -20
  287. package/lib/window-rpc/setup-window-rpc.d.ts +0 -5
  288. package/lib/window-rpc/setup-window-rpc.js +0 -291
  289. package/lib/window-rpc/types.js +0 -3
  290. package/lib/window-rpc/utils.d.ts +0 -14
  291. package/lib/window-rpc/utils.js +0 -102
  292. package/lib/window-rpc/window-rpc-zk.d.ts +0 -15
  293. package/lib/window-rpc/window-rpc-zk.js +0 -85
  294. /package/lib/{tests/test.auth.d.ts → external-rpc/jsc-polyfills/2.d.ts} +0 -0
  295. /package/lib/{tests/test.bgp-listener.d.ts → scripts/build-browser.d.ts} +0 -0
  296. /package/lib/{tests/test.claim-creation.d.ts → scripts/build-jsc.d.ts} +0 -0
  297. /package/lib/{tests/test.http-provider-utils.d.ts → scripts/build-lib.d.ts} +0 -0
@@ -0,0 +1,237 @@
1
+ import crypto, { X509Certificate } from "crypto";
2
+ let gcpKeysCache = null;
3
+ let gcpKeysCacheTime = 0;
4
+ const GCP_KEYS_CACHE_TTL = 36e5;
5
+ const GCP_CONFIDENTIAL_SPACE_ROOT_CA = `-----BEGIN CERTIFICATE-----
6
+ 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
38
+ uyT5CnJulxSC5CT1
39
+ -----END CERTIFICATE-----`;
40
+ function base64urlDecode(input) {
41
+ let base64 = input.replace(/-/g, "+").replace(/_/g, "/");
42
+ while (base64.length % 4) {
43
+ base64 += "=";
44
+ }
45
+ return Buffer.from(base64, "base64");
46
+ }
47
+ async function fetchGooglePublicKeys(logger) {
48
+ const now = Date.now();
49
+ if (gcpKeysCache && now - gcpKeysCacheTime < GCP_KEYS_CACHE_TTL) {
50
+ if (logger) {
51
+ logger.debug("Using cached Google public keys");
52
+ }
53
+ return gcpKeysCache;
54
+ }
55
+ if (logger) {
56
+ logger.info("Fetching Google public keys from https://www.googleapis.com/oauth2/v3/certs");
57
+ }
58
+ const response = await fetch("https://www.googleapis.com/oauth2/v3/certs");
59
+ if (!response.ok) {
60
+ throw new Error(`Failed to fetch Google keys: ${response.status} ${response.statusText}`);
61
+ }
62
+ const keys = await response.json();
63
+ gcpKeysCache = keys;
64
+ gcpKeysCacheTime = now;
65
+ if (logger) {
66
+ logger.info(`Fetched ${keys.keys.length} Google public keys`);
67
+ }
68
+ return keys;
69
+ }
70
+ function jwkToPublicKey(jwk) {
71
+ return crypto.createPublicKey({
72
+ key: {
73
+ kty: "RSA",
74
+ n: jwk.n,
75
+ e: jwk.e
76
+ },
77
+ format: "jwk"
78
+ });
79
+ }
80
+ function verifyX5cChain(x5cChain, logger) {
81
+ if (!x5cChain || x5cChain.length === 0) {
82
+ throw new Error("Empty x5c certificate chain");
83
+ }
84
+ const leafCertPem = `-----BEGIN CERTIFICATE-----
85
+ ${x5cChain[0]}
86
+ -----END CERTIFICATE-----`;
87
+ const leafCert = new X509Certificate(leafCertPem);
88
+ if (logger) {
89
+ logger.info(`x5c leaf certificate: subject=${leafCert.subject}, issuer=${leafCert.issuer}`);
90
+ }
91
+ const rootCert = new X509Certificate(GCP_CONFIDENTIAL_SPACE_ROOT_CA);
92
+ let currentCert = leafCert;
93
+ for (let i = 1; i < x5cChain.length; i++) {
94
+ const intermediatePem = `-----BEGIN CERTIFICATE-----
95
+ ${x5cChain[i]}
96
+ -----END CERTIFICATE-----`;
97
+ const intermediateCert = new X509Certificate(intermediatePem);
98
+ const isValid = currentCert.verify(intermediateCert.publicKey);
99
+ if (!isValid) {
100
+ throw new Error(`Certificate chain verification failed at level ${i}`);
101
+ }
102
+ if (logger) {
103
+ logger.debug(`Verified cert level ${i}: ${intermediateCert.subject}`);
104
+ }
105
+ currentCert = intermediateCert;
106
+ }
107
+ const isRootValid = currentCert.verify(rootCert.publicKey);
108
+ if (!isRootValid) {
109
+ throw new Error("Certificate chain does not root to GCP Confidential Space Root CA");
110
+ }
111
+ if (logger) {
112
+ logger.info("x5c certificate chain verified successfully");
113
+ }
114
+ return leafCert.publicKey;
115
+ }
116
+ async function validateGcpAttestationAndExtractKey(attestationBytes, logger) {
117
+ const errors = [];
118
+ try {
119
+ const jwtString = Buffer.from(attestationBytes).toString("utf8");
120
+ const parts = jwtString.split(".");
121
+ if (parts.length !== 3) {
122
+ errors.push("Invalid JWT format: expected 3 parts");
123
+ return { isValid: false, errors };
124
+ }
125
+ const [headerB64, payloadB64, signatureB64] = parts;
126
+ const headerJson = base64urlDecode(headerB64).toString("utf8");
127
+ const payloadJson = base64urlDecode(payloadB64).toString("utf8");
128
+ const header = JSON.parse(headerJson);
129
+ const payload = JSON.parse(payloadJson);
130
+ if (logger) {
131
+ logger.info(`GCP JWT header: kid=${header.kid}, alg=${header.alg}`);
132
+ logger.info(`GCP JWT payload: iss=${payload.iss}, aud=${payload.aud}`);
133
+ }
134
+ const now = Math.floor(Date.now() / 1e3);
135
+ const validIssuers = [
136
+ "https://accounts.google.com",
137
+ "https://confidentialcomputing.googleapis.com"
138
+ ];
139
+ if (!validIssuers.includes(payload.iss)) {
140
+ errors.push(`Invalid issuer: expected one of ${validIssuers.join(", ")}, got "${payload.iss}"`);
141
+ }
142
+ if (payload.exp <= now) {
143
+ errors.push(`Token expired: exp=${payload.exp}, now=${now}`);
144
+ }
145
+ if (payload.iat > now + 60) {
146
+ errors.push(`Token issued in future: iat=${payload.iat}, now=${now}`);
147
+ }
148
+ const hasReclaimAudience = payload.aud?.includes("reclaimprotocol.org");
149
+ const hasGcpStsAudience = payload.aud?.includes("sts.googleapis.com");
150
+ if (!hasReclaimAudience && !hasGcpStsAudience) {
151
+ errors.push(`Invalid audience: expected "reclaimprotocol.org" or "sts.googleapis.com", got "${payload.aud}"`);
152
+ }
153
+ if (errors.length > 0) {
154
+ return { isValid: false, errors };
155
+ }
156
+ let publicKey;
157
+ if (header.x5c && header.x5c.length > 0) {
158
+ if (logger) {
159
+ logger.info(`Using x5c certificate chain (${header.x5c.length} certificates)`);
160
+ }
161
+ publicKey = verifyX5cChain(header.x5c, logger);
162
+ } else if (header.kid) {
163
+ if (logger) {
164
+ logger.info(`Using OIDC token with kid: ${header.kid}`);
165
+ }
166
+ const jwks = await fetchGooglePublicKeys(logger);
167
+ const jwk = jwks.keys.find((k) => k.kid === header.kid);
168
+ if (!jwk) {
169
+ errors.push(`No public key found for kid: ${header.kid}`);
170
+ return { isValid: false, errors };
171
+ }
172
+ publicKey = jwkToPublicKey(jwk);
173
+ } else {
174
+ errors.push("JWT header must contain either x5c or kid field");
175
+ return { isValid: false, errors };
176
+ }
177
+ const signedData = `${headerB64}.${payloadB64}`;
178
+ const signature = base64urlDecode(signatureB64);
179
+ const verify = crypto.createVerify("RSA-SHA256");
180
+ verify.update(signedData);
181
+ const isSignatureValid = verify.verify(publicKey, signature);
182
+ if (!isSignatureValid) {
183
+ errors.push("Signature verification failed");
184
+ return { isValid: false, errors };
185
+ }
186
+ if (logger) {
187
+ logger.info("GCP JWT signature verified successfully");
188
+ }
189
+ if (!payload.eat_nonce) {
190
+ errors.push("No eat_nonce field found in JWT payload");
191
+ return { isValid: false, errors };
192
+ }
193
+ const match = payload.eat_nonce.match(/^(tee_[kt])_public_key:0x([0-9a-fA-F]{40})$/);
194
+ if (!match) {
195
+ errors.push(`Invalid eat_nonce format: ${payload.eat_nonce}`);
196
+ return { isValid: false, errors };
197
+ }
198
+ const userDataType = match[1];
199
+ const hexAddress = match[2];
200
+ const ethAddress = new Uint8Array(Buffer.from(hexAddress, "hex"));
201
+ if (logger) {
202
+ logger.info(`Extracted address from eat_nonce: ${payload.eat_nonce}`);
203
+ }
204
+ let pcr0 = "gcp-no-digest";
205
+ if (payload.google?.compute_engine?.image_digest) {
206
+ pcr0 = payload.google.compute_engine.image_digest;
207
+ } else if (payload.submods?.container?.image_digest) {
208
+ pcr0 = payload.submods.container.image_digest;
209
+ }
210
+ if (payload.dbgstat === "enabled" && pcr0.startsWith("sha256:")) {
211
+ pcr0 = "debug_" + pcr0;
212
+ }
213
+ const envVars = payload.submods?.container?.env || {};
214
+ if (logger) {
215
+ const hexAddr = Buffer.from(ethAddress).toString("hex");
216
+ logger.info(`Extracted ETH address from GCP attestation: 0x${hexAddr}, type: ${userDataType}, pcr0: ${pcr0}`);
217
+ if (Object.keys(envVars).length > 0) {
218
+ logger.debug(`Environment variables: ${Object.keys(envVars).join(", ")}`);
219
+ }
220
+ }
221
+ return {
222
+ isValid: true,
223
+ errors: [],
224
+ ethAddress,
225
+ userDataType,
226
+ pcr0,
227
+ envVars
228
+ };
229
+ } catch (error) {
230
+ const errorMsg = error instanceof Error ? error.message : String(error);
231
+ errors.push(`GCP attestation validation error: ${errorMsg}`);
232
+ return { isValid: false, errors };
233
+ }
234
+ }
235
+ export {
236
+ validateGcpAttestationAndExtractKey
237
+ };
@@ -1,5 +1,5 @@
1
- import { IncomingMessage } from 'http';
2
- import { ServiceSignatureType } from '../../proto/api';
1
+ import type { IncomingMessage } from 'http';
2
+ import type { ServiceSignatureType } from '#src/proto/api.ts';
3
3
  /**
4
4
  * Sign message using the PRIVATE_KEY env var.
5
5
  */
@@ -19,4 +19,4 @@ export declare function niceParseJsonObject(data: string, key: string): any;
19
19
  * Extract any initial messages sent via the query string,
20
20
  * in the `messages` parameter.
21
21
  */
22
- export declare function getInitialMessagesFromQuery(req: IncomingMessage): import("../../proto/api").RPCMessage[];
22
+ export declare function getInitialMessagesFromQuery(req: IncomingMessage): import("#src/proto/api.ts").RPCMessage[];
@@ -1,59 +1,45 @@
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("../../proto/api");
9
- const utils_1 = require("../../utils");
10
- const env_1 = require("../../utils/env");
11
- const signatures_1 = require("../../utils/signatures");
12
- const PRIVATE_KEY = (0, env_1.getEnvVariable)('PRIVATE_KEY');
13
- /**
14
- * Sign message using the PRIVATE_KEY env var.
15
- */
1
+ import { RPCMessages } from "../../proto/api.js";
2
+ import { getEnvVariable } from "../../utils/env.js";
3
+ import { AttestorError, strToUint8Array } from "../../utils/index.js";
4
+ import { SIGNATURES } from "../../utils/signatures/index.js";
5
+ const PRIVATE_KEY = getEnvVariable("PRIVATE_KEY");
16
6
  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);
7
+ const { sign } = SIGNATURES[scheme];
8
+ return sign(
9
+ typeof data === "string" ? strToUint8Array(data) : data,
10
+ PRIVATE_KEY
11
+ );
19
12
  }
20
- /**
21
- * Obtain the address on chain, from the PRIVATE_KEY env var.
22
- */
23
13
  function getAttestorAddress(scheme) {
24
- const { getAddress, getPublicKey } = signatures_1.SIGNATURES[scheme];
25
- const publicKey = getPublicKey(PRIVATE_KEY);
26
- return getAddress(publicKey);
14
+ const { getAddress, getPublicKey } = SIGNATURES[scheme];
15
+ const publicKey = getPublicKey(PRIVATE_KEY);
16
+ return getAddress(publicKey);
27
17
  }
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
18
  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
- }
19
+ if (!data) {
20
+ return {};
21
+ }
22
+ try {
23
+ return JSON.parse(data);
24
+ } catch (e) {
25
+ throw AttestorError.badRequest(
26
+ `Invalid JSON in ${key}: ${e.message}`
27
+ );
28
+ }
44
29
  }
45
- /**
46
- * Extract any initial messages sent via the query string,
47
- * in the `messages` parameter.
48
- */
49
30
  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;
31
+ const url = new URL(req.url, "http://localhost");
32
+ const messagesB64 = url.searchParams.get("messages");
33
+ if (!messagesB64?.length) {
34
+ return [];
35
+ }
36
+ const msgsBytes = Buffer.from(messagesB64, "base64");
37
+ const msgs = RPCMessages.decode(msgsBytes);
38
+ return msgs.messages;
58
39
  }
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3V0aWxzL2dlbmVyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBWUEsd0NBU0M7QUFLRCxnREFJQztBQVFELGtEQVlDO0FBTUQsa0VBVUM7QUFsRUQsOENBQXNEO0FBRXRELHVDQUFpRTtBQUNqRSxxQ0FBeUM7QUFDekMsdUNBQThDO0FBQzlDLHFEQUFpRDtBQUVqRCxNQUFNLFdBQVcsR0FBRyxJQUFBLG9CQUFjLEVBQUMsYUFBYSxDQUFFLENBQUE7QUFFbEQ7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQzdCLElBQXlCLEVBQ3pCLE1BQTRCO0lBRTVCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ25DLE9BQU8sSUFBSSxDQUNWLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBQSxxQkFBZSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ3ZELFdBQVcsQ0FDWCxDQUFBO0FBQ0YsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsTUFBNEI7SUFDOUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsR0FBRyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMzQyxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUM3QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsR0FBVztJQUM1RCxJQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQTtJQUNWLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUFDLE9BQU0sQ0FBQyxFQUFFLENBQUM7UUFDWCxNQUFNLHFCQUFhLENBQUMsVUFBVSxDQUM3QixtQkFBbUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FDdEMsQ0FBQTtJQUNGLENBQUM7QUFDRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsMkJBQTJCLENBQUMsR0FBb0I7SUFDL0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQ2pELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3BELElBQUcsQ0FBQyxDQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxNQUFNLENBQUEsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxDQUFBO0lBQ1YsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3BELE1BQU0sSUFBSSxHQUFHLGlCQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtBQUNyQixDQUFDIn0=
40
+ export {
41
+ getAttestorAddress,
42
+ getInitialMessagesFromQuery,
43
+ niceParseJsonObject,
44
+ signAsAttestor
45
+ };