@seams/wallet-server 0.6.2 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/artifact-manifest.json +147 -32
- package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -0
- package/cloudflare-router-ab/build/deriver-a/index.js +2 -2
- package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/deriver-b/build-stamp.json +1 -0
- package/cloudflare-router-ab/build/deriver-b/index.js +2 -2
- package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/local-tools/darwin-x64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/local-tools/linux-x64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/router/build-stamp.json +1 -0
- package/cloudflare-router-ab/build/router/index.js +2 -2
- package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -0
- package/cloudflare-router-ab/build/signing-worker/index.js +2 -2
- package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/index.js +2 -2
- package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
- package/cloudflare-router-ab/migrations/deriver-a/0012_tenant_root_creation_tombstones.sql +20 -0
- package/cloudflare-router-ab/migrations/deriver-a/0013_tenant_root_root_use_admissions.sql +32 -0
- package/cloudflare-router-ab/migrations/deriver-a/0014_tenant_root_refresh_supersessions.sql +24 -0
- package/cloudflare-router-ab/migrations/deriver-a/0015_tenant_root_root_use_attempts.sql +56 -0
- package/cloudflare-router-ab/migrations/deriver-a/0016_tenant_root_root_use_admission_settlement.sql +5 -0
- package/cloudflare-router-ab/migrations/deriver-a/0017_tenant_root_root_use_admission_claims.sql +64 -0
- package/cloudflare-router-ab/migrations/deriver-a/0018_tenant_root_recovery_retention_keys.sql +12 -0
- package/cloudflare-router-ab/migrations/deriver-b/0012_tenant_root_creation_tombstones.sql +20 -0
- package/cloudflare-router-ab/migrations/deriver-b/0013_tenant_root_root_use_admissions.sql +32 -0
- package/cloudflare-router-ab/migrations/deriver-b/0014_tenant_root_refresh_supersessions.sql +24 -0
- package/cloudflare-router-ab/migrations/deriver-b/0015_tenant_root_root_use_attempts.sql +56 -0
- package/cloudflare-router-ab/migrations/deriver-b/0016_tenant_root_root_use_admission_settlement.sql +5 -0
- package/cloudflare-router-ab/migrations/deriver-b/0017_tenant_root_root_use_admission_claims.sql +64 -0
- package/cloudflare-router-ab/migrations/deriver-b/0018_tenant_root_recovery_retention_keys.sql +12 -0
- package/cloudflare-router-ab/scripts/bootstrap-local-tenant-root.mjs +81 -16
- package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +102 -9
- package/cloudflare-router-ab/scripts/start-local-role-workers.mjs +4 -1
- package/cloudflare-router-ab/wrangler.deriver-a.toml +24 -0
- package/cloudflare-router-ab/wrangler.router.toml +13 -0
- package/dist/esm/authorization/capabilityPolicy.js +1 -1
- package/dist/esm/authorization/domain.js +2 -2
- package/dist/esm/authorization/factorEvidence.js +6 -100
- package/dist/esm/authorization/service.js +34 -2
- package/dist/esm/authorization/vaultProxyUse.js +3 -4
- package/dist/esm/cloud-host.js +16 -11
- package/dist/esm/core/EmailOtpRecords.js +19 -1
- package/dist/esm/core/EmailOtpStores.js +323 -924
- package/dist/esm/core/IdentityStore.js +44 -235
- package/dist/esm/core/NearPublicKeyStore.js +21 -63
- package/dist/esm/core/RegistrationCeremonyStore.js +3 -1793
- package/dist/esm/core/ThresholdService/config.js +1 -82
- package/dist/esm/core/ThresholdService/kv.js +3 -3
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +37 -5
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.js +4 -74
- package/dist/esm/core/ThresholdService/stores/CloudflareDurableObjectStore.js +15 -51
- package/dist/esm/core/ThresholdService/stores/KeyStore.js +3 -3
- package/dist/esm/core/ThresholdService/stores/SessionStore.js +5 -81
- package/dist/esm/core/ThresholdService/stores/WalletSessionStore.js +185 -290
- package/dist/esm/core/ThresholdService/validation.js +18 -230
- package/dist/esm/core/WalletAuthMethodStore.js +22 -79
- package/dist/esm/core/WalletStore.js +58 -185
- package/dist/esm/core/WebAuthnAuthenticatorStore.js +57 -340
- package/dist/esm/core/WebAuthnCredentialBindingStore.js +90 -369
- package/dist/esm/core/WebAuthnLoginChallengeStore.js +17 -397
- package/dist/esm/core/WebAuthnSyncChallengeStore.js +17 -397
- package/dist/esm/core/authService/AuthService.js +2 -19
- package/dist/esm/core/authService/emailOtpChallengeProof.js +1 -1
- package/dist/esm/core/authService/emailOtpChallenges.js +1 -1
- package/dist/esm/core/authService/emailOtpConfig.js +1 -32
- package/dist/esm/core/authService/emailOtpRegistrationEnrollment.js +6 -153
- package/dist/esm/core/authService/googleEmailOtpRegistration.js +1 -1
- package/dist/esm/core/authService/nearPrivateKeySigning.js +7 -15
- package/dist/esm/core/authService/nearTransactions.js +2 -1
- package/dist/esm/core/authService/oidcVerification.js +3 -4
- package/dist/esm/core/authService/rateLimits.js +1 -31
- package/dist/esm/core/authService/registrationThresholdHelpers.js +2 -103
- package/dist/esm/core/authService/storeRegistry.js +2 -13
- package/dist/esm/core/authService/thresholdEcdsaKeyInventory.js +4 -5
- package/dist/esm/core/authService/webauthn.js +15 -50
- package/dist/esm/core/authService/webauthnOidcHelpers.js +1 -6
- package/dist/esm/core/authService/webauthnVerificationOutcomes.js +60 -0
- package/dist/esm/core/authService/webauthnWalletBinding.js +2 -122
- package/dist/esm/core/d1IdentityStore.js +32 -66
- package/dist/esm/core/d1TenantStore.js +82 -0
- package/dist/esm/core/d1WalletAuthMethodStore.js +92 -143
- package/dist/esm/core/d1WalletStore.js +14 -12
- package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +10 -8
- package/dist/esm/core/deviceLinking/linkedDeviceManagement.js +25 -3
- package/dist/esm/core/deviceLinking/linkedDeviceSession.js +6 -895
- package/dist/esm/core/deviceLinking/linkedDeviceSessionApproval.js +102 -0
- package/dist/esm/core/deviceLinking/linkedDeviceSessionRecord.js +668 -0
- package/dist/esm/core/emailOtpD1Statements.js +383 -0
- package/dist/esm/core/hostedAccountIds.js +2 -2
- package/dist/esm/core/keyMaterialBrands.js +2 -48
- package/dist/esm/core/nearRelayerAccountProvisioning.js +25 -150
- package/dist/esm/core/nearSignerWasmRuntime.js +1 -4
- package/dist/esm/core/rpcClients/near/NearClient.js +15 -218
- package/dist/esm/core/signingLanes/LaneEnrollmentActivation.js +1 -1
- package/dist/esm/core/signingLanes/LaneLifecycleApplicationService.js +2 -4
- package/dist/esm/core/signingLanes/LaneLifecycleStore.js +0 -24
- package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +5 -5
- package/dist/esm/core/signingLanes/ecdsaServerRetirement.js +3 -8
- package/dist/esm/core/signingLanes/ed25519ServerRetirement.js +1 -4
- package/dist/esm/core/storeBackends.js +208 -0
- package/dist/esm/core/thresholdEcdsaChainTarget.js +1 -7
- package/dist/esm/core/webAuthnD1Statements.js +92 -0
- package/dist/esm/core/webAuthnStoreBackends.js +198 -0
- package/dist/esm/hosted-wallet-gateway.js +33 -16
- package/dist/esm/index.js +2 -2
- package/dist/esm/local-hosted-wallet-gateway-worker.js +2 -23
- package/dist/esm/localHostedWalletGatewayHandler.js +299 -0
- package/dist/esm/localIntendedEcdsaFinalizeFault.js +85 -0
- package/dist/esm/localIntendedLinkExecuteFault.js +140 -0
- package/dist/esm/localIntendedRevokeFault.js +106 -0
- package/dist/esm/localIntendedSessionAdmissionFault.js +139 -0
- package/dist/esm/localIntendedYaoExportFault.js +117 -0
- package/dist/esm/localIntendedYaoFault.js +13 -16
- package/dist/esm/localIntendedYaoFinalizeFault.js +99 -0
- package/dist/esm/localIntendedYaoRecoveryFault.js +102 -0
- package/dist/esm/localIntendedYaoSigningFault.js +127 -0
- package/dist/esm/router/auth/authRequestValidation.js +1 -1
- package/dist/esm/router/auth/commonRouterUtils.js +10 -2
- package/dist/esm/router/auth/walletSessionFailure.js +1 -14
- package/dist/esm/router/cloudflare/d1/auth/d1AuthorizedOperationRouteService.js +23 -0
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +86 -66
- package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +208 -0
- package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +246 -296
- package/dist/esm/router/cloudflare/d1/authorization/persistedWalletSessionAuthorization.js +14 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +62 -63
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpGrantStore.js +3 -6
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpTargetFactor.js +1 -19
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceManagementService.js +4 -3
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +52 -9
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +3 -6
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRevocation.js +100 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.js +7 -10
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.js +33 -124
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSourceContributionPreparationPlanner.js +2 -2
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +9 -17
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.js +6 -6
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkSourceReader.js +3 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/index.js +3 -3
- package/dist/esm/router/cloudflare/d1/deviceLinking/installedEcdsaAuthority.js +69 -0
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoCapabilityPersistence.js +39 -68
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.js +69 -0
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js +2 -2
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +26 -71
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +20 -3
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpEnrollmentStore.js +7 -94
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpGrantStore.js +5 -47
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +26 -123
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +0 -2
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRegistrationEnrollmentFinalizer.js +2 -2
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationAttemptStore.js +15 -134
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationRecords.js +54 -260
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +1 -1
- package/dist/esm/router/cloudflare/d1/identity/d1IdentityRecords.js +1 -28
- package/dist/esm/router/cloudflare/d1/near/d1NearPublicKeyStore.js +2 -8
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyEnvelopeStore.js +1 -1
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.js +3 -3
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +23 -73
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpRecords.js +15 -2
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpService.js +12 -203
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +16 -32
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +29 -72
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +4 -1
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationIntentService.js +3 -1
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +6 -30
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +261 -205
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +5 -3
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +2 -2
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +3 -3
- package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +43 -25
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneEffectJournalStore.js +0 -1
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLifecycleStore.js +1 -1
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneRecords.js +2 -1
- package/dist/esm/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.js +2 -60
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +158 -19
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodBoundary.js +19 -49
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodRevocationReplayStore.js +100 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +132 -33
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +83 -4
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +14 -49
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnRecords.js +4 -4
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnStore.js +22 -116
- package/dist/esm/router/cloudflare/runtime/createSelfHostedCloudflareSigningWorker.js +1 -2
- package/dist/esm/router/cloudflare/runtime/walletConsoleTenantRootLineage.js +11 -2
- package/dist/esm/router/cloudflare/runtime/walletGateway.js +1 -1
- package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.js +5 -6
- package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.js +2 -1
- package/dist/esm/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js +48 -21
- package/dist/esm/router/cloudflare.js +11480 -12853
- package/dist/esm/router/domains/ecdsa/routerAbEcdsaStrictRegistration.js +16 -5
- package/dist/esm/router/domains/ecdsa/thresholdEcdsaRequestValidation.js +2 -8
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoLifecycleDecision.js +33 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +17 -9
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +29 -431
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.js +7 -2
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRunner.js +2 -1
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js +70 -2
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +134 -169
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +77 -162
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js +205 -51
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +29 -11
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js +182 -55
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js +2 -1
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.js +63 -247
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +3 -2
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js +87 -132
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationTwoPhaseRunner.js +5 -4
- package/dist/esm/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.js +45 -0
- package/dist/esm/router/domains/ed25519Yao/session/thresholdEd25519RequestValidation.js +1 -1
- package/dist/esm/router/domains/emailOtp/emailOtpExportPolicy.js +1 -42
- package/dist/esm/router/domains/emailOtp/emailOtpRequestValidation.js +1 -6
- package/dist/esm/router/domains/emailOtp/emailOtpSessionRouteHelpers.js +1 -142
- package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrievalRoute.js +1 -1
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +2 -2
- package/dist/esm/router/domains/passkeyCustody/walletRecoveryFinalization.js +23 -45
- package/dist/esm/router/domains/passkeyCustody/walletRecoveryKeyManifest.js +5 -5
- package/dist/esm/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.js +1 -1
- package/dist/esm/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.js +827 -0
- package/dist/esm/router/domains/signingOperations/routerAbEd25519NormalSigningRoute.js +698 -0
- package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmission.js +209 -0
- package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmissionCore.js +16 -15
- package/dist/esm/router/domains/signingOperations/routerAbOperationStepUp.js +313 -0
- package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +62 -2159
- package/dist/esm/router/domains/tenantRoot/tenantRootIdentityResolution.js +1 -1
- package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +18 -22
- package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +3 -4
- package/dist/esm/router/domains/walletUnlock/walletUnlockRequestedCapabilitiesValidation.js +2 -2
- package/dist/esm/router/domains/walletUnlock/walletUnlockRouteHandlers.js +97 -150
- package/dist/esm/router/express.js +5967 -6410
- package/dist/esm/router/framework/http.js +1 -4
- package/dist/esm/router/framework/ror/normalize.js +1 -1
- package/dist/esm/router/framework/routerApiRouteSurface.js +1 -1
- package/dist/esm/router/node/nodeHostedWalletGateway.js +64 -0
- package/dist/esm/router/node/nodeHostedWalletGatewayCheck.js +163 -0
- package/dist/esm/router/node/nodeHostedWalletGatewayMain.js +120 -0
- package/dist/esm/router/node/nodeHttp.js +79 -0
- package/dist/esm/router/node/nodeSqlite.js +43 -0
- package/dist/esm/router/node/signerSqlMigrations.js +48 -0
- package/dist/esm/router/transport/fetch/createFetchRouter.js +1 -1
- package/dist/esm/router/transport/fetch/routes/deviceLinking.js +16 -18
- package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +3 -5
- package/dist/esm/router/transport/fetch/routes/deviceManagement.js +15 -24
- package/dist/esm/router/transport/fetch/routes/normalSigningRouterProxy.js +3 -16
- package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +144 -461
- package/dist/esm/router/transport/fetch/routes/sessions.js +4 -4
- package/dist/esm/router/transport/fetch/routes/syncAccount.js +4 -6
- package/dist/esm/router/transport/fetch/routes/syncAccountBootstrap.js +2 -2
- package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +69 -23
- package/dist/esm/router/transport/fetch/routes/thresholdEd25519.js +52 -27
- package/dist/esm/shared-ts/src/authorization/capabilityKinds.js +1 -1
- package/dist/esm/shared-ts/src/authorization/delegatedAuthority.js +1 -1
- package/dist/esm/shared-ts/src/authorization/operationFingerprint.js +1 -2
- package/dist/esm/shared-ts/src/authorization/walletAuthority.js +99 -227
- package/dist/esm/shared-ts/src/authorization/walletCustodyOperation.js +4 -6
- package/dist/esm/shared-ts/src/device-linking/activeWalletSession.js +74 -0
- package/dist/esm/shared-ts/src/device-linking/authorityActivation.js +50 -0
- package/dist/esm/shared-ts/src/device-linking/committedSignerPackages.js +8 -9
- package/dist/esm/shared-ts/src/device-linking/delegatedActivationPlan.js +3 -1
- package/dist/esm/shared-ts/src/device-linking/deviceManagement.js +55 -0
- package/dist/esm/shared-ts/src/device-linking/digests.js +10 -65
- package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +3 -1
- package/dist/esm/shared-ts/src/device-linking/index.js +4 -1
- package/dist/esm/shared-ts/src/device-linking/parsers.js +510 -1063
- package/dist/esm/shared-ts/src/device-linking/requestProof.js +5 -14
- package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +6 -9
- package/dist/esm/shared-ts/src/device-linking/walletSessionCredentialDelivery.js +9 -9
- package/dist/esm/shared-ts/src/device-linking/wireFields.js +59 -0
- package/dist/esm/shared-ts/src/near/nearClient.js +252 -0
- package/dist/esm/shared-ts/src/passkey-custody/credentialActivity.js +3 -1
- package/dist/esm/shared-ts/src/passkey-custody/custodyEnvelope.js +7 -5
- package/dist/esm/shared-ts/src/passkey-custody/custodySecretBinding.js +6 -4
- package/dist/esm/shared-ts/src/passkey-custody/primitives.js +5 -39
- package/dist/esm/shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.js +1 -5
- package/dist/esm/shared-ts/src/signing-lanes/index.js +3 -3
- package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +5 -12
- package/dist/esm/shared-ts/src/signing-lanes/participantDigest.js +5 -14
- package/dist/esm/shared-ts/src/signing-lanes/participants.js +2 -5
- package/dist/esm/shared-ts/src/signing-lanes/recordParsers.js +7 -5
- package/dist/esm/shared-ts/src/signing-lanes/rotationDigests.js +6 -45
- package/dist/esm/shared-ts/src/signing-lanes/rotationParsers.js +423 -1511
- package/dist/esm/shared-ts/src/signing-lanes/rotationProtocolParsers.js +323 -0
- package/dist/esm/shared-ts/src/signing-lanes/rotationWireFields.js +59 -0
- package/dist/esm/shared-ts/src/tenant-root/tenantRootOperationRecord.js +1 -1
- package/dist/esm/shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.js +1 -2
- package/dist/esm/shared-ts/src/threshold/keyMaterialBrands.js +49 -0
- package/dist/esm/shared-ts/src/utils/addAuthMethodRegistration.js +3 -4
- package/dist/esm/shared-ts/src/utils/canonicalPrimitives.js +8 -1
- package/dist/esm/shared-ts/src/utils/digestEncoding.js +63 -0
- package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +2 -2
- package/dist/esm/shared-ts/src/utils/exactRecord.js +44 -0
- package/dist/esm/shared-ts/src/utils/registrationAuthMethodInput.js +127 -0
- package/dist/esm/shared-ts/src/utils/registrationEstablishedSession.js +2 -2
- package/dist/esm/shared-ts/src/utils/registrationIds.js +280 -0
- package/dist/esm/shared-ts/src/utils/registrationIntent.js +4 -1170
- package/dist/esm/shared-ts/src/utils/registrationSignerPlan.js +429 -0
- package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +11 -136
- package/dist/esm/shared-ts/src/utils/routerAbEd25519Yao.js +3 -163
- package/dist/esm/shared-ts/src/utils/routerAbEd25519YaoDigests.js +160 -0
- package/dist/esm/shared-ts/src/utils/routerAbNormalSigningIdentity.js +1 -4
- package/dist/esm/shared-ts/src/utils/routerAbPublicKeyset.js +7 -15
- package/dist/esm/shared-ts/src/utils/validation.js +37 -6
- package/dist/esm/shared-ts/src/utils/walletAuthMethodRecord.js +362 -0
- package/dist/esm/shared-ts/src/utils/wireSchema.js +77 -0
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeLocator.js +1 -1
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeReservation.js +1 -1
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryCommittedProjection.js +7 -11
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.js +4 -8
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEnvelopeSet.js +3 -1
- package/dist/esm/storage/d1Sql.js +10 -1
- package/dist/esm/storage/syncSqlite.js +79 -0
- package/dist/esm/threshold/session/signingSessionSeal/crypto/cipher.js +1 -1
- package/dist/esm/threshold/session/signingSessionSeal/crypto/shamir3PassWasm.js +1 -1
- package/dist/esm/threshold/session/signingSessionSeal/idempotencyRecords.js +1 -2
- package/dist/esm/threshold/session/signingSessionSeal/options.js +1 -1
- package/dist/esm/threshold/session/signingSessionSeal/transport/shared.js +18 -55
- package/dist/esm/threshold/statusCodes.js +1 -1
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker.js +3 -3
- 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_bg.wasm +0 -0
- package/dist/types/shared-ts/src/authorization/capabilityKinds.d.ts +8 -26
- package/dist/types/shared-ts/src/authorization/delegatedAuthority.d.ts +0 -8
- package/dist/types/shared-ts/src/authorization/operationFingerprint.d.ts +1 -3
- package/dist/types/shared-ts/src/authorization/walletAuthority.d.ts +25 -12
- package/dist/types/shared-ts/src/authorization/walletSessionIssuance.d.ts +2 -1
- package/dist/types/shared-ts/src/device-linking/activeWalletSession.d.ts +3 -2
- package/dist/types/shared-ts/src/device-linking/authorityActivation.d.ts +5 -0
- package/dist/types/shared-ts/src/device-linking/committedSignerPackages.d.ts +2 -5
- package/dist/types/shared-ts/src/device-linking/contracts.d.ts +8 -11
- package/dist/types/shared-ts/src/device-linking/contracts.typecheck.d.ts +2 -1
- package/dist/types/shared-ts/src/device-linking/deviceManagement.d.ts +7 -0
- package/dist/types/shared-ts/src/device-linking/digests.d.ts +0 -5
- package/dist/types/shared-ts/src/device-linking/ed25519ExportRoot.d.ts +3 -2
- package/dist/types/shared-ts/src/device-linking/index.d.ts +2 -0
- package/dist/types/shared-ts/src/device-linking/parsers.d.ts +4 -41
- package/dist/types/shared-ts/src/device-linking/requestProof.d.ts +0 -1
- package/dist/types/shared-ts/src/device-linking/sourceContribution.d.ts +3 -2
- package/dist/types/shared-ts/src/device-linking/walletSessionCredentialDelivery.d.ts +2 -1
- package/dist/types/shared-ts/src/device-linking/wireFields.d.ts +26 -0
- package/dist/types/shared-ts/src/near/actions.d.ts +4 -4
- package/dist/types/shared-ts/src/near/delegate.d.ts +3 -2
- package/dist/types/shared-ts/src/near/nearClient.d.ts +145 -0
- package/dist/types/shared-ts/src/passkey-custody/ceremonyCommitPayload.d.ts +0 -22
- package/dist/types/shared-ts/src/passkey-custody/credentialActivity.d.ts +2 -4
- package/dist/types/shared-ts/src/passkey-custody/custodyEnvelope.d.ts +9 -18
- package/dist/types/shared-ts/src/passkey-custody/custodySecretBinding.d.ts +8 -24
- package/dist/types/shared-ts/src/passkey-custody/index.d.ts +0 -2
- package/dist/types/shared-ts/src/passkey-custody/primitives.d.ts +0 -14
- package/dist/types/shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.d.ts +0 -15
- package/dist/types/shared-ts/src/signing-lanes/execution.d.ts +2 -51
- package/dist/types/shared-ts/src/signing-lanes/index.d.ts +1 -2
- package/dist/types/shared-ts/src/signing-lanes/ownerContinuity.d.ts +1 -2
- package/dist/types/shared-ts/src/signing-lanes/participantDigest.d.ts +5 -27
- package/dist/types/shared-ts/src/signing-lanes/participants.d.ts +0 -11
- package/dist/types/shared-ts/src/signing-lanes/recordParsers.d.ts +6 -53
- package/dist/types/shared-ts/src/signing-lanes/records.d.ts +1 -2
- package/dist/types/shared-ts/src/signing-lanes/rotation.d.ts +15 -37
- package/dist/types/shared-ts/src/signing-lanes/rotationDigests.d.ts +1 -20
- package/dist/types/shared-ts/src/signing-lanes/rotationLifecycle.d.ts +4 -25
- package/dist/types/shared-ts/src/signing-lanes/rotationParsers.d.ts +1 -41
- package/dist/types/shared-ts/src/signing-lanes/rotationProtocolParsers.d.ts +6 -0
- package/dist/types/shared-ts/src/signing-lanes/rotationWireFields.d.ts +20 -0
- package/dist/types/shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.d.ts +2 -35
- package/dist/types/shared-ts/src/threshold/ed25519OperationFingerprint.d.ts +8 -35
- package/dist/types/shared-ts/src/threshold/keyMaterialBrands.d.ts +25 -0
- package/dist/types/shared-ts/src/threshold/participants.d.ts +3 -9
- package/dist/types/shared-ts/src/threshold/secp256k1.d.ts +0 -37
- package/dist/types/shared-ts/src/threshold/sessionPolicy.d.ts +24 -0
- package/dist/types/shared-ts/src/threshold/signingRootScope.d.ts +2 -5
- package/dist/types/shared-ts/src/utils/addAuthMethodRegistration.d.ts +3 -4
- package/dist/types/shared-ts/src/utils/addWalletAuthMethod.d.ts +7 -108
- package/dist/types/shared-ts/src/utils/addWalletAuthMethod.typecheck.d.ts +16 -3
- package/dist/types/shared-ts/src/utils/canonicalPrimitives.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/digestEncoding.d.ts +9 -0
- package/dist/types/shared-ts/src/utils/domainIds.d.ts +1 -2
- package/dist/types/shared-ts/src/utils/ecdsaKeyFactsInventory.d.ts +1 -2
- package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +5 -5
- package/dist/types/shared-ts/src/utils/emailOtpRecoveryKey.d.ts +0 -2
- package/dist/types/shared-ts/src/utils/errors.d.ts +0 -7
- package/dist/types/shared-ts/src/utils/exactRecord.d.ts +12 -0
- package/dist/types/shared-ts/src/utils/index.d.ts +5 -2
- package/dist/types/shared-ts/src/utils/jsonRpc.d.ts +3 -2
- package/dist/types/shared-ts/src/utils/near.d.ts +2 -1
- package/dist/types/shared-ts/src/utils/nearRpcResults.d.ts +7 -7
- package/dist/types/shared-ts/src/utils/normalize.d.ts +0 -4
- package/dist/types/shared-ts/src/utils/registrationAuthMethodInput.d.ts +184 -0
- package/dist/types/shared-ts/src/utils/registrationContracts.d.ts +76 -0
- package/dist/types/shared-ts/src/utils/registrationEstablishedSession.d.ts +1 -2
- package/dist/types/shared-ts/src/utils/registrationIds.d.ts +56 -0
- package/dist/types/shared-ts/src/utils/registrationIntent.d.ts +9 -514
- package/dist/types/shared-ts/src/utils/registrationSignerPlan.d.ts +142 -0
- package/dist/types/shared-ts/src/utils/routerAbEcdsaDerivation.d.ts +21 -92
- package/dist/types/shared-ts/src/utils/routerAbEd25519Yao.d.ts +14 -99
- package/dist/types/shared-ts/src/utils/routerAbEd25519YaoDigests.d.ts +39 -0
- package/dist/types/shared-ts/src/utils/routerAbPublicKeyset.d.ts +10 -15
- package/dist/types/shared-ts/src/utils/routerAbTraceContext.d.ts +2 -1
- package/dist/types/shared-ts/src/utils/secureRandomId.d.ts +0 -2
- package/dist/types/shared-ts/src/utils/signerDomain.d.ts +3 -35
- package/dist/types/shared-ts/src/utils/signerSlot.d.ts +0 -4
- package/dist/types/shared-ts/src/utils/signingSessionSeal.d.ts +1 -7
- package/dist/types/shared-ts/src/utils/validation.d.ts +10 -10
- package/dist/types/shared-ts/src/utils/variant.d.ts +11 -0
- package/dist/types/shared-ts/src/utils/variant.typecheck.d.ts +22 -0
- package/dist/types/shared-ts/src/utils/walletAddSignerActivation.d.ts +2 -2
- package/dist/types/shared-ts/src/utils/walletAuthAuthority.d.ts +1 -58
- package/dist/types/shared-ts/src/utils/walletAuthMethodRecord.d.ts +104 -0
- package/dist/types/shared-ts/src/utils/walletCapabilityBindings.d.ts +3 -7
- package/dist/types/shared-ts/src/utils/webauthnDeviceInfo.d.ts +3 -4
- package/dist/types/shared-ts/src/utils/wireSchema.d.ts +60 -0
- package/dist/types/shared-ts/src/wallet-recovery/backupAcknowledgement.d.ts +2 -1
- package/dist/types/shared-ts/src/wallet-recovery/index.d.ts +0 -1
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeLocator.d.ts +0 -16
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeReservation.d.ts +2 -11
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryCommittedProjection.d.ts +6 -18
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.d.ts +0 -2
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryEnvelopeSet.d.ts +1 -3
- package/dist/types/wallet-server/src/authorization/capabilityPolicy.d.ts +0 -1
- package/dist/types/wallet-server/src/authorization/domain.d.ts +25 -5
- package/dist/types/wallet-server/src/authorization/ecdsaWalletSessionAdmission.d.ts +37 -0
- package/dist/types/wallet-server/src/authorization/ecdsaWalletSessionAdmission.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/factorEvidence.d.ts +6 -7
- package/dist/types/wallet-server/src/authorization/service.d.ts +52 -3
- package/dist/types/wallet-server/src/cloud-host.d.ts +6 -2
- package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +10 -1
- package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +16 -116
- package/dist/types/wallet-server/src/core/IdentityStore.d.ts +2 -7
- package/dist/types/wallet-server/src/core/NearPublicKeyStore.d.ts +6 -16
- package/dist/types/wallet-server/src/core/RegistrationCeremonyStore.d.ts +29 -90
- package/dist/types/wallet-server/src/core/ThresholdService/config.d.ts +0 -12
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +10 -3
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.d.ts +17 -48
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/internalServiceHttp.d.ts +2 -1
- package/dist/types/wallet-server/src/core/ThresholdService/stores/CloudflareDurableObjectStore.d.ts +4 -71
- package/dist/types/wallet-server/src/core/ThresholdService/stores/KeyStore.d.ts +2 -1
- package/dist/types/wallet-server/src/core/ThresholdService/stores/SessionStore.d.ts +4 -8
- package/dist/types/wallet-server/src/core/ThresholdService/stores/StoreConfig.d.ts +2 -1
- package/dist/types/wallet-server/src/core/ThresholdService/stores/WalletSessionStore.d.ts +1 -3
- package/dist/types/wallet-server/src/core/ThresholdService/validation.d.ts +14 -47
- package/dist/types/wallet-server/src/core/WalletAuthMethodStore.d.ts +2 -7
- package/dist/types/wallet-server/src/core/WalletStore.d.ts +3 -8
- package/dist/types/wallet-server/src/core/WebAuthnAuthenticatorStore.d.ts +7 -22
- package/dist/types/wallet-server/src/core/WebAuthnCredentialBindingStore.d.ts +14 -36
- package/dist/types/wallet-server/src/core/WebAuthnLoginChallengeStore.d.ts +9 -34
- package/dist/types/wallet-server/src/core/WebAuthnSyncChallengeStore.d.ts +9 -34
- package/dist/types/wallet-server/src/core/authService/AuthService.d.ts +0 -3
- package/dist/types/wallet-server/src/core/authService/emailOtpChallengeOperations.d.ts +6 -5
- package/dist/types/wallet-server/src/core/authService/emailOtpChallengeProof.d.ts +9 -17
- package/dist/types/wallet-server/src/core/authService/emailOtpChallengeVerification.d.ts +3 -2
- package/dist/types/wallet-server/src/core/authService/emailOtpChallenges.d.ts +7 -23
- package/dist/types/wallet-server/src/core/authService/emailOtpConfig.d.ts +3 -10
- package/dist/types/wallet-server/src/core/authService/emailOtpDelivery.d.ts +4 -3
- package/dist/types/wallet-server/src/core/authService/emailOtpGrant.d.ts +4 -3
- package/dist/types/wallet-server/src/core/authService/emailOtpRegistrationEnrollment.d.ts +3 -70
- package/dist/types/wallet-server/src/core/authService/emailOtpSeal.d.ts +3 -2
- package/dist/types/wallet-server/src/core/authService/emailOtpUnlock.d.ts +4 -3
- package/dist/types/wallet-server/src/core/authService/googleEmailOtpRegistration.d.ts +5 -8
- package/dist/types/wallet-server/src/core/authService/nearPrivateKeySigning.d.ts +3 -2
- package/dist/types/wallet-server/src/core/authService/nearPublicKeyMetadata.d.ts +2 -1
- package/dist/types/wallet-server/src/core/authService/nearTransactions.d.ts +2 -1
- package/dist/types/wallet-server/src/core/authService/oidcVerification.d.ts +4 -3
- package/dist/types/wallet-server/src/core/authService/rateLimits.d.ts +0 -3
- package/dist/types/wallet-server/src/core/authService/registrationThresholdHelpers.d.ts +0 -26
- package/dist/types/wallet-server/src/core/authService/storeRegistry.d.ts +0 -5
- package/dist/types/wallet-server/src/core/authService/thresholdEcdsaKeyInventory.d.ts +0 -23
- package/dist/types/wallet-server/src/core/authService/webauthn.d.ts +8 -16
- package/dist/types/wallet-server/src/core/authService/webauthnOidcHelpers.d.ts +7 -7
- package/dist/types/wallet-server/src/core/authService/webauthnVerificationOutcomes.d.ts +43 -0
- package/dist/types/wallet-server/src/core/authService/webauthnWalletBinding.d.ts +1 -28
- package/dist/types/wallet-server/src/core/d1IdentityStore.d.ts +6 -16
- package/dist/types/wallet-server/src/core/d1TenantStore.d.ts +51 -0
- package/dist/types/wallet-server/src/core/d1WalletAuthMethodStore.d.ts +11 -29
- package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +6 -1
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceEd25519ExportRoot.d.ts +2 -1
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceEmailOtpGrant.d.ts +2 -1
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceManagement.d.ts +44 -26
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceSession.d.ts +19 -217
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceSessionApproval.d.ts +8 -0
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceSessionRecord.d.ts +259 -0
- package/dist/types/wallet-server/src/core/deviceLinking/requestProof.d.ts +2 -2
- package/dist/types/wallet-server/src/core/emailOtpD1Statements.d.ts +54 -0
- package/dist/types/wallet-server/src/core/hostedAccountIds.d.ts +0 -15
- package/dist/types/wallet-server/src/core/keyMaterialBrands.d.ts +4 -24
- package/dist/types/wallet-server/src/core/nearRelayerAccountProvisioning.d.ts +2 -3
- package/dist/types/wallet-server/src/core/nearSignerWasmRuntime.d.ts +0 -1
- package/dist/types/wallet-server/src/core/registrationContracts.d.ts +37 -108
- package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbNormalSigningRuntime.d.ts +5 -4
- package/dist/types/wallet-server/src/core/rpcClients/near/NearClient.d.ts +10 -106
- package/dist/types/wallet-server/src/core/signingLanes/LaneAggregateRevocationApplicationService.d.ts +4 -3
- package/dist/types/wallet-server/src/core/signingLanes/LaneEffectJournalStore.d.ts +2 -3
- package/dist/types/wallet-server/src/core/signingLanes/LaneLifecycleStore.d.ts +2 -3
- package/dist/types/wallet-server/src/core/signingLanes/WalletExecutionLaneProjection.d.ts +3 -9
- package/dist/types/wallet-server/src/core/signingLanes/ecdsaServerRetirement.d.ts +4 -4
- package/dist/types/wallet-server/src/core/signingLanes/ed25519ServerRetirement.d.ts +3 -3
- package/dist/types/wallet-server/src/core/storeBackends.d.ts +83 -0
- package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +13 -59
- package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.typecheck.d.ts +51 -3
- package/dist/types/wallet-server/src/core/thresholdEcdsaChainTarget.d.ts +0 -1
- package/dist/types/wallet-server/src/core/types.d.ts +3 -24
- package/dist/types/wallet-server/src/core/webAuthnD1Statements.d.ts +29 -0
- package/dist/types/wallet-server/src/core/webAuthnStoreBackends.d.ts +96 -0
- package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +11 -7
- package/dist/types/wallet-server/src/index.d.ts +1 -1
- package/dist/types/wallet-server/src/local-hosted-wallet-gateway-worker.d.ts +1 -4
- package/dist/types/wallet-server/src/localHostedWalletGatewayHandler.d.ts +12 -0
- package/dist/types/wallet-server/src/localIntendedEcdsaFinalizeFault.d.ts +33 -0
- package/dist/types/wallet-server/src/localIntendedLinkExecuteFault.d.ts +47 -0
- package/dist/types/wallet-server/src/localIntendedRevokeFault.d.ts +40 -0
- package/dist/types/wallet-server/src/localIntendedSessionAdmissionFault.d.ts +41 -0
- package/dist/types/wallet-server/src/localIntendedYaoExportFault.d.ts +41 -0
- package/dist/types/wallet-server/src/localIntendedYaoFault.d.ts +7 -1
- package/dist/types/wallet-server/src/localIntendedYaoFinalizeFault.d.ts +37 -0
- package/dist/types/wallet-server/src/localIntendedYaoRecoveryFault.d.ts +45 -0
- package/dist/types/wallet-server/src/localIntendedYaoSigningFault.d.ts +51 -0
- package/dist/types/wallet-server/src/router/auth/authRequestValidation.d.ts +10 -21
- package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +5 -10
- package/dist/types/wallet-server/src/router/auth/walletSessionFailure.d.ts +1 -4
- package/dist/types/wallet-server/src/router/auth/webAuthnCredentialCodecs.d.ts +3 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1AuthorizedOperationRouteService.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthBoundary.d.ts +3 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +2 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/authorizedOperationStatements.d.ts +30 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +45 -21
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/persistedWalletSessionAuthorization.d.ts +3 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/walletSessionAuthorityProjection.d.ts +2 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +57 -6
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpGrantStore.d.ts +2 -3
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpTargetFactor.d.ts +8 -21
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.d.ts +14 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRevocation.d.ts +49 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.d.ts +4 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSourceContributionPreparationPlanner.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.d.ts +2 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.d.ts +8 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.d.ts +3 -5
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/installedEcdsaAuthority.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoCapabilityPersistence.d.ts +1 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.d.ts +33 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +13 -3
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.d.ts +24 -5
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpEnrollmentStore.d.ts +2 -3
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpGrantStore.d.ts +1 -3
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +3 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +9 -8
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.d.ts +0 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRegistrationEnrollmentFinalizer.d.ts +5 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationAttemptStore.d.ts +1 -3
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationRecords.d.ts +3 -21
- package/dist/types/wallet-server/src/router/cloudflare/d1/identity/d1IdentityRecords.d.ts +0 -23
- package/dist/types/wallet-server/src/router/cloudflare/d1/near/d1NearPublicKeyStore.d.ts +1 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyEnvelopeStore.d.ts +11 -19
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.d.ts +5 -54
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +7 -19
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpRecords.d.ts +4 -3
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpService.d.ts +8 -12
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +5 -8
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.d.ts +10 -22
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +6 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +10 -6
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +15 -22
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetup.d.ts +5 -3
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.d.ts +4 -3
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.d.ts +5 -5
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +3 -5
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneEffectJournalStore.d.ts +0 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.d.ts +0 -16
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +29 -14
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodBoundary.d.ts +15 -12
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodRevocationReplayStore.d.ts +71 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +34 -24
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +44 -26
- package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnRecords.d.ts +3 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnStore.d.ts +8 -19
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleTenantRootLineage.d.ts +2 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +1 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.d.ts +15 -2
- package/dist/types/wallet-server/src/router/cloudflare-adaptor.d.ts +2 -2
- package/dist/types/wallet-server/src/router/domains/ecdsa/routerAbEcdsaStrictRegistration.d.ts +9 -7
- package/dist/types/wallet-server/src/router/domains/ecdsa/thresholdEcdsaRequestValidation.d.ts +4 -4
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoLifecycleDecision.d.ts +46 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +5 -3
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.d.ts +20 -79
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRunner.d.ts +1 -1
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.d.ts +4 -3
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +62 -42
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.d.ts +108 -32
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryActivation.typecheck.d.ts +5 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.d.ts +36 -5
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.d.ts +5 -4
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.d.ts +41 -50
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.d.ts +2 -2
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.d.ts +3 -3
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.d.ts +6 -5
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationTwoPhaseRunner.d.ts +14 -4
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.d.ts +12 -1
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/session/routerAbEd25519YaoWalletSession.d.ts +5 -5
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/session/thresholdEd25519RequestValidation.d.ts +3 -4
- package/dist/types/wallet-server/src/router/domains/emailOtp/emailOtpExportPolicy.d.ts +2 -27
- package/dist/types/wallet-server/src/router/domains/emailOtp/emailOtpRequestValidation.d.ts +1 -2
- package/dist/types/wallet-server/src/router/domains/emailOtp/emailOtpRouteHandlers.d.ts +2 -1
- package/dist/types/wallet-server/src/router/domains/emailOtp/emailOtpSessionRouteHelpers.d.ts +2 -102
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/envelopeRevocationAdmission.d.ts +2 -1
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.d.ts +3 -2
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrievalRoute.d.ts +1 -9
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/registrationCustodyOutcome.d.ts +2 -1
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/verifiedCustodyFactor.d.ts +2 -1
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.d.ts +2 -1
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +2 -28
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletRecoveryFinalization.d.ts +43 -1
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletRecoveryKeyManifest.d.ts +7 -7
- package/dist/types/wallet-server/src/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.d.ts +0 -3
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.d.ts +165 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbEd25519NormalSigningRoute.d.ts +110 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmission.d.ts +360 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmissionCore.d.ts +11 -10
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmissionCore.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbOperationStepUp.d.ts +165 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbPrivateSigningWorker.d.ts +16 -702
- package/dist/types/wallet-server/src/router/domains/signingOperations/walletExecutionAdmission.d.ts +5 -12
- package/dist/types/wallet-server/src/router/domains/syncAccount/syncAccountRequestValidation.d.ts +5 -4
- package/dist/types/wallet-server/src/router/domains/tenantRoot/tenantRootCustodyLineage.d.ts +6 -1
- package/dist/types/wallet-server/src/router/domains/tenantRoot/tenantRootIdentityResolution.d.ts +4 -7
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +2 -1
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +8 -8
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationSetupPayload.d.ts +4 -4
- package/dist/types/wallet-server/src/router/domains/walletUnlock/walletUnlockRequestedCapabilitiesValidation.d.ts +4 -4
- package/dist/types/wallet-server/src/router/domains/walletUnlock/walletUnlockRouteHandlers.d.ts +4 -62
- package/dist/types/wallet-server/src/router/express-adaptor.d.ts +2 -2
- package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +64 -61
- package/dist/types/wallet-server/src/router/framework/http.d.ts +0 -1
- package/dist/types/wallet-server/src/router/framework/ror/normalize.d.ts +2 -2
- package/dist/types/wallet-server/src/router/framework/routeMeteringPolicy.d.ts +3 -2
- package/dist/types/wallet-server/src/router/framework/routerApi.d.ts +1 -1
- package/dist/types/wallet-server/src/router/framework/routerApiRouteSurface.d.ts +3 -3
- package/dist/types/wallet-server/src/router/node/nodeHostedWalletGateway.d.ts +34 -0
- package/dist/types/wallet-server/src/router/node/nodeHostedWalletGatewayCheck.d.ts +21 -0
- package/dist/types/wallet-server/src/router/node/nodeHostedWalletGatewayMain.d.ts +2 -0
- package/dist/types/wallet-server/src/router/node/nodeHttp.d.ts +13 -0
- package/dist/types/wallet-server/src/router/node/nodeSqlite.d.ts +22 -0
- package/dist/types/wallet-server/src/router/node/signerSqlMigrations.d.ts +20 -0
- package/dist/types/wallet-server/src/router/transport/fetch/createFetchRouter.d.ts +1 -3
- package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinking.d.ts +5 -6
- package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.d.ts +2 -2
- package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceManagement.d.ts +14 -16
- package/dist/types/wallet-server/src/router/transport/fetch/routes/normalSigningRouterProxy.d.ts +0 -12
- package/dist/types/wallet-server/src/router/transport/fetch/routes/passkeyCustody.d.ts +1 -1
- package/dist/types/wallet-server/src/router/transport/fetch/routes/sessions.d.ts +2 -1
- package/dist/types/wallet-server/src/router/transport/fetch/routes/syncAccountBootstrap.d.ts +7 -13
- package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +3 -57
- package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEd25519.d.ts +0 -44
- package/dist/types/wallet-server/src/storage/d1Sql.d.ts +7 -0
- package/dist/types/wallet-server/src/storage/syncSqlite.d.ts +28 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/crypto/shamir3PassWasm.d.ts +0 -1
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/idempotencyRecords.d.ts +5 -6
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/transport/shared.d.ts +1 -0
- package/dist/types/wallet-server/src/threshold/statusCodes.d.ts +4 -4
- package/migrations/d1-signer/0036_r150_yao_lifecycle_decisions.sql +22 -0
- package/migrations/d1-signer/0037_r150_wallet_auth_method_revocation_replays.sql +26 -0
- package/migrations/d1-signer/0038_r150_registration_ceremony_cas_guard_seed.sql +8 -0
- package/migrations/d1-signer/0039_r150_revocation_replay_answer_kind.sql +9 -0
- package/package.json +1 -1
- package/dist/esm/core/ThresholdService/ecdsaClientRootProof.js +0 -27
- package/dist/esm/core/ThresholdService/routerAbEcdsaSigningWorkerWasm.js +0 -115
- package/dist/esm/core/ThresholdService/secureRandomId.js +0 -9
- package/dist/esm/core/authService/record.js +0 -8
- package/dist/esm/core/authService/thresholdRuntimePolicy.js +0 -19
- package/dist/esm/core/authService/walletRegistrationPlanning.js +0 -49
- package/dist/esm/core/deviceLinking/index.js +0 -5
- package/dist/esm/core/errors.js +0 -54
- package/dist/esm/core/routerAbSigning/createCloudflareDurableObjectRouterAbSigningRuntimes.js +0 -39
- package/dist/esm/core/signingLanes/WalletKeyStore.js +0 -0
- package/dist/esm/core/signingLanes/index.js +0 -8
- package/dist/esm/router/domains/tenantRoot/tenantRootEcdsaWalletSessionComposition.js +0 -55
- package/dist/esm/router/domains/tenantRoot/tenantRootEd25519WalletSessionComposition.js +0 -56
- package/dist/esm/shared-ts/src/signing-lanes/linkedEcdsaScope.js +0 -1
- package/dist/esm/wasm/router_ab_ecdsa_signing_worker/pkg/router_ab_ecdsa_signing_worker.js +0 -414
- package/dist/types/shared-ts/src/passkey-custody/credentialObservations.d.ts +0 -74
- package/dist/types/shared-ts/src/passkey-custody/kekContext.d.ts +0 -34
- package/dist/types/shared-ts/src/signing-lanes/linkedEcdsaScope.d.ts +0 -62
- package/dist/types/shared-ts/src/signing-lanes/linkedEcdsaScope.typecheck.d.ts +0 -2
- package/dist/types/shared-ts/src/signing-lanes/validation.d.ts +0 -11
- package/dist/types/shared-ts/src/utils/bigint.d.ts +0 -3
- package/dist/types/shared-ts/src/utils/paillier.d.ts +0 -37
- package/dist/types/shared-ts/src/utils/recoveryDomain.d.ts +0 -12
- package/dist/types/shared-ts/src/utils/signerDomain.typecheck.d.ts +0 -2
- package/dist/types/shared-ts/src/wallet-recovery/recoveryKekContext.d.ts +0 -37
- package/dist/types/wallet-server/src/core/ThresholdService/ecdsaClientRootProof.d.ts +0 -12
- package/dist/types/wallet-server/src/core/ThresholdService/routerAbEcdsaSigningWorkerWasm.d.ts +0 -17
- package/dist/types/wallet-server/src/core/ThresholdService/secureRandomId.d.ts +0 -2
- package/dist/types/wallet-server/src/core/authService/record.d.ts +0 -2
- package/dist/types/wallet-server/src/core/authService/thresholdRuntimePolicy.d.ts +0 -4
- package/dist/types/wallet-server/src/core/authService/walletRegistrationPlanning.d.ts +0 -19
- package/dist/types/wallet-server/src/core/deviceLinking/index.d.ts +0 -5
- package/dist/types/wallet-server/src/core/errors.d.ts +0 -10
- package/dist/types/wallet-server/src/core/routerAbSigning/createCloudflareDurableObjectRouterAbSigningRuntimes.d.ts +0 -28
- package/dist/types/wallet-server/src/core/signingLanes/SigningLaneStore.d.ts +0 -15
- package/dist/types/wallet-server/src/core/signingLanes/WalletKeyStore.d.ts +0 -13
- package/dist/types/wallet-server/src/core/signingLanes/index.d.ts +0 -11
- package/dist/types/wallet-server/src/router/domains/tenantRoot/tenantRootEcdsaWalletSessionComposition.d.ts +0 -35
- package/dist/types/wallet-server/src/router/domains/tenantRoot/tenantRootEd25519WalletSessionComposition.d.ts +0 -35
- /package/dist/esm/{core/signingLanes/SigningLaneStore.js → authorization/ecdsaWalletSessionAdmission.js} +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { parseEmailOtpChallengeId, parseOrgId, parseProviderSubject, parseWalletAuthMethodId, parseWalletAuthorityId, parseWalletId, parseWalletRecoveryOperationId, parseWebAuthnCredentialIdB64u, parseWebAuthnRpId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
2
|
import { buildVaultOperationRef, parseAuthFactorId, parseAuthorizationAuditEventId, parseAuthorizationEvidenceId, parseAuthorizationEvidenceSetId, parseAuthorizedOperationId, parseCapabilityId, parseCapabilityOperationId, parseDeviceId, parsePrincipalId, parseTenantId } from "../../../../shared-ts/src/authorization/capabilityKinds.js";
|
|
3
|
-
import { base64UrlDecode
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { base64UrlDecode } from "../../../../shared-ts/src/utils/base64.js";
|
|
4
|
+
import { alphabetizeStringify } from "../../../../shared-ts/src/utils/digests.js";
|
|
5
|
+
import { sha256Utf8DigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
6
6
|
import { buildCapabilityOperationEnvelope, computeCapabilityOperationFingerprintDigest } from "../../../../shared-ts/src/authorization/operationFingerprint.js";
|
|
7
|
-
import "../../../../shared-ts/src/utils/
|
|
7
|
+
import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
|
|
8
|
+
import { isPlainObject, requireTrimmedString } from "../../../../shared-ts/src/utils/validation.js";
|
|
8
9
|
import { buildPasskeyWalletAuthAuthority, walletAuthAuthorityRef } from "../../../../shared-ts/src/utils/walletAuthAuthority.js";
|
|
9
10
|
import { parseSessionOrigin, parseVerifiedOwnerProofId } from "../../../../authorization/domain.js";
|
|
10
11
|
import { buildVerifiedWalletOperationEmailOtpFactorResult, buildVerifiedWalletOperationPasskeyFactorResult } from "../../../../authorization/factorEvidence.js";
|
|
@@ -19,8 +20,8 @@ import { parseRecoveryCodeReservationId } from "../../../../shared-ts/src/wallet
|
|
|
19
20
|
import { computeWalletCustodyAdminChallengeDigest } from "../../../../shared-ts/src/authorization/walletCustodyOperation.js";
|
|
20
21
|
import { parseWalletRecoveryTargetV1 } from "../../../../shared-ts/src/wallet-recovery/walletRecoveryTarget.js";
|
|
21
22
|
import { parseWebAuthnAuthenticationCredential } from "../../../auth/webAuthnCredentialCodecs.js";
|
|
22
|
-
import { EMAIL_OTP_CHANNEL, WALLET_EMAIL_OTP_UNLOCK_OPERATION } from "../../../../shared-ts/src/utils/emailOtpDomain.js";
|
|
23
23
|
import { emailOtpStatusCode, hashEmailOtpOperationBinding } from "../../../domains/emailOtp/emailOtpSessionRouteHelpers.js";
|
|
24
|
+
import { EMAIL_OTP_CHANNEL, WALLET_EMAIL_OTP_UNLOCK_OPERATION } from "../../../../shared-ts/src/utils/emailOtpDomain.js";
|
|
24
25
|
import { parseDerivedWalletRecoveryKeyId } from "../../../../shared-ts/src/wallet-recovery/recoveryKeyId.js";
|
|
25
26
|
import { parseWalletRecoverySetRotationWireV1 } from "../../../../shared-ts/src/wallet-recovery/walletRecoveryEnvelopeSet.js";
|
|
26
27
|
import { parseRecoveryCodeLocatorV1 } from "../../../../shared-ts/src/wallet-recovery/recoveryCodeLocator.js";
|
|
@@ -52,18 +53,14 @@ const EMAIL_OTP_CHALLENGE_ROUTE_ID = "wallet_custody_email_otp_challenge";
|
|
|
52
53
|
const ENVELOPE_OWNERSHIP_UPGRADE_ROUTE_ID = "wallet_custody_envelope_ownership_upgrade";
|
|
53
54
|
const CUSTODY_OPERATION_CAPABILITY_ID = "wallet-custody-admin";
|
|
54
55
|
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
56
|
function requireExactObjectFields(value, fields, label) {
|
|
60
57
|
const keys = Object.keys(value).sort();
|
|
61
58
|
const expected = [...fields].sort();
|
|
62
59
|
if (keys.length !== expected.length || keys.some((key, index) => key !== expected[index])) throw new Error(`${label} contains unsupported fields`);
|
|
63
60
|
}
|
|
64
61
|
function parseCustodyOwnerProof(value) {
|
|
65
|
-
if (!
|
|
66
|
-
const kind =
|
|
62
|
+
if (!isPlainObject(value)) throw new Error("factorProof is required");
|
|
63
|
+
const kind = normalizeOptionalTrimmedString(value.kind);
|
|
67
64
|
if (kind === "passkey") {
|
|
68
65
|
requireExactObjectFields(value, [
|
|
69
66
|
"kind",
|
|
@@ -77,10 +74,10 @@ function parseCustodyOwnerProof(value) {
|
|
|
77
74
|
if (!webauthnAuthentication) throw new Error("factorProof.webauthn_authentication is invalid");
|
|
78
75
|
return {
|
|
79
76
|
kind,
|
|
80
|
-
walletId:
|
|
81
|
-
rpId:
|
|
82
|
-
credentialIdB64u:
|
|
83
|
-
challenge_digest:
|
|
77
|
+
walletId: requireTrimmedString(value.walletId, "factorProof.walletId"),
|
|
78
|
+
rpId: requireTrimmedString(value.rpId, "factorProof.rpId"),
|
|
79
|
+
credentialIdB64u: requireTrimmedString(value.credentialIdB64u, "factorProof.credentialIdB64u"),
|
|
80
|
+
challenge_digest: requireTrimmedString(value.challenge_digest, "factorProof.challenge_digest"),
|
|
84
81
|
webauthn_authentication: webauthnAuthentication
|
|
85
82
|
};
|
|
86
83
|
}
|
|
@@ -94,10 +91,10 @@ function parseCustodyOwnerProof(value) {
|
|
|
94
91
|
], "factorProof");
|
|
95
92
|
return {
|
|
96
93
|
kind,
|
|
97
|
-
provider_subject_id:
|
|
98
|
-
challenge_id:
|
|
99
|
-
otp_code:
|
|
100
|
-
challenge_digest:
|
|
94
|
+
provider_subject_id: requireTrimmedString(value.provider_subject_id, "factorProof.provider_subject_id"),
|
|
95
|
+
challenge_id: requireTrimmedString(value.challenge_id, "factorProof.challenge_id"),
|
|
96
|
+
otp_code: requireTrimmedString(value.otp_code, "factorProof.otp_code"),
|
|
97
|
+
challenge_digest: requireTrimmedString(value.challenge_digest, "factorProof.challenge_digest")
|
|
101
98
|
};
|
|
102
99
|
}
|
|
103
100
|
throw new Error("factorProof.kind must be passkey or email_otp");
|
|
@@ -107,7 +104,7 @@ function parseRequiredAuthorizationValue(parsed) {
|
|
|
107
104
|
return parsed.value;
|
|
108
105
|
}
|
|
109
106
|
async function custodyDigest(domain, value) {
|
|
110
|
-
return
|
|
107
|
+
return sha256Utf8DigestB64u(`${domain}|${alphabetizeStringify(value)}`);
|
|
111
108
|
}
|
|
112
109
|
async function buildWalletCustodyOperation(input) {
|
|
113
110
|
const tenantId = parseRequiredAuthorizationValue(parseTenantId(input.tenantId));
|
|
@@ -147,7 +144,7 @@ async function buildWalletCustodyOperation(input) {
|
|
|
147
144
|
};
|
|
148
145
|
}
|
|
149
146
|
async function authorizeWalletCustodyOperation(input) {
|
|
150
|
-
const requestOrigin =
|
|
147
|
+
const requestOrigin = normalizeOptionalTrimmedString(input.ctx.request.headers.get("origin"));
|
|
151
148
|
if (!requestOrigin) return toCustodyAuthorizationFailure(400, "invalid_origin", "request Origin is required");
|
|
152
149
|
let origin;
|
|
153
150
|
let proof;
|
|
@@ -322,16 +319,24 @@ async function authorizeWalletCustodyOperation(input) {
|
|
|
322
319
|
function toCustodyAuthorizationFailure(status, code, message) {
|
|
323
320
|
return {
|
|
324
321
|
ok: false,
|
|
325
|
-
response:
|
|
326
|
-
status,
|
|
327
|
-
body: {
|
|
328
|
-
ok: false,
|
|
329
|
-
code,
|
|
330
|
-
message
|
|
331
|
-
}
|
|
332
|
-
})
|
|
322
|
+
response: routeErrorResponse(status, code, message)
|
|
333
323
|
};
|
|
334
324
|
}
|
|
325
|
+
function routeErrorResponse(status, code, message) {
|
|
326
|
+
return toFetchRouteResponse({
|
|
327
|
+
status,
|
|
328
|
+
body: {
|
|
329
|
+
ok: false,
|
|
330
|
+
code,
|
|
331
|
+
message
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
function matchRoute(ctx, routeId) {
|
|
336
|
+
const route = findRouteDefinitionById(ctx.routeDefinitions, routeId);
|
|
337
|
+
if (!route) throw new Error(`Missing route definition for ${routeId}`);
|
|
338
|
+
return matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname) ? route : null;
|
|
339
|
+
}
|
|
335
340
|
async function completeWalletCustodyOperation(ctx, operation, status, body, result = "succeeded") {
|
|
336
341
|
const bodyText = JSON.stringify(body);
|
|
337
342
|
await ctx.service.authorizedOperations.completeAuthorizedOperation({
|
|
@@ -350,22 +355,13 @@ async function completeWalletCustodyOperation(ctx, operation, status, body, resu
|
|
|
350
355
|
});
|
|
351
356
|
}
|
|
352
357
|
async function handlePasskeyCustody(ctx) {
|
|
353
|
-
|
|
354
|
-
if (!route) throw new Error(`Missing route definition for ${ROUTE_ID}`);
|
|
355
|
-
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
358
|
+
if (!matchRoute(ctx, ROUTE_ID)) return null;
|
|
356
359
|
const request = parseWireRequest(await readJsonObject(ctx.request), ctx.request.headers.get("origin"));
|
|
357
|
-
if (!request) return
|
|
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
|
-
});
|
|
360
|
+
if (!request) return routeErrorResponse(400, "invalid_request", "custody retrieval needs a locator, a challenge id, and an assertion");
|
|
365
361
|
return toFetchRouteResponse(await ctx.service.passkeyCustody.retrieveEnvelope(request));
|
|
366
362
|
}
|
|
367
363
|
function parseWalletCustodyEmailOtpChallengeRequest(value, actualOrigin) {
|
|
368
|
-
if (!
|
|
364
|
+
if (!isPlainObject(value)) throw new Error("Email OTP custody challenge body must be an object");
|
|
369
365
|
const keys = Object.keys(value).sort();
|
|
370
366
|
const expected = [
|
|
371
367
|
"operation",
|
|
@@ -386,7 +382,7 @@ function parseWalletCustodyEmailOtpChallengeRequest(value, actualOrigin) {
|
|
|
386
382
|
const providerSubjectId = parseRequiredAuthorizationValue(parseProviderSubject(value.providerSubjectId));
|
|
387
383
|
const operation = value.operation;
|
|
388
384
|
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 (!
|
|
385
|
+
if (!isPlainObject(value.payload)) throw new Error("Email OTP custody challenge payload is invalid");
|
|
390
386
|
if (value.requestOrigin !== void 0 && value.requestOrigin !== actualOrigin) throw new Error("Email OTP custody challenge requestOrigin does not match Origin");
|
|
391
387
|
return {
|
|
392
388
|
walletId,
|
|
@@ -398,36 +394,20 @@ function parseWalletCustodyEmailOtpChallengeRequest(value, actualOrigin) {
|
|
|
398
394
|
}
|
|
399
395
|
/** Issues one operation-bound Email OTP challenge without exposing authority metadata. */
|
|
400
396
|
async function handleWalletCustodyEmailOtpChallenge(ctx) {
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
404
|
-
const originHeader = trimmed(ctx.request.headers.get("origin"));
|
|
397
|
+
if (!matchRoute(ctx, EMAIL_OTP_CHALLENGE_ROUTE_ID)) return null;
|
|
398
|
+
const originHeader = normalizeOptionalTrimmedString(ctx.request.headers.get("origin"));
|
|
405
399
|
let request;
|
|
406
400
|
try {
|
|
407
401
|
const origin = parseSessionOrigin(originHeader);
|
|
408
402
|
request = parseWalletCustodyEmailOtpChallengeRequest(await readJson(ctx.request), origin);
|
|
409
403
|
} catch (error) {
|
|
410
|
-
return
|
|
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
|
-
});
|
|
404
|
+
return routeErrorResponse(400, "invalid_request", error instanceof Error ? error.message : "Email OTP custody challenge is invalid");
|
|
418
405
|
}
|
|
419
406
|
const active = await ctx.service.walletAuthMethods.resolveActiveEmailOtpAuthorityForVerifiedSubject({
|
|
420
407
|
walletId: request.walletId,
|
|
421
408
|
providerUserId: request.providerSubjectId
|
|
422
409
|
});
|
|
423
|
-
if (!active.ok) return
|
|
424
|
-
status: 403,
|
|
425
|
-
body: {
|
|
426
|
-
ok: false,
|
|
427
|
-
code: active.code,
|
|
428
|
-
message: active.message
|
|
429
|
-
}
|
|
430
|
-
});
|
|
410
|
+
if (!active.ok) return routeErrorResponse(403, active.code, active.message);
|
|
431
411
|
const authoritativeOrgId = parseRequiredAuthorizationValue(parseOrgId(ctx.service.authorizedOperations.tenantId));
|
|
432
412
|
const challengeDigest = await computeWalletCustodyAdminChallengeDigest(request);
|
|
433
413
|
const ownerProofBindingDigest = await hashEmailOtpOperationBinding({
|
|
@@ -472,18 +452,10 @@ async function handleWalletCustodyEmailOtpChallenge(ctx) {
|
|
|
472
452
|
}
|
|
473
453
|
/** Lists public passkey envelope identities with their sibling activity rows. */
|
|
474
454
|
async function handleWalletCustodyCredentialsList(ctx) {
|
|
475
|
-
const route =
|
|
476
|
-
if (!route)
|
|
477
|
-
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
455
|
+
const route = matchRoute(ctx, CREDENTIALS_LIST_ROUTE_ID);
|
|
456
|
+
if (!route) return null;
|
|
478
457
|
const walletId = walletIdFromPath(route.path, ctx.pathname);
|
|
479
|
-
if (!walletId) return
|
|
480
|
-
status: 400,
|
|
481
|
-
body: {
|
|
482
|
-
ok: false,
|
|
483
|
-
code: "invalid_request",
|
|
484
|
-
message: "credential list needs a wallet"
|
|
485
|
-
}
|
|
486
|
-
});
|
|
458
|
+
if (!walletId) return routeErrorResponse(400, "invalid_request", "credential list needs a wallet");
|
|
487
459
|
const body = await readJsonObject(ctx.request);
|
|
488
460
|
const authorized = await authorizeWalletCustodyOperation({
|
|
489
461
|
ctx,
|
|
@@ -494,14 +466,7 @@ async function handleWalletCustodyCredentialsList(ctx) {
|
|
|
494
466
|
});
|
|
495
467
|
if (!authorized.ok) return authorized.response;
|
|
496
468
|
const parsedWalletId = parseWalletId(walletId);
|
|
497
|
-
if (!parsedWalletId.ok) return
|
|
498
|
-
status: 400,
|
|
499
|
-
body: {
|
|
500
|
-
ok: false,
|
|
501
|
-
code: "invalid_request",
|
|
502
|
-
message: "wallet id is invalid"
|
|
503
|
-
}
|
|
504
|
-
});
|
|
469
|
+
if (!parsedWalletId.ok) return routeErrorResponse(400, "invalid_request", "wallet id is invalid");
|
|
505
470
|
const result = await ctx.service.passkeyCustody.listWalletCredentials({ walletId: parsedWalletId.value });
|
|
506
471
|
return await completeWalletCustodyOperation(ctx, authorized.operation, 200, {
|
|
507
472
|
ok: true,
|
|
@@ -509,61 +474,32 @@ async function handleWalletCustodyCredentialsList(ctx) {
|
|
|
509
474
|
});
|
|
510
475
|
}
|
|
511
476
|
/**
|
|
512
|
-
*
|
|
477
|
+
* Binds an unbound custody envelope to the method that opened it.
|
|
513
478
|
*
|
|
514
479
|
* The exact operation credential names the auth method that opened the
|
|
515
480
|
* envelope. Unlock already proved that method, so finishing the ownership
|
|
516
481
|
* upgrade requires no second user assertion.
|
|
517
482
|
*/
|
|
518
483
|
async function handleWalletCustodyEnvelopeOwnershipUpgrade(ctx) {
|
|
519
|
-
const route =
|
|
520
|
-
if (!route)
|
|
521
|
-
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
484
|
+
const route = matchRoute(ctx, ENVELOPE_OWNERSHIP_UPGRADE_ROUTE_ID);
|
|
485
|
+
if (!route) return null;
|
|
522
486
|
const parsedWalletId = parseWalletId(walletIdFromPath(route.path, ctx.pathname));
|
|
523
|
-
if (!parsedWalletId.ok) return
|
|
524
|
-
status: 400,
|
|
525
|
-
body: {
|
|
526
|
-
ok: false,
|
|
527
|
-
code: "invalid_request",
|
|
528
|
-
message: "wallet id is invalid"
|
|
529
|
-
}
|
|
530
|
-
});
|
|
487
|
+
if (!parsedWalletId.ok) return routeErrorResponse(400, "invalid_request", "wallet id is invalid");
|
|
531
488
|
const token = extractBearerCredential(ctx.request.headers);
|
|
532
|
-
if (!token) return
|
|
533
|
-
status: 401,
|
|
534
|
-
body: {
|
|
535
|
-
ok: false,
|
|
536
|
-
code: "unauthorized",
|
|
537
|
-
message: "No valid Wallet Session"
|
|
538
|
-
}
|
|
539
|
-
});
|
|
489
|
+
if (!token) return routeErrorResponse(401, "unauthorized", "No valid Wallet Session");
|
|
540
490
|
const exact = await ctx.service.authorizationSessions.readWalletSessionAuthorizationV2ByOperationCredential({
|
|
541
491
|
tenantId: ctx.service.authorizationSessions.tenantId,
|
|
542
492
|
token,
|
|
543
493
|
nowMs: Date.now()
|
|
544
494
|
});
|
|
545
|
-
if (!exact || String(exact.authorization.session.walletId) !== String(parsedWalletId.value)) return
|
|
546
|
-
status: 401,
|
|
547
|
-
body: {
|
|
548
|
-
ok: false,
|
|
549
|
-
code: "unauthorized",
|
|
550
|
-
message: "No valid Wallet Session"
|
|
551
|
-
}
|
|
552
|
-
});
|
|
495
|
+
if (!exact || String(exact.authorization.session.walletId) !== String(parsedWalletId.value)) return routeErrorResponse(401, "unauthorized", "No valid Wallet Session");
|
|
553
496
|
const walletAuthMethodId = exact.authMethod.walletAuthMethodId;
|
|
554
497
|
const body = await readJsonObject(ctx.request);
|
|
555
498
|
let envelope;
|
|
556
499
|
try {
|
|
557
500
|
envelope = parsePasskeyCustodyEnvelopeRecord(body?.envelope);
|
|
558
501
|
} catch (error) {
|
|
559
|
-
return
|
|
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
|
-
});
|
|
502
|
+
return routeErrorResponse(400, "invalid_request", error instanceof Error ? error.message : "custody envelope is invalid");
|
|
567
503
|
}
|
|
568
504
|
const result = await ctx.service.passkeyCustody.upgradeEnvelopeOwnership({
|
|
569
505
|
walletId: parsedWalletId.value,
|
|
@@ -586,49 +522,20 @@ async function handleWalletCustodyEnvelopeOwnershipUpgrade(ctx) {
|
|
|
586
522
|
upgraded: false
|
|
587
523
|
}
|
|
588
524
|
});
|
|
589
|
-
case "not_found": return
|
|
590
|
-
|
|
591
|
-
|
|
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
|
-
});
|
|
525
|
+
case "not_found": return routeErrorResponse(404, "not_found", "no custody envelope to upgrade");
|
|
526
|
+
case "conflict": return routeErrorResponse(409, "conflict", result.reason);
|
|
527
|
+
case "refused": return routeErrorResponse(403, "forbidden", result.reason);
|
|
613
528
|
}
|
|
614
529
|
}
|
|
615
530
|
/** Renames one passkey credential; the label is metadata and never AAD. */
|
|
616
531
|
async function handleWalletCustodyCredentialLabel(ctx) {
|
|
617
|
-
const route =
|
|
618
|
-
if (!route)
|
|
619
|
-
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
532
|
+
const route = matchRoute(ctx, CREDENTIAL_LABEL_ROUTE_ID);
|
|
533
|
+
if (!route) return null;
|
|
620
534
|
const walletId = walletIdFromPath(route.path, ctx.pathname);
|
|
621
535
|
const body = await readJsonObject(ctx.request);
|
|
622
|
-
const envelopeId =
|
|
536
|
+
const envelopeId = normalizeOptionalTrimmedString(body?.envelopeId);
|
|
623
537
|
const label = body?.label;
|
|
624
|
-
if (!walletId || !envelopeId || label !== void 0 && typeof label !== "string") return
|
|
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
|
-
});
|
|
538
|
+
if (!walletId || !envelopeId || label !== void 0 && typeof label !== "string") return routeErrorResponse(400, "invalid_request", "credential rename needs a wallet, envelope, and optional label");
|
|
632
539
|
const authorized = await authorizeWalletCustodyOperation({
|
|
633
540
|
ctx,
|
|
634
541
|
walletId,
|
|
@@ -642,14 +549,7 @@ async function handleWalletCustodyCredentialLabel(ctx) {
|
|
|
642
549
|
});
|
|
643
550
|
if (!authorized.ok) return authorized.response;
|
|
644
551
|
const parsedWalletId = parseWalletId(walletId);
|
|
645
|
-
if (!parsedWalletId.ok) return
|
|
646
|
-
status: 400,
|
|
647
|
-
body: {
|
|
648
|
-
ok: false,
|
|
649
|
-
code: "invalid_request",
|
|
650
|
-
message: "wallet id is invalid"
|
|
651
|
-
}
|
|
652
|
-
});
|
|
552
|
+
if (!parsedWalletId.ok) return routeErrorResponse(400, "invalid_request", "wallet id is invalid");
|
|
653
553
|
const result = await ctx.service.passkeyCustody.renameWalletCredential({
|
|
654
554
|
walletId: parsedWalletId.value,
|
|
655
555
|
envelopeId,
|
|
@@ -691,9 +591,7 @@ async function handleWalletCustodyCredentialLabel(ctx) {
|
|
|
691
591
|
* this must not helpfully re-separate them on the way out.
|
|
692
592
|
*/
|
|
693
593
|
async function handleWalletRecoveryPrepare(ctx) {
|
|
694
|
-
|
|
695
|
-
if (!route) throw new Error(`Missing route definition for ${RECOVERY_PREPARE_ROUTE_ID}`);
|
|
696
|
-
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
594
|
+
if (!matchRoute(ctx, RECOVERY_PREPARE_ROUTE_ID)) return null;
|
|
697
595
|
const body = await readJsonObject(ctx.request);
|
|
698
596
|
let parsed;
|
|
699
597
|
try {
|
|
@@ -704,7 +602,7 @@ async function handleWalletRecoveryPrepare(ctx) {
|
|
|
704
602
|
"reservationId"
|
|
705
603
|
], "wallet recovery preparation");
|
|
706
604
|
const target = parseWalletRecoveryTargetV1(body.target);
|
|
707
|
-
const recoveryCodeB64u =
|
|
605
|
+
const recoveryCodeB64u = requireTrimmedString(body.recoveryCodeB64u, "recoveryCodeB64u");
|
|
708
606
|
if (!/^[A-Za-z0-9_-]+$/.test(recoveryCodeB64u)) throw new Error("wallet recovery preparation is invalid");
|
|
709
607
|
parsed = {
|
|
710
608
|
target,
|
|
@@ -712,24 +610,10 @@ async function handleWalletRecoveryPrepare(ctx) {
|
|
|
712
610
|
reservationId: parseRecoveryCodeReservationId(body.reservationId)
|
|
713
611
|
};
|
|
714
612
|
} catch {
|
|
715
|
-
return
|
|
716
|
-
status: 400,
|
|
717
|
-
body: {
|
|
718
|
-
ok: false,
|
|
719
|
-
code: "invalid_request",
|
|
720
|
-
message: "wallet recovery preparation is invalid"
|
|
721
|
-
}
|
|
722
|
-
});
|
|
613
|
+
return routeErrorResponse(400, "invalid_request", "wallet recovery preparation is invalid");
|
|
723
614
|
}
|
|
724
|
-
const origin =
|
|
725
|
-
if (!origin || parsed.target.kind === "passkey" && !isHostWithinRpId(originHostnameOrEmpty(origin), parsed.target.rpId)) return
|
|
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
|
-
});
|
|
615
|
+
const origin = normalizeOptionalTrimmedString(ctx.request.headers.get("origin"));
|
|
616
|
+
if (!origin || parsed.target.kind === "passkey" && !isHostWithinRpId(originHostnameOrEmpty(origin), parsed.target.rpId)) return routeErrorResponse(400, "invalid_origin", "wallet recovery origin does not match the relying party");
|
|
733
617
|
let recoveryCodeBytes;
|
|
734
618
|
try {
|
|
735
619
|
recoveryCodeBytes = base64UrlDecode(parsed.recoveryCodeB64u);
|
|
@@ -764,57 +648,27 @@ async function handleWalletRecoveryPrepare(ctx) {
|
|
|
764
648
|
storeVersion: result.storeVersion
|
|
765
649
|
}
|
|
766
650
|
});
|
|
767
|
-
case "conflict": return
|
|
768
|
-
status: 409,
|
|
769
|
-
body: {
|
|
770
|
-
ok: false,
|
|
771
|
-
code: "recovery_set_conflict",
|
|
772
|
-
message: "the recovery set changed during this attempt"
|
|
773
|
-
}
|
|
774
|
-
});
|
|
651
|
+
case "conflict": return routeErrorResponse(409, "recovery_set_conflict", "the recovery set changed during this attempt");
|
|
775
652
|
case "refused": return toFetchRouteResponse(refusedSpend());
|
|
776
653
|
case "reserved":
|
|
777
|
-
case "consumed": return
|
|
778
|
-
status: 401,
|
|
779
|
-
body: {
|
|
780
|
-
ok: false,
|
|
781
|
-
code: "recovery_code_used",
|
|
782
|
-
message: "that recovery code has already been used"
|
|
783
|
-
}
|
|
784
|
-
});
|
|
654
|
+
case "consumed": return routeErrorResponse(401, "recovery_code_used", "that recovery code has already been used");
|
|
785
655
|
case "manifest_unavailable":
|
|
786
|
-
case "registration_unavailable": return
|
|
787
|
-
status: 409,
|
|
788
|
-
body: {
|
|
789
|
-
ok: false,
|
|
790
|
-
code: "recovery_preparation_conflict",
|
|
791
|
-
message: "wallet recovery could not be prepared"
|
|
792
|
-
}
|
|
793
|
-
});
|
|
656
|
+
case "registration_unavailable": return routeErrorResponse(409, "recovery_preparation_conflict", "wallet recovery could not be prepared");
|
|
794
657
|
}
|
|
795
658
|
} finally {
|
|
796
659
|
recoveryCodeBytes.fill(0);
|
|
797
660
|
}
|
|
798
661
|
}
|
|
799
662
|
async function handleWalletRecoveryGoogleVerify(ctx) {
|
|
800
|
-
|
|
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;
|
|
663
|
+
if (!matchRoute(ctx, RECOVERY_GOOGLE_VERIFY_ROUTE_ID)) return null;
|
|
803
664
|
let request;
|
|
804
665
|
try {
|
|
805
666
|
request = parseWalletRecoveryGoogleVerifyRequest(await readJsonObject(ctx.request));
|
|
806
667
|
} catch {
|
|
807
668
|
return walletRecoveryRequestError();
|
|
808
669
|
}
|
|
809
|
-
const requestOrigin =
|
|
810
|
-
if (!requestOrigin) return
|
|
811
|
-
status: 400,
|
|
812
|
-
body: {
|
|
813
|
-
ok: false,
|
|
814
|
-
code: "invalid_origin",
|
|
815
|
-
message: "wallet recovery origin is required"
|
|
816
|
-
}
|
|
817
|
-
});
|
|
670
|
+
const requestOrigin = normalizeOptionalTrimmedString(ctx.request.headers.get("origin"));
|
|
671
|
+
if (!requestOrigin) return routeErrorResponse(400, "invalid_origin", "wallet recovery origin is required");
|
|
818
672
|
try {
|
|
819
673
|
const result = await ctx.service.passkeyCustody.verifyGoogleRecovery({
|
|
820
674
|
recoveryOperationId: request.recoveryOperationId,
|
|
@@ -840,9 +694,7 @@ async function handleWalletRecoveryGoogleVerify(ctx) {
|
|
|
840
694
|
}
|
|
841
695
|
}
|
|
842
696
|
async function handleWalletRecoveryEmailOtpVerify(ctx) {
|
|
843
|
-
|
|
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;
|
|
697
|
+
if (!matchRoute(ctx, RECOVERY_EMAIL_OTP_VERIFY_ROUTE_ID)) return null;
|
|
846
698
|
let request;
|
|
847
699
|
try {
|
|
848
700
|
request = parseWalletRecoveryEmailOtpVerifyRequest(await readJsonObject(ctx.request));
|
|
@@ -872,9 +724,7 @@ async function handleWalletRecoveryEmailOtpVerify(ctx) {
|
|
|
872
724
|
}
|
|
873
725
|
}
|
|
874
726
|
async function handleWalletRecoveryEmailOtpRelease(ctx) {
|
|
875
|
-
|
|
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;
|
|
727
|
+
if (!matchRoute(ctx, RECOVERY_EMAIL_OTP_RELEASE_ROUTE_ID)) return null;
|
|
878
728
|
let request;
|
|
879
729
|
try {
|
|
880
730
|
request = parseWalletRecoveryEmailOtpReleaseRequest(await readJsonObject(ctx.request));
|
|
@@ -931,9 +781,7 @@ async function handleWalletRecoveryEmailOtpRelease(ctx) {
|
|
|
931
781
|
* server-side; the body can add only a new-enrollment material bundle.
|
|
932
782
|
*/
|
|
933
783
|
async function handleWalletRecoveryGoogleEmailOtpFinalize(ctx) {
|
|
934
|
-
|
|
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;
|
|
784
|
+
if (!matchRoute(ctx, RECOVERY_GOOGLE_EMAIL_OTP_FINALIZE_ROUTE_ID)) return null;
|
|
937
785
|
let request;
|
|
938
786
|
try {
|
|
939
787
|
request = parseWalletRecoveryGoogleEmailOtpFinalizeRequest(await readJson(ctx.request));
|
|
@@ -941,43 +789,9 @@ async function handleWalletRecoveryGoogleEmailOtpFinalize(ctx) {
|
|
|
941
789
|
return walletRecoveryRequestError();
|
|
942
790
|
}
|
|
943
791
|
const finalizer = ctx.service.passkeyCustody.finalizeGoogleEmailOtpRecovery;
|
|
944
|
-
if (!finalizer) return
|
|
945
|
-
status: 503,
|
|
946
|
-
body: {
|
|
947
|
-
ok: false,
|
|
948
|
-
code: "not_configured",
|
|
949
|
-
message: "Google Email OTP recovery is not configured"
|
|
950
|
-
}
|
|
951
|
-
});
|
|
792
|
+
if (!finalizer) return routeErrorResponse(503, "not_configured", "Google Email OTP recovery is not configured");
|
|
952
793
|
try {
|
|
953
|
-
|
|
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
|
-
}
|
|
794
|
+
return walletRecoveryFinalizationResponse(await finalizer(request));
|
|
981
795
|
} catch {
|
|
982
796
|
return walletRecoveryInternalError();
|
|
983
797
|
}
|
|
@@ -997,7 +811,7 @@ function parseWalletRecoveryGoogleVerifyRequest(body) {
|
|
|
997
811
|
"reservationId",
|
|
998
812
|
"idToken"
|
|
999
813
|
], "wallet recovery Google verification"),
|
|
1000
|
-
idToken:
|
|
814
|
+
idToken: requireTrimmedString(body?.idToken, "idToken")
|
|
1001
815
|
};
|
|
1002
816
|
}
|
|
1003
817
|
function parseWalletRecoveryEmailOtpVerifyRequest(body) {
|
|
@@ -1009,7 +823,7 @@ function parseWalletRecoveryEmailOtpVerifyRequest(body) {
|
|
|
1009
823
|
"otpCode"
|
|
1010
824
|
], "wallet recovery Email OTP verification"),
|
|
1011
825
|
challengeId: parseRequiredAuthorizationValue(parseEmailOtpChallengeId(body?.challengeId)),
|
|
1012
|
-
otpCode:
|
|
826
|
+
otpCode: requireTrimmedString(body?.otpCode, "otpCode")
|
|
1013
827
|
};
|
|
1014
828
|
}
|
|
1015
829
|
function parseWalletRecoveryEmailOtpReleaseRequest(body) {
|
|
@@ -1019,11 +833,11 @@ function parseWalletRecoveryEmailOtpReleaseRequest(body) {
|
|
|
1019
833
|
"reservationId",
|
|
1020
834
|
"workerEphemeralPublicKey65B64u"
|
|
1021
835
|
], "wallet recovery Email OTP factor release"),
|
|
1022
|
-
workerEphemeralPublicKey65B64u:
|
|
836
|
+
workerEphemeralPublicKey65B64u: requireTrimmedString(body?.workerEphemeralPublicKey65B64u, "workerEphemeralPublicKey65B64u")
|
|
1023
837
|
};
|
|
1024
838
|
}
|
|
1025
839
|
function parseWalletRecoveryGoogleEmailOtpFinalizeRequest(value) {
|
|
1026
|
-
if (!
|
|
840
|
+
if (!isPlainObject(value)) throw new Error("wallet recovery Google Email OTP finalization body must be an object");
|
|
1027
841
|
const recoveryOperationId = parseWalletRecoveryOperationId(value.recoveryOperationId);
|
|
1028
842
|
if (!recoveryOperationId.ok) throw new Error("wallet recovery Google Email OTP finalization operation is invalid");
|
|
1029
843
|
const reservationId = parseRecoveryCodeReservationId(value.reservationId);
|
|
@@ -1062,9 +876,9 @@ function parseWalletRecoveryGoogleEmailOtpFinalizeRequest(value) {
|
|
|
1062
876
|
};
|
|
1063
877
|
}
|
|
1064
878
|
function parseWalletRecoveryGoogleEmailOtpCreateEnrollment(value) {
|
|
1065
|
-
if (!
|
|
879
|
+
if (!isPlainObject(value)) throw new Error("new recovery Email enrollment is invalid");
|
|
1066
880
|
requireExactObjectFields(value, ["kind", "material"], "new recovery Email enrollment");
|
|
1067
|
-
if (value.kind !== "create" || !
|
|
881
|
+
if (value.kind !== "create" || !isPlainObject(value.material)) throw new Error("new recovery Email enrollment is invalid");
|
|
1068
882
|
const material = value.material;
|
|
1069
883
|
requireExactObjectFields(material, [
|
|
1070
884
|
"enrollmentSealKeyVersion",
|
|
@@ -1075,42 +889,37 @@ function parseWalletRecoveryGoogleEmailOtpCreateEnrollment(value) {
|
|
|
1075
889
|
return {
|
|
1076
890
|
kind: "create",
|
|
1077
891
|
material: {
|
|
1078
|
-
enrollmentSealKeyVersion:
|
|
1079
|
-
clientUnlockPublicKeyB64u:
|
|
1080
|
-
unlockKeyVersion:
|
|
1081
|
-
serverSealedFactorCiphertextB64u:
|
|
892
|
+
enrollmentSealKeyVersion: requireTrimmedString(material.enrollmentSealKeyVersion, "enrollmentSealKeyVersion"),
|
|
893
|
+
clientUnlockPublicKeyB64u: requireTrimmedString(material.clientUnlockPublicKeyB64u, "clientUnlockPublicKeyB64u"),
|
|
894
|
+
unlockKeyVersion: requireTrimmedString(material.unlockKeyVersion, "unlockKeyVersion"),
|
|
895
|
+
serverSealedFactorCiphertextB64u: requireTrimmedString(material.serverSealedFactorCiphertextB64u, "serverSealedFactorCiphertextB64u")
|
|
1082
896
|
}
|
|
1083
897
|
};
|
|
1084
898
|
}
|
|
899
|
+
function walletRecoveryFinalizationResponse(result) {
|
|
900
|
+
switch (result.kind) {
|
|
901
|
+
case "promoted": return toFetchRouteResponse({
|
|
902
|
+
status: 200,
|
|
903
|
+
body: {
|
|
904
|
+
ok: true,
|
|
905
|
+
projection: result.projection
|
|
906
|
+
}
|
|
907
|
+
});
|
|
908
|
+
case "conflict": return routeErrorResponse(409, "recovery_conflict", "wallet recovery conflicted");
|
|
909
|
+
case "refused":
|
|
910
|
+
case "envelope_rejected":
|
|
911
|
+
case "registration_rejected":
|
|
912
|
+
case "enrollment_rejected": return routeErrorResponse(400, "recovery_rejected", "wallet recovery was rejected");
|
|
913
|
+
}
|
|
914
|
+
}
|
|
1085
915
|
function walletRecoveryRequestError() {
|
|
1086
|
-
return
|
|
1087
|
-
status: 400,
|
|
1088
|
-
body: {
|
|
1089
|
-
ok: false,
|
|
1090
|
-
code: "invalid_body",
|
|
1091
|
-
message: "wallet recovery request is invalid"
|
|
1092
|
-
}
|
|
1093
|
-
});
|
|
916
|
+
return routeErrorResponse(400, "invalid_body", "wallet recovery request is invalid");
|
|
1094
917
|
}
|
|
1095
918
|
function walletRecoveryInternalError() {
|
|
1096
|
-
return
|
|
1097
|
-
status: 500,
|
|
1098
|
-
body: {
|
|
1099
|
-
ok: false,
|
|
1100
|
-
code: "internal",
|
|
1101
|
-
message: "wallet recovery could not continue"
|
|
1102
|
-
}
|
|
1103
|
-
});
|
|
919
|
+
return routeErrorResponse(500, "internal", "wallet recovery could not continue");
|
|
1104
920
|
}
|
|
1105
921
|
function walletRecoveryGoogleFailureResponse(result) {
|
|
1106
|
-
return
|
|
1107
|
-
status: walletRecoveryGoogleStatusCode(result.code),
|
|
1108
|
-
body: {
|
|
1109
|
-
ok: false,
|
|
1110
|
-
code: result.code,
|
|
1111
|
-
message: "wallet recovery could not continue"
|
|
1112
|
-
}
|
|
1113
|
-
});
|
|
922
|
+
return routeErrorResponse(walletRecoveryGoogleStatusCode(result.code), result.code, "wallet recovery could not continue");
|
|
1114
923
|
}
|
|
1115
924
|
function walletRecoveryGoogleStatusCode(code) {
|
|
1116
925
|
if (code === "internal") return 500;
|
|
@@ -1132,11 +941,11 @@ function refusedSpend() {
|
|
|
1132
941
|
}
|
|
1133
942
|
function parseWireRequest(body, originHeader) {
|
|
1134
943
|
if (!body || typeof body !== "object") return null;
|
|
1135
|
-
const challengeId =
|
|
944
|
+
const challengeId = normalizeOptionalTrimmedString(body.challengeId);
|
|
1136
945
|
const locator = parseEnvelopeRetrievalLocator(body.locator);
|
|
1137
946
|
const webauthnAuthentication = parseWebAuthnAuthenticationCredential(body.webauthnAuthentication);
|
|
1138
947
|
if (!challengeId || !locator || !webauthnAuthentication) return null;
|
|
1139
|
-
const expectedOrigin =
|
|
948
|
+
const expectedOrigin = normalizeOptionalTrimmedString(originHeader);
|
|
1140
949
|
if (!expectedOrigin) return null;
|
|
1141
950
|
return {
|
|
1142
951
|
challengeId,
|
|
@@ -1146,7 +955,7 @@ function parseWireRequest(body, originHeader) {
|
|
|
1146
955
|
};
|
|
1147
956
|
}
|
|
1148
957
|
function parseEnvelopeRetrievalLocator(value) {
|
|
1149
|
-
if (!
|
|
958
|
+
if (!isPlainObject(value) || !isPlainObject(value.factor)) return null;
|
|
1150
959
|
try {
|
|
1151
960
|
requireExactObjectFields(value, ["walletId", "factor"], "custody locator");
|
|
1152
961
|
requireExactObjectFields(value.factor, [
|
|
@@ -1171,15 +980,9 @@ function parseEnvelopeRetrievalLocator(value) {
|
|
|
1171
980
|
}
|
|
1172
981
|
};
|
|
1173
982
|
}
|
|
1174
|
-
function trimmed(value) {
|
|
1175
|
-
return typeof value === "string" ? value.trim() : "";
|
|
1176
|
-
}
|
|
1177
983
|
async function readJsonObject(request) {
|
|
1178
984
|
const value = await readJson(request);
|
|
1179
|
-
return
|
|
1180
|
-
}
|
|
1181
|
-
function isObject(value) {
|
|
1182
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
985
|
+
return isPlainObject(value) ? value : null;
|
|
1183
986
|
}
|
|
1184
987
|
function parseRecoveryCodeLocatorRecords(values, walletId, recoveryKeyIds) {
|
|
1185
988
|
if (values.length !== recoveryKeyIds.length) throw new Error("recovery code locators do not match the recovery wraps");
|
|
@@ -1206,33 +1009,17 @@ function parseRecoveryCodeLocatorRecords(values, walletId, recoveryKeyIds) {
|
|
|
1206
1009
|
* comes from its signer registry and durable activation receipts.
|
|
1207
1010
|
*/
|
|
1208
1011
|
async function handleWalletRecoveryFinalize(ctx) {
|
|
1209
|
-
|
|
1210
|
-
if (!route) throw new Error(`Missing route definition for ${RECOVERY_FINALIZE_ROUTE_ID}`);
|
|
1211
|
-
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
1012
|
+
if (!matchRoute(ctx, RECOVERY_FINALIZE_ROUTE_ID)) return null;
|
|
1212
1013
|
let requestBody;
|
|
1213
1014
|
try {
|
|
1214
1015
|
requestBody = parseWalletRecoveryFinalizeBody(await readJson(ctx.request));
|
|
1215
1016
|
} catch {
|
|
1216
|
-
return
|
|
1217
|
-
status: 400,
|
|
1218
|
-
body: {
|
|
1219
|
-
ok: false,
|
|
1220
|
-
code: "invalid_request",
|
|
1221
|
-
message: "wallet recovery finalization is invalid"
|
|
1222
|
-
}
|
|
1223
|
-
});
|
|
1017
|
+
return routeErrorResponse(400, "invalid_request", "wallet recovery finalization is invalid");
|
|
1224
1018
|
}
|
|
1225
1019
|
let serviceRequest;
|
|
1226
1020
|
if (requestBody.kind === "finalize") {
|
|
1227
|
-
const expectedOrigin =
|
|
1228
|
-
if (!expectedOrigin) return
|
|
1229
|
-
status: 400,
|
|
1230
|
-
body: {
|
|
1231
|
-
ok: false,
|
|
1232
|
-
code: "invalid_origin",
|
|
1233
|
-
message: "wallet recovery finalization requires the request Origin header"
|
|
1234
|
-
}
|
|
1235
|
-
});
|
|
1021
|
+
const expectedOrigin = normalizeOptionalTrimmedString(ctx.request.headers.get("origin"));
|
|
1022
|
+
if (!expectedOrigin) return routeErrorResponse(400, "invalid_origin", "wallet recovery finalization requires the request Origin header");
|
|
1236
1023
|
serviceRequest = {
|
|
1237
1024
|
kind: "finalize",
|
|
1238
1025
|
walletId: requestBody.walletId,
|
|
@@ -1259,37 +1046,10 @@ async function handleWalletRecoveryFinalize(ctx) {
|
|
|
1259
1046
|
replacementId: requestBody.replacementId,
|
|
1260
1047
|
replacementEnvelope: requestBody.replacementEnvelope
|
|
1261
1048
|
};
|
|
1262
|
-
|
|
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
|
-
}
|
|
1049
|
+
return walletRecoveryFinalizationResponse(await ctx.service.passkeyCustody.finalizeRecovery(serviceRequest));
|
|
1290
1050
|
}
|
|
1291
1051
|
function parseWalletRecoveryFinalizeBody(value) {
|
|
1292
|
-
if (!
|
|
1052
|
+
if (!isPlainObject(value)) throw new Error("wallet recovery finalization body must be an object");
|
|
1293
1053
|
const walletId = parseWalletId(value.walletId);
|
|
1294
1054
|
const recoveryOperationId = parseWalletRecoveryOperationId(value.recoveryOperationId);
|
|
1295
1055
|
const targetDeviceId = parseDeviceId(value.targetDeviceId);
|
|
@@ -1303,7 +1063,7 @@ function parseWalletRecoveryFinalizeBody(value) {
|
|
|
1303
1063
|
targetDeviceId: targetDeviceId.value,
|
|
1304
1064
|
targetAuthorityId: targetAuthorityId.value,
|
|
1305
1065
|
targetWalletAuthMethodId: targetWalletAuthMethodId.value,
|
|
1306
|
-
replacementId:
|
|
1066
|
+
replacementId: requireTrimmedString(value.replacementId, "replacementId"),
|
|
1307
1067
|
replacementEnvelope: parsePasskeyCustodyEnvelopeRecord(value.replacementEnvelope, "walletRecoveryFinalize.replacementEnvelope")
|
|
1308
1068
|
};
|
|
1309
1069
|
if (value.kind === "replay") {
|
|
@@ -1338,11 +1098,11 @@ function parseWalletRecoveryFinalizeBody(value) {
|
|
|
1338
1098
|
"replacementEnvelope",
|
|
1339
1099
|
"ecdsaMaterialPossessionProofs"
|
|
1340
1100
|
], "wallet recovery finalization");
|
|
1341
|
-
if (!
|
|
1101
|
+
if (!isPlainObject(value.webauthnRegistration)) throw new Error("wallet recovery finalization registration is invalid");
|
|
1342
1102
|
return {
|
|
1343
1103
|
kind: "finalize",
|
|
1344
1104
|
...identity,
|
|
1345
|
-
challengeId:
|
|
1105
|
+
challengeId: requireTrimmedString(value.challengeId, "challengeId"),
|
|
1346
1106
|
webauthnRegistration: value.webauthnRegistration,
|
|
1347
1107
|
ecdsaMaterialPossessionProofs: parseEcdsaMaterialPossessionProofs(value.ecdsaMaterialPossessionProofs)
|
|
1348
1108
|
};
|
|
@@ -1351,9 +1111,9 @@ function parseEcdsaMaterialPossessionProofs(value) {
|
|
|
1351
1111
|
if (!Array.isArray(value)) throw new Error("wallet recovery finalization ECDSA proofs must be an array");
|
|
1352
1112
|
const seen = /* @__PURE__ */ new Set();
|
|
1353
1113
|
return value.map((item, index) => {
|
|
1354
|
-
if (!
|
|
1114
|
+
if (!isPlainObject(item)) throw new Error(`wallet recovery finalization ECDSA proof ${index} is invalid`);
|
|
1355
1115
|
requireExactObjectFields(item, ["keySetId", "proof"], `ECDSA proof ${index}`);
|
|
1356
|
-
const keySetId =
|
|
1116
|
+
const keySetId = normalizeOptionalTrimmedString(item.keySetId);
|
|
1357
1117
|
if (!/^evm_family_ecdsa:\S+$/.test(keySetId)) throw new Error(`wallet recovery finalization ECDSA proof ${index} is invalid`);
|
|
1358
1118
|
if (seen.has(keySetId)) throw new Error(`wallet recovery finalization ECDSA proof ${index} is duplicated`);
|
|
1359
1119
|
seen.add(keySetId);
|
|
@@ -1364,48 +1124,25 @@ function parseEcdsaMaterialPossessionProofs(value) {
|
|
|
1364
1124
|
});
|
|
1365
1125
|
}
|
|
1366
1126
|
function authorizedOperationReplay(operation) {
|
|
1367
|
-
if (operation.lifecycle !== "completed") return
|
|
1368
|
-
status: 409,
|
|
1369
|
-
body: {
|
|
1370
|
-
ok: false,
|
|
1371
|
-
code: "recovery_in_progress",
|
|
1372
|
-
message: "wallet recovery is still in progress"
|
|
1373
|
-
}
|
|
1374
|
-
});
|
|
1127
|
+
if (operation.lifecycle !== "completed") return routeErrorResponse(409, "recovery_in_progress", "wallet recovery is still in progress");
|
|
1375
1128
|
return new Response(operation.response.bodyText, {
|
|
1376
1129
|
status: operation.response.status,
|
|
1377
1130
|
headers: { "content-type": operation.response.contentType }
|
|
1378
1131
|
});
|
|
1379
1132
|
}
|
|
1380
1133
|
async function handleWalletRecoveryBackupAcknowledge(ctx) {
|
|
1381
|
-
|
|
1382
|
-
if (!route) throw new Error(`Missing route definition for ${RECOVERY_ACK_ROUTE_ID}`);
|
|
1383
|
-
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
1134
|
+
if (!matchRoute(ctx, RECOVERY_ACK_ROUTE_ID)) return null;
|
|
1384
1135
|
const body = await readJsonObject(ctx.request);
|
|
1385
1136
|
let walletId = "";
|
|
1386
1137
|
try {
|
|
1387
1138
|
if (!body) throw new Error("acknowledgement body is required");
|
|
1388
1139
|
requireExactObjectFields(body, ["walletId"], "recovery backup acknowledgement");
|
|
1389
|
-
walletId =
|
|
1140
|
+
walletId = requireTrimmedString(body.walletId, "walletId");
|
|
1390
1141
|
} catch {
|
|
1391
|
-
return
|
|
1392
|
-
status: 400,
|
|
1393
|
-
body: {
|
|
1394
|
-
ok: false,
|
|
1395
|
-
code: "invalid_request",
|
|
1396
|
-
message: "an acknowledgement needs a wallet"
|
|
1397
|
-
}
|
|
1398
|
-
});
|
|
1142
|
+
return routeErrorResponse(400, "invalid_request", "an acknowledgement needs a wallet");
|
|
1399
1143
|
}
|
|
1400
1144
|
const result = await ctx.service.passkeyCustody.acknowledgeRecoveryBackup({ walletId });
|
|
1401
|
-
if (result.kind === "no_recovery_set") return
|
|
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
|
-
});
|
|
1145
|
+
if (result.kind === "no_recovery_set") return routeErrorResponse(404, "no_recovery_set", "this wallet has no issued recovery codes to acknowledge");
|
|
1409
1146
|
return toFetchRouteResponse({
|
|
1410
1147
|
status: 200,
|
|
1411
1148
|
body: {
|
|
@@ -1424,33 +1161,17 @@ async function handleWalletRecoveryBackupAcknowledge(ctx) {
|
|
|
1424
1161
|
* owner wrote down, and nothing surfaces that until someone counts.
|
|
1425
1162
|
*/
|
|
1426
1163
|
async function handleWalletRecoveryRotate(ctx) {
|
|
1427
|
-
|
|
1428
|
-
if (!route) throw new Error(`Missing route definition for ${RECOVERY_ROTATE_ROUTE_ID}`);
|
|
1429
|
-
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
1164
|
+
if (!matchRoute(ctx, RECOVERY_ROTATE_ROUTE_ID)) return null;
|
|
1430
1165
|
const body = await readJsonObject(ctx.request);
|
|
1431
|
-
const walletId =
|
|
1432
|
-
const expectedStoreVersion =
|
|
1433
|
-
const manifestKekWraps = Array.isArray(body?.manifestKekWraps) ? body.manifestKekWraps.filter(
|
|
1434
|
-
const entries = Array.isArray(body?.entries) ? body.entries.filter(
|
|
1166
|
+
const walletId = normalizeOptionalTrimmedString(body?.walletId);
|
|
1167
|
+
const expectedStoreVersion = normalizeOptionalTrimmedString(body?.expectedStoreVersion);
|
|
1168
|
+
const manifestKekWraps = Array.isArray(body?.manifestKekWraps) ? body.manifestKekWraps.filter(isPlainObject) : [];
|
|
1169
|
+
const entries = Array.isArray(body?.entries) ? body.entries.filter(isPlainObject) : [];
|
|
1435
1170
|
const rawRecoveryCodeLocators = Array.isArray(body?.recoveryCodeLocators) ? body.recoveryCodeLocators : [];
|
|
1436
|
-
const recoveryCodeLocators = rawRecoveryCodeLocators.filter(
|
|
1437
|
-
if (!walletId || !expectedStoreVersion || manifestKekWraps.length === 0 || entries.length !== 1 || recoveryCodeLocators.length !== rawRecoveryCodeLocators.length || recoveryCodeLocators.length !== manifestKekWraps.length) return
|
|
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
|
-
});
|
|
1171
|
+
const recoveryCodeLocators = rawRecoveryCodeLocators.filter(isPlainObject);
|
|
1172
|
+
if (!walletId || !expectedStoreVersion || manifestKekWraps.length === 0 || entries.length !== 1 || recoveryCodeLocators.length !== rawRecoveryCodeLocators.length || recoveryCodeLocators.length !== manifestKekWraps.length) return routeErrorResponse(400, "invalid_request", "a rotation needs a wallet and its complete replacement recovery set");
|
|
1445
1173
|
const parsedWalletId = parseWalletId(walletId);
|
|
1446
|
-
if (!parsedWalletId.ok) return
|
|
1447
|
-
status: 400,
|
|
1448
|
-
body: {
|
|
1449
|
-
ok: false,
|
|
1450
|
-
code: "invalid_request",
|
|
1451
|
-
message: "wallet id is invalid"
|
|
1452
|
-
}
|
|
1453
|
-
});
|
|
1174
|
+
if (!parsedWalletId.ok) return routeErrorResponse(400, "invalid_request", "wallet id is invalid");
|
|
1454
1175
|
let replacement;
|
|
1455
1176
|
let parsedRecoveryCodeLocators;
|
|
1456
1177
|
try {
|
|
@@ -1461,14 +1182,7 @@ async function handleWalletRecoveryRotate(ctx) {
|
|
|
1461
1182
|
}, { expectedWalletId: parsedWalletId.value });
|
|
1462
1183
|
parsedRecoveryCodeLocators = parseRecoveryCodeLocatorRecords(recoveryCodeLocators, parsedWalletId.value, replacement.manifestKekWraps.map((wrap) => wrap.recoveryKeyId));
|
|
1463
1184
|
} catch (error) {
|
|
1464
|
-
return
|
|
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
|
-
});
|
|
1185
|
+
return routeErrorResponse(400, "invalid_request", error instanceof Error ? error.message : "replacement recovery set is invalid");
|
|
1472
1186
|
}
|
|
1473
1187
|
const authorized = await authorizeWalletCustodyOperation({
|
|
1474
1188
|
ctx,
|
|
@@ -1514,19 +1228,10 @@ async function handleWalletRecoveryRotate(ctx) {
|
|
|
1514
1228
|
}
|
|
1515
1229
|
}
|
|
1516
1230
|
async function handleWalletRecoveryRead(ctx) {
|
|
1517
|
-
|
|
1518
|
-
if (!route) throw new Error(`Missing route definition for ${RECOVERY_READ_ROUTE_ID}`);
|
|
1519
|
-
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
1231
|
+
if (!matchRoute(ctx, RECOVERY_READ_ROUTE_ID)) return null;
|
|
1520
1232
|
const body = await readJsonObject(ctx.request);
|
|
1521
|
-
const walletId =
|
|
1522
|
-
if (!walletId) return
|
|
1523
|
-
status: 400,
|
|
1524
|
-
body: {
|
|
1525
|
-
ok: false,
|
|
1526
|
-
code: "invalid_request",
|
|
1527
|
-
message: "a read needs a wallet"
|
|
1528
|
-
}
|
|
1529
|
-
});
|
|
1233
|
+
const walletId = normalizeOptionalTrimmedString(body?.walletId);
|
|
1234
|
+
if (!walletId) return routeErrorResponse(400, "invalid_request", "a read needs a wallet");
|
|
1530
1235
|
const authorized = await authorizeWalletCustodyOperation({
|
|
1531
1236
|
ctx,
|
|
1532
1237
|
walletId,
|
|
@@ -1558,40 +1263,18 @@ async function handleWalletRecoveryRead(ctx) {
|
|
|
1558
1263
|
* useful to someone else.
|
|
1559
1264
|
*/
|
|
1560
1265
|
async function handleWalletRecoveryStatus(ctx) {
|
|
1561
|
-
const route =
|
|
1562
|
-
if (!route)
|
|
1563
|
-
if (!matchesRouteDefinitionRequest(route, ctx.method, ctx.pathname)) return null;
|
|
1266
|
+
const route = matchRoute(ctx, RECOVERY_STATUS_ROUTE_ID);
|
|
1267
|
+
if (!route) return null;
|
|
1564
1268
|
const walletId = walletIdFromPath(route.path, ctx.pathname);
|
|
1565
|
-
if (!walletId) return
|
|
1566
|
-
|
|
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"));
|
|
1269
|
+
if (!walletId) return routeErrorResponse(400, "invalid_request", "status needs a wallet");
|
|
1270
|
+
const origin = normalizeOptionalTrimmedString(ctx.request.headers.get("origin"));
|
|
1574
1271
|
try {
|
|
1575
1272
|
parseSessionOrigin(origin);
|
|
1576
1273
|
} catch {
|
|
1577
|
-
return
|
|
1578
|
-
status: 400,
|
|
1579
|
-
body: {
|
|
1580
|
-
ok: false,
|
|
1581
|
-
code: "invalid_origin",
|
|
1582
|
-
message: "request Origin is invalid"
|
|
1583
|
-
}
|
|
1584
|
-
});
|
|
1274
|
+
return routeErrorResponse(400, "invalid_origin", "request Origin is invalid");
|
|
1585
1275
|
}
|
|
1586
1276
|
const result = await ctx.service.passkeyCustody.readRecoveryStatus({ walletId });
|
|
1587
|
-
if (result.kind === "no_recovery_set") return
|
|
1588
|
-
status: 404,
|
|
1589
|
-
body: {
|
|
1590
|
-
ok: false,
|
|
1591
|
-
code: "no_recovery_set",
|
|
1592
|
-
message: "this wallet has no recovery codes"
|
|
1593
|
-
}
|
|
1594
|
-
});
|
|
1277
|
+
if (result.kind === "no_recovery_set") return routeErrorResponse(404, "no_recovery_set", "this wallet has no recovery codes");
|
|
1595
1278
|
return toFetchRouteResponse({
|
|
1596
1279
|
status: 200,
|
|
1597
1280
|
body: {
|