@seams/wallet-server 0.5.0
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/LICENSE +21 -0
- package/README.md +8 -0
- package/artifact-manifest.json +464 -0
- package/cloudflare-router-ab/build/deriver-a/index.js +2 -0
- package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/deriver-a/package.json +16 -0
- package/cloudflare-router-ab/build/deriver-a/worker/shim.mjs +4 -0
- package/cloudflare-router-ab/build/deriver-b/index.js +2 -0
- package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/deriver-b/package.json +16 -0
- package/cloudflare-router-ab/build/deriver-b/worker/shim.mjs +4 -0
- package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/router/index.js +2 -0
- package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/router/package.json +16 -0
- package/cloudflare-router-ab/build/router/worker/shim.mjs +4 -0
- package/cloudflare-router-ab/build/signing-worker/index.js +2 -0
- package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/signing-worker/package.json +16 -0
- package/cloudflare-router-ab/build/signing-worker/worker/shim.mjs +4 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/index.js +2 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/package.json +16 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/worker/shim.mjs +4 -0
- package/cloudflare-router-ab/env/tenant-root-control-plane.local.example +6 -0
- package/cloudflare-router-ab/migrations/deriver-a/0001_role_private_storage.sql +14 -0
- package/cloudflare-router-ab/migrations/deriver-a/0002_tenant_root_role_shares.sql +32 -0
- package/cloudflare-router-ab/migrations/deriver-a/0003_tenant_root_command_replays.sql +76 -0
- package/cloudflare-router-ab/migrations/deriver-a/0004_tenant_root_creation_admission.sql +7 -0
- package/cloudflare-router-ab/migrations/deriver-a/0005_tenant_root_refresh_state.sql +15 -0
- package/cloudflare-router-ab/migrations/deriver-a/0006_tenant_root_restore_import_keys.sql +119 -0
- package/cloudflare-router-ab/migrations/deriver-a/0007_tenant_root_restore_refresh_attempts.sql +103 -0
- package/cloudflare-router-ab/migrations/deriver-a/0008_tenant_root_restore_promotion.sql +40 -0
- package/cloudflare-router-ab/migrations/deriver-a/0009_tenant_root_restore_preactivation_cleanup.sql +8 -0
- package/cloudflare-router-ab/migrations/deriver-a/0010_tenant_root_recovery_attempts.sql +26 -0
- package/cloudflare-router-ab/migrations/deriver-a/0011_tenant_root_source_retirement.sql +100 -0
- package/cloudflare-router-ab/migrations/deriver-b/0001_role_private_storage.sql +14 -0
- package/cloudflare-router-ab/migrations/deriver-b/0002_tenant_root_role_shares.sql +32 -0
- package/cloudflare-router-ab/migrations/deriver-b/0003_tenant_root_command_replays.sql +76 -0
- package/cloudflare-router-ab/migrations/deriver-b/0004_tenant_root_creation_admission.sql +7 -0
- package/cloudflare-router-ab/migrations/deriver-b/0005_tenant_root_refresh_state.sql +15 -0
- package/cloudflare-router-ab/migrations/deriver-b/0006_tenant_root_restore_import_keys.sql +119 -0
- package/cloudflare-router-ab/migrations/deriver-b/0007_tenant_root_restore_refresh_attempts.sql +103 -0
- package/cloudflare-router-ab/migrations/deriver-b/0008_tenant_root_restore_promotion.sql +40 -0
- package/cloudflare-router-ab/migrations/deriver-b/0009_tenant_root_restore_preactivation_cleanup.sql +8 -0
- package/cloudflare-router-ab/migrations/deriver-b/0010_tenant_root_recovery_attempts.sql +26 -0
- package/cloudflare-router-ab/migrations/deriver-b/0011_tenant_root_source_retirement.sql +100 -0
- package/cloudflare-router-ab/migrations/signing-worker/0001_private_storage.sql +67 -0
- package/cloudflare-router-ab/migrations/signing-worker/0002_activation_revocation_fences.sql +3 -0
- package/cloudflare-router-ab/scripts/bootstrap-local-tenant-root.mjs +182 -0
- package/cloudflare-router-ab/scripts/initialize-local-wallet.mjs +17 -0
- package/cloudflare-router-ab/scripts/local-key-material.mjs +29 -0
- package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +1110 -0
- package/cloudflare-router-ab/scripts/start-local-role-workers.mjs +333 -0
- package/cloudflare-router-ab/scripts/start-local-wallet-system.mjs +427 -0
- package/cloudflare-router-ab/wrangler.deriver-a.toml +123 -0
- package/cloudflare-router-ab/wrangler.deriver-b.toml +123 -0
- package/cloudflare-router-ab/wrangler.router.toml +126 -0
- package/cloudflare-router-ab/wrangler.signing-worker.toml +86 -0
- package/cloudflare-router-ab/wrangler.tenant-root-control-plane.toml +56 -0
- package/dist/esm/authorization/capabilityPolicy.js +96 -0
- package/dist/esm/authorization/domain.js +434 -0
- package/dist/esm/authorization/factorEvidence.js +405 -0
- package/dist/esm/authorization/service.js +319 -0
- package/dist/esm/authorization/vaultProxyUse.js +295 -0
- package/dist/esm/cloud-host.js +126 -0
- package/dist/esm/core/AuthService.js +2 -0
- package/dist/esm/core/EmailOtpRecords.js +361 -0
- package/dist/esm/core/EmailOtpStores.js +1460 -0
- package/dist/esm/core/IdentityStore.js +617 -0
- package/dist/esm/core/NearPublicKeyStore.js +242 -0
- package/dist/esm/core/RegistrationCeremonyStore.js +2101 -0
- package/dist/esm/core/SessionService.js +255 -0
- package/dist/esm/core/ThresholdService/config.js +111 -0
- package/dist/esm/core/ThresholdService/ecdsaClientRootProof.js +27 -0
- package/dist/esm/core/ThresholdService/evmCryptoWasm.js +167 -0
- package/dist/esm/core/ThresholdService/index.js +4 -0
- package/dist/esm/core/ThresholdService/kv.js +368 -0
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +360 -0
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillLiveSession.js +282 -0
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.js +272 -0
- package/dist/esm/core/ThresholdService/routerAb/internalServiceHttp.js +57 -0
- package/dist/esm/core/ThresholdService/routerAbEcdsaSigningWorkerWasm.js +115 -0
- package/dist/esm/core/ThresholdService/routerAbNormalSigningPolicy.js +31 -0
- package/dist/esm/core/ThresholdService/secureRandomId.js +9 -0
- package/dist/esm/core/ThresholdService/stores/CloudflareDurableObjectStore.js +603 -0
- package/dist/esm/core/ThresholdService/stores/EcdsaSigningStore.js +422 -0
- package/dist/esm/core/ThresholdService/stores/KeyStore.js +140 -0
- package/dist/esm/core/ThresholdService/stores/SessionStore.js +437 -0
- package/dist/esm/core/ThresholdService/stores/StoreConfig.js +13 -0
- package/dist/esm/core/ThresholdService/stores/WalletSessionStore.js +722 -0
- package/dist/esm/core/ThresholdService/validation.js +718 -0
- package/dist/esm/core/WalletAuthMethodStore.js +180 -0
- package/dist/esm/core/WalletStore.js +495 -0
- package/dist/esm/core/WebAuthnAuthenticatorStore.js +485 -0
- package/dist/esm/core/WebAuthnCredentialBindingStore.js +594 -0
- package/dist/esm/core/WebAuthnLoginChallengeStore.js +432 -0
- package/dist/esm/core/WebAuthnSyncChallengeStore.js +434 -0
- package/dist/esm/core/authService/AuthService.js +611 -0
- package/dist/esm/core/authService/bytes.js +22 -0
- package/dist/esm/core/authService/configValues.js +15 -0
- package/dist/esm/core/authService/emailOtpChallengeOperations.js +126 -0
- package/dist/esm/core/authService/emailOtpChallengeProof.js +214 -0
- package/dist/esm/core/authService/emailOtpChallengeVerification.js +335 -0
- package/dist/esm/core/authService/emailOtpChallenges.js +260 -0
- package/dist/esm/core/authService/emailOtpConfig.js +231 -0
- package/dist/esm/core/authService/emailOtpDelivery.js +169 -0
- package/dist/esm/core/authService/emailOtpEnrollment.js +141 -0
- package/dist/esm/core/authService/emailOtpGrant.js +74 -0
- package/dist/esm/core/authService/emailOtpRegistrationEnrollment.js +322 -0
- package/dist/esm/core/authService/emailOtpSeal.js +78 -0
- package/dist/esm/core/authService/emailOtpUnlock.js +264 -0
- package/dist/esm/core/authService/githubOAuth.js +140 -0
- package/dist/esm/core/authService/googleEmailOtpErrors.js +6 -0
- package/dist/esm/core/authService/googleEmailOtpOperations.js +141 -0
- package/dist/esm/core/authService/googleEmailOtpRegistration.js +674 -0
- package/dist/esm/core/authService/identity.js +57 -0
- package/dist/esm/core/authService/identityOperations.js +32 -0
- package/dist/esm/core/authService/nearAccountOperations.js +229 -0
- package/dist/esm/core/authService/nearPrivateKeySigning.js +110 -0
- package/dist/esm/core/authService/nearPublicKeyMetadata.js +127 -0
- package/dist/esm/core/authService/nearTransactions.js +139 -0
- package/dist/esm/core/authService/oidcVerification.js +262 -0
- package/dist/esm/core/authService/portableCrypto.js +19 -0
- package/dist/esm/core/authService/rateLimits.js +117 -0
- package/dist/esm/core/authService/record.js +8 -0
- package/dist/esm/core/authService/registrationThresholdHelpers.js +131 -0
- package/dist/esm/core/authService/runtime.js +45 -0
- package/dist/esm/core/authService/signerWasmUrls.js +20 -0
- package/dist/esm/core/authService/storeRegistry.js +113 -0
- package/dist/esm/core/authService/thresholdEcdsaKeyInventory.js +146 -0
- package/dist/esm/core/authService/thresholdRuntimePolicy.js +19 -0
- package/dist/esm/core/authService/thresholdStoreSummary.js +32 -0
- package/dist/esm/core/authService/walletRegistrationPlanning.js +49 -0
- package/dist/esm/core/authService/wasm.js +78 -0
- package/dist/esm/core/authService/webauthn.js +746 -0
- package/dist/esm/core/authService/webauthnAuthority.js +17 -0
- package/dist/esm/core/authService/webauthnOidcHelpers.js +91 -0
- package/dist/esm/core/authService/webauthnWalletBinding.js +157 -0
- package/dist/esm/core/config.js +110 -0
- package/dist/esm/core/d1IdentityStore.js +340 -0
- package/dist/esm/core/d1WalletAuthMethodStore.js +768 -0
- package/dist/esm/core/d1WalletStore.js +724 -0
- package/dist/esm/core/defaultConfigsServer.js +9 -0
- package/dist/esm/core/deviceLinking/index.js +5 -0
- package/dist/esm/core/deviceLinking/linkedDeviceEd25519ExportRoot.js +0 -0
- package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +211 -0
- package/dist/esm/core/deviceLinking/linkedDeviceManagement.js +279 -0
- package/dist/esm/core/deviceLinking/linkedDeviceSession.js +1419 -0
- package/dist/esm/core/deviceLinking/requestProof.js +172 -0
- package/dist/esm/core/errors.js +54 -0
- package/dist/esm/core/hostedAccountIds.js +225 -0
- package/dist/esm/core/keyMaterialBrands.js +58 -0
- package/dist/esm/core/logger.js +39 -0
- package/dist/esm/core/nearKeys.js +20 -0
- package/dist/esm/core/nearRelayerAccountProvisioning.js +713 -0
- package/dist/esm/core/nearSignerWasmRuntime.js +87 -0
- package/dist/esm/core/registrationContracts.js +2 -0
- package/dist/esm/core/routerAbSigning/RouterAbEcdsaPresignRuntime.js +88 -0
- package/dist/esm/core/routerAbSigning/RouterAbNormalSigningRuntime.js +101 -0
- package/dist/esm/core/routerAbSigning/createCloudflareDurableObjectRouterAbSigningRuntimes.js +39 -0
- package/dist/esm/core/routerAbSigning/createRouterAbSigningRuntimes.js +91 -0
- package/dist/esm/core/rpcClients/near/NearClient.js +389 -0
- package/dist/esm/core/sessionValidation.js +0 -0
- package/dist/esm/core/signingLanes/LaneAggregateRevocationApplicationService.js +86 -0
- package/dist/esm/core/signingLanes/LaneEffectJournalStore.js +0 -0
- package/dist/esm/core/signingLanes/LaneEnrollmentActivation.js +324 -0
- package/dist/esm/core/signingLanes/LaneEnrollmentRevocation.js +173 -0
- package/dist/esm/core/signingLanes/LaneLifecycleApplicationService.js +200 -0
- package/dist/esm/core/signingLanes/LaneLifecycleStore.js +24 -0
- package/dist/esm/core/signingLanes/SigningLaneStore.js +0 -0
- package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +296 -0
- package/dist/esm/core/signingLanes/WalletKeyStore.js +0 -0
- package/dist/esm/core/signingLanes/ecdsaServerRetirement.js +78 -0
- package/dist/esm/core/signingLanes/ed25519ServerRetirement.js +71 -0
- package/dist/esm/core/signingLanes/index.js +8 -0
- package/dist/esm/core/signingLanes/signingWorkerLaneMaterialIdentity.js +0 -0
- package/dist/esm/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.js +305 -0
- package/dist/esm/core/threeRouteRegistrationContracts.js +5 -0
- package/dist/esm/core/thresholdEcdsaChainTarget.js +49 -0
- package/dist/esm/core/types.js +8 -0
- package/dist/esm/core/utils.js +14 -0
- package/dist/esm/delegateAction/index.js +136 -0
- package/dist/esm/hosted-wallet-gateway-worker.js +18 -0
- package/dist/esm/hosted-wallet-gateway.js +701 -0
- package/dist/esm/index.js +53 -0
- package/dist/esm/local-hosted-wallet-gateway-worker.js +23 -0
- package/dist/esm/node_modules/@near-js/types/lib/esm/provider/response.js +17 -0
- package/dist/esm/router/auth/authRequestValidation.js +264 -0
- package/dist/esm/router/auth/commonRouterUtils.js +305 -0
- package/dist/esm/router/auth/routerApiCredentialAuth.js +91 -0
- package/dist/esm/router/auth/routerApiKeyAuth.js +63 -0
- package/dist/esm/router/auth/walletSessionFailure.js +49 -0
- package/dist/esm/router/auth/webAuthnCredentialCodecs.js +107 -0
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthBoundary.js +84 -0
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthConfig.js +321 -0
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +1581 -0
- package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +1820 -0
- package/dist/esm/router/cloudflare/d1/authorization/d1VaultProxyStore.js +122 -0
- package/dist/esm/router/cloudflare/d1/authorization/walletSessionAuthorityProjection.js +119 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +1831 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEd25519ExportRootStore.js +118 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpGrantStore.js +81 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpTargetFactor.js +539 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceManagementService.js +92 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +560 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +136 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRouteService.js +95 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.js +91 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionService.js +15 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.js +732 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSourceContributionPreparationPlanner.js +195 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetAuthenticatorStore.js +100 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +867 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.js +169 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.js +255 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkSourceReader.js +128 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/index.js +15 -0
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoCapabilityPersistence.js +311 -0
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js +21 -0
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoWalletSigner.js +65 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +216 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeService.js +326 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +346 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +495 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpDeliveryRuntime.js +157 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpEnrollmentStore.js +248 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpGrantStore.js +66 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.js +76 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +539 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +404 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRegistrationEnrollmentFinalizer.js +200 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpServerSealRuntime.js +84 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationAttemptStore.js +217 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationRecords.js +485 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +509 -0
- package/dist/esm/router/cloudflare/d1/identity/d1IdentityRecords.js +51 -0
- package/dist/esm/router/cloudflare/d1/identity/d1IdentityService.js +135 -0
- package/dist/esm/router/cloudflare/d1/near/d1NearPublicKeyStore.js +62 -0
- package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +272 -0
- package/dist/esm/router/cloudflare/d1/oidc/d1OidcVerificationService.js +132 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyEnvelopeStore.js +628 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.js +871 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +823 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpAttemptStore.js +38 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpRecords.js +304 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpService.js +793 -0
- package/dist/esm/router/cloudflare/d1/registration/d1EvmFamilyEcdsaRegistrationBranch.js +120 -0
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +317 -0
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +2084 -0
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +309 -0
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationIntentService.js +120 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +263 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +3887 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +182 -0
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +399 -0
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +486 -0
- package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +146 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1EcdsaLanePrivateBindingResolver.js +10 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneAggregateRevocationApplicationService.js +22 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneEffectJournalStore.js +167 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneEnrollmentGateway.js +38 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLifecycleApplicationService.js +20 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLifecycleStore.js +1459 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLockStore.js +114 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneProtocolCommitter.js +16 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneRecords.js +170 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/index.js +10 -0
- package/dist/esm/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.js +412 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +1396 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodBoundary.js +285 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +2018 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +792 -0
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +635 -0
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnRecords.js +538 -0
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnStore.js +264 -0
- package/dist/esm/router/cloudflare/durableObjects/thresholdStore.js +514 -0
- package/dist/esm/router/cloudflare/durableObjects/versionedJsonRecordStore.js +192 -0
- package/dist/esm/router/cloudflare/runtime/cloudflare.types.js +0 -0
- package/dist/esm/router/cloudflare/runtime/cloudflareSignerWasm.js +8 -0
- package/dist/esm/router/cloudflare/runtime/createCloudflareRouter.js +19 -0
- package/dist/esm/router/cloudflare/runtime/createSelfHostedCloudflareSigningWorker.js +94 -0
- package/dist/esm/router/cloudflare/runtime/ed25519SessionAdapter.js +106 -0
- package/dist/esm/router/cloudflare/runtime/environment.js +25 -0
- package/dist/esm/router/cloudflare/runtime/routerAbPrewarm.js +34 -0
- package/dist/esm/router/cloudflare/runtime/routerAbServiceBindings.js +33 -0
- package/dist/esm/router/cloudflare/runtime/sessionAdapterRuntime.js +104 -0
- package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +168 -0
- package/dist/esm/router/cloudflare/runtime/tenantRootCreationGrant.js +147 -0
- package/dist/esm/router/cloudflare/runtime/walletConsoleOps.js +143 -0
- package/dist/esm/router/cloudflare/runtime/walletConsoleOpsClient.js +227 -0
- package/dist/esm/router/cloudflare/runtime/walletConsoleTenantRootLineage.js +30 -0
- package/dist/esm/router/cloudflare/runtime/walletControlOps.js +107 -0
- package/dist/esm/router/cloudflare/runtime/walletGateway.js +149 -0
- package/dist/esm/router/cloudflare/runtime/walletRuntimeOps.js +322 -0
- package/dist/esm/router/cloudflare/runtime/walletRuntimeOpsHandler.js +48 -0
- package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.js +597 -0
- package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.js +272 -0
- package/dist/esm/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js +477 -0
- package/dist/esm/router/cloudflare/signingLanes/index.js +4 -0
- package/dist/esm/router/cloudflare/signingLanes/linkedDeviceEd25519CeremonyBinding.js +32 -0
- package/dist/esm/router/cloudflare-adaptor.js +45 -0
- package/dist/esm/router/cloudflare.js +42794 -0
- package/dist/esm/router/domains/ecdsa/routerAbEcdsaStrictRegistration.js +738 -0
- package/dist/esm/router/domains/ecdsa/thresholdEcdsaRequestValidation.js +134 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +368 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +624 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.js +143 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js +270 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRunner.js +31 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js +162 -0
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +1366 -0
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +465 -0
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js +1609 -0
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +540 -0
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js +394 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js +572 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js +555 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.js +268 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +329 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js +423 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js +432 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationTwoPhaseRunner.js +58 -0
- package/dist/esm/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.js +0 -0
- package/dist/esm/router/domains/ed25519Yao/session/routerAbEd25519YaoWalletSession.js +0 -0
- package/dist/esm/router/domains/ed25519Yao/session/thresholdEd25519RequestValidation.js +275 -0
- package/dist/esm/router/domains/emailOtp/emailOtpExportPolicy.js +70 -0
- package/dist/esm/router/domains/emailOtp/emailOtpRequestValidation.js +34 -0
- package/dist/esm/router/domains/emailOtp/emailOtpRouteHandlers.js +218 -0
- package/dist/esm/router/domains/emailOtp/emailOtpSessionRouteHelpers.js +210 -0
- package/dist/esm/router/domains/passkeyCustody/envelopeRevocationAdmission.js +26 -0
- package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.js +107 -0
- package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrievalRoute.js +45 -0
- package/dist/esm/router/domains/passkeyCustody/registrationCustodyOutcome.js +47 -0
- package/dist/esm/router/domains/passkeyCustody/verifiedCustodyFactor.js +46 -0
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.js +32 -0
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +170 -0
- package/dist/esm/router/domains/passkeyCustody/walletRecoveryAttempt.js +64 -0
- package/dist/esm/router/domains/passkeyCustody/walletRecoveryFinalization.js +652 -0
- package/dist/esm/router/domains/passkeyCustody/walletRecoveryKeyManifest.js +396 -0
- package/dist/esm/router/domains/passkeyCustody/walletRecoveryRotation.js +87 -0
- package/dist/esm/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.js +89 -0
- package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmissionCore.js +106 -0
- package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +2669 -0
- package/dist/esm/router/domains/signingOperations/walletExecutionAdmission.js +228 -0
- package/dist/esm/router/domains/syncAccount/syncAccountRequestValidation.js +78 -0
- package/dist/esm/router/domains/tenantRoot/tenantRootCustodyLineage.js +0 -0
- package/dist/esm/router/domains/tenantRoot/tenantRootEcdsaWalletSessionComposition.js +55 -0
- package/dist/esm/router/domains/tenantRoot/tenantRootEd25519WalletSessionComposition.js +56 -0
- package/dist/esm/router/domains/tenantRoot/tenantRootIdentityResolution.js +111 -0
- package/dist/esm/router/domains/walletRegistration/walletRegistrationInputs.js +0 -0
- package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +2199 -0
- package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +155 -0
- package/dist/esm/router/domains/walletUnlock/walletUnlockRequestedCapabilitiesValidation.js +84 -0
- package/dist/esm/router/domains/walletUnlock/walletUnlockRouteHandlers.js +1142 -0
- package/dist/esm/router/express-adaptor.js +84 -0
- package/dist/esm/router/express.js +26616 -0
- package/dist/esm/router/framework/apiCredentialPorts.js +11 -0
- package/dist/esm/router/framework/applyRouteMetering.js +26 -0
- package/dist/esm/router/framework/authServicePort.js +30 -0
- package/dist/esm/router/framework/enforceRoutePolicy.js +92 -0
- package/dist/esm/router/framework/http.js +87 -0
- package/dist/esm/router/framework/logger.js +7 -0
- package/dist/esm/router/framework/modules.js +34 -0
- package/dist/esm/router/framework/ror/index.js +5 -0
- package/dist/esm/router/framework/ror/normalize.js +57 -0
- package/dist/esm/router/framework/ror/options.js +33 -0
- package/dist/esm/router/framework/ror/provider.js +33 -0
- package/dist/esm/router/framework/ror/staticProvider.js +24 -0
- package/dist/esm/router/framework/routeAuthPolicy.js +16 -0
- package/dist/esm/router/framework/routeDefinitions.js +446 -0
- package/dist/esm/router/framework/routeExecutionContext.js +24 -0
- package/dist/esm/router/framework/routeExtensions.js +50 -0
- package/dist/esm/router/framework/routeMeteringPolicy.js +0 -0
- package/dist/esm/router/framework/routeRequestValidation.js +32 -0
- package/dist/esm/router/framework/routeResponses.js +33 -0
- package/dist/esm/router/framework/routerApi.js +42 -0
- package/dist/esm/router/framework/routerApiRouteSurface.js +54 -0
- package/dist/esm/router/framework/routerApiWebhooks.js +60 -0
- package/dist/esm/router/framework/runtimeSnapshotConsumer.js +145 -0
- package/dist/esm/router/framework/versionedJsonRecordStore.js +0 -0
- package/dist/esm/router/ror-adaptor.js +5 -0
- package/dist/esm/router/ror.js +178 -0
- package/dist/esm/router/transport/fetch/createFetchRouter.js +309 -0
- package/dist/esm/router/transport/fetch/fetchRouter.types.js +0 -0
- package/dist/esm/router/transport/fetch/routes/auth.js +219 -0
- package/dist/esm/router/transport/fetch/routes/deviceLinking.js +1196 -0
- package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +264 -0
- package/dist/esm/router/transport/fetch/routes/deviceManagement.js +289 -0
- package/dist/esm/router/transport/fetch/routes/health.js +42 -0
- package/dist/esm/router/transport/fetch/routes/nearPublicKeys.js +39 -0
- package/dist/esm/router/transport/fetch/routes/normalSigningRouterProxy.js +118 -0
- package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +1618 -0
- package/dist/esm/router/transport/fetch/routes/sessions.js +1033 -0
- package/dist/esm/router/transport/fetch/routes/syncAccount.js +187 -0
- package/dist/esm/router/transport/fetch/routes/syncAccountBootstrap.js +214 -0
- package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +1729 -0
- package/dist/esm/router/transport/fetch/routes/thresholdEd25519.js +1321 -0
- package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +228 -0
- package/dist/esm/router/transport/fetch/routes/walletRegistration.js +73 -0
- package/dist/esm/router/transport/fetch/routes/webauthnAuthenticators.js +43 -0
- package/dist/esm/router/transport/fetch/routes/wellKnown.js +48 -0
- package/dist/esm/shared-ts/src/authorization/capabilityKinds.js +224 -0
- package/dist/esm/shared-ts/src/authorization/delegatedAuthority.js +134 -0
- package/dist/esm/shared-ts/src/authorization/index.js +6 -0
- package/dist/esm/shared-ts/src/authorization/operationFingerprint.js +58 -0
- package/dist/esm/shared-ts/src/authorization/walletAuthority.js +802 -0
- package/dist/esm/shared-ts/src/authorization/walletCustodyOperation.js +18 -0
- package/dist/esm/shared-ts/src/authorization/walletSessionIssuance.js +5 -0
- package/dist/esm/shared-ts/src/device-linking/committedSignerPackages.js +332 -0
- package/dist/esm/shared-ts/src/device-linking/contracts.js +8 -0
- package/dist/esm/shared-ts/src/device-linking/delegatedActivationPlan.js +132 -0
- package/dist/esm/shared-ts/src/device-linking/digests.js +273 -0
- package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +158 -0
- package/dist/esm/shared-ts/src/device-linking/index.js +9 -0
- package/dist/esm/shared-ts/src/device-linking/parsers.js +1412 -0
- package/dist/esm/shared-ts/src/device-linking/requestProof.js +114 -0
- package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +563 -0
- package/dist/esm/shared-ts/src/device-linking/walletSessionCredentialDelivery.js +207 -0
- package/dist/esm/shared-ts/src/near/actions.js +75 -0
- package/dist/esm/shared-ts/src/passkey-custody/ceremonyCommitPayload.js +69 -0
- package/dist/esm/shared-ts/src/passkey-custody/credentialActivity.js +81 -0
- package/dist/esm/shared-ts/src/passkey-custody/custodyEnvelope.js +272 -0
- package/dist/esm/shared-ts/src/passkey-custody/custodySecretBinding.js +175 -0
- package/dist/esm/shared-ts/src/passkey-custody/index.js +5 -0
- package/dist/esm/shared-ts/src/passkey-custody/primitives.js +92 -0
- package/dist/esm/shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.js +53 -0
- package/dist/esm/shared-ts/src/signing-lanes/execution.js +14 -0
- package/dist/esm/shared-ts/src/signing-lanes/index.js +11 -0
- package/dist/esm/shared-ts/src/signing-lanes/linkedEcdsaScope.js +1 -0
- package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +91 -0
- package/dist/esm/shared-ts/src/signing-lanes/participantDigest.js +124 -0
- package/dist/esm/shared-ts/src/signing-lanes/participants.js +262 -0
- package/dist/esm/shared-ts/src/signing-lanes/recordParsers.js +143 -0
- package/dist/esm/shared-ts/src/signing-lanes/rotation.js +8 -0
- package/dist/esm/shared-ts/src/signing-lanes/rotationDigests.js +397 -0
- package/dist/esm/shared-ts/src/signing-lanes/rotationLifecycle.js +313 -0
- package/dist/esm/shared-ts/src/signing-lanes/rotationParsers.js +1620 -0
- package/dist/esm/shared-ts/src/tenant-root/index.js +2 -0
- package/dist/esm/shared-ts/src/tenant-root/tenantRootIdentity.js +198 -0
- package/dist/esm/shared-ts/src/tenant-root/tenantRootOperationRecord.js +440 -0
- package/dist/esm/shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.js +85 -0
- package/dist/esm/shared-ts/src/threshold/participants.js +26 -0
- package/dist/esm/shared-ts/src/threshold/sessionPolicy.js +9 -0
- package/dist/esm/shared-ts/src/threshold/signingRootScope.js +40 -0
- package/dist/esm/shared-ts/src/utils/addAuthMethodRegistration.js +104 -0
- package/dist/esm/shared-ts/src/utils/addWalletAuthMethod.js +36 -0
- package/dist/esm/shared-ts/src/utils/base58.js +28 -0
- package/dist/esm/shared-ts/src/utils/base64.js +70 -0
- package/dist/esm/shared-ts/src/utils/canonicalPrimitives.js +27 -0
- package/dist/esm/shared-ts/src/utils/digests.js +33 -0
- package/dist/esm/shared-ts/src/utils/domainIds.js +309 -0
- package/dist/esm/shared-ts/src/utils/ecdsaCapabilityActivation.js +34 -0
- package/dist/esm/shared-ts/src/utils/ecdsaKeyFactsInventory.js +46 -0
- package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +38 -0
- package/dist/esm/shared-ts/src/utils/emailOtpRecoveryKey.js +10 -0
- package/dist/esm/shared-ts/src/utils/encoders.js +2 -0
- package/dist/esm/shared-ts/src/utils/errors.js +88 -0
- package/dist/esm/shared-ts/src/utils/evmRpcResults.js +97 -0
- package/dist/esm/shared-ts/src/utils/jsonRpc.js +64 -0
- package/dist/esm/shared-ts/src/utils/keccak.js +150 -0
- package/dist/esm/shared-ts/src/utils/near.js +99 -0
- package/dist/esm/shared-ts/src/utils/nearRpcResults.js +205 -0
- package/dist/esm/shared-ts/src/utils/normalize.js +87 -0
- package/dist/esm/shared-ts/src/utils/registrationEstablishedSession.js +201 -0
- package/dist/esm/shared-ts/src/utils/registrationIntent.js +1268 -0
- package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +1655 -0
- package/dist/esm/shared-ts/src/utils/routerAbEd25519Yao.js +984 -0
- package/dist/esm/shared-ts/src/utils/routerAbNormalSigningIdentity.js +118 -0
- package/dist/esm/shared-ts/src/utils/routerAbPublicKeyset.js +138 -0
- package/dist/esm/shared-ts/src/utils/routerAbTraceContext.js +36 -0
- package/dist/esm/shared-ts/src/utils/secureRandomId.js +35 -0
- package/dist/esm/shared-ts/src/utils/signingSessionSeal.js +118 -0
- package/dist/esm/shared-ts/src/utils/thresholdEcdsaKeyHandle.js +28 -0
- package/dist/esm/shared-ts/src/utils/validation.js +23 -0
- package/dist/esm/shared-ts/src/utils/walletAddSignerActivation.js +32 -0
- package/dist/esm/shared-ts/src/utils/walletAuthAuthority.js +207 -0
- package/dist/esm/shared-ts/src/utils/walletSessionFailure.js +15 -0
- package/dist/esm/shared-ts/src/utils/webauthnDeviceInfo.js +207 -0
- package/dist/esm/shared-ts/src/wallet-recovery/backupAcknowledgement.js +66 -0
- package/dist/esm/shared-ts/src/wallet-recovery/index.js +10 -0
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeIssuance.js +1 -0
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeLocator.js +34 -0
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeReservation.js +80 -0
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodes.js +4 -0
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryKeyId.js +53 -0
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryCommittedProjection.js +108 -0
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.js +157 -0
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEnvelopeSet.js +233 -0
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryRotation.js +3 -0
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryTarget.js +29 -0
- package/dist/esm/storage/d1Sql.js +85 -0
- package/dist/esm/storage/tenantRoute.js +89 -0
- package/dist/esm/tenant-root.js +5 -0
- package/dist/esm/threshold/session/signingSessionSeal/crypto/cipher.js +204 -0
- package/dist/esm/threshold/session/signingSessionSeal/crypto/shamir3PassWasm.js +87 -0
- package/dist/esm/threshold/session/signingSessionSeal/guards/backends.js +192 -0
- package/dist/esm/threshold/session/signingSessionSeal/guards/index.js +121 -0
- package/dist/esm/threshold/session/signingSessionSeal/idempotency.js +38 -0
- package/dist/esm/threshold/session/signingSessionSeal/idempotencyBackends.js +131 -0
- package/dist/esm/threshold/session/signingSessionSeal/idempotencyRecords.js +55 -0
- package/dist/esm/threshold/session/signingSessionSeal/index.js +13 -0
- package/dist/esm/threshold/session/signingSessionSeal/observability/audit.js +38 -0
- package/dist/esm/threshold/session/signingSessionSeal/options.js +54 -0
- package/dist/esm/threshold/session/signingSessionSeal/routesOptions.js +45 -0
- package/dist/esm/threshold/session/signingSessionSeal/service.js +316 -0
- package/dist/esm/threshold/session/signingSessionSeal/signingSessionSeal.types.js +0 -0
- package/dist/esm/threshold/session/signingSessionSeal/transport/express.js +151 -0
- package/dist/esm/threshold/session/signingSessionSeal/transport/fetch.js +106 -0
- package/dist/esm/threshold/session/signingSessionSeal/transport/shared.js +159 -0
- package/dist/esm/threshold/statusCodes.js +39 -0
- package/dist/esm/wasm/evm_crypto/pkg/evm_crypto.js +601 -0
- package/dist/esm/wasm/evm_crypto/pkg/evm_crypto_bg.wasm +0 -0
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker.js +1078 -0
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
- package/dist/esm/wasm/router_ab_ecdsa_signing_worker/pkg/router_ab_ecdsa_signing_worker.js +503 -0
- package/dist/esm/wasm/router_ab_ecdsa_signing_worker/pkg/router_ab_ecdsa_signing_worker_bg.wasm +0 -0
- package/dist/esm/wasm/shamir3pass_runtime/pkg/shamir3pass_runtime.js +393 -0
- package/dist/esm/wasm/shamir3pass_runtime/pkg/shamir3pass_runtime_bg.wasm +0 -0
- package/dist/esm/wasm/signer.js +2 -0
- package/dist/types/shared-ts/src/authorization/capabilityKinds.d.ts +147 -0
- package/dist/types/shared-ts/src/authorization/capabilityKinds.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/authorization/delegatedAuthority.d.ts +44 -0
- package/dist/types/shared-ts/src/authorization/index.d.ts +7 -0
- package/dist/types/shared-ts/src/authorization/operationFingerprint.d.ts +39 -0
- package/dist/types/shared-ts/src/authorization/operationFingerprint.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/authorization/walletAuthority.d.ts +168 -0
- package/dist/types/shared-ts/src/authorization/walletAuthority.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/authorization/walletCustodyOperation.d.ts +10 -0
- package/dist/types/shared-ts/src/authorization/walletSessionIssuance.d.ts +28 -0
- package/dist/types/shared-ts/src/device-linking/activeWalletSession.d.ts +3 -0
- package/dist/types/shared-ts/src/device-linking/activeWalletSession.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/device-linking/committedSignerPackages.d.ts +71 -0
- package/dist/types/shared-ts/src/device-linking/contracts.d.ts +843 -0
- package/dist/types/shared-ts/src/device-linking/contracts.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/device-linking/delegatedActivationPlan.d.ts +37 -0
- package/dist/types/shared-ts/src/device-linking/digests.d.ts +23 -0
- package/dist/types/shared-ts/src/device-linking/ed25519ExportRoot.d.ts +93 -0
- package/dist/types/shared-ts/src/device-linking/index.d.ts +11 -0
- package/dist/types/shared-ts/src/device-linking/parsers.d.ts +124 -0
- package/dist/types/shared-ts/src/device-linking/requestProof.d.ts +26 -0
- package/dist/types/shared-ts/src/device-linking/sourceContribution.d.ts +182 -0
- package/dist/types/shared-ts/src/device-linking/walletSessionCredentialDelivery.d.ts +84 -0
- package/dist/types/shared-ts/src/index.d.ts +10 -0
- package/dist/types/shared-ts/src/near/actions.d.ts +141 -0
- package/dist/types/shared-ts/src/near/delegate.d.ts +55 -0
- package/dist/types/shared-ts/src/near/index.d.ts +3 -0
- package/dist/types/shared-ts/src/passkey-custody/ceremonyCommitPayload.d.ts +211 -0
- package/dist/types/shared-ts/src/passkey-custody/credentialActivity.d.ts +49 -0
- package/dist/types/shared-ts/src/passkey-custody/credentialObservations.d.ts +74 -0
- package/dist/types/shared-ts/src/passkey-custody/custodyEnvelope.d.ts +191 -0
- package/dist/types/shared-ts/src/passkey-custody/custodySecretBinding.d.ts +140 -0
- package/dist/types/shared-ts/src/passkey-custody/envelopeIndex.d.ts +29 -0
- package/dist/types/shared-ts/src/passkey-custody/index.d.ts +9 -0
- package/dist/types/shared-ts/src/passkey-custody/kekContext.d.ts +34 -0
- package/dist/types/shared-ts/src/passkey-custody/passkeyCustody.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/passkey-custody/primitives.d.ts +34 -0
- package/dist/types/shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.d.ts +27 -0
- package/dist/types/shared-ts/src/signing-lanes/execution.d.ts +91 -0
- package/dist/types/shared-ts/src/signing-lanes/execution.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/signing-lanes/ids.d.ts +18 -0
- package/dist/types/shared-ts/src/signing-lanes/index.d.ts +14 -0
- package/dist/types/shared-ts/src/signing-lanes/linkedEcdsaScope.d.ts +62 -0
- package/dist/types/shared-ts/src/signing-lanes/linkedEcdsaScope.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/signing-lanes/ownerContinuity.d.ts +30 -0
- package/dist/types/shared-ts/src/signing-lanes/ownerContinuity.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/signing-lanes/participantDigest.d.ts +48 -0
- package/dist/types/shared-ts/src/signing-lanes/participantDigest.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/signing-lanes/participants.d.ts +89 -0
- package/dist/types/shared-ts/src/signing-lanes/recordParsers.d.ts +128 -0
- package/dist/types/shared-ts/src/signing-lanes/records.d.ts +160 -0
- package/dist/types/shared-ts/src/signing-lanes/records.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/signing-lanes/rotation.d.ts +894 -0
- package/dist/types/shared-ts/src/signing-lanes/rotation.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/signing-lanes/rotationDigests.d.ts +32 -0
- package/dist/types/shared-ts/src/signing-lanes/rotationLifecycle.d.ts +99 -0
- package/dist/types/shared-ts/src/signing-lanes/rotationParsers.d.ts +67 -0
- package/dist/types/shared-ts/src/signing-lanes/validation.d.ts +11 -0
- package/dist/types/shared-ts/src/tenant-root/index.d.ts +3 -0
- package/dist/types/shared-ts/src/tenant-root/tenantRootIdentity.d.ts +72 -0
- package/dist/types/shared-ts/src/tenant-root/tenantRootOperationRecord.d.ts +192 -0
- package/dist/types/shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.d.ts +77 -0
- package/dist/types/shared-ts/src/threshold/ed25519OperationFingerprint.d.ts +130 -0
- package/dist/types/shared-ts/src/threshold/index.d.ts +7 -0
- package/dist/types/shared-ts/src/threshold/participants.d.ts +38 -0
- package/dist/types/shared-ts/src/threshold/secp256k1.d.ts +39 -0
- package/dist/types/shared-ts/src/threshold/sessionPolicy.d.ts +5 -0
- package/dist/types/shared-ts/src/threshold/signingRootScope.d.ts +24 -0
- package/dist/types/shared-ts/src/utils/addAuthMethodRegistration.d.ts +63 -0
- package/dist/types/shared-ts/src/utils/addWalletAuthMethod.d.ts +295 -0
- package/dist/types/shared-ts/src/utils/addWalletAuthMethod.typecheck.d.ts +11 -0
- package/dist/types/shared-ts/src/utils/authenticatorOptions.d.ts +25 -0
- package/dist/types/shared-ts/src/utils/base58.d.ts +17 -0
- package/dist/types/shared-ts/src/utils/base64.d.ts +53 -0
- package/dist/types/shared-ts/src/utils/bigint.d.ts +3 -0
- package/dist/types/shared-ts/src/utils/canonicalPrimitives.d.ts +12 -0
- package/dist/types/shared-ts/src/utils/digests.d.ts +6 -0
- package/dist/types/shared-ts/src/utils/domainIds.d.ts +140 -0
- package/dist/types/shared-ts/src/utils/domainIds.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/ecdsaCapabilityActivation.d.ts +29 -0
- package/dist/types/shared-ts/src/utils/ecdsaKeyFactsInventory.d.ts +24 -0
- package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +30 -0
- package/dist/types/shared-ts/src/utils/emailOtpRecoveryKey.d.ts +31 -0
- package/dist/types/shared-ts/src/utils/encoders.d.ts +3 -0
- package/dist/types/shared-ts/src/utils/errors.d.ts +44 -0
- package/dist/types/shared-ts/src/utils/evmRpcResults.d.ts +31 -0
- package/dist/types/shared-ts/src/utils/generated/routerAbEd25519YaoCore.d.ts +128 -0
- package/dist/types/shared-ts/src/utils/index.d.ts +34 -0
- package/dist/types/shared-ts/src/utils/jsonRpc.d.ts +30 -0
- package/dist/types/shared-ts/src/utils/keccak.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/near.d.ts +81 -0
- package/dist/types/shared-ts/src/utils/nearRpcResults.d.ts +101 -0
- package/dist/types/shared-ts/src/utils/normalize.d.ts +57 -0
- package/dist/types/shared-ts/src/utils/paillier.d.ts +37 -0
- package/dist/types/shared-ts/src/utils/recoveryDomain.d.ts +12 -0
- package/dist/types/shared-ts/src/utils/registrationEstablishedSession.d.ts +85 -0
- package/dist/types/shared-ts/src/utils/registrationIntent.d.ts +621 -0
- package/dist/types/shared-ts/src/utils/registrationIntent.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/routerAbEcdsaDerivation.d.ts +715 -0
- package/dist/types/shared-ts/src/utils/routerAbEcdsaDerivation.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/routerAbEcdsaDerivationRefresh.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/routerAbEd25519Yao.d.ts +339 -0
- package/dist/types/shared-ts/src/utils/routerAbEd25519Yao.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/routerAbNormalSigningIdentity.d.ts +71 -0
- package/dist/types/shared-ts/src/utils/routerAbPublicKeyset.d.ts +51 -0
- package/dist/types/shared-ts/src/utils/routerAbTraceContext.d.ts +16 -0
- package/dist/types/shared-ts/src/utils/secureRandomId.d.ts +6 -0
- package/dist/types/shared-ts/src/utils/signerDomain.d.ts +75 -0
- package/dist/types/shared-ts/src/utils/signerDomain.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/signerSlot.d.ts +11 -0
- package/dist/types/shared-ts/src/utils/signingSessionSeal.d.ts +153 -0
- package/dist/types/shared-ts/src/utils/signingSessionSeal.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/theme.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/thresholdEcdsaKeyHandle.d.ts +11 -0
- package/dist/types/shared-ts/src/utils/validation.d.ts +35 -0
- package/dist/types/shared-ts/src/utils/walletAddSignerActivation.d.ts +23 -0
- package/dist/types/shared-ts/src/utils/walletAuthAuthority.d.ts +150 -0
- package/dist/types/shared-ts/src/utils/walletAuthAuthority.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/walletCapabilityBindings.d.ts +106 -0
- package/dist/types/shared-ts/src/utils/walletCapabilityBindings.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/walletSessionFailure.d.ts +13 -0
- package/dist/types/shared-ts/src/utils/webauthnDeviceInfo.d.ts +48 -0
- package/dist/types/shared-ts/src/wallet-recovery/backupAcknowledgement.d.ts +56 -0
- package/dist/types/shared-ts/src/wallet-recovery/index.d.ts +10 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeAttempt.d.ts +59 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeIssuance.d.ts +37 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeLocator.d.ts +22 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeReservation.d.ts +79 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodes.d.ts +11 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryEnvelopes.d.ts +42 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryKekContext.d.ts +37 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryKeyId.d.ts +58 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecovery.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryCommittedProjection.d.ts +110 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.d.ts +29 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryEnvelopeSet.d.ts +115 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryRotation.d.ts +18 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryTarget.d.ts +12 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryTarget.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/capabilityPolicy.d.ts +45 -0
- package/dist/types/wallet-server/src/authorization/capabilityPolicy.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/domain.d.ts +454 -0
- package/dist/types/wallet-server/src/authorization/domain.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/factorEvidence.d.ts +165 -0
- package/dist/types/wallet-server/src/authorization/factorEvidence.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/service.d.ts +227 -0
- package/dist/types/wallet-server/src/authorization/vaultProxyUse.d.ts +75 -0
- package/dist/types/wallet-server/src/cloud-host.d.ts +94 -0
- package/dist/types/wallet-server/src/core/AuthService.d.ts +3 -0
- package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +33 -0
- package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +336 -0
- package/dist/types/wallet-server/src/core/IdentityStore.d.ts +57 -0
- package/dist/types/wallet-server/src/core/NearPublicKeyStore.d.ts +58 -0
- package/dist/types/wallet-server/src/core/RegistrationCeremonyStore.d.ts +551 -0
- package/dist/types/wallet-server/src/core/SessionService.d.ts +70 -0
- package/dist/types/wallet-server/src/core/ThresholdService/config.d.ts +23 -0
- package/dist/types/wallet-server/src/core/ThresholdService/ecdsaClientRootProof.d.ts +12 -0
- package/dist/types/wallet-server/src/core/ThresholdService/evmCryptoWasm.d.ts +32 -0
- package/dist/types/wallet-server/src/core/ThresholdService/index.d.ts +4 -0
- package/dist/types/wallet-server/src/core/ThresholdService/kv.d.ts +52 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +45 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillLiveSession.d.ts +93 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.d.ts +138 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/internalServiceHttp.d.ts +30 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAbEcdsaSigningWorkerWasm.d.ts +17 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAbNormalSigningPolicy.d.ts +21 -0
- package/dist/types/wallet-server/src/core/ThresholdService/secureRandomId.d.ts +2 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/CloudflareDurableObjectStore.d.ts +128 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/EcdsaSigningStore.d.ts +76 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/KeyStore.d.ts +39 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/SessionStore.d.ts +102 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/StoreConfig.d.ts +3 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/ThresholdStoreConfig.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/WalletSessionStore.d.ts +98 -0
- package/dist/types/wallet-server/src/core/ThresholdService/thresholdEd25519AuthorityScope.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/core/ThresholdService/validation.d.ts +193 -0
- package/dist/types/wallet-server/src/core/WalletAuthMethodStore.d.ts +12 -0
- package/dist/types/wallet-server/src/core/WalletStore.d.ts +143 -0
- package/dist/types/wallet-server/src/core/WalletStore.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/core/WebAuthnAuthenticatorStore.d.ts +62 -0
- package/dist/types/wallet-server/src/core/WebAuthnCredentialBindingStore.d.ts +116 -0
- package/dist/types/wallet-server/src/core/WebAuthnCredentialBindingStore.typecheck.d.ts +13 -0
- package/dist/types/wallet-server/src/core/WebAuthnLoginChallengeStore.d.ts +50 -0
- package/dist/types/wallet-server/src/core/WebAuthnSyncChallengeStore.d.ts +50 -0
- package/dist/types/wallet-server/src/core/authService/AuthService.d.ts +493 -0
- package/dist/types/wallet-server/src/core/authService/bytes.d.ts +4 -0
- package/dist/types/wallet-server/src/core/authService/configValues.d.ts +7 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpChallengeOperations.d.ts +108 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpChallengeProof.d.ts +177 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpChallengeVerification.d.ts +46 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpChallenges.d.ts +110 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpConfig.d.ts +34 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpDelivery.d.ts +65 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpEnrollment.d.ts +79 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpGrant.d.ts +42 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpRegistrationEnrollment.d.ts +116 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpSeal.d.ts +35 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpUnlock.d.ts +70 -0
- package/dist/types/wallet-server/src/core/authService/githubOAuth.d.ts +35 -0
- package/dist/types/wallet-server/src/core/authService/googleEmailOtpErrors.d.ts +2 -0
- package/dist/types/wallet-server/src/core/authService/googleEmailOtpOperations.d.ts +126 -0
- package/dist/types/wallet-server/src/core/authService/googleEmailOtpRegistration.d.ts +172 -0
- package/dist/types/wallet-server/src/core/authService/identity.d.ts +25 -0
- package/dist/types/wallet-server/src/core/authService/identityOperations.d.ts +19 -0
- package/dist/types/wallet-server/src/core/authService/nearAccountOperations.d.ts +55 -0
- package/dist/types/wallet-server/src/core/authService/nearPrivateKeySigning.d.ts +16 -0
- package/dist/types/wallet-server/src/core/authService/nearPublicKeyMetadata.d.ts +43 -0
- package/dist/types/wallet-server/src/core/authService/nearTransactions.d.ts +49 -0
- package/dist/types/wallet-server/src/core/authService/oidcVerification.d.ts +65 -0
- package/dist/types/wallet-server/src/core/authService/portableCrypto.d.ts +3 -0
- package/dist/types/wallet-server/src/core/authService/rateLimits.d.ts +30 -0
- package/dist/types/wallet-server/src/core/authService/record.d.ts +2 -0
- package/dist/types/wallet-server/src/core/authService/registrationThresholdHelpers.d.ts +37 -0
- package/dist/types/wallet-server/src/core/authService/runtime.d.ts +20 -0
- package/dist/types/wallet-server/src/core/authService/signerWasmUrls.d.ts +3 -0
- package/dist/types/wallet-server/src/core/authService/storeRegistry.d.ts +58 -0
- package/dist/types/wallet-server/src/core/authService/thresholdEcdsaKeyInventory.d.ts +72 -0
- package/dist/types/wallet-server/src/core/authService/thresholdRuntimePolicy.d.ts +4 -0
- package/dist/types/wallet-server/src/core/authService/thresholdStoreSummary.d.ts +3 -0
- package/dist/types/wallet-server/src/core/authService/walletRegistrationPlanning.d.ts +19 -0
- package/dist/types/wallet-server/src/core/authService/wasm.d.ts +12 -0
- package/dist/types/wallet-server/src/core/authService/webauthn.d.ts +207 -0
- package/dist/types/wallet-server/src/core/authService/webauthnAuthority.d.ts +5 -0
- package/dist/types/wallet-server/src/core/authService/webauthnOidcHelpers.d.ts +52 -0
- package/dist/types/wallet-server/src/core/authService/webauthnWalletBinding.d.ts +48 -0
- package/dist/types/wallet-server/src/core/config.d.ts +13 -0
- package/dist/types/wallet-server/src/core/d1IdentityStore.d.ts +44 -0
- package/dist/types/wallet-server/src/core/d1WalletAuthMethodStore.d.ts +214 -0
- package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +108 -0
- package/dist/types/wallet-server/src/core/defaultConfigsServer.d.ts +5 -0
- package/dist/types/wallet-server/src/core/deviceLinking/index.d.ts +5 -0
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceEd25519ExportRoot.d.ts +36 -0
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceEmailOtpGrant.d.ts +87 -0
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceManagement.d.ts +137 -0
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceSession.d.ts +462 -0
- package/dist/types/wallet-server/src/core/deviceLinking/requestProof.d.ts +55 -0
- package/dist/types/wallet-server/src/core/errors.d.ts +10 -0
- package/dist/types/wallet-server/src/core/hostedAccountIds.d.ts +31 -0
- package/dist/types/wallet-server/src/core/keyMaterialBrands.d.ts +28 -0
- package/dist/types/wallet-server/src/core/keyMaterialBrands.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/core/logger.d.ts +21 -0
- package/dist/types/wallet-server/src/core/nearKeys.d.ts +3 -0
- package/dist/types/wallet-server/src/core/nearRelayerAccountProvisioning.d.ts +78 -0
- package/dist/types/wallet-server/src/core/nearSignerWasmRuntime.d.ts +3 -0
- package/dist/types/wallet-server/src/core/registrationContracts.d.ts +747 -0
- package/dist/types/wallet-server/src/core/registrationRequests.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbEcdsaPresignRuntime.d.ts +53 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbNormalSigningRuntime.d.ts +71 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/createCloudflareDurableObjectRouterAbSigningRuntimes.d.ts +28 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/createRouterAbSigningRuntimes.d.ts +16 -0
- package/dist/types/wallet-server/src/core/rpcClients/near/NearClient.d.ts +134 -0
- package/dist/types/wallet-server/src/core/sessionValidation.d.ts +9 -0
- package/dist/types/wallet-server/src/core/signingLanes/LaneAggregateRevocationApplicationService.d.ts +35 -0
- package/dist/types/wallet-server/src/core/signingLanes/LaneEffectJournalStore.d.ts +63 -0
- package/dist/types/wallet-server/src/core/signingLanes/LaneEnrollmentActivation.d.ts +13 -0
- package/dist/types/wallet-server/src/core/signingLanes/LaneEnrollmentRevocation.d.ts +24 -0
- package/dist/types/wallet-server/src/core/signingLanes/LaneLifecycleApplicationService.d.ts +141 -0
- package/dist/types/wallet-server/src/core/signingLanes/LaneLifecycleStore.d.ts +229 -0
- package/dist/types/wallet-server/src/core/signingLanes/SigningLaneStore.d.ts +15 -0
- package/dist/types/wallet-server/src/core/signingLanes/WalletExecutionLaneProjection.d.ts +59 -0
- package/dist/types/wallet-server/src/core/signingLanes/WalletKeyStore.d.ts +13 -0
- package/dist/types/wallet-server/src/core/signingLanes/ecdsaServerRetirement.d.ts +58 -0
- package/dist/types/wallet-server/src/core/signingLanes/ed25519ServerRetirement.d.ts +30 -0
- package/dist/types/wallet-server/src/core/signingLanes/index.d.ts +11 -0
- package/dist/types/wallet-server/src/core/signingLanes/signingWorkerLaneMaterialIdentity.d.ts +21 -0
- package/dist/types/wallet-server/src/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.d.ts +155 -0
- package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +442 -0
- package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.typecheck.d.ts +58 -0
- package/dist/types/wallet-server/src/core/thresholdEcdsaChainTarget.d.ts +15 -0
- package/dist/types/wallet-server/src/core/types.d.ts +757 -0
- package/dist/types/wallet-server/src/core/utils.d.ts +3 -0
- package/dist/types/wallet-server/src/delegateAction/index.d.ts +88 -0
- package/dist/types/wallet-server/src/hosted-wallet-gateway-worker.d.ts +10 -0
- package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +126 -0
- package/dist/types/wallet-server/src/index.d.ts +34 -0
- package/dist/types/wallet-server/src/local-hosted-wallet-gateway-worker.d.ts +13 -0
- package/dist/types/wallet-server/src/router/auth/authRequestValidation.d.ts +97 -0
- package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +142 -0
- package/dist/types/wallet-server/src/router/auth/routerApiCredentialAuth.d.ts +26 -0
- package/dist/types/wallet-server/src/router/auth/routerApiKeyAuth.d.ts +16 -0
- package/dist/types/wallet-server/src/router/auth/walletSessionFailure.d.ts +14 -0
- package/dist/types/wallet-server/src/router/auth/webAuthnCredentialCodecs.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthBoundary.d.ts +28 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +192 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +174 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1VaultProxyStore.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/walletSessionAuthorityProjection.d.ts +24 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +241 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEd25519ExportRootStore.d.ts +23 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpGrantStore.d.ts +32 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpTargetFactor.d.ts +118 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceManagementService.d.ts +22 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.d.ts +80 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.d.ts +29 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRouteService.d.ts +17 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.d.ts +37 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionService.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.d.ts +149 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSourceContributionPreparationPlanner.d.ts +38 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetAuthenticatorStore.d.ts +19 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.d.ts +220 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.d.ts +88 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.d.ts +54 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkSourceReader.d.ts +23 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/index.d.ts +15 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoCapabilityPersistence.d.ts +33 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.d.ts +6 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoWalletSigner.d.ts +27 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.d.ts +80 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeService.d.ts +48 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +64 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.d.ts +126 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpDeliveryRuntime.d.ts +22 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpEnrollmentStore.d.ts +68 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpGrantStore.d.ts +15 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +37 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +186 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.d.ts +45 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRegistrationEnrollmentFinalizer.d.ts +124 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpServerSealRuntime.d.ts +24 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationAttemptStore.d.ts +51 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationRecords.d.ts +69 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.d.ts +57 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/identity/d1IdentityRecords.d.ts +38 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/identity/d1IdentityService.d.ts +31 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/near/d1NearPublicKeyStore.d.ts +30 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/oidc/d1OidcBoundary.d.ts +60 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/oidc/d1OidcVerificationService.d.ts +39 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyEnvelopeStore.d.ts +335 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.d.ts +448 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +256 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpAttemptStore.d.ts +32 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpRecords.d.ts +116 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpService.d.ts +180 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1EvmFamilyEcdsaRegistrationBranch.d.ts +24 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +86 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.d.ts +121 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +84 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationIntentService.d.ts +31 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +49 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +369 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetup.d.ts +106 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.d.ts +104 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.d.ts +70 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +26 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1EcdsaLanePrivateBindingResolver.d.ts +4 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneAggregateRevocationApplicationService.d.ts +4 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneEffectJournalStore.d.ts +25 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneEnrollmentGateway.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLifecycleApplicationService.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLifecycleStore.d.ts +51 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLockStore.d.ts +28 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneProtocolCommitter.d.ts +5 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneRecords.d.ts +107 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/index.d.ts +10 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.d.ts +118 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +114 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodBoundary.d.ts +90 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +359 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +143 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.d.ts +42 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnRecords.d.ts +135 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnStore.d.ts +89 -0
- package/dist/types/wallet-server/src/router/cloudflare/durableObjects/thresholdStore.d.ts +19 -0
- package/dist/types/wallet-server/src/router/cloudflare/durableObjects/versionedJsonRecordStore.d.ts +32 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/cloudflare.types.d.ts +30 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/cloudflareSignerWasm.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/createCloudflareRouter.d.ts +5 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/createSelfHostedCloudflareSigningWorker.d.ts +23 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/ed25519SessionAdapter.d.ts +16 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/environment.d.ts +5 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/routerAbPrewarm.d.ts +9 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/routerAbServiceBindings.d.ts +11 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/sessionAdapterRuntime.d.ts +28 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/staticWalletConsoleBinding.d.ts +27 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/tenantRootCreationGrant.d.ts +24 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +143 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOpsClient.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleTenantRootLineage.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletControlOps.d.ts +21 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +30 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRuntimeOps.d.ts +64 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRuntimeOpsHandler.d.ts +3 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.d.ts +217 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.d.ts +73 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.d.ts +100 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/index.d.ts +4 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/linkedDeviceEd25519CeremonyBinding.d.ts +6 -0
- package/dist/types/wallet-server/src/router/cloudflare-adaptor.d.ts +75 -0
- package/dist/types/wallet-server/src/router/domains/ecdsa/routerAbEcdsaStrictRegistration.d.ts +199 -0
- package/dist/types/wallet-server/src/router/domains/ecdsa/thresholdEcdsaRequestValidation.d.ts +32 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +172 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.d.ts +156 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.d.ts +59 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.d.ts +47 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRunner.d.ts +29 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.d.ts +20 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +271 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.d.ts +12 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.d.ts +509 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryActivation.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.d.ts +14 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.d.ts +20 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.d.ts +56 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.d.ts +200 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.d.ts +70 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.d.ts +73 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.d.ts +9 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.d.ts +131 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationTwoPhaseRunner.d.ts +62 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.d.ts +17 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/session/routerAbEd25519YaoWalletSession.d.ts +178 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/session/routerAbEd25519YaoWalletSession.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/session/thresholdEd25519RequestValidation.d.ts +19 -0
- package/dist/types/wallet-server/src/router/domains/emailOtp/emailOtpExportPolicy.d.ts +32 -0
- package/dist/types/wallet-server/src/router/domains/emailOtp/emailOtpRequestValidation.d.ts +13 -0
- package/dist/types/wallet-server/src/router/domains/emailOtp/emailOtpRouteHandlers.d.ts +35 -0
- package/dist/types/wallet-server/src/router/domains/emailOtp/emailOtpSessionRouteHelpers.d.ts +134 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/envelopeRevocationAdmission.d.ts +31 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.d.ts +85 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrievalRoute.d.ts +42 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/registrationCustodyOutcome.d.ts +38 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/verifiedCustodyFactor.d.ts +35 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.d.ts +56 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +65 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletRecoveryAttempt.d.ts +59 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletRecoveryFinalization.d.ts +81 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletRecoveryKeyManifest.d.ts +184 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletRecoveryRotation.d.ts +31 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.d.ts +32 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmissionCore.d.ts +48 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbPrivateSigningWorker.d.ts +909 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/walletExecutionAdmission.d.ts +104 -0
- package/dist/types/wallet-server/src/router/domains/syncAccount/syncAccountRequestValidation.d.ts +30 -0
- package/dist/types/wallet-server/src/router/domains/tenantRoot/tenantRootCustodyLineage.d.ts +14 -0
- package/dist/types/wallet-server/src/router/domains/tenantRoot/tenantRootEcdsaWalletSessionComposition.d.ts +35 -0
- package/dist/types/wallet-server/src/router/domains/tenantRoot/tenantRootEd25519WalletSessionComposition.d.ts +35 -0
- package/dist/types/wallet-server/src/router/domains/tenantRoot/tenantRootIdentityResolution.d.ts +56 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +78 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +91 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationSetupPayload.d.ts +105 -0
- package/dist/types/wallet-server/src/router/domains/walletUnlock/walletUnlockRequestedCapabilitiesValidation.d.ts +39 -0
- package/dist/types/wallet-server/src/router/domains/walletUnlock/walletUnlockRouteHandlers.d.ts +172 -0
- package/dist/types/wallet-server/src/router/express-adaptor.d.ts +22 -0
- package/dist/types/wallet-server/src/router/framework/apiCredentialPorts.d.ts +82 -0
- package/dist/types/wallet-server/src/router/framework/applyRouteMetering.d.ts +23 -0
- package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +1392 -0
- package/dist/types/wallet-server/src/router/framework/enforceRoutePolicy.d.ts +48 -0
- package/dist/types/wallet-server/src/router/framework/http.d.ts +12 -0
- package/dist/types/wallet-server/src/router/framework/logger.d.ts +5 -0
- package/dist/types/wallet-server/src/router/framework/modules.d.ts +17 -0
- package/dist/types/wallet-server/src/router/framework/ror/index.d.ts +7 -0
- package/dist/types/wallet-server/src/router/framework/ror/normalize.d.ts +14 -0
- package/dist/types/wallet-server/src/router/framework/ror/options.d.ts +9 -0
- package/dist/types/wallet-server/src/router/framework/ror/provider.d.ts +17 -0
- package/dist/types/wallet-server/src/router/framework/ror/staticProvider.d.ts +11 -0
- package/dist/types/wallet-server/src/router/framework/routeAuthPolicy.d.ts +34 -0
- package/dist/types/wallet-server/src/router/framework/routeDefinitions.d.ts +27 -0
- package/dist/types/wallet-server/src/router/framework/routeDefinitions.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/framework/routeExecutionContext.d.ts +29 -0
- package/dist/types/wallet-server/src/router/framework/routeExtensions.d.ts +27 -0
- package/dist/types/wallet-server/src/router/framework/routeMeteringPolicy.d.ts +17 -0
- package/dist/types/wallet-server/src/router/framework/routeRequestValidation.d.ts +5 -0
- package/dist/types/wallet-server/src/router/framework/routeResponses.d.ts +17 -0
- package/dist/types/wallet-server/src/router/framework/routerApi.d.ts +221 -0
- package/dist/types/wallet-server/src/router/framework/routerApiRouteSurface.d.ts +14 -0
- package/dist/types/wallet-server/src/router/framework/routerApiWebhooks.d.ts +12 -0
- package/dist/types/wallet-server/src/router/framework/runtimeSnapshotConsumer.d.ts +28 -0
- package/dist/types/wallet-server/src/router/framework/versionedJsonRecordStore.d.ts +20 -0
- package/dist/types/wallet-server/src/router/ror-adaptor.d.ts +3 -0
- package/dist/types/wallet-server/src/router/transport/fetch/createFetchRouter.d.ts +8 -0
- package/dist/types/wallet-server/src/router/transport/fetch/fetchRouter.types.d.ts +23 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/auth.d.ts +3 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinking.d.ts +202 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.d.ts +92 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceManagement.d.ts +29 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/health.d.ts +4 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/nearPublicKeys.d.ts +3 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/normalSigningRouterProxy.d.ts +33 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/passkeyCustody.d.ts +66 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/sessions.d.ts +31 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/syncAccount.d.ts +3 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/syncAccountBootstrap.d.ts +128 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +87 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEd25519.d.ts +47 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/walletExecutionLanePreflight.d.ts +4 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/walletRegistration.d.ts +3 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/webauthnAuthenticators.d.ts +3 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/wellKnown.d.ts +3 -0
- package/dist/types/wallet-server/src/storage/d1Sql.d.ts +14 -0
- package/dist/types/wallet-server/src/storage/tenantRoute.d.ts +136 -0
- package/dist/types/wallet-server/src/storage/tenantRoute.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/tenant-root.d.ts +5 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/crypto/cipher.d.ts +45 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/crypto/shamir3PassWasm.d.ts +16 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/guards/backends.d.ts +23 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/guards/index.d.ts +46 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/idempotency.d.ts +3 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/idempotencyBackends.d.ts +24 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/idempotencyRecords.d.ts +22 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/index.d.ts +23 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/observability/audit.d.ts +9 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/options.d.ts +9 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/routesOptions.d.ts +20 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/service.d.ts +3 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/signingSessionSeal.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/signingSessionSeal.types.d.ts +148 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/transport/express.d.ts +12 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/transport/fetch.d.ts +13 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/transport/shared.d.ts +24 -0
- package/dist/types/wallet-server/src/threshold/statusCodes.d.ts +10 -0
- package/dist/types/wallet-server/src/wasm/signer.d.ts +8 -0
- package/migrations/d1-signer/0001_signer_d1_initial.sql +2486 -0
- package/migrations/d1-signer/0002_signer_post_103_canonical_upgrade.sql +1576 -0
- package/migrations/d1-signer/0003_r107_wallet_authorization.sql +299 -0
- package/migrations/d1-signer/0004_remove_legacy_email_recovery.sql +14 -0
- package/migrations/d1-signer/0005_r103p8_linked_owner_auth_bindings.sql +92 -0
- package/migrations/d1-signer/0006_r103p8_linked_device_custody_transfers.sql +77 -0
- package/migrations/d1-signer/0007_r103p8_wallet_session_auth_method_provenance.sql +18 -0
- package/migrations/d1-signer/0008_r103p8_linked_device_session_cas_guard.sql +35 -0
- package/migrations/d1-signer/0009_linked_device_email_otp.sql +405 -0
- package/migrations/d1-signer/0010_linked_device_session_target_factor.sql +78 -0
- package/migrations/d1-signer/0011_linked_device_ed25519_export_root.sql +9 -0
- package/migrations/d1-signer/0012_versioned_json_cas_guard.sql +3 -0
- package/migrations/d1-signer/0013_linked_device_export_authorization.sql +133 -0
- package/migrations/d1-signer/0014_wallet_recovery_code_locators.sql +19 -0
- package/migrations/d1-signer/0015_r103e_authority_baseline.sql +259 -0
- package/migrations/d1-signer/0016_r103e_wallet_session_authorizations_v2.sql +133 -0
- package/migrations/d1-signer/0017_r103e_link_session_state.sql +83 -0
- package/migrations/d1-signer/0018_r103e_linked_device_authority_installations.sql +34 -0
- package/migrations/d1-signer/0019_r103e_email_otp_device_methods.sql +3 -0
- package/migrations/d1-signer/0020_r103e_wallet_session_operation_credentials.sql +12 -0
- package/migrations/d1-signer/0021_linked_device_source_contribution_transcripts.sql +64 -0
- package/migrations/d1-signer/0022_r109c_multi_auth_email_cardinality.sql +118 -0
- package/migrations/d1-signer/0023_r109d_first_email_linked_device.sql +111 -0
- package/migrations/d1-signer/0024_r103f_v2_authorized_operation_claim.sql +99 -0
- package/migrations/d1-signer/0025_r109d_email_enrollment_wallet_cardinality.sql +57 -0
- package/migrations/d1-signer/0026_r115_wallet_recovery_authority_provenance.sql +253 -0
- package/migrations/d1-signer/0027_r115_email_otp_recovery_bootstrap.sql +90 -0
- package/migrations/d1-signer/0028_r103f_phase1_additive_schema_bridge.sql +1119 -0
- package/migrations/d1-signer/0029_r103f_phase0_registration_replay_tokens.sql +135 -0
- package/migrations/d1-signer/0030_r103f_wallet_session_client_capability.sql +17 -0
- package/migrations/d1-signer/0031_r103f_delete_registration_replay_tokens.sql +4 -0
- package/migrations/d1-signer/0032_r103f_exact_authorized_operation_enforcement.sql +149 -0
- package/migrations/d1-signer/0033_r103f_linked_delivery_recipient.sql +6 -0
- package/migrations/d1-signer/0034_r103f_exact_wallet_session_cutover.sql +743 -0
- package/migrations/d1-signer/0035_r103f_linked_delivery_acknowledgement_cleanup_window.sql +413 -0
- package/package.json +132 -0
- package/scripts/d1-local-migrate-signer.mjs +148 -0
- package/src/README.md +75 -0
- package/wrangler.local-hosted-wallet-gateway.toml +37 -0
|
@@ -0,0 +1,1618 @@
|
|
|
1
|
+
import { parseEmailOtpChallengeId, parseOrgId, parseProviderSubject, parseWalletAuthMethodId, parseWalletAuthorityId, parseWalletId, parseWalletRecoveryOperationId, parseWebAuthnCredentialIdB64u, parseWebAuthnRpId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
+
import { buildVaultOperationRef, parseAuthFactorId, parseAuthorizationAuditEventId, parseAuthorizationEvidenceId, parseAuthorizationEvidenceSetId, parseAuthorizedOperationId, parseCapabilityId, parseCapabilityOperationId, parseDeviceId, parsePrincipalId, parseTenantId } from "../../../../shared-ts/src/authorization/capabilityKinds.js";
|
|
3
|
+
import { base64UrlDecode, base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
|
|
4
|
+
import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
5
|
+
import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
|
|
6
|
+
import { buildCapabilityOperationEnvelope, computeCapabilityOperationFingerprintDigest } from "../../../../shared-ts/src/authorization/operationFingerprint.js";
|
|
7
|
+
import "../../../../shared-ts/src/utils/encoders.js";
|
|
8
|
+
import { buildPasskeyWalletAuthAuthority, walletAuthAuthorityRef } from "../../../../shared-ts/src/utils/walletAuthAuthority.js";
|
|
9
|
+
import { parseSessionOrigin, parseVerifiedOwnerProofId } from "../../../../authorization/domain.js";
|
|
10
|
+
import { buildVerifiedWalletOperationEmailOtpFactorResult, buildVerifiedWalletOperationPasskeyFactorResult } from "../../../../authorization/factorEvidence.js";
|
|
11
|
+
import { findRouteDefinitionById, matchesRouteDefinitionRequest } from "../../../framework/routeDefinitions.js";
|
|
12
|
+
import { readJson } from "../../../framework/http.js";
|
|
13
|
+
import { extractBearerCredential, resolveSourceIpFromFetchHeaders } from "../../../auth/routerApiKeyAuth.js";
|
|
14
|
+
import { toFetchRouteResponse } from "../../../framework/routeResponses.js";
|
|
15
|
+
import { parsePasskeyCustodyEnvelopeRecord } from "../../../../shared-ts/src/passkey-custody/custodyEnvelope.js";
|
|
16
|
+
import "../../../../shared-ts/src/passkey-custody/index.js";
|
|
17
|
+
import { isHostWithinRpId, originHostnameOrEmpty } from "../../../../core/authService/webauthnOidcHelpers.js";
|
|
18
|
+
import { parseRecoveryCodeReservationId } from "../../../../shared-ts/src/wallet-recovery/recoveryCodeReservation.js";
|
|
19
|
+
import { computeWalletCustodyAdminChallengeDigest } from "../../../../shared-ts/src/authorization/walletCustodyOperation.js";
|
|
20
|
+
import { parseWalletRecoveryTargetV1 } from "../../../../shared-ts/src/wallet-recovery/walletRecoveryTarget.js";
|
|
21
|
+
import { parseWebAuthnAuthenticationCredential } from "../../../auth/webAuthnCredentialCodecs.js";
|
|
22
|
+
import { EMAIL_OTP_CHANNEL, WALLET_EMAIL_OTP_UNLOCK_OPERATION } from "../../../../shared-ts/src/utils/emailOtpDomain.js";
|
|
23
|
+
import { emailOtpStatusCode, hashEmailOtpOperationBinding } from "../../../domains/emailOtp/emailOtpSessionRouteHelpers.js";
|
|
24
|
+
import { parseDerivedWalletRecoveryKeyId } from "../../../../shared-ts/src/wallet-recovery/recoveryKeyId.js";
|
|
25
|
+
import { parseWalletRecoverySetRotationWireV1 } from "../../../../shared-ts/src/wallet-recovery/walletRecoveryEnvelopeSet.js";
|
|
26
|
+
import { parseRecoveryCodeLocatorV1 } from "../../../../shared-ts/src/wallet-recovery/recoveryCodeLocator.js";
|
|
27
|
+
import { parseWalletRecoveryEcdsaPossessionProofV1 } from "../../../../shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.js";
|
|
28
|
+
//#region src/router/transport/fetch/routes/passkeyCustody.ts
|
|
29
|
+
/**
|
|
30
|
+
* The transport for custody envelope retrieval.
|
|
31
|
+
*
|
|
32
|
+
* Thin on purpose: it parses a body, hands it to the port, and returns what
|
|
33
|
+
* the port decided. Every gate — assertion verification, credential match,
|
|
34
|
+
* lifecycle, digest — lives below, and the status each failure earns is fixed
|
|
35
|
+
* in one wire mapping. A transport that re-decided any of that would be a
|
|
36
|
+
* second opinion on whether a wallet opens.
|
|
37
|
+
*/
|
|
38
|
+
const ROUTE_ID = "passkey_custody_envelope_retrieve";
|
|
39
|
+
const CREDENTIALS_LIST_ROUTE_ID = "wallet_custody_credentials_list";
|
|
40
|
+
const CREDENTIAL_LABEL_ROUTE_ID = "wallet_custody_credential_label";
|
|
41
|
+
const RECOVERY_PREPARE_ROUTE_ID = "wallet_recovery_prepare";
|
|
42
|
+
const RECOVERY_GOOGLE_VERIFY_ROUTE_ID = "wallet_recovery_google_verify";
|
|
43
|
+
const RECOVERY_EMAIL_OTP_VERIFY_ROUTE_ID = "wallet_recovery_email_otp_verify";
|
|
44
|
+
const RECOVERY_EMAIL_OTP_RELEASE_ROUTE_ID = "wallet_recovery_email_otp_release";
|
|
45
|
+
const RECOVERY_GOOGLE_EMAIL_OTP_FINALIZE_ROUTE_ID = "wallet_recovery_google_email_otp_finalize";
|
|
46
|
+
const RECOVERY_FINALIZE_ROUTE_ID = "wallet_recovery_finalize";
|
|
47
|
+
const RECOVERY_ACK_ROUTE_ID = "wallet_recovery_backup_acknowledge";
|
|
48
|
+
const RECOVERY_ROTATE_ROUTE_ID = "wallet_recovery_codes_rotate";
|
|
49
|
+
const RECOVERY_READ_ROUTE_ID = "wallet_recovery_codes_read";
|
|
50
|
+
const RECOVERY_STATUS_ROUTE_ID = "wallet_recovery_status";
|
|
51
|
+
const EMAIL_OTP_CHALLENGE_ROUTE_ID = "wallet_custody_email_otp_challenge";
|
|
52
|
+
const ENVELOPE_OWNERSHIP_UPGRADE_ROUTE_ID = "wallet_custody_envelope_ownership_upgrade";
|
|
53
|
+
const CUSTODY_OPERATION_CAPABILITY_ID = "wallet-custody-admin";
|
|
54
|
+
const CUSTODY_PROOF_TTL_MS = 6e4;
|
|
55
|
+
function parseRequiredString(value, field) {
|
|
56
|
+
if (typeof value !== "string" || !value.trim()) throw new Error(`${field} is required`);
|
|
57
|
+
return value.trim();
|
|
58
|
+
}
|
|
59
|
+
function requireExactObjectFields(value, fields, label) {
|
|
60
|
+
const keys = Object.keys(value).sort();
|
|
61
|
+
const expected = [...fields].sort();
|
|
62
|
+
if (keys.length !== expected.length || keys.some((key, index) => key !== expected[index])) throw new Error(`${label} contains unsupported fields`);
|
|
63
|
+
}
|
|
64
|
+
function parseCustodyOwnerProof(value) {
|
|
65
|
+
if (!isObject(value)) throw new Error("factorProof is required");
|
|
66
|
+
const kind = trimmed(value.kind);
|
|
67
|
+
if (kind === "passkey") {
|
|
68
|
+
requireExactObjectFields(value, [
|
|
69
|
+
"kind",
|
|
70
|
+
"walletId",
|
|
71
|
+
"rpId",
|
|
72
|
+
"credentialIdB64u",
|
|
73
|
+
"challenge_digest",
|
|
74
|
+
"webauthn_authentication"
|
|
75
|
+
], "factorProof");
|
|
76
|
+
const webauthnAuthentication = parseWebAuthnAuthenticationCredential(value.webauthn_authentication);
|
|
77
|
+
if (!webauthnAuthentication) throw new Error("factorProof.webauthn_authentication is invalid");
|
|
78
|
+
return {
|
|
79
|
+
kind,
|
|
80
|
+
walletId: parseRequiredString(value.walletId, "factorProof.walletId"),
|
|
81
|
+
rpId: parseRequiredString(value.rpId, "factorProof.rpId"),
|
|
82
|
+
credentialIdB64u: parseRequiredString(value.credentialIdB64u, "factorProof.credentialIdB64u"),
|
|
83
|
+
challenge_digest: parseRequiredString(value.challenge_digest, "factorProof.challenge_digest"),
|
|
84
|
+
webauthn_authentication: webauthnAuthentication
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
if (kind === "email_otp") {
|
|
88
|
+
requireExactObjectFields(value, [
|
|
89
|
+
"kind",
|
|
90
|
+
"provider_subject_id",
|
|
91
|
+
"challenge_id",
|
|
92
|
+
"otp_code",
|
|
93
|
+
"challenge_digest"
|
|
94
|
+
], "factorProof");
|
|
95
|
+
return {
|
|
96
|
+
kind,
|
|
97
|
+
provider_subject_id: parseRequiredString(value.provider_subject_id, "factorProof.provider_subject_id"),
|
|
98
|
+
challenge_id: parseRequiredString(value.challenge_id, "factorProof.challenge_id"),
|
|
99
|
+
otp_code: parseRequiredString(value.otp_code, "factorProof.otp_code"),
|
|
100
|
+
challenge_digest: parseRequiredString(value.challenge_digest, "factorProof.challenge_digest")
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
throw new Error("factorProof.kind must be passkey or email_otp");
|
|
104
|
+
}
|
|
105
|
+
function parseRequiredAuthorizationValue(parsed) {
|
|
106
|
+
if (!parsed.ok) throw new Error(parsed.error.message);
|
|
107
|
+
return parsed.value;
|
|
108
|
+
}
|
|
109
|
+
async function custodyDigest(domain, value) {
|
|
110
|
+
return parseDigestB64u(base64UrlEncode(await sha256BytesUtf8(`${domain}|${alphabetizeStringify(value)}`)));
|
|
111
|
+
}
|
|
112
|
+
async function buildWalletCustodyOperation(input) {
|
|
113
|
+
const tenantId = parseRequiredAuthorizationValue(parseTenantId(input.tenantId));
|
|
114
|
+
const principalId = parseRequiredAuthorizationValue(parsePrincipalId(input.principalId));
|
|
115
|
+
const capabilityId = parseRequiredAuthorizationValue(parseCapabilityId(CUSTODY_OPERATION_CAPABILITY_ID));
|
|
116
|
+
const operationRef = buildVaultOperationRef("vault.reveal");
|
|
117
|
+
const laneDigest = await custodyDigest("seams:wallet-custody:lane:v1", {
|
|
118
|
+
capabilityId,
|
|
119
|
+
operation: input.operation,
|
|
120
|
+
operationRef
|
|
121
|
+
});
|
|
122
|
+
const challengeDigest = await computeWalletCustodyAdminChallengeDigest({
|
|
123
|
+
walletId: input.walletId,
|
|
124
|
+
operation: input.operation,
|
|
125
|
+
payload: input.payload,
|
|
126
|
+
requestOrigin: input.requestOrigin
|
|
127
|
+
});
|
|
128
|
+
const intentDigest = challengeDigest;
|
|
129
|
+
const displayDigest = await custodyDigest("seams:wallet-custody:display:v1", {
|
|
130
|
+
walletId: input.walletId,
|
|
131
|
+
operation: input.operation
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
operation: buildCapabilityOperationEnvelope({
|
|
135
|
+
tenantId,
|
|
136
|
+
principalId,
|
|
137
|
+
capabilityId,
|
|
138
|
+
operationId: parseRequiredAuthorizationValue(parseCapabilityOperationId(`wallet-custody:${input.operation}:${intentDigest}`)),
|
|
139
|
+
operation: operationRef,
|
|
140
|
+
digests: {
|
|
141
|
+
laneDigest,
|
|
142
|
+
intentDigest,
|
|
143
|
+
displayDigest
|
|
144
|
+
}
|
|
145
|
+
}),
|
|
146
|
+
challengeDigest
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
async function authorizeWalletCustodyOperation(input) {
|
|
150
|
+
const requestOrigin = trimmed(input.ctx.request.headers.get("origin"));
|
|
151
|
+
if (!requestOrigin) return toCustodyAuthorizationFailure(400, "invalid_origin", "request Origin is required");
|
|
152
|
+
let origin;
|
|
153
|
+
let proof;
|
|
154
|
+
let walletId;
|
|
155
|
+
try {
|
|
156
|
+
origin = parseSessionOrigin(requestOrigin);
|
|
157
|
+
walletId = parseRequiredAuthorizationValue(parseWalletId(input.walletId));
|
|
158
|
+
proof = parseCustodyOwnerProof(input.factorProof);
|
|
159
|
+
} catch (error) {
|
|
160
|
+
return toCustodyAuthorizationFailure(400, "invalid_owner_proof", error instanceof Error ? error.message : "owner proof is invalid");
|
|
161
|
+
}
|
|
162
|
+
if (proof.kind === "passkey" && proof.walletId !== input.walletId) return toCustodyAuthorizationFailure(403, "scope_mismatch", "owner proof wallet differs");
|
|
163
|
+
let principalId;
|
|
164
|
+
let factor;
|
|
165
|
+
let operation;
|
|
166
|
+
let challengeDigest;
|
|
167
|
+
try {
|
|
168
|
+
principalId = proof.kind === "passkey" ? input.walletId : proof.provider_subject_id;
|
|
169
|
+
const built = await buildWalletCustodyOperation({
|
|
170
|
+
tenantId: input.ctx.service.authorizedOperations.tenantId,
|
|
171
|
+
principalId,
|
|
172
|
+
walletId: input.walletId,
|
|
173
|
+
operation: input.operation,
|
|
174
|
+
payload: input.payload,
|
|
175
|
+
requestOrigin
|
|
176
|
+
});
|
|
177
|
+
operation = built.operation;
|
|
178
|
+
challengeDigest = built.challengeDigest;
|
|
179
|
+
} catch (error) {
|
|
180
|
+
return toCustodyAuthorizationFailure(400, "invalid_owner_proof", error instanceof Error ? error.message : "owner proof binding is invalid");
|
|
181
|
+
}
|
|
182
|
+
const operationFingerprintDigest = await computeCapabilityOperationFingerprintDigest(operation);
|
|
183
|
+
const nowMs = Date.now();
|
|
184
|
+
if (proof.challenge_digest !== String(challengeDigest)) return toCustodyAuthorizationFailure(403, "scope_mismatch", "factor proof challenge does not match the requested operation");
|
|
185
|
+
if (proof.kind === "passkey") {
|
|
186
|
+
let authority;
|
|
187
|
+
try {
|
|
188
|
+
authority = buildPasskeyWalletAuthAuthority({
|
|
189
|
+
walletId,
|
|
190
|
+
rpId: proof.rpId,
|
|
191
|
+
credentialIdB64u: proof.credentialIdB64u
|
|
192
|
+
});
|
|
193
|
+
} catch (error) {
|
|
194
|
+
return toCustodyAuthorizationFailure(400, "invalid_owner_proof", error instanceof Error ? error.message : "passkey authority is invalid");
|
|
195
|
+
}
|
|
196
|
+
const active = await input.ctx.service.walletAuthMethods.verifyActivePasskeyAuthority(authority);
|
|
197
|
+
if (!active.ok) return toCustodyAuthorizationFailure(403, active.code, active.message);
|
|
198
|
+
const credential = parseWebAuthnAuthenticationCredential(proof.webauthn_authentication);
|
|
199
|
+
if (!credential) return toCustodyAuthorizationFailure(400, "invalid_owner_proof", "passkey assertion is invalid");
|
|
200
|
+
if (String(credential.rawId || credential.id).trim() !== authority.factor.credentialIdB64u) return toCustodyAuthorizationFailure(401, "unauthorized", "passkey credential changed");
|
|
201
|
+
const verified = await input.ctx.service.webAuthn.verifyWebAuthnAuthenticationLite({
|
|
202
|
+
userId: input.walletId,
|
|
203
|
+
rpId: authority.verifier.rpId,
|
|
204
|
+
expectedChallenge: challengeDigest,
|
|
205
|
+
expected_origin: requestOrigin,
|
|
206
|
+
webauthn_authentication: credential
|
|
207
|
+
});
|
|
208
|
+
if (!verified.success || !verified.verified) return toCustodyAuthorizationFailure(401, verified.code || "not_verified", verified.message || "WebAuthn authentication verification failed");
|
|
209
|
+
factor = buildVerifiedWalletOperationPasskeyFactorResult({
|
|
210
|
+
tenantId: operation.tenantId,
|
|
211
|
+
principalId: operation.principalId,
|
|
212
|
+
walletId,
|
|
213
|
+
authorityRef: await walletAuthAuthorityRef({ authority }),
|
|
214
|
+
requestOrigin: origin,
|
|
215
|
+
audience: origin,
|
|
216
|
+
factorId: parseRequiredAuthorizationValue(parseAuthFactorId(`passkey:${authority.factor.credentialIdB64u}`)),
|
|
217
|
+
credentialIdB64u: parseRequiredAuthorizationValue(parseWebAuthnCredentialIdB64u(authority.factor.credentialIdB64u)),
|
|
218
|
+
assertionDigest: await custodyDigest("seams:wallet-custody:assertion:v1", { credential }),
|
|
219
|
+
operation,
|
|
220
|
+
verifiedAtMs: nowMs,
|
|
221
|
+
expiresAtMs: nowMs + CUSTODY_PROOF_TTL_MS
|
|
222
|
+
});
|
|
223
|
+
} else {
|
|
224
|
+
const providerSubject = parseRequiredAuthorizationValue(parseProviderSubject(proof.provider_subject_id));
|
|
225
|
+
const orgId = parseRequiredAuthorizationValue(parseOrgId(input.ctx.service.authorizedOperations.tenantId));
|
|
226
|
+
const active = await input.ctx.service.walletAuthMethods.resolveActiveEmailOtpAuthorityForVerifiedSubject({
|
|
227
|
+
walletId: input.walletId,
|
|
228
|
+
providerUserId: proof.provider_subject_id
|
|
229
|
+
});
|
|
230
|
+
if (!active.ok) return toCustodyAuthorizationFailure(403, active.code, active.message);
|
|
231
|
+
const activeAuthorityRef = await walletAuthAuthorityRef({ authority: active.authority });
|
|
232
|
+
const ownerProofBindingDigest = await hashEmailOtpOperationBinding({
|
|
233
|
+
walletId: input.walletId,
|
|
234
|
+
providerUserId: proof.provider_subject_id,
|
|
235
|
+
orgId,
|
|
236
|
+
operation: `wallet_custody:${input.operation}`,
|
|
237
|
+
requestOrigin,
|
|
238
|
+
audience: requestOrigin,
|
|
239
|
+
authorityRef: activeAuthorityRef,
|
|
240
|
+
operationFingerprintDigest: challengeDigest
|
|
241
|
+
});
|
|
242
|
+
const verified = await input.ctx.service.emailOtp.verifyEmailOtpChallenge({
|
|
243
|
+
userId: proof.provider_subject_id,
|
|
244
|
+
walletId: input.walletId,
|
|
245
|
+
orgId,
|
|
246
|
+
challengeId: proof.challenge_id,
|
|
247
|
+
otpCode: proof.otp_code,
|
|
248
|
+
otpChannel: EMAIL_OTP_CHANNEL,
|
|
249
|
+
ownerProofBindingDigest,
|
|
250
|
+
operation: WALLET_EMAIL_OTP_UNLOCK_OPERATION
|
|
251
|
+
});
|
|
252
|
+
if (!verified.ok) return toCustodyAuthorizationFailure(verified.code === "invalid_body" ? 400 : 401, verified.code, verified.message);
|
|
253
|
+
const consumed = await input.ctx.service.emailOtp.consumeEmailOtpGrant({
|
|
254
|
+
subject: {
|
|
255
|
+
kind: "provider_identity",
|
|
256
|
+
orgId,
|
|
257
|
+
providerSubject,
|
|
258
|
+
walletId
|
|
259
|
+
},
|
|
260
|
+
loginGrant: verified.loginGrant,
|
|
261
|
+
otpChannel: EMAIL_OTP_CHANNEL
|
|
262
|
+
});
|
|
263
|
+
if (!consumed.ok) return toCustodyAuthorizationFailure(emailOtpStatusCode(consumed.code), consumed.code, consumed.message);
|
|
264
|
+
factor = buildVerifiedWalletOperationEmailOtpFactorResult({
|
|
265
|
+
tenantId: operation.tenantId,
|
|
266
|
+
principalId: operation.principalId,
|
|
267
|
+
walletId,
|
|
268
|
+
authorityRef: activeAuthorityRef,
|
|
269
|
+
requestOrigin: origin,
|
|
270
|
+
audience: origin,
|
|
271
|
+
factorId: parseRequiredAuthorizationValue(parseAuthFactorId(`email_otp:${active.authority.factor.provider}:${proof.provider_subject_id}`)),
|
|
272
|
+
operation,
|
|
273
|
+
challengeId: parseRequiredAuthorizationValue(parseEmailOtpChallengeId(consumed.challengeId)),
|
|
274
|
+
verificationReceiptDigest: await custodyDigest("seams:wallet-custody:otp-receipt:v1", {
|
|
275
|
+
challengeId: consumed.challengeId,
|
|
276
|
+
operationFingerprintDigest
|
|
277
|
+
}),
|
|
278
|
+
verifiedAtMs: nowMs,
|
|
279
|
+
expiresAtMs: Math.min(nowMs + CUSTODY_PROOF_TTL_MS, verified.grantExpiresAtMs)
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
const ownerProof = await input.ctx.service.authorizedOperations.buildVerifiedOwnerProof({
|
|
283
|
+
purpose: "operation",
|
|
284
|
+
proofId: parseVerifiedOwnerProofId(`wallet-custody:${operation.operationId}`),
|
|
285
|
+
factor
|
|
286
|
+
});
|
|
287
|
+
if (ownerProof.purpose !== "operation" || ownerProof.operation.operationFingerprintDigest !== operationFingerprintDigest) return toCustodyAuthorizationFailure(403, "owner_proof_rejected", "owner proof binding is invalid");
|
|
288
|
+
const evidenceSet = await input.ctx.service.authorizedOperations.recordVerifiedWalletOperationFactorEvidenceSet({
|
|
289
|
+
operation,
|
|
290
|
+
evidenceId: parseRequiredAuthorizationValue(parseAuthorizationEvidenceId(`wallet-custody:evidence:${operation.operationId}`)),
|
|
291
|
+
evidenceSetId: parseRequiredAuthorizationValue(parseAuthorizationEvidenceSetId(`wallet-custody:evidence-set:${operation.operationId}`)),
|
|
292
|
+
factor
|
|
293
|
+
});
|
|
294
|
+
const admission = await input.ctx.service.authorizedOperations.admitAuthorizedOperation({ operation: {
|
|
295
|
+
tenantId: operation.tenantId,
|
|
296
|
+
authorizedOperationId: parseRequiredAuthorizationValue(parseAuthorizedOperationId(`wallet-custody:authorized:${operation.operationId}`)),
|
|
297
|
+
auditEventId: parseRequiredAuthorizationValue(parseAuthorizationAuditEventId(`wallet-custody:audit:${operation.operationId}`)),
|
|
298
|
+
operation,
|
|
299
|
+
authorization: {
|
|
300
|
+
kind: "verified_step_up",
|
|
301
|
+
evidenceSetDigest: evidenceSet.evidenceSetDigest
|
|
302
|
+
},
|
|
303
|
+
quota: { kind: "quota_neutral" },
|
|
304
|
+
claimedAtMs: nowMs
|
|
305
|
+
} });
|
|
306
|
+
switch (admission.kind) {
|
|
307
|
+
case "claimed": return {
|
|
308
|
+
ok: true,
|
|
309
|
+
operation: admission.operation
|
|
310
|
+
};
|
|
311
|
+
case "replayed":
|
|
312
|
+
case "operation_in_progress": return {
|
|
313
|
+
ok: false,
|
|
314
|
+
response: authorizedOperationReplay(admission.operation)
|
|
315
|
+
};
|
|
316
|
+
case "authorization_grant_rejected":
|
|
317
|
+
case "verified_step_up_rejected":
|
|
318
|
+
case "wallet_session_quota_exhausted":
|
|
319
|
+
case "material_mismatch": return toCustodyAuthorizationFailure(403, "owner_proof_rejected", "owner proof was rejected");
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
function toCustodyAuthorizationFailure(status, code, message) {
|
|
323
|
+
return {
|
|
324
|
+
ok: false,
|
|
325
|
+
response: toFetchRouteResponse({
|
|
326
|
+
status,
|
|
327
|
+
body: {
|
|
328
|
+
ok: false,
|
|
329
|
+
code,
|
|
330
|
+
message
|
|
331
|
+
}
|
|
332
|
+
})
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
async function completeWalletCustodyOperation(ctx, operation, status, body, result = "succeeded") {
|
|
336
|
+
const bodyText = JSON.stringify(body);
|
|
337
|
+
await ctx.service.authorizedOperations.completeAuthorizedOperation({
|
|
338
|
+
operation,
|
|
339
|
+
result,
|
|
340
|
+
response: {
|
|
341
|
+
status,
|
|
342
|
+
contentType: "application/json",
|
|
343
|
+
bodyText
|
|
344
|
+
},
|
|
345
|
+
completedAtMs: Date.now()
|
|
346
|
+
});
|
|
347
|
+
return toFetchRouteResponse({
|
|
348
|
+
status,
|
|
349
|
+
body
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
async function handlePasskeyCustody(ctx) {
|
|
353
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, ROUTE_ID);
|
|
354
|
+
if (!route) throw new Error(`Missing route definition for ${ROUTE_ID}`);
|
|
355
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
356
|
+
const request = parseWireRequest(await readJsonObject(ctx.request), ctx.request.headers.get("origin"));
|
|
357
|
+
if (!request) return toFetchRouteResponse({
|
|
358
|
+
status: 400,
|
|
359
|
+
body: {
|
|
360
|
+
ok: false,
|
|
361
|
+
code: "invalid_request",
|
|
362
|
+
message: "custody retrieval needs a locator, a challenge id, and an assertion"
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
return toFetchRouteResponse(await ctx.service.passkeyCustody.retrieveEnvelope(request));
|
|
366
|
+
}
|
|
367
|
+
function parseWalletCustodyEmailOtpChallengeRequest(value, actualOrigin) {
|
|
368
|
+
if (!isObject(value)) throw new Error("Email OTP custody challenge body must be an object");
|
|
369
|
+
const keys = Object.keys(value).sort();
|
|
370
|
+
const expected = [
|
|
371
|
+
"operation",
|
|
372
|
+
"payload",
|
|
373
|
+
"providerSubjectId",
|
|
374
|
+
"requestOrigin",
|
|
375
|
+
"walletId"
|
|
376
|
+
];
|
|
377
|
+
const required = [
|
|
378
|
+
"operation",
|
|
379
|
+
"payload",
|
|
380
|
+
"providerSubjectId",
|
|
381
|
+
"walletId"
|
|
382
|
+
];
|
|
383
|
+
const withoutOptional = keys.filter((key) => key !== "requestOrigin");
|
|
384
|
+
if (withoutOptional.length !== required.length || withoutOptional.some((key, index) => key !== required.slice().sort()[index]) || keys.includes("requestOrigin") && keys.length !== expected.length) throw new Error("Email OTP custody challenge body contains unsupported fields");
|
|
385
|
+
const walletId = parseRequiredAuthorizationValue(parseWalletId(value.walletId));
|
|
386
|
+
const providerSubjectId = parseRequiredAuthorizationValue(parseProviderSubject(value.providerSubjectId));
|
|
387
|
+
const operation = value.operation;
|
|
388
|
+
if (operation !== "credentials_list" && operation !== "credential_label" && operation !== "recovery_rotate" && operation !== "recovery_read") throw new Error("Email OTP custody challenge operation is invalid");
|
|
389
|
+
if (!isObject(value.payload)) throw new Error("Email OTP custody challenge payload is invalid");
|
|
390
|
+
if (value.requestOrigin !== void 0 && value.requestOrigin !== actualOrigin) throw new Error("Email OTP custody challenge requestOrigin does not match Origin");
|
|
391
|
+
return {
|
|
392
|
+
walletId,
|
|
393
|
+
providerSubjectId,
|
|
394
|
+
operation,
|
|
395
|
+
payload: value.payload,
|
|
396
|
+
requestOrigin: actualOrigin
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
/** Issues one operation-bound Email OTP challenge without exposing authority metadata. */
|
|
400
|
+
async function handleWalletCustodyEmailOtpChallenge(ctx) {
|
|
401
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, EMAIL_OTP_CHALLENGE_ROUTE_ID);
|
|
402
|
+
if (!route) throw new Error(`Missing route definition for ${EMAIL_OTP_CHALLENGE_ROUTE_ID}`);
|
|
403
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
404
|
+
const originHeader = trimmed(ctx.request.headers.get("origin"));
|
|
405
|
+
let request;
|
|
406
|
+
try {
|
|
407
|
+
const origin = parseSessionOrigin(originHeader);
|
|
408
|
+
request = parseWalletCustodyEmailOtpChallengeRequest(await readJson(ctx.request), origin);
|
|
409
|
+
} catch (error) {
|
|
410
|
+
return toFetchRouteResponse({
|
|
411
|
+
status: 400,
|
|
412
|
+
body: {
|
|
413
|
+
ok: false,
|
|
414
|
+
code: "invalid_request",
|
|
415
|
+
message: error instanceof Error ? error.message : "Email OTP custody challenge is invalid"
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
const active = await ctx.service.walletAuthMethods.resolveActiveEmailOtpAuthorityForVerifiedSubject({
|
|
420
|
+
walletId: request.walletId,
|
|
421
|
+
providerUserId: request.providerSubjectId
|
|
422
|
+
});
|
|
423
|
+
if (!active.ok) return toFetchRouteResponse({
|
|
424
|
+
status: 403,
|
|
425
|
+
body: {
|
|
426
|
+
ok: false,
|
|
427
|
+
code: active.code,
|
|
428
|
+
message: active.message
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
const authoritativeOrgId = parseRequiredAuthorizationValue(parseOrgId(ctx.service.authorizedOperations.tenantId));
|
|
432
|
+
const challengeDigest = await computeWalletCustodyAdminChallengeDigest(request);
|
|
433
|
+
const ownerProofBindingDigest = await hashEmailOtpOperationBinding({
|
|
434
|
+
walletId: request.walletId,
|
|
435
|
+
providerUserId: request.providerSubjectId,
|
|
436
|
+
orgId: authoritativeOrgId,
|
|
437
|
+
operation: `wallet_custody:${request.operation}`,
|
|
438
|
+
requestOrigin: request.requestOrigin,
|
|
439
|
+
audience: request.requestOrigin,
|
|
440
|
+
authorityRef: await walletAuthAuthorityRef({ authority: active.authority }),
|
|
441
|
+
operationFingerprintDigest: challengeDigest
|
|
442
|
+
});
|
|
443
|
+
const result = await ctx.service.emailOtp.createEmailOtpChallenge({
|
|
444
|
+
userId: request.providerSubjectId,
|
|
445
|
+
walletId: request.walletId,
|
|
446
|
+
orgId: authoritativeOrgId,
|
|
447
|
+
otpChannel: EMAIL_OTP_CHANNEL,
|
|
448
|
+
ownerProofBindingDigest,
|
|
449
|
+
reuseActiveChallenge: true,
|
|
450
|
+
requestOrigin: request.requestOrigin,
|
|
451
|
+
operation: WALLET_EMAIL_OTP_UNLOCK_OPERATION
|
|
452
|
+
});
|
|
453
|
+
if (!result.ok) return toFetchRouteResponse({
|
|
454
|
+
status: emailOtpStatusCode(result.code),
|
|
455
|
+
body: {
|
|
456
|
+
ok: false,
|
|
457
|
+
code: result.code,
|
|
458
|
+
message: result.message,
|
|
459
|
+
...result.retryAfterMs ? { retryAfterMs: result.retryAfterMs } : {}
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
return toFetchRouteResponse({
|
|
463
|
+
status: 200,
|
|
464
|
+
body: {
|
|
465
|
+
ok: true,
|
|
466
|
+
challengeId: result.challenge.challengeId,
|
|
467
|
+
challenge_digest: challengeDigest,
|
|
468
|
+
expiresAtMs: result.challenge.expiresAtMs,
|
|
469
|
+
otpChannel: result.challenge.otpChannel
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
/** Lists public passkey envelope identities with their sibling activity rows. */
|
|
474
|
+
async function handleWalletCustodyCredentialsList(ctx) {
|
|
475
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, CREDENTIALS_LIST_ROUTE_ID);
|
|
476
|
+
if (!route) throw new Error(`Missing route definition for ${CREDENTIALS_LIST_ROUTE_ID}`);
|
|
477
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
478
|
+
const walletId = walletIdFromPath(route.path, ctx.pathname);
|
|
479
|
+
if (!walletId) return toFetchRouteResponse({
|
|
480
|
+
status: 400,
|
|
481
|
+
body: {
|
|
482
|
+
ok: false,
|
|
483
|
+
code: "invalid_request",
|
|
484
|
+
message: "credential list needs a wallet"
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
const body = await readJsonObject(ctx.request);
|
|
488
|
+
const authorized = await authorizeWalletCustodyOperation({
|
|
489
|
+
ctx,
|
|
490
|
+
walletId,
|
|
491
|
+
operation: "credentials_list",
|
|
492
|
+
payload: { walletId },
|
|
493
|
+
factorProof: body?.factorProof
|
|
494
|
+
});
|
|
495
|
+
if (!authorized.ok) return authorized.response;
|
|
496
|
+
const parsedWalletId = parseWalletId(walletId);
|
|
497
|
+
if (!parsedWalletId.ok) return toFetchRouteResponse({
|
|
498
|
+
status: 400,
|
|
499
|
+
body: {
|
|
500
|
+
ok: false,
|
|
501
|
+
code: "invalid_request",
|
|
502
|
+
message: "wallet id is invalid"
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
const result = await ctx.service.passkeyCustody.listWalletCredentials({ walletId: parsedWalletId.value });
|
|
506
|
+
return await completeWalletCustodyOperation(ctx, authorized.operation, 200, {
|
|
507
|
+
ok: true,
|
|
508
|
+
credentials: result
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Refactor 109C: binds a pre-109C custody envelope to the method that opened it.
|
|
513
|
+
*
|
|
514
|
+
* The exact operation credential names the auth method that opened the
|
|
515
|
+
* envelope. Unlock already proved that method, so finishing the ownership
|
|
516
|
+
* upgrade requires no second user assertion.
|
|
517
|
+
*/
|
|
518
|
+
async function handleWalletCustodyEnvelopeOwnershipUpgrade(ctx) {
|
|
519
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, ENVELOPE_OWNERSHIP_UPGRADE_ROUTE_ID);
|
|
520
|
+
if (!route) throw new Error(`Missing route definition for ${ENVELOPE_OWNERSHIP_UPGRADE_ROUTE_ID}`);
|
|
521
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
522
|
+
const parsedWalletId = parseWalletId(walletIdFromPath(route.path, ctx.pathname));
|
|
523
|
+
if (!parsedWalletId.ok) return toFetchRouteResponse({
|
|
524
|
+
status: 400,
|
|
525
|
+
body: {
|
|
526
|
+
ok: false,
|
|
527
|
+
code: "invalid_request",
|
|
528
|
+
message: "wallet id is invalid"
|
|
529
|
+
}
|
|
530
|
+
});
|
|
531
|
+
const token = extractBearerCredential(ctx.request.headers);
|
|
532
|
+
if (!token) return toFetchRouteResponse({
|
|
533
|
+
status: 401,
|
|
534
|
+
body: {
|
|
535
|
+
ok: false,
|
|
536
|
+
code: "unauthorized",
|
|
537
|
+
message: "No valid Wallet Session"
|
|
538
|
+
}
|
|
539
|
+
});
|
|
540
|
+
const exact = await ctx.service.authorizationSessions.readWalletSessionAuthorizationV2ByOperationCredential({
|
|
541
|
+
tenantId: ctx.service.authorizationSessions.tenantId,
|
|
542
|
+
token,
|
|
543
|
+
nowMs: Date.now()
|
|
544
|
+
});
|
|
545
|
+
if (!exact || String(exact.authorization.session.walletId) !== String(parsedWalletId.value)) return toFetchRouteResponse({
|
|
546
|
+
status: 401,
|
|
547
|
+
body: {
|
|
548
|
+
ok: false,
|
|
549
|
+
code: "unauthorized",
|
|
550
|
+
message: "No valid Wallet Session"
|
|
551
|
+
}
|
|
552
|
+
});
|
|
553
|
+
const walletAuthMethodId = exact.authMethod.walletAuthMethodId;
|
|
554
|
+
const body = await readJsonObject(ctx.request);
|
|
555
|
+
let envelope;
|
|
556
|
+
try {
|
|
557
|
+
envelope = parsePasskeyCustodyEnvelopeRecord(body?.envelope);
|
|
558
|
+
} catch (error) {
|
|
559
|
+
return toFetchRouteResponse({
|
|
560
|
+
status: 400,
|
|
561
|
+
body: {
|
|
562
|
+
ok: false,
|
|
563
|
+
code: "invalid_request",
|
|
564
|
+
message: error instanceof Error ? error.message : "custody envelope is invalid"
|
|
565
|
+
}
|
|
566
|
+
});
|
|
567
|
+
}
|
|
568
|
+
const result = await ctx.service.passkeyCustody.upgradeEnvelopeOwnership({
|
|
569
|
+
walletId: parsedWalletId.value,
|
|
570
|
+
walletAuthMethodId,
|
|
571
|
+
envelope
|
|
572
|
+
});
|
|
573
|
+
switch (result.kind) {
|
|
574
|
+
case "upgraded": return toFetchRouteResponse({
|
|
575
|
+
status: 200,
|
|
576
|
+
body: {
|
|
577
|
+
ok: true,
|
|
578
|
+
upgraded: true,
|
|
579
|
+
envelopeRevision: result.envelopeRevision
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
case "already_owned": return toFetchRouteResponse({
|
|
583
|
+
status: 200,
|
|
584
|
+
body: {
|
|
585
|
+
ok: true,
|
|
586
|
+
upgraded: false
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
case "not_found": return toFetchRouteResponse({
|
|
590
|
+
status: 404,
|
|
591
|
+
body: {
|
|
592
|
+
ok: false,
|
|
593
|
+
code: "not_found",
|
|
594
|
+
message: "no custody envelope to upgrade"
|
|
595
|
+
}
|
|
596
|
+
});
|
|
597
|
+
case "conflict": return toFetchRouteResponse({
|
|
598
|
+
status: 409,
|
|
599
|
+
body: {
|
|
600
|
+
ok: false,
|
|
601
|
+
code: "conflict",
|
|
602
|
+
message: result.reason
|
|
603
|
+
}
|
|
604
|
+
});
|
|
605
|
+
case "refused": return toFetchRouteResponse({
|
|
606
|
+
status: 403,
|
|
607
|
+
body: {
|
|
608
|
+
ok: false,
|
|
609
|
+
code: "forbidden",
|
|
610
|
+
message: result.reason
|
|
611
|
+
}
|
|
612
|
+
});
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
/** Renames one passkey credential; the label is metadata and never AAD. */
|
|
616
|
+
async function handleWalletCustodyCredentialLabel(ctx) {
|
|
617
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, CREDENTIAL_LABEL_ROUTE_ID);
|
|
618
|
+
if (!route) throw new Error(`Missing route definition for ${CREDENTIAL_LABEL_ROUTE_ID}`);
|
|
619
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
620
|
+
const walletId = walletIdFromPath(route.path, ctx.pathname);
|
|
621
|
+
const body = await readJsonObject(ctx.request);
|
|
622
|
+
const envelopeId = trimmed(body?.envelopeId);
|
|
623
|
+
const label = body?.label;
|
|
624
|
+
if (!walletId || !envelopeId || label !== void 0 && typeof label !== "string") return toFetchRouteResponse({
|
|
625
|
+
status: 400,
|
|
626
|
+
body: {
|
|
627
|
+
ok: false,
|
|
628
|
+
code: "invalid_request",
|
|
629
|
+
message: "credential rename needs a wallet, envelope, and optional label"
|
|
630
|
+
}
|
|
631
|
+
});
|
|
632
|
+
const authorized = await authorizeWalletCustodyOperation({
|
|
633
|
+
ctx,
|
|
634
|
+
walletId,
|
|
635
|
+
operation: "credential_label",
|
|
636
|
+
payload: {
|
|
637
|
+
walletId,
|
|
638
|
+
envelopeId,
|
|
639
|
+
...label === void 0 ? {} : { label }
|
|
640
|
+
},
|
|
641
|
+
factorProof: body?.factorProof
|
|
642
|
+
});
|
|
643
|
+
if (!authorized.ok) return authorized.response;
|
|
644
|
+
const parsedWalletId = parseWalletId(walletId);
|
|
645
|
+
if (!parsedWalletId.ok) return toFetchRouteResponse({
|
|
646
|
+
status: 400,
|
|
647
|
+
body: {
|
|
648
|
+
ok: false,
|
|
649
|
+
code: "invalid_request",
|
|
650
|
+
message: "wallet id is invalid"
|
|
651
|
+
}
|
|
652
|
+
});
|
|
653
|
+
const result = await ctx.service.passkeyCustody.renameWalletCredential({
|
|
654
|
+
walletId: parsedWalletId.value,
|
|
655
|
+
envelopeId,
|
|
656
|
+
...label === void 0 ? {} : { label }
|
|
657
|
+
});
|
|
658
|
+
switch (result.kind) {
|
|
659
|
+
case "updated": return await completeWalletCustodyOperation(ctx, authorized.operation, 200, {
|
|
660
|
+
ok: true,
|
|
661
|
+
credential: result.projection
|
|
662
|
+
});
|
|
663
|
+
case "missing": return await completeWalletCustodyOperation(ctx, authorized.operation, 404, {
|
|
664
|
+
ok: false,
|
|
665
|
+
code: "credential_not_found",
|
|
666
|
+
message: "credential not found"
|
|
667
|
+
}, "failed_before_side_effect");
|
|
668
|
+
case "conflict": return await completeWalletCustodyOperation(ctx, authorized.operation, 409, {
|
|
669
|
+
ok: false,
|
|
670
|
+
code: "credential_activity_conflict",
|
|
671
|
+
message: "credential changed; retry"
|
|
672
|
+
}, "failed_before_side_effect");
|
|
673
|
+
case "invalid_envelope_id": return await completeWalletCustodyOperation(ctx, authorized.operation, 400, {
|
|
674
|
+
ok: false,
|
|
675
|
+
code: "invalid_envelope_id",
|
|
676
|
+
message: "credential envelope id is invalid"
|
|
677
|
+
}, "failed_before_side_effect");
|
|
678
|
+
case "invalid_label": return await completeWalletCustodyOperation(ctx, authorized.operation, 400, {
|
|
679
|
+
ok: false,
|
|
680
|
+
code: "invalid_label",
|
|
681
|
+
message: result.reason
|
|
682
|
+
}, "failed_before_side_effect");
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* Spending a recovery code.
|
|
687
|
+
*
|
|
688
|
+
* The refusal is one shape for every cause — unknown wallet, unknown code,
|
|
689
|
+
* spent code. The domain deliberately makes them indistinguishable so the
|
|
690
|
+
* route cannot be used to count how many of a user's ten codes remain, and
|
|
691
|
+
* this must not helpfully re-separate them on the way out.
|
|
692
|
+
*/
|
|
693
|
+
async function handleWalletRecoveryPrepare(ctx) {
|
|
694
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, RECOVERY_PREPARE_ROUTE_ID);
|
|
695
|
+
if (!route) throw new Error(`Missing route definition for ${RECOVERY_PREPARE_ROUTE_ID}`);
|
|
696
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
697
|
+
const body = await readJsonObject(ctx.request);
|
|
698
|
+
let parsed;
|
|
699
|
+
try {
|
|
700
|
+
if (!body) throw new Error("wallet recovery preparation body is required");
|
|
701
|
+
requireExactObjectFields(body, [
|
|
702
|
+
"target",
|
|
703
|
+
"recoveryCodeB64u",
|
|
704
|
+
"reservationId"
|
|
705
|
+
], "wallet recovery preparation");
|
|
706
|
+
const target = parseWalletRecoveryTargetV1(body.target);
|
|
707
|
+
const recoveryCodeB64u = parseRequiredString(body.recoveryCodeB64u, "recoveryCodeB64u");
|
|
708
|
+
if (!/^[A-Za-z0-9_-]+$/.test(recoveryCodeB64u)) throw new Error("wallet recovery preparation is invalid");
|
|
709
|
+
parsed = {
|
|
710
|
+
target,
|
|
711
|
+
recoveryCodeB64u,
|
|
712
|
+
reservationId: parseRecoveryCodeReservationId(body.reservationId)
|
|
713
|
+
};
|
|
714
|
+
} catch {
|
|
715
|
+
return toFetchRouteResponse({
|
|
716
|
+
status: 400,
|
|
717
|
+
body: {
|
|
718
|
+
ok: false,
|
|
719
|
+
code: "invalid_request",
|
|
720
|
+
message: "wallet recovery preparation is invalid"
|
|
721
|
+
}
|
|
722
|
+
});
|
|
723
|
+
}
|
|
724
|
+
const origin = trimmed(ctx.request.headers.get("origin"));
|
|
725
|
+
if (!origin || parsed.target.kind === "passkey" && !isHostWithinRpId(originHostnameOrEmpty(origin), parsed.target.rpId)) return toFetchRouteResponse({
|
|
726
|
+
status: 400,
|
|
727
|
+
body: {
|
|
728
|
+
ok: false,
|
|
729
|
+
code: "invalid_origin",
|
|
730
|
+
message: "wallet recovery origin does not match the relying party"
|
|
731
|
+
}
|
|
732
|
+
});
|
|
733
|
+
let recoveryCodeBytes;
|
|
734
|
+
try {
|
|
735
|
+
recoveryCodeBytes = base64UrlDecode(parsed.recoveryCodeB64u);
|
|
736
|
+
if (recoveryCodeBytes.length === 0) throw new Error("recovery code is empty");
|
|
737
|
+
} catch {
|
|
738
|
+
return toFetchRouteResponse(refusedSpend());
|
|
739
|
+
}
|
|
740
|
+
try {
|
|
741
|
+
const result = await ctx.service.passkeyCustody.prepareRecovery({
|
|
742
|
+
target: parsed.target,
|
|
743
|
+
origin,
|
|
744
|
+
recoveryCodeBytes,
|
|
745
|
+
reservationId: parsed.reservationId
|
|
746
|
+
});
|
|
747
|
+
switch (result.kind) {
|
|
748
|
+
case "prepared": return toFetchRouteResponse({
|
|
749
|
+
status: 200,
|
|
750
|
+
body: {
|
|
751
|
+
ok: true,
|
|
752
|
+
walletId: result.walletId,
|
|
753
|
+
wrap: result.wrap,
|
|
754
|
+
entries: result.entries,
|
|
755
|
+
keyManifest: result.keyManifest,
|
|
756
|
+
target: result.target,
|
|
757
|
+
recoveryOperationId: result.recoveryOperationId,
|
|
758
|
+
targetDeviceId: result.targetDeviceId,
|
|
759
|
+
targetAuthorityId: result.targetAuthorityId,
|
|
760
|
+
targetWalletAuthMethodId: result.targetWalletAuthMethodId,
|
|
761
|
+
...result.target.kind === "passkey" ? { registration: result.registration } : {},
|
|
762
|
+
reservationId: result.reservationId,
|
|
763
|
+
reservationExpiresAtMs: result.reservationExpiresAtMs,
|
|
764
|
+
storeVersion: result.storeVersion
|
|
765
|
+
}
|
|
766
|
+
});
|
|
767
|
+
case "conflict": return toFetchRouteResponse({
|
|
768
|
+
status: 409,
|
|
769
|
+
body: {
|
|
770
|
+
ok: false,
|
|
771
|
+
code: "recovery_set_conflict",
|
|
772
|
+
message: "the recovery set changed during this attempt"
|
|
773
|
+
}
|
|
774
|
+
});
|
|
775
|
+
case "refused": return toFetchRouteResponse(refusedSpend());
|
|
776
|
+
case "reserved":
|
|
777
|
+
case "consumed": return toFetchRouteResponse({
|
|
778
|
+
status: 401,
|
|
779
|
+
body: {
|
|
780
|
+
ok: false,
|
|
781
|
+
code: "recovery_code_used",
|
|
782
|
+
message: "that recovery code has already been used"
|
|
783
|
+
}
|
|
784
|
+
});
|
|
785
|
+
case "manifest_unavailable":
|
|
786
|
+
case "registration_unavailable": return toFetchRouteResponse({
|
|
787
|
+
status: 409,
|
|
788
|
+
body: {
|
|
789
|
+
ok: false,
|
|
790
|
+
code: "recovery_preparation_conflict",
|
|
791
|
+
message: "wallet recovery could not be prepared"
|
|
792
|
+
}
|
|
793
|
+
});
|
|
794
|
+
}
|
|
795
|
+
} finally {
|
|
796
|
+
recoveryCodeBytes.fill(0);
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
async function handleWalletRecoveryGoogleVerify(ctx) {
|
|
800
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, RECOVERY_GOOGLE_VERIFY_ROUTE_ID);
|
|
801
|
+
if (!route) throw new Error(`Missing route definition for ${RECOVERY_GOOGLE_VERIFY_ROUTE_ID}`);
|
|
802
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
803
|
+
let request;
|
|
804
|
+
try {
|
|
805
|
+
request = parseWalletRecoveryGoogleVerifyRequest(await readJsonObject(ctx.request));
|
|
806
|
+
} catch {
|
|
807
|
+
return walletRecoveryRequestError();
|
|
808
|
+
}
|
|
809
|
+
const requestOrigin = trimmed(ctx.request.headers.get("origin"));
|
|
810
|
+
if (!requestOrigin) return toFetchRouteResponse({
|
|
811
|
+
status: 400,
|
|
812
|
+
body: {
|
|
813
|
+
ok: false,
|
|
814
|
+
code: "invalid_origin",
|
|
815
|
+
message: "wallet recovery origin is required"
|
|
816
|
+
}
|
|
817
|
+
});
|
|
818
|
+
try {
|
|
819
|
+
const result = await ctx.service.passkeyCustody.verifyGoogleRecovery({
|
|
820
|
+
recoveryOperationId: request.recoveryOperationId,
|
|
821
|
+
reservationId: String(request.reservationId),
|
|
822
|
+
idToken: request.idToken,
|
|
823
|
+
requestOrigin,
|
|
824
|
+
clientIp: resolveSourceIpFromFetchHeaders(ctx.request.headers) || void 0
|
|
825
|
+
});
|
|
826
|
+
if (!result.ok) return walletRecoveryGoogleFailureResponse(result);
|
|
827
|
+
return toFetchRouteResponse({
|
|
828
|
+
status: 200,
|
|
829
|
+
body: {
|
|
830
|
+
ok: true,
|
|
831
|
+
recoveryOperationId: result.recoveryOperationId,
|
|
832
|
+
reservationId: result.reservationId,
|
|
833
|
+
challengeId: result.challengeId,
|
|
834
|
+
delivery: result.delivery,
|
|
835
|
+
expiresAtMs: result.expiresAtMs
|
|
836
|
+
}
|
|
837
|
+
});
|
|
838
|
+
} catch {
|
|
839
|
+
return walletRecoveryInternalError();
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
async function handleWalletRecoveryEmailOtpVerify(ctx) {
|
|
843
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, RECOVERY_EMAIL_OTP_VERIFY_ROUTE_ID);
|
|
844
|
+
if (!route) throw new Error(`Missing route definition for ${RECOVERY_EMAIL_OTP_VERIFY_ROUTE_ID}`);
|
|
845
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
846
|
+
let request;
|
|
847
|
+
try {
|
|
848
|
+
request = parseWalletRecoveryEmailOtpVerifyRequest(await readJsonObject(ctx.request));
|
|
849
|
+
} catch {
|
|
850
|
+
return walletRecoveryRequestError();
|
|
851
|
+
}
|
|
852
|
+
try {
|
|
853
|
+
const result = await ctx.service.passkeyCustody.verifyRecoveryEmailOtp({
|
|
854
|
+
recoveryOperationId: request.recoveryOperationId,
|
|
855
|
+
reservationId: String(request.reservationId),
|
|
856
|
+
challengeId: String(request.challengeId),
|
|
857
|
+
otpCode: request.otpCode,
|
|
858
|
+
clientIp: resolveSourceIpFromFetchHeaders(ctx.request.headers) || void 0
|
|
859
|
+
});
|
|
860
|
+
if (!result.ok) return walletRecoveryGoogleFailureResponse(result);
|
|
861
|
+
return toFetchRouteResponse({
|
|
862
|
+
status: 200,
|
|
863
|
+
body: {
|
|
864
|
+
ok: true,
|
|
865
|
+
recoveryOperationId: String(result.recovery.recoveryOperationId),
|
|
866
|
+
reservationId: String(result.recovery.reservationId),
|
|
867
|
+
challengeId: String(result.recovery.challengeId)
|
|
868
|
+
}
|
|
869
|
+
});
|
|
870
|
+
} catch {
|
|
871
|
+
return walletRecoveryInternalError();
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
async function handleWalletRecoveryEmailOtpRelease(ctx) {
|
|
875
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, RECOVERY_EMAIL_OTP_RELEASE_ROUTE_ID);
|
|
876
|
+
if (!route) throw new Error(`Missing route definition for ${RECOVERY_EMAIL_OTP_RELEASE_ROUTE_ID}`);
|
|
877
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
878
|
+
let request;
|
|
879
|
+
try {
|
|
880
|
+
request = parseWalletRecoveryEmailOtpReleaseRequest(await readJsonObject(ctx.request));
|
|
881
|
+
} catch {
|
|
882
|
+
return walletRecoveryRequestError();
|
|
883
|
+
}
|
|
884
|
+
try {
|
|
885
|
+
const result = await ctx.service.passkeyCustody.releaseRecoveryEmailOtpFactor({
|
|
886
|
+
recoveryOperationId: request.recoveryOperationId,
|
|
887
|
+
reservationId: String(request.reservationId),
|
|
888
|
+
workerEphemeralPublicKey65B64u: request.workerEphemeralPublicKey65B64u
|
|
889
|
+
});
|
|
890
|
+
if (!result.ok) return walletRecoveryGoogleFailureResponse(result);
|
|
891
|
+
switch (result.kind) {
|
|
892
|
+
case "email_otp_factor_release_v1": return toFetchRouteResponse({
|
|
893
|
+
status: 200,
|
|
894
|
+
body: {
|
|
895
|
+
ok: true,
|
|
896
|
+
kind: result.kind,
|
|
897
|
+
recoveryOperationId: String(result.recovery.recoveryOperationId),
|
|
898
|
+
reservationId: String(result.recovery.reservationId),
|
|
899
|
+
challengeId: String(result.recovery.challengeId),
|
|
900
|
+
providerSubject: result.recovery.providerSubject,
|
|
901
|
+
verifiedEmail: result.recovery.verifiedEmail,
|
|
902
|
+
enrollmentId: result.enrollment.enrollmentId,
|
|
903
|
+
enrollmentSealKeyVersion: result.enrollment.enrollmentSealKeyVersion,
|
|
904
|
+
serverEphemeralPublicKey65B64u: result.serverEphemeralPublicKey65B64u,
|
|
905
|
+
nonce12B64u: result.nonce12B64u,
|
|
906
|
+
ciphertextB64u: result.ciphertextB64u
|
|
907
|
+
}
|
|
908
|
+
});
|
|
909
|
+
case "wallet_recovery_google_email_otp_new_enrollment_v1": return toFetchRouteResponse({
|
|
910
|
+
status: 200,
|
|
911
|
+
body: {
|
|
912
|
+
ok: true,
|
|
913
|
+
kind: result.kind,
|
|
914
|
+
recoveryOperationId: String(result.recovery.recoveryOperationId),
|
|
915
|
+
reservationId: String(result.recovery.reservationId),
|
|
916
|
+
enrollment: {
|
|
917
|
+
kind: "create",
|
|
918
|
+
providerSubject: result.enrollment.providerSubject,
|
|
919
|
+
verifiedEmail: result.enrollment.verifiedEmail
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
});
|
|
923
|
+
}
|
|
924
|
+
} catch {
|
|
925
|
+
return walletRecoveryInternalError();
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
/**
|
|
929
|
+
* Installs the Google/Email OTP recovery target selected by the persisted
|
|
930
|
+
* `otp_verified` attempt. Recovery identity and enrollment identifiers stay
|
|
931
|
+
* server-side; the body can add only a new-enrollment material bundle.
|
|
932
|
+
*/
|
|
933
|
+
async function handleWalletRecoveryGoogleEmailOtpFinalize(ctx) {
|
|
934
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, RECOVERY_GOOGLE_EMAIL_OTP_FINALIZE_ROUTE_ID);
|
|
935
|
+
if (!route) throw new Error(`Missing route definition for ${RECOVERY_GOOGLE_EMAIL_OTP_FINALIZE_ROUTE_ID}`);
|
|
936
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
937
|
+
let request;
|
|
938
|
+
try {
|
|
939
|
+
request = parseWalletRecoveryGoogleEmailOtpFinalizeRequest(await readJson(ctx.request));
|
|
940
|
+
} catch {
|
|
941
|
+
return walletRecoveryRequestError();
|
|
942
|
+
}
|
|
943
|
+
const finalizer = ctx.service.passkeyCustody.finalizeGoogleEmailOtpRecovery;
|
|
944
|
+
if (!finalizer) return toFetchRouteResponse({
|
|
945
|
+
status: 503,
|
|
946
|
+
body: {
|
|
947
|
+
ok: false,
|
|
948
|
+
code: "not_configured",
|
|
949
|
+
message: "Google Email OTP recovery is not configured"
|
|
950
|
+
}
|
|
951
|
+
});
|
|
952
|
+
try {
|
|
953
|
+
const result = await finalizer(request);
|
|
954
|
+
switch (result.kind) {
|
|
955
|
+
case "promoted": return toFetchRouteResponse({
|
|
956
|
+
status: 200,
|
|
957
|
+
body: {
|
|
958
|
+
ok: true,
|
|
959
|
+
projection: result.projection
|
|
960
|
+
}
|
|
961
|
+
});
|
|
962
|
+
case "conflict": return toFetchRouteResponse({
|
|
963
|
+
status: 409,
|
|
964
|
+
body: {
|
|
965
|
+
ok: false,
|
|
966
|
+
code: "recovery_conflict",
|
|
967
|
+
message: "wallet recovery conflicted"
|
|
968
|
+
}
|
|
969
|
+
});
|
|
970
|
+
case "refused":
|
|
971
|
+
case "envelope_rejected":
|
|
972
|
+
case "enrollment_rejected": return toFetchRouteResponse({
|
|
973
|
+
status: 400,
|
|
974
|
+
body: {
|
|
975
|
+
ok: false,
|
|
976
|
+
code: "recovery_rejected",
|
|
977
|
+
message: "wallet recovery was rejected"
|
|
978
|
+
}
|
|
979
|
+
});
|
|
980
|
+
}
|
|
981
|
+
} catch {
|
|
982
|
+
return walletRecoveryInternalError();
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
function parseWalletRecoveryOperationRequest(body, fields, label) {
|
|
986
|
+
if (!body) throw new Error(`${label} body is required`);
|
|
987
|
+
requireExactObjectFields(body, fields, label);
|
|
988
|
+
return {
|
|
989
|
+
recoveryOperationId: parseRequiredAuthorizationValue(parseWalletRecoveryOperationId(body.recoveryOperationId)),
|
|
990
|
+
reservationId: parseRecoveryCodeReservationId(body.reservationId)
|
|
991
|
+
};
|
|
992
|
+
}
|
|
993
|
+
function parseWalletRecoveryGoogleVerifyRequest(body) {
|
|
994
|
+
return {
|
|
995
|
+
...parseWalletRecoveryOperationRequest(body, [
|
|
996
|
+
"recoveryOperationId",
|
|
997
|
+
"reservationId",
|
|
998
|
+
"idToken"
|
|
999
|
+
], "wallet recovery Google verification"),
|
|
1000
|
+
idToken: parseRequiredString(body?.idToken, "idToken")
|
|
1001
|
+
};
|
|
1002
|
+
}
|
|
1003
|
+
function parseWalletRecoveryEmailOtpVerifyRequest(body) {
|
|
1004
|
+
return {
|
|
1005
|
+
...parseWalletRecoveryOperationRequest(body, [
|
|
1006
|
+
"recoveryOperationId",
|
|
1007
|
+
"reservationId",
|
|
1008
|
+
"challengeId",
|
|
1009
|
+
"otpCode"
|
|
1010
|
+
], "wallet recovery Email OTP verification"),
|
|
1011
|
+
challengeId: parseRequiredAuthorizationValue(parseEmailOtpChallengeId(body?.challengeId)),
|
|
1012
|
+
otpCode: parseRequiredString(body?.otpCode, "otpCode")
|
|
1013
|
+
};
|
|
1014
|
+
}
|
|
1015
|
+
function parseWalletRecoveryEmailOtpReleaseRequest(body) {
|
|
1016
|
+
return {
|
|
1017
|
+
...parseWalletRecoveryOperationRequest(body, [
|
|
1018
|
+
"recoveryOperationId",
|
|
1019
|
+
"reservationId",
|
|
1020
|
+
"workerEphemeralPublicKey65B64u"
|
|
1021
|
+
], "wallet recovery Email OTP factor release"),
|
|
1022
|
+
workerEphemeralPublicKey65B64u: parseRequiredString(body?.workerEphemeralPublicKey65B64u, "workerEphemeralPublicKey65B64u")
|
|
1023
|
+
};
|
|
1024
|
+
}
|
|
1025
|
+
function parseWalletRecoveryGoogleEmailOtpFinalizeRequest(value) {
|
|
1026
|
+
if (!isObject(value)) throw new Error("wallet recovery Google Email OTP finalization body must be an object");
|
|
1027
|
+
const recoveryOperationId = parseWalletRecoveryOperationId(value.recoveryOperationId);
|
|
1028
|
+
if (!recoveryOperationId.ok) throw new Error("wallet recovery Google Email OTP finalization operation is invalid");
|
|
1029
|
+
const reservationId = parseRecoveryCodeReservationId(value.reservationId);
|
|
1030
|
+
const replacementEnvelope = parsePasskeyCustodyEnvelopeRecord(value.replacementEnvelope, "walletRecoveryGoogleEmailOtpFinalize.replacementEnvelope");
|
|
1031
|
+
if (value.kind === "replay") {
|
|
1032
|
+
requireExactObjectFields(value, [
|
|
1033
|
+
"kind",
|
|
1034
|
+
"recoveryOperationId",
|
|
1035
|
+
"reservationId",
|
|
1036
|
+
"replacementEnvelope"
|
|
1037
|
+
], "wallet recovery Google Email OTP replay");
|
|
1038
|
+
return {
|
|
1039
|
+
kind: "replay",
|
|
1040
|
+
recoveryOperationId: recoveryOperationId.value,
|
|
1041
|
+
reservationId,
|
|
1042
|
+
replacementEnvelope
|
|
1043
|
+
};
|
|
1044
|
+
}
|
|
1045
|
+
if (value.kind !== "finalize") throw new Error("wallet recovery Google Email OTP finalization kind is invalid");
|
|
1046
|
+
requireExactObjectFields(value, [
|
|
1047
|
+
"kind",
|
|
1048
|
+
"recoveryOperationId",
|
|
1049
|
+
"reservationId",
|
|
1050
|
+
"replacementEnvelope",
|
|
1051
|
+
"ecdsaMaterialPossessionProofs",
|
|
1052
|
+
...value.emailOtpEnrollment === void 0 ? [] : ["emailOtpEnrollment"]
|
|
1053
|
+
], "wallet recovery Google Email OTP finalization");
|
|
1054
|
+
const emailOtpEnrollment = value.emailOtpEnrollment === void 0 ? null : parseWalletRecoveryGoogleEmailOtpCreateEnrollment(value.emailOtpEnrollment);
|
|
1055
|
+
return {
|
|
1056
|
+
kind: "finalize",
|
|
1057
|
+
recoveryOperationId: recoveryOperationId.value,
|
|
1058
|
+
reservationId,
|
|
1059
|
+
replacementEnvelope,
|
|
1060
|
+
ecdsaMaterialPossessionProofs: parseEcdsaMaterialPossessionProofs(value.ecdsaMaterialPossessionProofs),
|
|
1061
|
+
emailOtpEnrollment
|
|
1062
|
+
};
|
|
1063
|
+
}
|
|
1064
|
+
function parseWalletRecoveryGoogleEmailOtpCreateEnrollment(value) {
|
|
1065
|
+
if (!isObject(value)) throw new Error("new recovery Email enrollment is invalid");
|
|
1066
|
+
requireExactObjectFields(value, ["kind", "material"], "new recovery Email enrollment");
|
|
1067
|
+
if (value.kind !== "create" || !isObject(value.material)) throw new Error("new recovery Email enrollment is invalid");
|
|
1068
|
+
const material = value.material;
|
|
1069
|
+
requireExactObjectFields(material, [
|
|
1070
|
+
"enrollmentSealKeyVersion",
|
|
1071
|
+
"clientUnlockPublicKeyB64u",
|
|
1072
|
+
"unlockKeyVersion",
|
|
1073
|
+
"serverSealedFactorCiphertextB64u"
|
|
1074
|
+
], "new recovery Email enrollment material");
|
|
1075
|
+
return {
|
|
1076
|
+
kind: "create",
|
|
1077
|
+
material: {
|
|
1078
|
+
enrollmentSealKeyVersion: parseRequiredString(material.enrollmentSealKeyVersion, "enrollmentSealKeyVersion"),
|
|
1079
|
+
clientUnlockPublicKeyB64u: parseRequiredString(material.clientUnlockPublicKeyB64u, "clientUnlockPublicKeyB64u"),
|
|
1080
|
+
unlockKeyVersion: parseRequiredString(material.unlockKeyVersion, "unlockKeyVersion"),
|
|
1081
|
+
serverSealedFactorCiphertextB64u: parseRequiredString(material.serverSealedFactorCiphertextB64u, "serverSealedFactorCiphertextB64u")
|
|
1082
|
+
}
|
|
1083
|
+
};
|
|
1084
|
+
}
|
|
1085
|
+
function walletRecoveryRequestError() {
|
|
1086
|
+
return toFetchRouteResponse({
|
|
1087
|
+
status: 400,
|
|
1088
|
+
body: {
|
|
1089
|
+
ok: false,
|
|
1090
|
+
code: "invalid_body",
|
|
1091
|
+
message: "wallet recovery request is invalid"
|
|
1092
|
+
}
|
|
1093
|
+
});
|
|
1094
|
+
}
|
|
1095
|
+
function walletRecoveryInternalError() {
|
|
1096
|
+
return toFetchRouteResponse({
|
|
1097
|
+
status: 500,
|
|
1098
|
+
body: {
|
|
1099
|
+
ok: false,
|
|
1100
|
+
code: "internal",
|
|
1101
|
+
message: "wallet recovery could not continue"
|
|
1102
|
+
}
|
|
1103
|
+
});
|
|
1104
|
+
}
|
|
1105
|
+
function walletRecoveryGoogleFailureResponse(result) {
|
|
1106
|
+
return toFetchRouteResponse({
|
|
1107
|
+
status: walletRecoveryGoogleStatusCode(result.code),
|
|
1108
|
+
body: {
|
|
1109
|
+
ok: false,
|
|
1110
|
+
code: result.code,
|
|
1111
|
+
message: "wallet recovery could not continue"
|
|
1112
|
+
}
|
|
1113
|
+
});
|
|
1114
|
+
}
|
|
1115
|
+
function walletRecoveryGoogleStatusCode(code) {
|
|
1116
|
+
if (code === "internal") return 500;
|
|
1117
|
+
if (code === "not_configured") return 503;
|
|
1118
|
+
if (code === "recovery_conflict") return 409;
|
|
1119
|
+
if (code === "rate_limited" || code === "otp_locked_out" || code === "otp_attempts_exhausted") return 429;
|
|
1120
|
+
if (code === "recovery_attempt_unavailable" || code === "provider_identity_mismatch" || code === "challenge_expired_or_invalid" || code === "invalid_otp") return 401;
|
|
1121
|
+
return emailOtpStatusCode(code);
|
|
1122
|
+
}
|
|
1123
|
+
function refusedSpend() {
|
|
1124
|
+
return {
|
|
1125
|
+
status: 401,
|
|
1126
|
+
body: {
|
|
1127
|
+
ok: false,
|
|
1128
|
+
code: "recovery_code_rejected",
|
|
1129
|
+
message: "that recovery code cannot be used"
|
|
1130
|
+
}
|
|
1131
|
+
};
|
|
1132
|
+
}
|
|
1133
|
+
function parseWireRequest(body, originHeader) {
|
|
1134
|
+
if (!body || typeof body !== "object") return null;
|
|
1135
|
+
const challengeId = trimmed(body.challengeId);
|
|
1136
|
+
const locator = parseEnvelopeRetrievalLocator(body.locator);
|
|
1137
|
+
const webauthnAuthentication = parseWebAuthnAuthenticationCredential(body.webauthnAuthentication);
|
|
1138
|
+
if (!challengeId || !locator || !webauthnAuthentication) return null;
|
|
1139
|
+
const expectedOrigin = trimmed(originHeader);
|
|
1140
|
+
if (!expectedOrigin) return null;
|
|
1141
|
+
return {
|
|
1142
|
+
challengeId,
|
|
1143
|
+
expectedOrigin,
|
|
1144
|
+
locator,
|
|
1145
|
+
webauthnAuthentication
|
|
1146
|
+
};
|
|
1147
|
+
}
|
|
1148
|
+
function parseEnvelopeRetrievalLocator(value) {
|
|
1149
|
+
if (!isObject(value) || !isObject(value.factor)) return null;
|
|
1150
|
+
try {
|
|
1151
|
+
requireExactObjectFields(value, ["walletId", "factor"], "custody locator");
|
|
1152
|
+
requireExactObjectFields(value.factor, [
|
|
1153
|
+
"kind",
|
|
1154
|
+
"rpId",
|
|
1155
|
+
"credentialIdB64u"
|
|
1156
|
+
], "custody locator.factor");
|
|
1157
|
+
} catch {
|
|
1158
|
+
return null;
|
|
1159
|
+
}
|
|
1160
|
+
const walletId = parseWalletId(value.walletId);
|
|
1161
|
+
const rpId = parseWebAuthnRpId(value.factor.rpId);
|
|
1162
|
+
const credentialIdB64u = parseWebAuthnCredentialIdB64u(value.factor.credentialIdB64u);
|
|
1163
|
+
if (!walletId.ok || !rpId.ok || !credentialIdB64u.ok) return null;
|
|
1164
|
+
if (value.factor.kind !== "passkey") return null;
|
|
1165
|
+
return {
|
|
1166
|
+
walletId: walletId.value,
|
|
1167
|
+
factor: {
|
|
1168
|
+
kind: "passkey",
|
|
1169
|
+
rpId: rpId.value,
|
|
1170
|
+
credentialIdB64u: credentialIdB64u.value
|
|
1171
|
+
}
|
|
1172
|
+
};
|
|
1173
|
+
}
|
|
1174
|
+
function trimmed(value) {
|
|
1175
|
+
return typeof value === "string" ? value.trim() : "";
|
|
1176
|
+
}
|
|
1177
|
+
async function readJsonObject(request) {
|
|
1178
|
+
const value = await readJson(request);
|
|
1179
|
+
return isObject(value) ? value : null;
|
|
1180
|
+
}
|
|
1181
|
+
function isObject(value) {
|
|
1182
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1183
|
+
}
|
|
1184
|
+
function parseRecoveryCodeLocatorRecords(values, walletId, recoveryKeyIds) {
|
|
1185
|
+
if (values.length !== recoveryKeyIds.length) throw new Error("recovery code locators do not match the recovery wraps");
|
|
1186
|
+
const locators = values.map((value, index) => {
|
|
1187
|
+
requireExactObjectFields(value, ["locatorB64u", "recoveryKeyId"], "recovery code locator");
|
|
1188
|
+
const locatorB64u = parseRecoveryCodeLocatorV1(value.locatorB64u);
|
|
1189
|
+
const recoveryKeyId = parseDerivedWalletRecoveryKeyId(value.recoveryKeyId);
|
|
1190
|
+
const expectedRecoveryKeyId = recoveryKeyIds[index];
|
|
1191
|
+
if (!expectedRecoveryKeyId || String(recoveryKeyId) !== String(expectedRecoveryKeyId)) throw new Error("recovery code locator does not match its recovery wrap");
|
|
1192
|
+
return {
|
|
1193
|
+
locatorB64u,
|
|
1194
|
+
walletId,
|
|
1195
|
+
recoveryKeyId
|
|
1196
|
+
};
|
|
1197
|
+
});
|
|
1198
|
+
if (new Set(locators.map((locator) => String(locator.locatorB64u))).size !== locators.length) throw new Error("recovery code locators must be unique");
|
|
1199
|
+
return locators;
|
|
1200
|
+
}
|
|
1201
|
+
/**
|
|
1202
|
+
* Installing the credential a recovery enrolled.
|
|
1203
|
+
*
|
|
1204
|
+
* The envelope arrives sealed, but its complete wire shape is parsed here.
|
|
1205
|
+
* The server has no seed and cannot open the ciphertext. Exact key coverage
|
|
1206
|
+
* comes from its signer registry and durable activation receipts.
|
|
1207
|
+
*/
|
|
1208
|
+
async function handleWalletRecoveryFinalize(ctx) {
|
|
1209
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, RECOVERY_FINALIZE_ROUTE_ID);
|
|
1210
|
+
if (!route) throw new Error(`Missing route definition for ${RECOVERY_FINALIZE_ROUTE_ID}`);
|
|
1211
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
1212
|
+
let requestBody;
|
|
1213
|
+
try {
|
|
1214
|
+
requestBody = parseWalletRecoveryFinalizeBody(await readJson(ctx.request));
|
|
1215
|
+
} catch {
|
|
1216
|
+
return toFetchRouteResponse({
|
|
1217
|
+
status: 400,
|
|
1218
|
+
body: {
|
|
1219
|
+
ok: false,
|
|
1220
|
+
code: "invalid_request",
|
|
1221
|
+
message: "wallet recovery finalization is invalid"
|
|
1222
|
+
}
|
|
1223
|
+
});
|
|
1224
|
+
}
|
|
1225
|
+
let serviceRequest;
|
|
1226
|
+
if (requestBody.kind === "finalize") {
|
|
1227
|
+
const expectedOrigin = trimmed(ctx.request.headers.get("origin"));
|
|
1228
|
+
if (!expectedOrigin) return toFetchRouteResponse({
|
|
1229
|
+
status: 400,
|
|
1230
|
+
body: {
|
|
1231
|
+
ok: false,
|
|
1232
|
+
code: "invalid_origin",
|
|
1233
|
+
message: "wallet recovery finalization requires the request Origin header"
|
|
1234
|
+
}
|
|
1235
|
+
});
|
|
1236
|
+
serviceRequest = {
|
|
1237
|
+
kind: "finalize",
|
|
1238
|
+
walletId: requestBody.walletId,
|
|
1239
|
+
reservationId: requestBody.reservationId,
|
|
1240
|
+
recoveryOperationId: requestBody.recoveryOperationId,
|
|
1241
|
+
targetDeviceId: requestBody.targetDeviceId,
|
|
1242
|
+
targetAuthorityId: requestBody.targetAuthorityId,
|
|
1243
|
+
targetWalletAuthMethodId: requestBody.targetWalletAuthMethodId,
|
|
1244
|
+
challengeId: requestBody.challengeId,
|
|
1245
|
+
replacementId: requestBody.replacementId,
|
|
1246
|
+
webauthnRegistration: requestBody.webauthnRegistration,
|
|
1247
|
+
expectedOrigin,
|
|
1248
|
+
replacementEnvelope: requestBody.replacementEnvelope,
|
|
1249
|
+
ecdsaMaterialPossessionProofs: requestBody.ecdsaMaterialPossessionProofs
|
|
1250
|
+
};
|
|
1251
|
+
} else serviceRequest = {
|
|
1252
|
+
kind: "replay",
|
|
1253
|
+
walletId: requestBody.walletId,
|
|
1254
|
+
reservationId: requestBody.reservationId,
|
|
1255
|
+
recoveryOperationId: requestBody.recoveryOperationId,
|
|
1256
|
+
targetDeviceId: requestBody.targetDeviceId,
|
|
1257
|
+
targetAuthorityId: requestBody.targetAuthorityId,
|
|
1258
|
+
targetWalletAuthMethodId: requestBody.targetWalletAuthMethodId,
|
|
1259
|
+
replacementId: requestBody.replacementId,
|
|
1260
|
+
replacementEnvelope: requestBody.replacementEnvelope
|
|
1261
|
+
};
|
|
1262
|
+
const result = await ctx.service.passkeyCustody.finalizeRecovery(serviceRequest);
|
|
1263
|
+
switch (result.kind) {
|
|
1264
|
+
case "promoted": return toFetchRouteResponse({
|
|
1265
|
+
status: 200,
|
|
1266
|
+
body: {
|
|
1267
|
+
ok: true,
|
|
1268
|
+
projection: result.projection
|
|
1269
|
+
}
|
|
1270
|
+
});
|
|
1271
|
+
case "conflict": return toFetchRouteResponse({
|
|
1272
|
+
status: 409,
|
|
1273
|
+
body: {
|
|
1274
|
+
ok: false,
|
|
1275
|
+
code: "recovery_conflict",
|
|
1276
|
+
message: "wallet recovery conflicted"
|
|
1277
|
+
}
|
|
1278
|
+
});
|
|
1279
|
+
case "refused":
|
|
1280
|
+
case "envelope_rejected":
|
|
1281
|
+
case "registration_rejected": return toFetchRouteResponse({
|
|
1282
|
+
status: 400,
|
|
1283
|
+
body: {
|
|
1284
|
+
ok: false,
|
|
1285
|
+
code: "recovery_rejected",
|
|
1286
|
+
message: "wallet recovery was rejected"
|
|
1287
|
+
}
|
|
1288
|
+
});
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
function parseWalletRecoveryFinalizeBody(value) {
|
|
1292
|
+
if (!isObject(value)) throw new Error("wallet recovery finalization body must be an object");
|
|
1293
|
+
const walletId = parseWalletId(value.walletId);
|
|
1294
|
+
const recoveryOperationId = parseWalletRecoveryOperationId(value.recoveryOperationId);
|
|
1295
|
+
const targetDeviceId = parseDeviceId(value.targetDeviceId);
|
|
1296
|
+
const targetAuthorityId = parseWalletAuthorityId(value.targetAuthorityId);
|
|
1297
|
+
const targetWalletAuthMethodId = parseWalletAuthMethodId(value.targetWalletAuthMethodId);
|
|
1298
|
+
if (!walletId.ok || !recoveryOperationId.ok || !targetDeviceId.ok || !targetAuthorityId.ok || !targetWalletAuthMethodId.ok) throw new Error("wallet recovery finalization identity is invalid");
|
|
1299
|
+
const identity = {
|
|
1300
|
+
walletId: walletId.value,
|
|
1301
|
+
reservationId: parseRecoveryCodeReservationId(value.reservationId),
|
|
1302
|
+
recoveryOperationId: recoveryOperationId.value,
|
|
1303
|
+
targetDeviceId: targetDeviceId.value,
|
|
1304
|
+
targetAuthorityId: targetAuthorityId.value,
|
|
1305
|
+
targetWalletAuthMethodId: targetWalletAuthMethodId.value,
|
|
1306
|
+
replacementId: parseRequiredString(value.replacementId, "replacementId"),
|
|
1307
|
+
replacementEnvelope: parsePasskeyCustodyEnvelopeRecord(value.replacementEnvelope, "walletRecoveryFinalize.replacementEnvelope")
|
|
1308
|
+
};
|
|
1309
|
+
if (value.kind === "replay") {
|
|
1310
|
+
requireExactObjectFields(value, [
|
|
1311
|
+
"kind",
|
|
1312
|
+
"walletId",
|
|
1313
|
+
"reservationId",
|
|
1314
|
+
"recoveryOperationId",
|
|
1315
|
+
"targetDeviceId",
|
|
1316
|
+
"targetAuthorityId",
|
|
1317
|
+
"targetWalletAuthMethodId",
|
|
1318
|
+
"replacementId",
|
|
1319
|
+
"replacementEnvelope"
|
|
1320
|
+
], "wallet recovery replay");
|
|
1321
|
+
return {
|
|
1322
|
+
kind: "replay",
|
|
1323
|
+
...identity
|
|
1324
|
+
};
|
|
1325
|
+
}
|
|
1326
|
+
if (value.kind !== "finalize") throw new Error("wallet recovery finalization kind is invalid");
|
|
1327
|
+
requireExactObjectFields(value, [
|
|
1328
|
+
"kind",
|
|
1329
|
+
"walletId",
|
|
1330
|
+
"reservationId",
|
|
1331
|
+
"recoveryOperationId",
|
|
1332
|
+
"targetDeviceId",
|
|
1333
|
+
"targetAuthorityId",
|
|
1334
|
+
"targetWalletAuthMethodId",
|
|
1335
|
+
"challengeId",
|
|
1336
|
+
"replacementId",
|
|
1337
|
+
"webauthnRegistration",
|
|
1338
|
+
"replacementEnvelope",
|
|
1339
|
+
"ecdsaMaterialPossessionProofs"
|
|
1340
|
+
], "wallet recovery finalization");
|
|
1341
|
+
if (!isObject(value.webauthnRegistration)) throw new Error("wallet recovery finalization registration is invalid");
|
|
1342
|
+
return {
|
|
1343
|
+
kind: "finalize",
|
|
1344
|
+
...identity,
|
|
1345
|
+
challengeId: parseRequiredString(value.challengeId, "challengeId"),
|
|
1346
|
+
webauthnRegistration: value.webauthnRegistration,
|
|
1347
|
+
ecdsaMaterialPossessionProofs: parseEcdsaMaterialPossessionProofs(value.ecdsaMaterialPossessionProofs)
|
|
1348
|
+
};
|
|
1349
|
+
}
|
|
1350
|
+
function parseEcdsaMaterialPossessionProofs(value) {
|
|
1351
|
+
if (!Array.isArray(value)) throw new Error("wallet recovery finalization ECDSA proofs must be an array");
|
|
1352
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1353
|
+
return value.map((item, index) => {
|
|
1354
|
+
if (!isObject(item)) throw new Error(`wallet recovery finalization ECDSA proof ${index} is invalid`);
|
|
1355
|
+
requireExactObjectFields(item, ["keySetId", "proof"], `ECDSA proof ${index}`);
|
|
1356
|
+
const keySetId = trimmed(item.keySetId);
|
|
1357
|
+
if (!/^evm_family_ecdsa:\S+$/.test(keySetId)) throw new Error(`wallet recovery finalization ECDSA proof ${index} is invalid`);
|
|
1358
|
+
if (seen.has(keySetId)) throw new Error(`wallet recovery finalization ECDSA proof ${index} is duplicated`);
|
|
1359
|
+
seen.add(keySetId);
|
|
1360
|
+
return {
|
|
1361
|
+
keySetId,
|
|
1362
|
+
proof: parseWalletRecoveryEcdsaPossessionProofV1(item.proof)
|
|
1363
|
+
};
|
|
1364
|
+
});
|
|
1365
|
+
}
|
|
1366
|
+
function authorizedOperationReplay(operation) {
|
|
1367
|
+
if (operation.lifecycle !== "completed") return toFetchRouteResponse({
|
|
1368
|
+
status: 409,
|
|
1369
|
+
body: {
|
|
1370
|
+
ok: false,
|
|
1371
|
+
code: "recovery_in_progress",
|
|
1372
|
+
message: "wallet recovery is still in progress"
|
|
1373
|
+
}
|
|
1374
|
+
});
|
|
1375
|
+
return new Response(operation.response.bodyText, {
|
|
1376
|
+
status: operation.response.status,
|
|
1377
|
+
headers: { "content-type": operation.response.contentType }
|
|
1378
|
+
});
|
|
1379
|
+
}
|
|
1380
|
+
async function handleWalletRecoveryBackupAcknowledge(ctx) {
|
|
1381
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, RECOVERY_ACK_ROUTE_ID);
|
|
1382
|
+
if (!route) throw new Error(`Missing route definition for ${RECOVERY_ACK_ROUTE_ID}`);
|
|
1383
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
1384
|
+
const body = await readJsonObject(ctx.request);
|
|
1385
|
+
let walletId = "";
|
|
1386
|
+
try {
|
|
1387
|
+
if (!body) throw new Error("acknowledgement body is required");
|
|
1388
|
+
requireExactObjectFields(body, ["walletId"], "recovery backup acknowledgement");
|
|
1389
|
+
walletId = parseRequiredString(body.walletId, "walletId");
|
|
1390
|
+
} catch {
|
|
1391
|
+
return toFetchRouteResponse({
|
|
1392
|
+
status: 400,
|
|
1393
|
+
body: {
|
|
1394
|
+
ok: false,
|
|
1395
|
+
code: "invalid_request",
|
|
1396
|
+
message: "an acknowledgement needs a wallet"
|
|
1397
|
+
}
|
|
1398
|
+
});
|
|
1399
|
+
}
|
|
1400
|
+
const result = await ctx.service.passkeyCustody.acknowledgeRecoveryBackup({ walletId });
|
|
1401
|
+
if (result.kind === "no_recovery_set") return toFetchRouteResponse({
|
|
1402
|
+
status: 404,
|
|
1403
|
+
body: {
|
|
1404
|
+
ok: false,
|
|
1405
|
+
code: "no_recovery_set",
|
|
1406
|
+
message: "this wallet has no issued recovery codes to acknowledge"
|
|
1407
|
+
}
|
|
1408
|
+
});
|
|
1409
|
+
return toFetchRouteResponse({
|
|
1410
|
+
status: 200,
|
|
1411
|
+
body: {
|
|
1412
|
+
ok: true,
|
|
1413
|
+
issuedAtMs: result.issuedAtMs
|
|
1414
|
+
}
|
|
1415
|
+
});
|
|
1416
|
+
}
|
|
1417
|
+
/**
|
|
1418
|
+
* Rotating a wallet's recovery codes.
|
|
1419
|
+
*
|
|
1420
|
+
* The wraps pass through as opaque records — the server cannot check that
|
|
1421
|
+
* they wrap the right KEK, because it has neither. What it does check is the
|
|
1422
|
+
* set's shape, and it does so before writing: a set that reaches the store
|
|
1423
|
+
* with the wrong number of wraps leaves a wallet holding fewer codes than its
|
|
1424
|
+
* owner wrote down, and nothing surfaces that until someone counts.
|
|
1425
|
+
*/
|
|
1426
|
+
async function handleWalletRecoveryRotate(ctx) {
|
|
1427
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, RECOVERY_ROTATE_ROUTE_ID);
|
|
1428
|
+
if (!route) throw new Error(`Missing route definition for ${RECOVERY_ROTATE_ROUTE_ID}`);
|
|
1429
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
1430
|
+
const body = await readJsonObject(ctx.request);
|
|
1431
|
+
const walletId = trimmed(body?.walletId);
|
|
1432
|
+
const expectedStoreVersion = trimmed(body?.expectedStoreVersion);
|
|
1433
|
+
const manifestKekWraps = Array.isArray(body?.manifestKekWraps) ? body.manifestKekWraps.filter(isObject) : [];
|
|
1434
|
+
const entries = Array.isArray(body?.entries) ? body.entries.filter(isObject) : [];
|
|
1435
|
+
const rawRecoveryCodeLocators = Array.isArray(body?.recoveryCodeLocators) ? body.recoveryCodeLocators : [];
|
|
1436
|
+
const recoveryCodeLocators = rawRecoveryCodeLocators.filter(isObject);
|
|
1437
|
+
if (!walletId || !expectedStoreVersion || manifestKekWraps.length === 0 || entries.length !== 1 || recoveryCodeLocators.length !== rawRecoveryCodeLocators.length || recoveryCodeLocators.length !== manifestKekWraps.length) return toFetchRouteResponse({
|
|
1438
|
+
status: 400,
|
|
1439
|
+
body: {
|
|
1440
|
+
ok: false,
|
|
1441
|
+
code: "invalid_request",
|
|
1442
|
+
message: "a rotation needs a wallet and its complete replacement recovery set"
|
|
1443
|
+
}
|
|
1444
|
+
});
|
|
1445
|
+
const parsedWalletId = parseWalletId(walletId);
|
|
1446
|
+
if (!parsedWalletId.ok) return toFetchRouteResponse({
|
|
1447
|
+
status: 400,
|
|
1448
|
+
body: {
|
|
1449
|
+
ok: false,
|
|
1450
|
+
code: "invalid_request",
|
|
1451
|
+
message: "wallet id is invalid"
|
|
1452
|
+
}
|
|
1453
|
+
});
|
|
1454
|
+
let replacement;
|
|
1455
|
+
let parsedRecoveryCodeLocators;
|
|
1456
|
+
try {
|
|
1457
|
+
replacement = parseWalletRecoverySetRotationWireV1({
|
|
1458
|
+
walletId,
|
|
1459
|
+
manifestKekWraps,
|
|
1460
|
+
entries
|
|
1461
|
+
}, { expectedWalletId: parsedWalletId.value });
|
|
1462
|
+
parsedRecoveryCodeLocators = parseRecoveryCodeLocatorRecords(recoveryCodeLocators, parsedWalletId.value, replacement.manifestKekWraps.map((wrap) => wrap.recoveryKeyId));
|
|
1463
|
+
} catch (error) {
|
|
1464
|
+
return toFetchRouteResponse({
|
|
1465
|
+
status: 400,
|
|
1466
|
+
body: {
|
|
1467
|
+
ok: false,
|
|
1468
|
+
code: "invalid_request",
|
|
1469
|
+
message: error instanceof Error ? error.message : "replacement recovery set is invalid"
|
|
1470
|
+
}
|
|
1471
|
+
});
|
|
1472
|
+
}
|
|
1473
|
+
const authorized = await authorizeWalletCustodyOperation({
|
|
1474
|
+
ctx,
|
|
1475
|
+
walletId,
|
|
1476
|
+
operation: "recovery_rotate",
|
|
1477
|
+
payload: {
|
|
1478
|
+
walletId,
|
|
1479
|
+
expectedStoreVersion,
|
|
1480
|
+
manifestKekWraps,
|
|
1481
|
+
entries,
|
|
1482
|
+
recoveryCodeLocators
|
|
1483
|
+
},
|
|
1484
|
+
factorProof: body?.factorProof
|
|
1485
|
+
});
|
|
1486
|
+
if (!authorized.ok) return authorized.response;
|
|
1487
|
+
const result = await ctx.service.passkeyCustody.rotateRecoveryCodes({
|
|
1488
|
+
walletId,
|
|
1489
|
+
replacement,
|
|
1490
|
+
recoveryCodeLocators: parsedRecoveryCodeLocators,
|
|
1491
|
+
expectedStoreVersion
|
|
1492
|
+
});
|
|
1493
|
+
switch (result.kind) {
|
|
1494
|
+
case "rotated": return await completeWalletCustodyOperation(ctx, authorized.operation, 200, {
|
|
1495
|
+
ok: true,
|
|
1496
|
+
issuedAtMs: result.issuedAtMs,
|
|
1497
|
+
storeVersion: result.storeVersion
|
|
1498
|
+
});
|
|
1499
|
+
case "no_recovery_set": return await completeWalletCustodyOperation(ctx, authorized.operation, 404, {
|
|
1500
|
+
ok: false,
|
|
1501
|
+
code: "no_recovery_set",
|
|
1502
|
+
message: "this wallet has no codes to rotate"
|
|
1503
|
+
}, "failed_before_side_effect");
|
|
1504
|
+
case "conflict": return await completeWalletCustodyOperation(ctx, authorized.operation, 409, {
|
|
1505
|
+
ok: false,
|
|
1506
|
+
code: "recovery_set_conflict",
|
|
1507
|
+
message: "the recovery set changed during this rotation; try again"
|
|
1508
|
+
}, "failed_before_side_effect");
|
|
1509
|
+
case "rejected": return await completeWalletCustodyOperation(ctx, authorized.operation, 400, {
|
|
1510
|
+
ok: false,
|
|
1511
|
+
code: "rotation_rejected",
|
|
1512
|
+
message: result.reason
|
|
1513
|
+
}, "failed_before_side_effect");
|
|
1514
|
+
}
|
|
1515
|
+
}
|
|
1516
|
+
async function handleWalletRecoveryRead(ctx) {
|
|
1517
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, RECOVERY_READ_ROUTE_ID);
|
|
1518
|
+
if (!route) throw new Error(`Missing route definition for ${RECOVERY_READ_ROUTE_ID}`);
|
|
1519
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
1520
|
+
const body = await readJsonObject(ctx.request);
|
|
1521
|
+
const walletId = trimmed(body?.walletId);
|
|
1522
|
+
if (!walletId) return toFetchRouteResponse({
|
|
1523
|
+
status: 400,
|
|
1524
|
+
body: {
|
|
1525
|
+
ok: false,
|
|
1526
|
+
code: "invalid_request",
|
|
1527
|
+
message: "a read needs a wallet"
|
|
1528
|
+
}
|
|
1529
|
+
});
|
|
1530
|
+
const authorized = await authorizeWalletCustodyOperation({
|
|
1531
|
+
ctx,
|
|
1532
|
+
walletId,
|
|
1533
|
+
operation: "recovery_read",
|
|
1534
|
+
payload: { walletId },
|
|
1535
|
+
factorProof: body?.factorProof
|
|
1536
|
+
});
|
|
1537
|
+
if (!authorized.ok) return authorized.response;
|
|
1538
|
+
const result = await ctx.service.passkeyCustody.readRecoverySet({ walletId });
|
|
1539
|
+
if (result.kind === "no_recovery_set") return await completeWalletCustodyOperation(ctx, authorized.operation, 404, {
|
|
1540
|
+
ok: false,
|
|
1541
|
+
code: "no_recovery_set",
|
|
1542
|
+
message: "this wallet has no issued recovery codes"
|
|
1543
|
+
}, "failed_before_side_effect");
|
|
1544
|
+
return await completeWalletCustodyOperation(ctx, authorized.operation, 200, {
|
|
1545
|
+
ok: true,
|
|
1546
|
+
recoverySet: result.record,
|
|
1547
|
+
storeVersion: result.storeVersion
|
|
1548
|
+
});
|
|
1549
|
+
}
|
|
1550
|
+
/**
|
|
1551
|
+
* Reporting recovery status to the wallet's owner.
|
|
1552
|
+
*
|
|
1553
|
+
* The wallet comes from the path. Origin binding keeps this count endpoint
|
|
1554
|
+
* scoped to browser callers without exposing recovery identifiers.
|
|
1555
|
+
*
|
|
1556
|
+
* Counts only, never identifiers. Which codes remain is not something even
|
|
1557
|
+
* the owner's browser needs, and a list would be one leak away from being
|
|
1558
|
+
* useful to someone else.
|
|
1559
|
+
*/
|
|
1560
|
+
async function handleWalletRecoveryStatus(ctx) {
|
|
1561
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, RECOVERY_STATUS_ROUTE_ID);
|
|
1562
|
+
if (!route) throw new Error(`Missing route definition for ${RECOVERY_STATUS_ROUTE_ID}`);
|
|
1563
|
+
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
1564
|
+
const walletId = walletIdFromPath(route.path, ctx.pathname);
|
|
1565
|
+
if (!walletId) return toFetchRouteResponse({
|
|
1566
|
+
status: 400,
|
|
1567
|
+
body: {
|
|
1568
|
+
ok: false,
|
|
1569
|
+
code: "invalid_request",
|
|
1570
|
+
message: "status needs a wallet"
|
|
1571
|
+
}
|
|
1572
|
+
});
|
|
1573
|
+
const origin = trimmed(ctx.request.headers.get("origin"));
|
|
1574
|
+
try {
|
|
1575
|
+
parseSessionOrigin(origin);
|
|
1576
|
+
} catch {
|
|
1577
|
+
return toFetchRouteResponse({
|
|
1578
|
+
status: 400,
|
|
1579
|
+
body: {
|
|
1580
|
+
ok: false,
|
|
1581
|
+
code: "invalid_origin",
|
|
1582
|
+
message: "request Origin is invalid"
|
|
1583
|
+
}
|
|
1584
|
+
});
|
|
1585
|
+
}
|
|
1586
|
+
const result = await ctx.service.passkeyCustody.readRecoveryStatus({ walletId });
|
|
1587
|
+
if (result.kind === "no_recovery_set") return toFetchRouteResponse({
|
|
1588
|
+
status: 404,
|
|
1589
|
+
body: {
|
|
1590
|
+
ok: false,
|
|
1591
|
+
code: "no_recovery_set",
|
|
1592
|
+
message: "this wallet has no recovery codes"
|
|
1593
|
+
}
|
|
1594
|
+
});
|
|
1595
|
+
return toFetchRouteResponse({
|
|
1596
|
+
status: 200,
|
|
1597
|
+
body: {
|
|
1598
|
+
ok: true,
|
|
1599
|
+
activeCodeCount: result.activeCodeCount,
|
|
1600
|
+
totalCodeCount: result.totalCodeCount,
|
|
1601
|
+
issuedAtMs: result.issuedAtMs,
|
|
1602
|
+
storeVersion: result.storeVersion,
|
|
1603
|
+
backupOutstanding: result.backupOutstanding
|
|
1604
|
+
}
|
|
1605
|
+
});
|
|
1606
|
+
}
|
|
1607
|
+
function walletIdFromPath(routePath, pathname) {
|
|
1608
|
+
const routeSegments = routePath.split("/").filter(Boolean);
|
|
1609
|
+
const pathSegments = pathname.split("/").filter(Boolean);
|
|
1610
|
+
const index = routeSegments.indexOf(":walletId");
|
|
1611
|
+
if (index < 0) return "";
|
|
1612
|
+
const segment = pathSegments[index];
|
|
1613
|
+
return segment ? decodeURIComponent(segment).trim() : "";
|
|
1614
|
+
}
|
|
1615
|
+
//#endregion
|
|
1616
|
+
export { handlePasskeyCustody, handleWalletCustodyCredentialLabel, handleWalletCustodyCredentialsList, handleWalletCustodyEmailOtpChallenge, handleWalletCustodyEnvelopeOwnershipUpgrade, handleWalletRecoveryBackupAcknowledge, handleWalletRecoveryEmailOtpRelease, handleWalletRecoveryEmailOtpVerify, handleWalletRecoveryFinalize, handleWalletRecoveryGoogleEmailOtpFinalize, handleWalletRecoveryGoogleVerify, handleWalletRecoveryPrepare, handleWalletRecoveryRead, handleWalletRecoveryRotate, handleWalletRecoveryStatus };
|
|
1617
|
+
|
|
1618
|
+
//# sourceMappingURL=passkeyCustody.js.map
|