@joclaim/attestor-core 0.2.0 → 0.2.3
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 +21 -15
- package/lib/avs/abis/avsDirectoryABI.d.ts +60 -0
- package/lib/avs/abis/avsDirectoryABI.js +340 -0
- package/lib/avs/abis/delegationABI.d.ts +126 -0
- package/lib/avs/abis/delegationABI.js +1 -0
- package/lib/avs/abis/registryABI.d.ts +136 -0
- package/lib/avs/abis/registryABI.js +725 -0
- package/lib/avs/client/create-claim-on-avs.d.ts +12 -0
- package/lib/avs/client/create-claim-on-avs.js +138 -0
- package/lib/avs/config.d.ts +7 -0
- package/lib/avs/config.js +20 -0
- package/lib/avs/contracts/ReclaimServiceManager.d.ts +697 -0
- package/lib/avs/contracts/ReclaimServiceManager.js +1 -0
- package/lib/avs/contracts/common.d.ts +21 -0
- package/lib/avs/contracts/common.js +1 -0
- package/lib/avs/contracts/factories/ReclaimServiceManager__factory.d.ts +888 -0
- package/lib/avs/contracts/factories/ReclaimServiceManager__factory.js +1169 -0
- package/lib/avs/contracts/factories/index.d.ts +1 -0
- package/{src/avs/contracts/factories/index.ts → lib/avs/contracts/factories/index.js} +1 -1
- package/{src/avs/contracts/index.ts → lib/avs/contracts/index.d.ts} +0 -3
- package/lib/avs/contracts/index.js +2 -0
- package/lib/avs/types/index.d.ts +55 -0
- package/lib/avs/types/index.js +1 -0
- package/lib/avs/utils/contracts.d.ts +21 -0
- package/lib/avs/utils/contracts.js +33 -0
- package/lib/avs/utils/register.d.ts +27 -0
- package/lib/avs/utils/register.js +78 -0
- package/lib/avs/utils/tasks.d.ts +22 -0
- package/lib/avs/utils/tasks.js +40 -0
- package/lib/client/create-claim.d.ts +5 -0
- package/lib/client/create-claim.js +437 -0
- package/lib/client/index.d.ts +3 -0
- package/lib/client/index.js +3 -0
- package/lib/client/tunnels/make-rpc-tcp-tunnel.d.ts +16 -0
- package/lib/client/tunnels/make-rpc-tcp-tunnel.js +51 -0
- package/lib/client/tunnels/make-rpc-tls-tunnel.d.ts +26 -0
- package/lib/client/tunnels/make-rpc-tls-tunnel.js +131 -0
- package/lib/client/utils/attestor-pool.d.ts +8 -0
- package/lib/client/utils/attestor-pool.js +25 -0
- package/lib/client/utils/client-socket.d.ts +11 -0
- package/lib/client/utils/client-socket.js +98 -0
- package/lib/client/utils/message-handler.d.ts +4 -0
- package/lib/client/utils/message-handler.js +87 -0
- package/lib/config/index.d.ts +30 -0
- package/lib/config/index.js +43 -0
- package/lib/external-rpc/benchmark.d.ts +1 -0
- package/lib/external-rpc/benchmark.js +69 -0
- package/lib/external-rpc/event-bus.d.ts +7 -0
- package/lib/external-rpc/event-bus.js +14 -0
- package/lib/external-rpc/handle-incoming-msg.d.ts +2 -0
- package/lib/external-rpc/handle-incoming-msg.js +233 -0
- package/lib/external-rpc/index.d.ts +3 -0
- package/lib/external-rpc/index.js +3 -0
- package/lib/external-rpc/jsc-polyfills/1.d.ts +14 -0
- package/lib/external-rpc/jsc-polyfills/1.js +82 -0
- package/lib/external-rpc/jsc-polyfills/2.d.ts +1 -0
- package/lib/external-rpc/jsc-polyfills/2.js +20 -0
- package/lib/external-rpc/jsc-polyfills/event.d.ts +10 -0
- package/lib/external-rpc/jsc-polyfills/event.js +14 -0
- package/lib/external-rpc/jsc-polyfills/index.d.ts +2 -0
- package/lib/external-rpc/jsc-polyfills/index.js +2 -0
- package/lib/external-rpc/jsc-polyfills/ws.d.ts +21 -0
- package/lib/external-rpc/jsc-polyfills/ws.js +81 -0
- package/lib/external-rpc/setup-browser.d.ts +6 -0
- package/lib/external-rpc/setup-browser.js +33 -0
- package/lib/external-rpc/setup-jsc.d.ts +24 -0
- package/lib/external-rpc/setup-jsc.js +22 -0
- package/lib/external-rpc/types.d.ts +213 -0
- package/lib/external-rpc/types.js +1 -0
- package/lib/external-rpc/utils.d.ts +20 -0
- package/lib/external-rpc/utils.js +100 -0
- package/lib/external-rpc/zk.d.ts +14 -0
- package/lib/external-rpc/zk.js +63 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.js +9 -0
- package/lib/mechain/abis/governanceABI.d.ts +50 -0
- package/lib/mechain/abis/governanceABI.js +458 -0
- package/lib/mechain/abis/taskABI.d.ts +157 -0
- package/lib/mechain/abis/taskABI.js +509 -0
- package/lib/mechain/client/create-claim-on-mechain.d.ts +10 -0
- package/lib/mechain/client/create-claim-on-mechain.js +28 -0
- package/lib/mechain/client/index.d.ts +1 -0
- package/lib/mechain/client/index.js +1 -0
- package/lib/mechain/constants/index.d.ts +3 -0
- package/{src/mechain/constants/index.ts → lib/mechain/constants/index.js} +3 -5
- package/lib/mechain/index.d.ts +2 -0
- package/lib/mechain/index.js +2 -0
- package/lib/mechain/types/index.d.ts +23 -0
- package/lib/mechain/types/index.js +1 -0
- package/lib/proto/api.d.ts +633 -0
- package/lib/proto/api.js +4258 -0
- package/lib/proto/tee-bundle.d.ts +135 -0
- package/lib/proto/tee-bundle.js +1161 -0
- package/lib/providers/http/index.d.ts +18 -0
- package/lib/providers/http/index.js +658 -0
- package/lib/providers/http/patch-parse5-tree.d.ts +6 -0
- package/lib/providers/http/patch-parse5-tree.js +33 -0
- package/lib/providers/http/utils.d.ts +77 -0
- package/lib/providers/http/utils.js +324 -0
- package/lib/providers/index.d.ts +4 -0
- package/lib/providers/index.js +4 -0
- package/lib/scripts/build-browser.d.ts +1 -0
- package/lib/scripts/build-browser.js +37 -0
- package/lib/scripts/build-jsc.d.ts +1 -0
- package/lib/scripts/build-jsc.js +49 -0
- package/lib/scripts/check-avs-registration.d.ts +1 -0
- package/lib/scripts/check-avs-registration.js +26 -0
- package/lib/scripts/fallbacks/crypto.d.ts +1 -0
- package/lib/scripts/fallbacks/crypto.js +1 -0
- package/lib/scripts/fallbacks/empty.d.ts +3 -0
- package/lib/scripts/fallbacks/empty.js +1 -0
- package/lib/scripts/fallbacks/re2.d.ts +1 -0
- package/lib/scripts/fallbacks/re2.js +4 -0
- package/lib/scripts/fallbacks/snarkjs.d.ts +1 -0
- package/lib/scripts/fallbacks/snarkjs.js +1 -0
- package/lib/scripts/generate-provider-types.d.ts +5 -0
- package/lib/scripts/generate-provider-types.js +78 -0
- package/lib/scripts/generate-receipt.d.ts +9 -0
- package/lib/scripts/generate-receipt.js +90 -0
- package/lib/scripts/generate-toprf-keys.d.ts +1 -0
- package/lib/scripts/generate-toprf-keys.js +20 -0
- package/lib/scripts/jsc-cli-rpc.d.ts +1 -0
- package/lib/scripts/jsc-cli-rpc.js +37 -0
- package/lib/scripts/register-avs-operator.d.ts +1 -0
- package/lib/scripts/register-avs-operator.js +4 -0
- package/lib/scripts/start-server.d.ts +1 -0
- package/lib/scripts/start-server.js +13 -0
- package/lib/scripts/update-avs-metadata.d.ts +1 -0
- package/lib/scripts/update-avs-metadata.js +19 -0
- package/lib/scripts/utils.d.ts +1 -0
- package/lib/scripts/utils.js +7 -0
- package/lib/scripts/whitelist-operator.d.ts +1 -0
- package/lib/scripts/whitelist-operator.js +15 -0
- package/lib/server/create-server.d.ts +7 -0
- package/lib/server/create-server.js +122 -0
- package/lib/server/handlers/claimTeeBundle.d.ts +6 -0
- package/lib/server/handlers/claimTeeBundle.js +206 -0
- package/lib/server/handlers/claimTunnel.d.ts +2 -0
- package/lib/server/handlers/claimTunnel.js +73 -0
- package/lib/server/handlers/completeClaimOnChain.d.ts +2 -0
- package/lib/server/handlers/completeClaimOnChain.js +22 -0
- package/lib/server/handlers/createClaimOnChain.d.ts +2 -0
- package/lib/server/handlers/createClaimOnChain.js +26 -0
- package/lib/server/handlers/createTaskOnMechain.d.ts +2 -0
- package/lib/server/handlers/createTaskOnMechain.js +47 -0
- package/lib/server/handlers/createTunnel.d.ts +2 -0
- package/lib/server/handlers/createTunnel.js +93 -0
- package/lib/server/handlers/disconnectTunnel.d.ts +2 -0
- package/lib/server/handlers/disconnectTunnel.js +5 -0
- package/lib/server/handlers/fetchCertificateBytes.d.ts +2 -0
- package/lib/server/handlers/fetchCertificateBytes.js +41 -0
- package/lib/server/handlers/index.d.ts +4 -0
- package/lib/server/handlers/index.js +22 -0
- package/lib/server/handlers/init.d.ts +2 -0
- package/lib/server/handlers/init.js +30 -0
- package/lib/server/handlers/toprf.d.ts +2 -0
- package/lib/server/handlers/toprf.js +16 -0
- package/lib/server/index.d.ts +4 -0
- package/lib/server/index.js +4 -0
- package/lib/server/provider-api.d.ts +9 -0
- package/lib/server/provider-api.js +98 -0
- package/lib/server/provider-store.d.ts +53 -0
- package/lib/server/provider-store.js +80 -0
- package/lib/server/session-api.d.ts +9 -0
- package/lib/server/session-api.js +95 -0
- package/lib/server/session-store.d.ts +14 -0
- package/lib/server/session-store.js +36 -0
- package/lib/server/socket.d.ts +13 -0
- package/lib/server/socket.js +109 -0
- package/lib/server/tunnels/make-tcp-tunnel.d.ts +22 -0
- package/lib/server/tunnels/make-tcp-tunnel.js +177 -0
- package/lib/server/utils/apm.d.ts +11 -0
- package/lib/server/utils/apm.js +36 -0
- package/lib/server/utils/assert-valid-claim-request.d.ts +31 -0
- package/lib/server/utils/assert-valid-claim-request.js +229 -0
- package/lib/server/utils/config-env.d.ts +1 -0
- package/lib/server/utils/config-env.js +4 -0
- package/lib/server/utils/dns.d.ts +1 -0
- package/lib/server/utils/dns.js +18 -0
- package/lib/server/utils/gcp-attestation.d.ts +17 -0
- package/lib/server/utils/gcp-attestation.js +289 -0
- package/lib/server/utils/generics.d.ts +22 -0
- package/lib/server/utils/generics.js +51 -0
- package/lib/server/utils/iso.d.ts +1 -0
- package/lib/server/utils/iso.js +256 -0
- package/lib/server/utils/keep-alive.d.ts +7 -0
- package/lib/server/utils/keep-alive.js +38 -0
- package/lib/server/utils/nitro-attestation.d.ts +33 -0
- package/lib/server/utils/nitro-attestation.js +325 -0
- package/lib/server/utils/process-handshake.d.ts +13 -0
- package/lib/server/utils/process-handshake.js +214 -0
- package/lib/server/utils/proxy-session.d.ts +1 -0
- package/lib/server/utils/proxy-session.js +6 -0
- package/lib/server/utils/tee-oprf-verification.d.ts +22 -0
- package/lib/server/utils/tee-oprf-verification.js +160 -0
- package/lib/server/utils/tee-transcript-reconstruction.d.ts +24 -0
- package/lib/server/utils/tee-transcript-reconstruction.js +187 -0
- package/lib/server/utils/tee-verification.d.ts +27 -0
- package/lib/server/utils/tee-verification.js +365 -0
- package/lib/server/utils/validation.d.ts +2 -0
- package/lib/server/utils/validation.js +38 -0
- package/lib/types/bgp.d.ts +11 -0
- package/lib/types/bgp.js +1 -0
- package/lib/types/claims.d.ts +73 -0
- package/lib/types/claims.js +1 -0
- package/lib/types/client.d.ts +163 -0
- package/lib/types/client.js +1 -0
- package/lib/types/general.d.ts +54 -0
- package/lib/types/general.js +1 -0
- package/lib/types/handlers.d.ts +10 -0
- package/lib/types/handlers.js +1 -0
- package/lib/types/index.d.ts +10 -0
- package/lib/types/index.js +10 -0
- package/lib/types/providers.d.ts +161 -0
- package/lib/types/providers.gen.d.ts +443 -0
- package/lib/types/providers.gen.js +10 -0
- package/lib/types/providers.js +1 -0
- package/lib/types/rpc.d.ts +35 -0
- package/lib/types/rpc.js +1 -0
- package/lib/types/signatures.d.ts +28 -0
- package/lib/types/signatures.js +1 -0
- package/lib/types/tunnel.d.ts +18 -0
- package/lib/types/tunnel.js +1 -0
- package/lib/types/zk.d.ts +28 -0
- package/lib/types/zk.js +1 -0
- package/lib/utils/auth.d.ts +8 -0
- package/lib/utils/auth.js +59 -0
- package/lib/utils/b64-json.d.ts +2 -0
- package/lib/utils/b64-json.js +17 -0
- package/lib/utils/bgp-listener.d.ts +7 -0
- package/lib/utils/bgp-listener.js +119 -0
- package/lib/utils/claims.d.ts +33 -0
- package/lib/utils/claims.js +101 -0
- package/lib/utils/env.d.ts +3 -0
- package/lib/utils/env.js +15 -0
- package/lib/utils/error.d.ts +26 -0
- package/lib/utils/error.js +50 -0
- package/lib/utils/generics.d.ts +114 -0
- package/lib/utils/generics.js +317 -0
- package/lib/utils/http-parser.d.ts +59 -0
- package/lib/utils/http-parser.js +246 -0
- package/lib/utils/index.d.ts +13 -0
- package/lib/utils/index.js +13 -0
- package/lib/utils/logger.d.ts +13 -0
- package/lib/utils/logger.js +91 -0
- package/lib/utils/prepare-packets.d.ts +16 -0
- package/lib/utils/prepare-packets.js +62 -0
- package/lib/utils/redactions.d.ts +62 -0
- package/lib/utils/redactions.js +148 -0
- package/lib/utils/retries.d.ts +12 -0
- package/lib/utils/retries.js +24 -0
- package/lib/utils/signatures/eth.d.ts +2 -0
- package/lib/utils/signatures/eth.js +29 -0
- package/lib/utils/signatures/index.d.ts +5 -0
- package/lib/utils/signatures/index.js +7 -0
- package/lib/utils/socket-base.d.ts +23 -0
- package/lib/utils/socket-base.js +90 -0
- package/lib/utils/tls.d.ts +2 -0
- package/{src/utils/tls.ts → lib/utils/tls.js} +28 -35
- package/lib/utils/ws.d.ts +7 -0
- package/lib/utils/ws.js +22 -0
- package/lib/utils/zk.d.ts +70 -0
- package/lib/utils/zk.js +572 -0
- package/package.json +19 -12
- package/src/avs/abis/avsDirectoryABI.ts +0 -340
- package/src/avs/abis/delegationABI.ts +0 -1
- package/src/avs/abis/registryABI.ts +0 -725
- package/src/avs/client/create-claim-on-avs.ts +0 -206
- package/src/avs/config.ts +0 -25
- package/src/avs/contracts/ReclaimServiceManager.ts +0 -1457
- package/src/avs/contracts/common.ts +0 -44
- package/src/avs/contracts/factories/ReclaimServiceManager__factory.ts +0 -1213
- package/src/avs/tests/test.operator.ts +0 -413
- package/src/avs/tests/utils.ts +0 -51
- package/src/avs/types/index.ts +0 -60
- package/src/avs/utils/contracts.ts +0 -66
- package/src/avs/utils/register.ts +0 -125
- package/src/avs/utils/tasks.ts +0 -76
- package/src/client/create-claim.ts +0 -626
- package/src/client/index.ts +0 -3
- package/src/client/tunnels/make-rpc-tcp-tunnel.ts +0 -78
- package/src/client/tunnels/make-rpc-tls-tunnel.ts +0 -172
- package/src/client/utils/attestor-pool.ts +0 -35
- package/src/client/utils/client-socket.ts +0 -160
- package/src/client/utils/message-handler.ts +0 -116
- package/src/config/index.ts +0 -65
- package/src/external-rpc/benchmark.ts +0 -102
- package/src/external-rpc/event-bus.ts +0 -19
- package/src/external-rpc/global.d.ts +0 -20
- package/src/external-rpc/handle-incoming-msg.ts +0 -308
- package/src/external-rpc/index.ts +0 -3
- package/src/external-rpc/jsc-polyfills/1.ts +0 -117
- package/src/external-rpc/jsc-polyfills/2.ts +0 -24
- package/src/external-rpc/jsc-polyfills/event.ts +0 -16
- package/src/external-rpc/jsc-polyfills/index.ts +0 -2
- package/src/external-rpc/jsc-polyfills/ws.ts +0 -105
- package/src/external-rpc/setup-browser.ts +0 -42
- package/src/external-rpc/setup-jsc.ts +0 -48
- package/src/external-rpc/types.ts +0 -289
- package/src/external-rpc/utils.ts +0 -126
- package/src/external-rpc/zk.ts +0 -79
- package/src/index.ts +0 -9
- package/src/mechain/abis/governanceABI.ts +0 -458
- package/src/mechain/abis/taskABI.ts +0 -509
- package/src/mechain/client/create-claim-on-mechain.ts +0 -52
- package/src/mechain/client/index.ts +0 -1
- package/src/mechain/index.ts +0 -2
- package/src/mechain/types/index.ts +0 -29
- package/src/proto/api.ts +0 -5285
- package/src/proto/tee-bundle.ts +0 -1413
- package/src/providers/http/index.ts +0 -873
- package/src/providers/http/patch-parse5-tree.ts +0 -49
- package/src/providers/http/utils.ts +0 -439
- package/src/providers/index.ts +0 -8
- package/src/scripts/build-browser.sh +0 -9
- package/src/scripts/build-browser.ts +0 -40
- package/src/scripts/build-jsc.ts +0 -55
- package/src/scripts/check-avs-registration.ts +0 -38
- package/src/scripts/contract-data-gen.sh +0 -8
- package/src/scripts/fallbacks/crypto.ts +0 -1
- package/src/scripts/fallbacks/empty.ts +0 -2
- package/src/scripts/fallbacks/re2.ts +0 -5
- package/src/scripts/fallbacks/snarkjs.ts +0 -5
- package/src/scripts/generate-certs.sh +0 -11
- package/src/scripts/generate-proto.sh +0 -5
- package/src/scripts/generate-provider-types.ts +0 -121
- package/src/scripts/generate-receipt.ts +0 -138
- package/src/scripts/generate-toprf-keys.ts +0 -30
- package/src/scripts/jsc-cli-rpc.ts +0 -48
- package/src/scripts/register-avs-operator.ts +0 -5
- package/src/scripts/start-server.ts +0 -17
- package/src/scripts/update-avs-metadata.ts +0 -26
- package/src/scripts/utils.ts +0 -8
- package/src/scripts/whitelist-operator.ts +0 -22
- package/src/server/create-server.ts +0 -169
- package/src/server/handlers/claimTeeBundle.ts +0 -308
- package/src/server/handlers/claimTunnel.ts +0 -106
- package/src/server/handlers/completeClaimOnChain.ts +0 -36
- package/src/server/handlers/createClaimOnChain.ts +0 -39
- package/src/server/handlers/createTaskOnMechain.ts +0 -80
- package/src/server/handlers/createTunnel.ts +0 -128
- package/src/server/handlers/disconnectTunnel.ts +0 -11
- package/src/server/handlers/fetchCertificateBytes.ts +0 -66
- package/src/server/handlers/index.ts +0 -24
- package/src/server/handlers/init.ts +0 -46
- package/src/server/handlers/toprf.ts +0 -25
- package/src/server/index.ts +0 -4
- package/src/server/provider-api.ts +0 -118
- package/src/server/provider-store.ts +0 -117
- package/src/server/session-api.ts +0 -115
- package/src/server/session-store.ts +0 -60
- package/src/server/socket.ts +0 -156
- package/src/server/tunnels/make-tcp-tunnel.ts +0 -275
- package/src/server/utils/apm.ts +0 -49
- package/src/server/utils/assert-valid-claim-request.ts +0 -375
- package/src/server/utils/config-env.ts +0 -6
- package/src/server/utils/dns.ts +0 -25
- package/src/server/utils/gcp-attestation.ts +0 -415
- package/src/server/utils/generics.ts +0 -68
- package/src/server/utils/iso.ts +0 -258
- package/src/server/utils/keep-alive.ts +0 -50
- package/src/server/utils/nitro-attestation.ts +0 -396
- package/src/server/utils/process-handshake.ts +0 -311
- package/src/server/utils/proxy-session.ts +0 -6
- package/src/server/utils/tee-oprf-verification.ts +0 -231
- package/src/server/utils/tee-transcript-reconstruction.ts +0 -254
- package/src/server/utils/tee-verification.ts +0 -513
- package/src/server/utils/validation.ts +0 -57
- package/src/tests/auth.test.ts +0 -105
- package/src/tests/bgp-listener.test.ts +0 -193
- package/src/tests/claim-creation.test.ts +0 -415
- package/src/tests/describe-with-server.ts +0 -94
- package/src/tests/gcp-attestation.test.ts +0 -206
- package/src/tests/http-parser.test.ts +0 -135
- package/src/tests/http-provider-utils.test.ts +0 -3306
- package/src/tests/http-provider.test.ts +0 -125
- package/src/tests/jsc.test_mac.ts +0 -296
- package/src/tests/mock-provider-server.ts +0 -106
- package/src/tests/mocks.ts +0 -25
- package/src/tests/proof_bundle.bin +0 -0
- package/src/tests/rpc-communication.test.ts +0 -115
- package/src/tests/rpc-tunnel.test.ts +0 -239
- package/src/tests/signatures.test.ts +0 -37
- package/src/tests/tcp-tunnel.test.ts +0 -154
- package/src/tests/tee-bundle.test.ts +0 -321
- package/src/tests/tee-signatures.test.ts +0 -81
- package/src/tests/utils.ts +0 -108
- package/src/tests/verification_bundle.pb +0 -0
- package/src/tests/verification_bundle_tee.pb +0 -0
- package/src/tests/zk.test.ts +0 -453
- package/src/types/bgp.ts +0 -17
- package/src/types/claims.ts +0 -79
- package/src/types/client.ts +0 -205
- package/src/types/general.ts +0 -61
- package/src/types/handlers.ts +0 -16
- package/src/types/index.ts +0 -10
- package/src/types/providers.gen.ts +0 -135
- package/src/types/providers.ts +0 -203
- package/src/types/rpc.ts +0 -46
- package/src/types/signatures.ts +0 -29
- package/src/types/tunnel.ts +0 -25
- package/src/types/zk.ts +0 -31
- package/src/utils/auth.ts +0 -92
- package/src/utils/b64-json.ts +0 -25
- package/src/utils/bgp-listener.ts +0 -159
- package/src/utils/claims.ts +0 -132
- package/src/utils/env.ts +0 -21
- package/src/utils/error.ts +0 -76
- package/src/utils/generics.ts +0 -429
- package/src/utils/http-parser.ts +0 -312
- package/src/utils/index.ts +0 -13
- package/src/utils/logger.ts +0 -114
- package/src/utils/prepare-packets.ts +0 -98
- package/src/utils/redactions.ts +0 -203
- package/src/utils/retries.ts +0 -41
- package/src/utils/signatures/eth.ts +0 -35
- package/src/utils/signatures/index.ts +0 -11
- package/src/utils/socket-base.ts +0 -132
- package/src/utils/ws.ts +0 -30
- package/src/utils/zk.ts +0 -908
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Working Nitro Attestation validation utilities
|
|
3
|
+
*/
|
|
4
|
+
export interface AttestationDocument {
|
|
5
|
+
module_id: string;
|
|
6
|
+
digest: string;
|
|
7
|
+
timestamp: bigint;
|
|
8
|
+
pcrs: {
|
|
9
|
+
[key: number]: Buffer;
|
|
10
|
+
};
|
|
11
|
+
certificate: Buffer;
|
|
12
|
+
cabundle: Buffer[];
|
|
13
|
+
public_key?: Buffer;
|
|
14
|
+
user_data?: Buffer;
|
|
15
|
+
nonce?: Buffer;
|
|
16
|
+
}
|
|
17
|
+
export interface NitroValidationResult {
|
|
18
|
+
isValid: boolean;
|
|
19
|
+
errors: string[];
|
|
20
|
+
warnings: string[];
|
|
21
|
+
userDataType?: 'tee_k' | 'tee_t';
|
|
22
|
+
ethAddress?: string;
|
|
23
|
+
pcr0: string;
|
|
24
|
+
}
|
|
25
|
+
export interface AddressExtractionResult {
|
|
26
|
+
teeType: 'tee_k' | 'tee_t';
|
|
27
|
+
ethAddress?: string;
|
|
28
|
+
pcr0: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Working validation function copied from nitroattestor
|
|
32
|
+
*/
|
|
33
|
+
export declare function validateNitroAttestationAndExtractKey(attestationBytes: Uint8Array): Promise<NitroValidationResult>;
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Working Nitro Attestation validation utilities
|
|
3
|
+
*/
|
|
4
|
+
import { AsnParser } from '@peculiar/asn1-schema';
|
|
5
|
+
import { SubjectPublicKeyInfo } from '@peculiar/asn1-x509';
|
|
6
|
+
import { Crypto } from '@peculiar/webcrypto';
|
|
7
|
+
import { X509Certificate, X509ChainBuilder } from '@peculiar/x509';
|
|
8
|
+
import { sign } from 'cose-js';
|
|
9
|
+
// Helper function to dynamically import cbor-x
|
|
10
|
+
async function getCborDecode() {
|
|
11
|
+
const { decode } = await import('cbor-x');
|
|
12
|
+
return decode;
|
|
13
|
+
}
|
|
14
|
+
// AWS Nitro root certificate (from nitrite)
|
|
15
|
+
const AWS_NITRO_ROOT_CERT = `-----BEGIN CERTIFICATE-----
|
|
16
|
+
MIICETCCAZagAwIBAgIRAPkxdWgbkK/hHUbMtOTn+FYwCgYIKoZIzj0EAwMwSTEL
|
|
17
|
+
MAkGA1UEBhMCVVMxDzANBgNVBAoMBkFtYXpvbjEMMAoGA1UECwwDQVdTMRswGQYD
|
|
18
|
+
VQQDDBJhd3Mubml0cm8tZW5jbGF2ZXMwHhcNMTkxMDI4MTMyODA1WhcNNDkxMDI4
|
|
19
|
+
MTQyODA1WjBJMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGQW1hem9uMQwwCgYDVQQL
|
|
20
|
+
DANBV1MxGzAZBgNVBAMMEmF3cy5uaXRyby1lbmNsYXZlczB2MBAGByqGSM49AgEG
|
|
21
|
+
BSuBBAAiA2IABPwCVOumCMHzaHDimtqQvkY4MpJzbolL//Zy2YlES1BR5TSksfbb
|
|
22
|
+
48C8WBoyt7F2Bw7eEtaaP+ohG2bnUs990d0JX28TcPQXCEPZ3BABIeTPYwEoCWZE
|
|
23
|
+
h8l5YoQwTcU/9KNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUkCW1DdkF
|
|
24
|
+
R+eWw5b6cp3PmanfS5YwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2kAMGYC
|
|
25
|
+
MQCjfy+Rocm9Xue4YnwWmNJVA44fA0P5W2OpYow9OYCVRaEevL8uO1XYru5xtMPW
|
|
26
|
+
rfMCMQCi85sWBbJwKKXdS6BptQFuZbT73o/gBh1qUxl/nNr12UO8Yfwr6wPLb+6N
|
|
27
|
+
IwLz3/Y=
|
|
28
|
+
-----END CERTIFICATE-----`;
|
|
29
|
+
// Expected PCR values (replace with actual values)
|
|
30
|
+
// const EXPECTED_PCRS = {
|
|
31
|
+
// //0: Buffer.from('000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex'),
|
|
32
|
+
// }
|
|
33
|
+
//
|
|
34
|
+
// // Secure buffer comparison to prevent timing attacks
|
|
35
|
+
// function secureBufferCompare(a: Buffer, b: Buffer): boolean {
|
|
36
|
+
// if(a.length !== b.length) {
|
|
37
|
+
// return false
|
|
38
|
+
// }
|
|
39
|
+
//
|
|
40
|
+
// let result = 0
|
|
41
|
+
// for(const [i, element] of a.entries()) {
|
|
42
|
+
// result |= element ^ b[i]
|
|
43
|
+
// }
|
|
44
|
+
//
|
|
45
|
+
// return result === 0
|
|
46
|
+
// }
|
|
47
|
+
// Enhanced certificate chain validation
|
|
48
|
+
async function validateCertificateChain(targetCert, intermediateCerts, rootCert, crypto) {
|
|
49
|
+
const errors = [];
|
|
50
|
+
try {
|
|
51
|
+
// Validate root certificate is self-signed and trusted
|
|
52
|
+
const rootSubject = rootCert.subject;
|
|
53
|
+
const rootIssuer = rootCert.issuer;
|
|
54
|
+
if (rootSubject !== rootIssuer) {
|
|
55
|
+
errors.push('Root certificate is not self-signed');
|
|
56
|
+
}
|
|
57
|
+
// Verify root certificate signature (self-verification)
|
|
58
|
+
try {
|
|
59
|
+
const isRootValid = await rootCert.verify(undefined, crypto);
|
|
60
|
+
if (!isRootValid) {
|
|
61
|
+
errors.push('Root certificate signature verification failed');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
errors.push(`Root certificate verification failed: ${error.message}`);
|
|
66
|
+
}
|
|
67
|
+
// Build the certificate chain
|
|
68
|
+
const chainBuilder = new X509ChainBuilder({
|
|
69
|
+
certificates: [rootCert, ...intermediateCerts]
|
|
70
|
+
});
|
|
71
|
+
let chain;
|
|
72
|
+
try {
|
|
73
|
+
chain = await chainBuilder.build(targetCert, crypto);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
errors.push(`Certificate chain building failed: ${error.message}`);
|
|
77
|
+
return { isValid: false, errors, chain: [] };
|
|
78
|
+
}
|
|
79
|
+
if (!chain || chain.length === 0) {
|
|
80
|
+
errors.push('No valid certificate chain could be built');
|
|
81
|
+
return { isValid: false, errors, chain: [] };
|
|
82
|
+
}
|
|
83
|
+
// Validate each certificate in the chain
|
|
84
|
+
const now = new Date();
|
|
85
|
+
for (let i = 0; i < chain.length; i++) {
|
|
86
|
+
const cert = chain[i];
|
|
87
|
+
// Check expiration dates
|
|
88
|
+
if (now < cert.notBefore) {
|
|
89
|
+
errors.push(`Certificate ${i} (${cert.subject}) is not yet valid`);
|
|
90
|
+
}
|
|
91
|
+
if (now > cert.notAfter) {
|
|
92
|
+
errors.push(`Certificate ${i} (${cert.subject}) has expired`);
|
|
93
|
+
}
|
|
94
|
+
// Verify each certificate's signature (except root which is self-signed)
|
|
95
|
+
if (i < chain.length - 1) {
|
|
96
|
+
try {
|
|
97
|
+
const issuer = chain[i + 1];
|
|
98
|
+
const isValid = await cert.verify(issuer, crypto);
|
|
99
|
+
// eslint-disable-next-line max-depth
|
|
100
|
+
if (!isValid) {
|
|
101
|
+
errors.push(`Certificate ${i} signature verification failed`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
errors.push(`Certificate ${i} verification failed: ${error.message}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
isValid: errors.length === 0,
|
|
111
|
+
errors,
|
|
112
|
+
chain
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
errors.push(`Certificate chain validation error: ${error.message}`);
|
|
117
|
+
return { isValid: false, errors, chain: [] };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Extract public key from user_data field in attestation document
|
|
122
|
+
*/
|
|
123
|
+
function extractPublicKeyFromUserData(userDataBuffer) {
|
|
124
|
+
try {
|
|
125
|
+
const userDataString = userDataBuffer.toString('utf-8');
|
|
126
|
+
// Parse new format: "tee_k_public_key:0xETH_ADDRESS" or "tee_t_public_key:0xETH_ADDRESS"
|
|
127
|
+
const teeKMatch = userDataString.match(/^tee_k_public_key:(0x[0-9a-fA-F]{40})$/);
|
|
128
|
+
const teeTMatch = userDataString.match(/^tee_t_public_key:(0x[0-9a-fA-F]{40})$/);
|
|
129
|
+
if (teeKMatch) {
|
|
130
|
+
return {
|
|
131
|
+
teeType: 'tee_k',
|
|
132
|
+
ethAddress: teeKMatch[1], // Store the full ETH address with 0x prefix
|
|
133
|
+
pcr0: ''
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
if (teeTMatch) {
|
|
137
|
+
return {
|
|
138
|
+
teeType: 'tee_t',
|
|
139
|
+
ethAddress: teeTMatch[1], // Store the full ETH address with 0x prefix
|
|
140
|
+
pcr0: ''
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Working validation function copied from nitroattestor
|
|
151
|
+
*/
|
|
152
|
+
export async function validateNitroAttestationAndExtractKey(attestationBytes) {
|
|
153
|
+
const errors = [];
|
|
154
|
+
const warnings = [];
|
|
155
|
+
try {
|
|
156
|
+
// Set up WebCrypto
|
|
157
|
+
const crypto = new Crypto();
|
|
158
|
+
// Decode CBOR - use exact same approach as working nitroattestor
|
|
159
|
+
const decode = await getCborDecode();
|
|
160
|
+
let decoded;
|
|
161
|
+
try {
|
|
162
|
+
decoded = decode(Buffer.from(attestationBytes));
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
errors.push(`CBOR decoding failed: ${error.message}`);
|
|
166
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
167
|
+
}
|
|
168
|
+
// Extract COSE_Sign1 structure
|
|
169
|
+
if (!Array.isArray(decoded) || decoded.length < 4) {
|
|
170
|
+
errors.push('Invalid COSE_Sign1 structure: expected array with 4 elements');
|
|
171
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
172
|
+
}
|
|
173
|
+
const [, , payload] = decoded;
|
|
174
|
+
// Validate payload exists and is not empty
|
|
175
|
+
if (!payload || payload.length === 0) {
|
|
176
|
+
errors.push('Empty or missing payload in COSE_Sign1 structure');
|
|
177
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
178
|
+
}
|
|
179
|
+
// Decode payload - use exact same approach as working code
|
|
180
|
+
let doc;
|
|
181
|
+
try {
|
|
182
|
+
doc = decode(payload);
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
errors.push(`Payload decoding failed: ${error.message}`);
|
|
186
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
187
|
+
}
|
|
188
|
+
// Validate mandatory fields with strict type checking
|
|
189
|
+
if (doc.module_id.length === 0) {
|
|
190
|
+
errors.push('Missing or invalid module_id');
|
|
191
|
+
}
|
|
192
|
+
if (doc.digest.length === 0) {
|
|
193
|
+
errors.push('Missing or invalid digest');
|
|
194
|
+
}
|
|
195
|
+
if (!doc.pcrs || typeof doc.pcrs !== 'object') {
|
|
196
|
+
errors.push('Missing or invalid pcrs');
|
|
197
|
+
}
|
|
198
|
+
if (!Buffer.isBuffer(doc.certificate) || doc.certificate.length === 0) {
|
|
199
|
+
errors.push('Missing or invalid certificate');
|
|
200
|
+
}
|
|
201
|
+
if (!Array.isArray(doc.cabundle) || doc.cabundle.length === 0) {
|
|
202
|
+
errors.push('Missing or invalid cabundle');
|
|
203
|
+
}
|
|
204
|
+
// Early return if basic validation fails
|
|
205
|
+
if (errors.length > 0) {
|
|
206
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
207
|
+
}
|
|
208
|
+
const pcr0 = doc.pcrs[0].toString('hex');
|
|
209
|
+
// Validate PCRs with secure comparison
|
|
210
|
+
// for(const [index, expected] of Object.entries(EXPECTED_PCRS)) {
|
|
211
|
+
// const pcrIndex = parseInt(index)
|
|
212
|
+
// const actualPcr = doc.pcrs[pcrIndex]
|
|
213
|
+
//
|
|
214
|
+
// if(!Buffer.isBuffer(actualPcr)) {
|
|
215
|
+
// errors.push(`PCR${index} is not a Buffer`)
|
|
216
|
+
// continue
|
|
217
|
+
// }
|
|
218
|
+
//
|
|
219
|
+
// if(!secureBufferCompare(expected, actualPcr)) {
|
|
220
|
+
// errors.push(`PCR${index} mismatch`)
|
|
221
|
+
// }
|
|
222
|
+
// }
|
|
223
|
+
// Parse certificates with better error handling
|
|
224
|
+
const intermediateCerts = [];
|
|
225
|
+
for (let i = 0; i < doc.cabundle.length; i++) {
|
|
226
|
+
try {
|
|
227
|
+
const cert = new X509Certificate(doc.cabundle[i].toString('base64'));
|
|
228
|
+
intermediateCerts.push(cert);
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
errors.push(`Failed to parse cabundle certificate ${i}: ${error.message}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Parse target certificate
|
|
235
|
+
let targetCert;
|
|
236
|
+
try {
|
|
237
|
+
targetCert = new X509Certificate(doc.certificate.toString('base64'));
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
errors.push(`Failed to parse target certificate: ${error.message}`);
|
|
241
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
242
|
+
}
|
|
243
|
+
// Parse root certificate
|
|
244
|
+
let rootCert;
|
|
245
|
+
try {
|
|
246
|
+
rootCert = new X509Certificate(AWS_NITRO_ROOT_CERT);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
errors.push(`Failed to parse AWS Nitro root certificate: ${error.message}`);
|
|
250
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
251
|
+
}
|
|
252
|
+
// Enhanced certificate chain validation
|
|
253
|
+
const chainResult = await validateCertificateChain(targetCert, intermediateCerts, rootCert, crypto);
|
|
254
|
+
if (!chainResult.isValid) {
|
|
255
|
+
errors.push(...chainResult.errors);
|
|
256
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
257
|
+
}
|
|
258
|
+
// Parse and validate public key
|
|
259
|
+
let publicKeyRaw;
|
|
260
|
+
try {
|
|
261
|
+
publicKeyRaw = Buffer.from(targetCert.publicKey.rawData);
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
errors.push(`Failed to extract public key: ${error.message}`);
|
|
265
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
266
|
+
}
|
|
267
|
+
// Validate public key format (P-384 ECDSA)
|
|
268
|
+
if (publicKeyRaw.length !== 120 || publicKeyRaw[0] !== 0x30) {
|
|
269
|
+
errors.push(`Invalid public key format: expected 120-byte DER-encoded key, got ${publicKeyRaw.length} bytes`);
|
|
270
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
271
|
+
}
|
|
272
|
+
let spki;
|
|
273
|
+
try {
|
|
274
|
+
spki = AsnParser.parse(publicKeyRaw, SubjectPublicKeyInfo);
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
errors.push(`Failed to parse SubjectPublicKeyInfo: ${error.message}`);
|
|
278
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
279
|
+
}
|
|
280
|
+
const ecPoint = Buffer.from(spki.subjectPublicKey);
|
|
281
|
+
if (ecPoint.length !== 97 || ecPoint[0] !== 0x04) {
|
|
282
|
+
errors.push('Invalid EC point: expected 97-byte uncompressed P-384 key');
|
|
283
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
284
|
+
}
|
|
285
|
+
const x = ecPoint.subarray(1, 49); // 48-byte x coordinate
|
|
286
|
+
const y = ecPoint.subarray(49, 97); // 48-byte y coordinate
|
|
287
|
+
// Validate ECDSA signature using cose-js
|
|
288
|
+
try {
|
|
289
|
+
const verifier = {
|
|
290
|
+
key: {
|
|
291
|
+
x: x,
|
|
292
|
+
y: y,
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
const options = { defaultType: 18 }; // cose.sign.Sign1Tag
|
|
296
|
+
await sign.verify(Buffer.from(attestationBytes), verifier, options);
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
errors.push(`COSE signature verification failed: ${error.message}`);
|
|
300
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
301
|
+
}
|
|
302
|
+
// Extract public key from user_data if present
|
|
303
|
+
let userDataType;
|
|
304
|
+
let ethAddress;
|
|
305
|
+
if (doc.user_data) {
|
|
306
|
+
const keyInfo = extractPublicKeyFromUserData(doc.user_data);
|
|
307
|
+
if (keyInfo) {
|
|
308
|
+
userDataType = keyInfo.teeType;
|
|
309
|
+
ethAddress = keyInfo.ethAddress;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
isValid: errors.length === 0,
|
|
314
|
+
errors,
|
|
315
|
+
warnings,
|
|
316
|
+
userDataType,
|
|
317
|
+
ethAddress,
|
|
318
|
+
pcr0: pcr0
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
errors.push(`Unexpected error during validation: ${error.message}`);
|
|
323
|
+
return { isValid: false, errors, warnings, pcr0: '' };
|
|
324
|
+
}
|
|
325
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ClaimTunnelRequest } from '../../proto/api.js';
|
|
2
|
+
import type { Logger } from '../../types/index.js';
|
|
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_RSA_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,214 @@
|
|
|
1
|
+
import { concatenateUint8Arrays, getSignatureDataTls12, getSignatureDataTls13, PACKET_TYPE, parseCertificates, parseClientHello, parseServerCertificateVerify, parseServerHello, processServerKeyShare, SUPPORTED_RECORD_TYPE_MAP, uint8ArrayToDataView, verifyCertificateChain, verifyCertificateSignature } from '@joclaim/tls';
|
|
2
|
+
import { TranscriptMessageSenderType } from '../../proto/api.js';
|
|
3
|
+
import { decryptDirect } from '../../utils/index.js';
|
|
4
|
+
const RECORD_LENGTH_BYTES = 3;
|
|
5
|
+
/**
|
|
6
|
+
* Verifies server cert chain and removes handshake messages from transcript
|
|
7
|
+
* @param receipt
|
|
8
|
+
* @param logger
|
|
9
|
+
*/
|
|
10
|
+
export async function processHandshake(receipt, logger) {
|
|
11
|
+
const certificates = [];
|
|
12
|
+
const handshakeRawMessages = [];
|
|
13
|
+
let currentPacketIdx = 0;
|
|
14
|
+
let cipherSuite = undefined;
|
|
15
|
+
let tlsVersion = undefined;
|
|
16
|
+
let serverRandom = undefined;
|
|
17
|
+
let clientRandom = undefined;
|
|
18
|
+
let serverFinishedIdx = -1;
|
|
19
|
+
let clientFinishedIdx = -1;
|
|
20
|
+
let certVerified = false;
|
|
21
|
+
let certVerifyHandled = false;
|
|
22
|
+
let hostname = undefined;
|
|
23
|
+
let clientChangeCipherSpecMsgIdx = -1;
|
|
24
|
+
let serverChangeCipherSpecMsgIdx = -1;
|
|
25
|
+
let incompletePkt = undefined;
|
|
26
|
+
while (serverFinishedIdx < 0 || clientFinishedIdx < 0) {
|
|
27
|
+
const packetIdx = currentPacketIdx++;
|
|
28
|
+
if (packetIdx >= receipt.length) {
|
|
29
|
+
throw new Error('Receipt over but server finish: ' + serverFinishedIdx
|
|
30
|
+
+ ', client finish: ' + clientFinishedIdx);
|
|
31
|
+
}
|
|
32
|
+
const { message, reveal, sender } = receipt[packetIdx];
|
|
33
|
+
// skip change cipher spec message
|
|
34
|
+
if (message[0] === PACKET_TYPE['CHANGE_CIPHER_SPEC']) {
|
|
35
|
+
if (sender === TranscriptMessageSenderType
|
|
36
|
+
.TRANSCRIPT_MESSAGE_SENDER_TYPE_CLIENT) {
|
|
37
|
+
clientChangeCipherSpecMsgIdx = packetIdx;
|
|
38
|
+
logger.trace('found client change cipher spec message');
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
serverChangeCipherSpecMsgIdx = packetIdx;
|
|
42
|
+
logger.trace('found server change cipher spec message');
|
|
43
|
+
}
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
let plaintext = getWithoutHeader(message);
|
|
47
|
+
if (!plaintext) {
|
|
48
|
+
throw new Error('incomplete TLS record encountered');
|
|
49
|
+
}
|
|
50
|
+
if (
|
|
51
|
+
// decrypt if wrapped record or after change cipher spec message,
|
|
52
|
+
// after which records are encrypted
|
|
53
|
+
message[0] === PACKET_TYPE['WRAPPED_RECORD']
|
|
54
|
+
|| (serverChangeCipherSpecMsgIdx > 0
|
|
55
|
+
&& sender === TranscriptMessageSenderType
|
|
56
|
+
.TRANSCRIPT_MESSAGE_SENDER_TYPE_SERVER)
|
|
57
|
+
|| (clientChangeCipherSpecMsgIdx > 0
|
|
58
|
+
&& sender === TranscriptMessageSenderType
|
|
59
|
+
.TRANSCRIPT_MESSAGE_SENDER_TYPE_CLIENT)) { // encrypted
|
|
60
|
+
if (!tlsVersion || !cipherSuite) {
|
|
61
|
+
throw new Error('Could not find cipherSuite to use & got enc record');
|
|
62
|
+
}
|
|
63
|
+
if (!reveal?.directReveal?.key) {
|
|
64
|
+
throw new Error('no direct reveal for handshake packet: ' + packetIdx);
|
|
65
|
+
}
|
|
66
|
+
const recordHeader = message.slice(0, 5);
|
|
67
|
+
({ plaintext } = await decryptDirect(reveal?.directReveal, cipherSuite, recordHeader, tlsVersion, plaintext));
|
|
68
|
+
if (tlsVersion === 'TLS1_3') {
|
|
69
|
+
plaintext = plaintext.slice(0, -1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (incompletePkt) {
|
|
73
|
+
const incSender = receipt[incompletePkt.packetIdx].sender;
|
|
74
|
+
if (incSender !== sender) {
|
|
75
|
+
throw new Error('Missing follow up to incomplete packet at idx: '
|
|
76
|
+
+ incompletePkt.packetIdx);
|
|
77
|
+
}
|
|
78
|
+
plaintext = concatenateUint8Arrays([
|
|
79
|
+
incompletePkt.remainingBytes,
|
|
80
|
+
plaintext
|
|
81
|
+
]);
|
|
82
|
+
incompletePkt = undefined;
|
|
83
|
+
}
|
|
84
|
+
const handshakeMessages = [];
|
|
85
|
+
// each handshake packet may contain multiple handshake messages
|
|
86
|
+
for (let offset = 0; offset < plaintext.length;) {
|
|
87
|
+
const type = plaintext[offset];
|
|
88
|
+
// +1 for the record type byte
|
|
89
|
+
const content = readWithLength(plaintext.slice(offset + 1), RECORD_LENGTH_BYTES);
|
|
90
|
+
if (!content) {
|
|
91
|
+
incompletePkt = {
|
|
92
|
+
remainingBytes: plaintext.slice(offset),
|
|
93
|
+
packetIdx,
|
|
94
|
+
};
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
handshakeMessages.push({
|
|
98
|
+
type,
|
|
99
|
+
content,
|
|
100
|
+
contentWithHeader: plaintext.slice(offset, offset + 1 + RECORD_LENGTH_BYTES + content.length),
|
|
101
|
+
packetIdx,
|
|
102
|
+
});
|
|
103
|
+
offset += 1 + RECORD_LENGTH_BYTES + content.length;
|
|
104
|
+
}
|
|
105
|
+
for (const msg of handshakeMessages) {
|
|
106
|
+
await processHandshakeMessage(msg);
|
|
107
|
+
handshakeRawMessages.push(msg.contentWithHeader);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (!certVerified) {
|
|
111
|
+
throw new Error('No provider certificates received');
|
|
112
|
+
}
|
|
113
|
+
if (tlsVersion === 'TLS1_3' && serverFinishedIdx < 0) {
|
|
114
|
+
throw new Error('server finished message not found');
|
|
115
|
+
}
|
|
116
|
+
if (tlsVersion === 'TLS1_3' && !certVerifyHandled) {
|
|
117
|
+
throw new Error('TLS1.3 cert verify packet not received');
|
|
118
|
+
}
|
|
119
|
+
if (tlsVersion === 'TLS1_2' && (serverChangeCipherSpecMsgIdx < 0 || clientChangeCipherSpecMsgIdx < 0)) {
|
|
120
|
+
throw new Error('change cipher spec message not found');
|
|
121
|
+
}
|
|
122
|
+
const nextMsgIndex = Math.max(serverFinishedIdx, clientFinishedIdx) + 1;
|
|
123
|
+
return {
|
|
124
|
+
tlsVersion: tlsVersion,
|
|
125
|
+
cipherSuite: cipherSuite,
|
|
126
|
+
hostname: hostname,
|
|
127
|
+
nextMsgIndex,
|
|
128
|
+
};
|
|
129
|
+
async function processHandshakeMessage({ type, content, contentWithHeader, packetIdx }) {
|
|
130
|
+
switch (type) {
|
|
131
|
+
case SUPPORTED_RECORD_TYPE_MAP.CLIENT_HELLO:
|
|
132
|
+
const clientHello = parseClientHello(contentWithHeader);
|
|
133
|
+
clientRandom = clientHello.serverRandom;
|
|
134
|
+
const { SERVER_NAME: sni } = clientHello.extensions;
|
|
135
|
+
hostname = sni?.serverName;
|
|
136
|
+
if (!hostname) {
|
|
137
|
+
throw new Error('client hello has no SNI');
|
|
138
|
+
}
|
|
139
|
+
break;
|
|
140
|
+
case SUPPORTED_RECORD_TYPE_MAP.SERVER_HELLO:
|
|
141
|
+
const serverHello = await parseServerHello(content);
|
|
142
|
+
cipherSuite = serverHello.cipherSuite;
|
|
143
|
+
tlsVersion = serverHello.serverTlsVersion;
|
|
144
|
+
serverRandom = serverHello.serverRandom;
|
|
145
|
+
logger.info({ serverTLSVersion: tlsVersion, cipherSuite }, 'extracted server hello params');
|
|
146
|
+
break;
|
|
147
|
+
case SUPPORTED_RECORD_TYPE_MAP.CERTIFICATE:
|
|
148
|
+
const parseResult = parseCertificates(content, { version: tlsVersion });
|
|
149
|
+
certificates.push(...parseResult.certificates);
|
|
150
|
+
await verifyCertificateChain(certificates, hostname, logger);
|
|
151
|
+
logger.info({ hostname }, 'verified provider certificate chain');
|
|
152
|
+
certVerified = true;
|
|
153
|
+
break;
|
|
154
|
+
case SUPPORTED_RECORD_TYPE_MAP.CERTIFICATE_VERIFY:
|
|
155
|
+
const signature = parseServerCertificateVerify(content);
|
|
156
|
+
if (!certificates?.length) {
|
|
157
|
+
throw new Error('No provider certificates received');
|
|
158
|
+
}
|
|
159
|
+
const signatureData = await getSignatureDataTls13(handshakeRawMessages, cipherSuite);
|
|
160
|
+
await verifyCertificateSignature({
|
|
161
|
+
...signature,
|
|
162
|
+
publicKey: certificates[0].getPublicKey(),
|
|
163
|
+
signatureData,
|
|
164
|
+
});
|
|
165
|
+
certVerifyHandled = true;
|
|
166
|
+
break;
|
|
167
|
+
case SUPPORTED_RECORD_TYPE_MAP.SERVER_KEY_SHARE:
|
|
168
|
+
if (!certificates?.length) {
|
|
169
|
+
throw new Error('No provider certificates received');
|
|
170
|
+
}
|
|
171
|
+
const keyShare = await processServerKeyShare(content);
|
|
172
|
+
const signatureData12 = await getSignatureDataTls12({
|
|
173
|
+
clientRandom: clientRandom,
|
|
174
|
+
serverRandom: serverRandom,
|
|
175
|
+
curveType: keyShare.publicKeyType,
|
|
176
|
+
publicKey: keyShare.publicKey,
|
|
177
|
+
});
|
|
178
|
+
// verify signature
|
|
179
|
+
await verifyCertificateSignature({
|
|
180
|
+
signature: keyShare.signatureBytes,
|
|
181
|
+
algorithm: keyShare.signatureAlgorithm,
|
|
182
|
+
publicKey: certificates[0].getPublicKey(),
|
|
183
|
+
signatureData: signatureData12,
|
|
184
|
+
});
|
|
185
|
+
await verifyCertificateChain(certificates, hostname, logger);
|
|
186
|
+
logger.info({ hostname }, 'verified provider certificate chain');
|
|
187
|
+
certVerified = true;
|
|
188
|
+
break;
|
|
189
|
+
case SUPPORTED_RECORD_TYPE_MAP.FINISHED:
|
|
190
|
+
const packet = receipt[packetIdx];
|
|
191
|
+
if (packet.sender === TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_CLIENT) {
|
|
192
|
+
clientFinishedIdx = packetIdx;
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
serverFinishedIdx = packetIdx;
|
|
196
|
+
}
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function getWithoutHeader(message) {
|
|
202
|
+
// strip the record header (xx 03 03 xx xx)
|
|
203
|
+
return readWithLength(message.slice(3), 2);
|
|
204
|
+
}
|
|
205
|
+
function readWithLength(data, lengthBytes = 2) {
|
|
206
|
+
const dataView = uint8ArrayToDataView(data);
|
|
207
|
+
const length = lengthBytes === 1
|
|
208
|
+
? dataView.getUint8(0)
|
|
209
|
+
: dataView.getUint16(lengthBytes === 3 ? 1 : 0);
|
|
210
|
+
if (data.length < lengthBytes + length) {
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
return data.slice(lengthBytes, lengthBytes + length);
|
|
214
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isValidProxySessionId(sessionId: string): boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TEE OPRF Verification and Replacement
|
|
3
|
+
* Verifies OPRF proofs and replaces ranges in reconstructed plaintext
|
|
4
|
+
*/
|
|
5
|
+
import type { OPRFVerificationData } from '../../proto/tee-bundle.js';
|
|
6
|
+
import type { TeeBundleData } from '../../server/utils/tee-verification.js';
|
|
7
|
+
import type { Logger } from '../../types/general.js';
|
|
8
|
+
export interface OprfVerificationResult {
|
|
9
|
+
position: number;
|
|
10
|
+
length: number;
|
|
11
|
+
output: Uint8Array;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Verifies all OPRF proofs in the bundle and returns replacement data
|
|
15
|
+
*/
|
|
16
|
+
export declare function verifyOprfProofs(bundleData: TeeBundleData & {
|
|
17
|
+
oprfVerifications?: OPRFVerificationData[];
|
|
18
|
+
}, logger: Logger): Promise<OprfVerificationResult[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Replaces OPRF ranges in the reconstructed plaintext with verified outputs
|
|
21
|
+
*/
|
|
22
|
+
export declare function replaceOprfRanges(plaintext: Uint8Array, oprfResults: OprfVerificationResult[], logger: Logger): Uint8Array;
|