@seams/wallet-server 0.8.0 → 0.9.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/THIRD_PARTY_NOTICES.md +7 -1
- package/artifact-manifest.json +196 -41
- package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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/0019_wallet_object_addresses.sql +10 -0
- package/cloudflare-router-ab/migrations/deriver-b/0019_wallet_object_addresses.sql +10 -0
- package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +3 -117
- package/cloudflare-router-ab/wrangler.deriver-a.toml +0 -8
- package/cloudflare-router-ab/wrangler.deriver-b.toml +24 -8
- package/cloudflare-router-ab/wrangler.router.toml +0 -2
- package/cloudflare-router-ab/wrangler.signing-worker.toml +29 -0
- package/dist/esm/authorization/domain.js +3 -2
- package/dist/esm/authorization/ed25519WalletSessionAdmission.js +0 -0
- package/dist/esm/authorization/service.js +64 -36
- package/dist/esm/cloud-host.js +24 -19
- package/dist/esm/core/EmailOtpRecords.js +29 -6
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +2 -0
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.js +10 -0
- package/dist/esm/core/ThresholdService/routerAb/internalServiceHttp.js +1 -0
- package/dist/esm/core/ThresholdService/validation.js +2 -2
- package/dist/esm/core/authService/nearPrivateKeySigning.js +1 -1
- package/dist/esm/core/authService/webauthn.js +1 -1
- package/dist/esm/core/d1Ed25519SignerRead.js +55 -0
- package/dist/esm/core/d1WalletStore.js +14 -11
- package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +2 -2
- package/dist/esm/core/deviceLinking/linkedDeviceManagement.js +1 -1
- package/dist/esm/core/deviceLinking/linkedDeviceSessionRecord.js +2 -2
- package/dist/esm/core/emailOtpD1Statements.js +1 -0
- package/dist/esm/core/nearRelayerAccountProvisioning.js +1 -1
- package/dist/esm/core/routerAbSigning/RouterAbEcdsaPresignRuntime.js +4 -0
- package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +1 -1
- package/dist/esm/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.js +1 -0
- package/dist/esm/hosted-wallet-gateway.js +93 -10
- package/dist/esm/localHostedWalletGatewayHandler.js +12 -9
- package/dist/esm/localIntendedYaoSigningFault.js +2 -30
- package/dist/esm/localRegistrationSetupAuthority.js +8 -1
- package/dist/esm/router/auth/commonRouterUtils.js +17 -10
- package/dist/esm/router/auth/routerApiCredentialAuth.js +26 -7
- package/dist/esm/router/auth/walletRegistrationContext.js +49 -0
- package/dist/esm/router/auth/webAuthnCredentialCodecs.js +1 -1
- package/dist/esm/router/cloudflare/d1/auth/d1AuthorizationAssembly.js +4 -3
- package/dist/esm/router/cloudflare/d1/auth/d1AuthorizedOperationRouteService.js +2 -0
- package/dist/esm/router/cloudflare/d1/auth/d1EmailOtpRouteService.js +25 -0
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthConfig.js +14 -6
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +44 -40
- package/dist/esm/router/cloudflare/d1/auth/walletSessionCredentialReaders.js +17 -1
- package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +35 -5
- package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +258 -99
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +31 -4
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.js +1 -1
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.js +11 -2
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js +100 -10
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.js +92 -0
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.js +77 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +14 -8
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +14 -8
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +3 -1
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.js +58 -38
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +27 -20
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +1 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +1 -0
- package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +1 -1
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +18 -7
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +75 -14
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +1 -1
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +49 -29
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.js +28 -0
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSetupSupport.js +11 -1
- package/dist/esm/router/cloudflare/d1/registration/d1WalletExecutionAuthority.js +168 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletOperationStore.js +53 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +83 -42
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.js +33 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.js +16 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationRead.js +58 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +439 -500
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +1 -1
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.js +104 -90
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +78 -44
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +11 -35
- package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +98 -39
- package/dist/esm/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.js +12 -9
- package/dist/esm/router/cloudflare/d1/wallet/authorizationSnapshotLayout.js +168 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.js +1 -1
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +15 -6
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +3 -40
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +54 -1
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.js +157 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.js +56 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.js +238 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.js +287 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.js +295 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.js +140 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.js +170 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.js +60 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwner.js +33 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.js +74 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.js +77 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.js +37 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationSessions.js +97 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.js +133 -0
- package/dist/esm/router/cloudflare/d1/walletObjectAddresses.js +47 -0
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +1 -1
- package/dist/esm/router/cloudflare/runtime/routerAbServiceBindings.js +32 -1
- package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +20 -8
- package/dist/esm/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.js +488 -0
- package/dist/esm/router/cloudflare/runtime/walletConsoleOps.js +1 -1
- package/dist/esm/router/cloudflare/runtime/walletConsoleOpsClient.js +26 -6
- package/dist/esm/router/cloudflare/runtime/walletControlOps.js +3 -0
- package/dist/esm/router/cloudflare/runtime/walletGateway.js +1 -1
- package/dist/esm/router/cloudflare/runtime/walletObjectAddresses.js +105 -0
- package/dist/esm/router/cloudflare/runtime/walletPlacementRoutes.js +339 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationDeriver.js +244 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationEcdsa.js +212 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationEd25519.js +172 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationOps.js +183 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationPresign.js +185 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationSource.js +221 -0
- package/dist/esm/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js +30 -8
- package/dist/esm/router/cloudflare-adaptor.js +8 -8
- package/dist/esm/router/cloudflare.js +34115 -32240
- package/dist/esm/router/domains/ecdsa/routerAbEcdsaStrictRegistration.js +35 -9
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.js +42 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +32 -6
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +61 -1
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js +70 -3
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js +59 -87
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +52 -22
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +10 -7
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js +108 -78
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +19 -5
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js +71 -22
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js +37 -25
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js +3 -3
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.js +2 -1
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +24 -3
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js +4 -3
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js +20 -7
- package/dist/esm/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.js +7 -1
- package/dist/esm/router/domains/emailOtp/emailOtpRouteHandlers.js +2 -2
- package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.js +1 -1
- package/dist/esm/router/domains/passkeyCustody/registrationCustodyOutcome.js +34 -18
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.js +2 -2
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +16 -6
- package/dist/esm/router/domains/signingOperations/authorizedOperationWire.js +73 -0
- package/dist/esm/router/domains/signingOperations/ecdsaSigningResponse.js +31 -0
- package/dist/esm/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.js +1 -1
- package/dist/esm/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.js +2 -1
- package/dist/esm/router/domains/signingOperations/routerAbEd25519NormalSigningRoute.js +31 -121
- package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmission.js +2 -93
- package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +1 -1
- package/dist/esm/router/domains/signingOperations/signingPrepareSession.js +33 -0
- package/dist/esm/router/domains/walletRegistration/registrationSessionSeal.js +121 -0
- package/dist/esm/router/domains/walletRegistration/walletRegistrationReservation.js +4 -4
- package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +46 -157
- package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +1 -1
- package/dist/esm/router/express.js +764 -894
- package/dist/esm/router/framework/http.js +2 -1
- package/dist/esm/router/transport/fetch/createFetchRouter.js +2 -2
- package/dist/esm/router/transport/fetch/routes/auth.js +1 -1
- package/dist/esm/router/transport/fetch/routes/deviceLinking.js +3 -3
- package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +2 -2
- package/dist/esm/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.js +65 -0
- package/dist/esm/router/transport/fetch/routes/normalSigningRouterProxy.js +13 -3
- package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +3 -3
- package/dist/esm/router/transport/fetch/routes/sessions.js +3 -2
- package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +67 -130
- package/dist/esm/router/transport/fetch/routes/thresholdEd25519.js +76 -212
- package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +18 -41
- package/dist/esm/router/transport/fetch/routes/walletRegistration.js +6 -5
- package/dist/esm/router/transport/fetch/routes/webauthnAuthenticators.js +1 -1
- package/dist/esm/shared-ts/src/authorization/index.js +1 -1
- package/dist/esm/shared-ts/src/authorization/walletAuthority.js +2 -2
- package/dist/esm/shared-ts/src/device-linking/activeWalletSession.js +12 -2
- package/dist/esm/shared-ts/src/device-linking/digests.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/index.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/parsers.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/wireFields.js +1 -1
- package/dist/esm/shared-ts/src/near/nearClient.js +1 -1
- package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +2 -2
- package/dist/esm/shared-ts/src/utils/ecdsaServerTiming.js +6 -1
- package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +4 -2
- package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +1 -1
- package/dist/esm/shared-ts/src/utils/routerAbPublicKeyset.js +0 -27
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.js +1 -1
- package/dist/esm/threshold/session/signingSessionSeal/options.js +1 -1
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
- package/dist/types/shared-ts/src/device-linking/activeWalletSession.d.ts +2 -1
- package/dist/types/shared-ts/src/device-linking/contracts.d.ts +10 -0
- package/dist/types/shared-ts/src/threshold/ed25519OperationFingerprint.d.ts +2 -1
- package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +3 -1
- package/dist/types/shared-ts/src/utils/routerAbPublicKeyset.d.ts +0 -9
- package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +1 -1
- package/dist/types/wallet-server/src/authorization/domain.d.ts +17 -1
- package/dist/types/wallet-server/src/authorization/ecdsaWalletSessionAdmission.d.ts +1 -0
- package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.d.ts +35 -0
- package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/service.d.ts +43 -5
- package/dist/types/wallet-server/src/authorization/sessionRouting.d.ts +2 -0
- package/dist/types/wallet-server/src/cloud-host.d.ts +7 -3
- package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +2 -1
- package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +19 -5
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +1 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.d.ts +6 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/internalServiceHttp.d.ts +1 -0
- package/dist/types/wallet-server/src/core/d1Ed25519SignerRead.d.ts +17 -0
- package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +6 -0
- package/dist/types/wallet-server/src/core/emailOtpD1Statements.d.ts +1 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbEcdsaPresignRuntime.d.ts +5 -1
- package/dist/types/wallet-server/src/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.d.ts +1 -0
- package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +14 -48
- package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +4 -3
- package/dist/types/wallet-server/src/localIntendedYaoSigningFault.d.ts +1 -16
- package/dist/types/wallet-server/src/localRegistrationSetupAuthority.d.ts +1 -1
- package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +7 -1
- package/dist/types/wallet-server/src/router/auth/routerApiCredentialAuth.d.ts +11 -3
- package/dist/types/wallet-server/src/router/auth/walletRegistrationContext.d.ts +8 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1AuthorizationAssembly.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1EmailOtpRouteService.d.ts +16 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +7 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +4 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/walletSessionCredentialReaders.d.ts +7 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +32 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.d.ts +3 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.d.ts +1 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.d.ts +8 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.d.ts +15 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.d.ts +6 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +1 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.d.ts +4 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpCounters.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +6 -29
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +21 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +17 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +32 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +16 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSetupSupport.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletExecutionAuthority.d.ts +41 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletOperationStore.d.ts +28 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +6 -9
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.d.ts +17 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationRead.d.ts +43 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +24 -45
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.d.ts +9 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.d.ts +42 -14
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.d.ts +5 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +24 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.d.ts +10 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/authorizationSnapshotLayout.d.ts +21 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +3 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +3 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +8 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.d.ts +29 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.d.ts +31 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.d.ts +49 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.d.ts +47 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.d.ts +25 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwner.d.ts +88 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.d.ts +37 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.d.ts +18 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationSessions.d.ts +23 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.d.ts +16 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/walletObjectAddresses.d.ts +14 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/routerAbServiceBindings.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.d.ts +21 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOpsClient.d.ts +3 -3
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletControlOps.d.ts +2 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +3 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletObjectAddresses.d.ts +45 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletPlacementRoutes.d.ts +30 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationDeriver.d.ts +11 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEcdsa.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEd25519.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationOps.d.ts +11 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationPresign.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationSource.d.ts +26 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.d.ts +5 -0
- package/dist/types/wallet-server/src/router/domains/ecdsa/routerAbEcdsaStrictRegistration.d.ts +3 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.d.ts +7 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +41 -7
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.d.ts +33 -2
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +12 -6
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.d.ts +17 -9
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.d.ts +13 -14
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.d.ts +7 -3
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.d.ts +1 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.d.ts +6 -1
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.d.ts +11 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.d.ts +12 -3
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/registrationCustodyOutcome.d.ts +10 -6
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.d.ts +10 -3
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +12 -5
- package/dist/types/wallet-server/src/router/domains/signingOperations/authorizedOperationWire.d.ts +97 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/ecdsaSigningResponse.d.ts +13 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmission.d.ts +9 -206
- package/dist/types/wallet-server/src/router/domains/signingOperations/signingPrepareSession.d.ts +23 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/registrationSessionSeal.d.ts +36 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +7 -7
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationReservation.d.ts +80 -6
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +15 -5
- package/dist/types/wallet-server/src/router/framework/apiCredentialPorts.d.ts +24 -0
- package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +21 -7
- package/dist/types/wallet-server/src/router/framework/routerApi.d.ts +3 -12
- package/dist/types/wallet-server/src/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.d.ts +37 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +1 -17
- package/dist/types/wallet-server/src/storage/tenantRoute.d.ts +1 -1
- package/migrations/d1-signer/0049_wallet_relocation_challenges.sql +16 -0
- package/migrations/d1-signer/0050_wallet_relocation_approvals.sql +14 -0
- package/migrations/d1-signer/0051_wallet_relocation_email_otp.sql +92 -0
- package/migrations/d1-signer/0052_wallet_relocation_session_fences.sql +91 -0
- package/migrations/d1-signer/0053_wallet_hosted_history_import.sql +164 -0
- package/migrations/d1-signer/0054_wallet_authorization_freeze.sql +318 -0
- package/migrations/d1-signer/0055_wallet_authorization_snapshot.sql +120 -0
- package/migrations/d1-signer/0056_wallet_authorization_history_import.sql +424 -0
- package/migrations/d1-signer/0057_wallet_authorization_intake.sql +44 -0
- package/migrations/d1-signer/0058_wallet_ceremony_activity.sql +59 -0
- package/migrations/d1-signer/0059_wallet_authorization_activation.sql +45 -0
- package/migrations/d1-signer/0060_wallet_authorization_cleanup.sql +153 -0
- package/migrations/d1-signer/0061_wallet_session_operation_settlement.sql +28 -0
- package/migrations/d1-signer/0062_wallet_step_up_operation_settlement.sql +204 -0
- package/migrations/d1-signer/0063_wallet_operation_history_transfer.sql +466 -0
- package/migrations/d1-signer/0064_wallet_execution_generations.sql +93 -0
- package/migrations/d1-signer/0065_wallet_operation_execution_generation.sql +37 -0
- package/migrations/d1-signer/0066_regional_deployment_admission.sql +59 -0
- package/migrations/d1-signer/0067_registration_completion_decision.sql +12 -0
- package/migrations/d1-signer/0068_registration_cancellation_write_fence.sql +24 -0
- package/migrations/d1-signer/0069_cancelled_registration_session_fence.sql +11 -0
- package/migrations/d1-signer/0070_wallet_passkey_relocation.sql +369 -0
- package/migrations/d1-signer/0071_regional_wallet_otp_counters.sql +98 -0
- package/migrations/d1-signer/0072_linked_device_relocation_history.sql +899 -0
- package/migrations/d1-signer/0073_wallet_recovery_relocation.sql +86 -0
- package/migrations/d1-signer/0074_email_otp_relocation.sql +158 -0
- package/migrations/d1-signer/0075_wallet_authorization_return.sql +107 -0
- package/migrations/d1-signer/0076_wallet_relocation_write_block.sql +406 -0
- package/migrations/d1-signer/0077_wallet_object_addresses.sql +24 -0
- package/package.json +1 -1
- package/src/README.md +23 -1
- package/cloudflare-router-ab/scripts/local-key-material.mjs +0 -29
package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { mpcMaterialActivationRefsEqual, parseLinkDeviceSessionId, parseWalletAuthMethodId, parseWalletAuthorityId, parseWalletId, parseWalletKeyId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
2
|
import { parseDeviceId, parsePrincipalId, parseTenantId, parseWalletSessionMintId } from "../../../../shared-ts/src/authorization/capabilityKinds.js";
|
|
3
|
+
import { isPlainObject } from "../../../../shared-ts/src/utils/validation.js";
|
|
4
|
+
import { buildDelegatedWalletAuthorityV1, parseDelegatedWalletPermissionSetV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
|
|
3
5
|
import { base64UrlDecode, base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
|
|
4
6
|
import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
|
|
5
7
|
import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
6
|
-
import { isPlainObject } from "../../../../shared-ts/src/utils/validation.js";
|
|
7
|
-
import { buildDelegatedWalletAuthorityV1, parseDelegatedWalletPermissionSetV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
|
|
8
8
|
import { routerAbMpcMaterialActivationRefFromWire, routerAbMpcMaterialActivationRefToWire } from "../../../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
|
|
9
9
|
import { parseRouterAbEd25519YaoApplicationBindingFactsV1, parseRouterAbEd25519YaoCeremonyBindingV1, sameRouterAbEd25519YaoActivationBindingV1 } from "../../../../shared-ts/src/utils/routerAbEd25519Yao.js";
|
|
10
10
|
import { assertLinkedDeviceOrdinaryMaterialSourceContributionMatchesContextV1, parseLinkedDeviceEcdsaSourceContributionPackageV1, parseLinkedDeviceEcdsaSourceDerivationV1, parseLinkedDeviceOrdinaryMaterialSourceContributionV1 } from "../../../../shared-ts/src/device-linking/sourceContribution.js";
|
|
@@ -25,6 +25,7 @@ import "../../../../core/deviceLinking/requestProof.js";
|
|
|
25
25
|
import { reservePasskeyCredential } from "../../../../core/passkeyCredentialClaims.js";
|
|
26
26
|
import { prepareD1WebAuthnCredentialBindingInsertStatement } from "../../../../core/WebAuthnCredentialBindingStore.js";
|
|
27
27
|
import { prepareD1WebAuthnAuthenticatorInsertStatement } from "../webauthn/d1WebAuthnStore.js";
|
|
28
|
+
import { admitD1EstablishedWalletHome } from "../registration/d1WalletExecutionAuthority.js";
|
|
28
29
|
import { findInstalledEcdsaAuthority, installedEcdsaAuthorityChain, projectInstalledEcdsaAuthority } from "./installedEcdsaAuthority.js";
|
|
29
30
|
import { buildAuthorityActiveSessionRecordV1, buildAuthorityPendingLocalInstallSessionRecordV1 } from "../../../../core/deviceLinking/linkedDeviceSessionRecord.js";
|
|
30
31
|
import { linkedDeviceX25519RecipientPublicKeyB64uV1 } from "./d1LinkedDeviceSourceContributionPreparationPlanner.js";
|
|
@@ -738,6 +739,9 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
|
|
|
738
739
|
}
|
|
739
740
|
async reserveSignerMaterial(input, sourceContributionPreparation) {
|
|
740
741
|
assertRecipientRequestsMatchManifest(input);
|
|
742
|
+
const admitted = await admitD1EstablishedWalletHome(this.options.database, this.options.scope, { walletId: input.walletId });
|
|
743
|
+
if (!admitted.ok) throw new Error(admitted.message);
|
|
744
|
+
const ownershipGeneration = admitted.ownershipGeneration;
|
|
741
745
|
let ed25519;
|
|
742
746
|
let ecdsa;
|
|
743
747
|
let ed25519Preparation;
|
|
@@ -777,6 +781,7 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
|
|
|
777
781
|
assertPreparationActivationMatches(targetMaterialActivation, workerPreparation.sourceContribution.targetMaterialActivation);
|
|
778
782
|
const reservation = await this.options.reservationService.reserveOrdinaryInactiveSignerMaterialV1({
|
|
779
783
|
kind: "ordinary_ed25519_signer_material_reservation_request_v1",
|
|
784
|
+
ownershipGeneration,
|
|
780
785
|
keyFamily: "ed25519",
|
|
781
786
|
signer,
|
|
782
787
|
plannedActivationRef: targetMaterialActivation,
|
|
@@ -792,6 +797,7 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
|
|
|
792
797
|
assertPreparationActivationMatches(targetMaterialActivation, workerPreparation.sourceContribution.binding.target.activation);
|
|
793
798
|
const reservation = await this.options.reservationService.reserveOrdinaryInactiveSignerMaterialV1({
|
|
794
799
|
kind: "ordinary_ecdsa_signer_material_reservation_request_v1",
|
|
800
|
+
ownershipGeneration,
|
|
795
801
|
keyFamily: "ecdsa_secp256k1",
|
|
796
802
|
signer,
|
|
797
803
|
plannedActivationRef: targetMaterialActivation,
|
|
@@ -814,10 +820,12 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
|
|
|
814
820
|
ordinarySignerMaterialPreparations: sourceContributionPreparation,
|
|
815
821
|
serverReservationIds: {
|
|
816
822
|
ed25519: {
|
|
823
|
+
ownershipGeneration,
|
|
817
824
|
reservationId: ed25519.serverMaterial.reservationId,
|
|
818
825
|
preparation: ed25519Preparation
|
|
819
826
|
},
|
|
820
827
|
ecdsa_secp256k1: {
|
|
828
|
+
ownershipGeneration,
|
|
821
829
|
reservationId: ecdsa.serverMaterial.reservationId,
|
|
822
830
|
preparation: ecdsaPreparation
|
|
823
831
|
}
|
|
@@ -834,6 +842,7 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
|
|
|
834
842
|
},
|
|
835
843
|
ordinarySignerMaterialPreparations: sourceContributionPreparation,
|
|
836
844
|
serverReservationIds: { ed25519: {
|
|
845
|
+
ownershipGeneration,
|
|
837
846
|
reservationId: ed25519.serverMaterial.reservationId,
|
|
838
847
|
preparation: ed25519Preparation
|
|
839
848
|
} }
|
|
@@ -849,6 +858,7 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
|
|
|
849
858
|
},
|
|
850
859
|
ordinarySignerMaterialPreparations: sourceContributionPreparation,
|
|
851
860
|
serverReservationIds: { ecdsa_secp256k1: {
|
|
861
|
+
ownershipGeneration,
|
|
852
862
|
reservationId: ecdsa.serverMaterial.reservationId,
|
|
853
863
|
preparation: ecdsaPreparation
|
|
854
864
|
} }
|
|
@@ -862,6 +872,7 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
|
|
|
862
872
|
const reservation = stored.serverReservationIds.ed25519;
|
|
863
873
|
if (!reservation || !packageValue) throw new Error("server reservation for ed25519 is missing");
|
|
864
874
|
await activation.activateOrdinaryInactiveSignerMaterialV1({
|
|
875
|
+
ownershipGeneration: reservation.ownershipGeneration,
|
|
865
876
|
keyFamily: "ed25519",
|
|
866
877
|
reservationId: reservation.reservationId,
|
|
867
878
|
materialActivation: packageValue.materialActivation,
|
|
@@ -877,6 +888,7 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
|
|
|
877
888
|
const reservation = stored.serverReservationIds.ecdsa_secp256k1;
|
|
878
889
|
if (!reservation || !packageValue) throw new Error("server reservation for ECDSA is missing");
|
|
879
890
|
await activation.activateOrdinaryInactiveSignerMaterialV1({
|
|
891
|
+
ownershipGeneration: reservation.ownershipGeneration,
|
|
880
892
|
keyFamily: "ecdsa_secp256k1",
|
|
881
893
|
reservationId: reservation.reservationId,
|
|
882
894
|
materialActivation: packageValue.materialActivation,
|
|
@@ -1616,7 +1628,11 @@ function parseServerReservationIds(raw) {
|
|
|
1616
1628
|
}
|
|
1617
1629
|
function parseEd25519ServerReservationRecord(raw) {
|
|
1618
1630
|
const record = requireRecord(raw, "Ed25519 server reservation");
|
|
1619
|
-
requireExactKeys(record,
|
|
1631
|
+
requireExactKeys(record, Object.hasOwn(record, "ownershipGeneration") ? [
|
|
1632
|
+
"reservationId",
|
|
1633
|
+
"preparation",
|
|
1634
|
+
"ownershipGeneration"
|
|
1635
|
+
] : ["reservationId", "preparation"], "Ed25519 server reservation");
|
|
1620
1636
|
const preparationRecord = requireRecord(record.preparation, "Ed25519 reservation preparation");
|
|
1621
1637
|
requireExactKeys(preparationRecord, [
|
|
1622
1638
|
"kind",
|
|
@@ -1631,6 +1647,7 @@ function parseEd25519ServerReservationRecord(raw) {
|
|
|
1631
1647
|
const applicationBinding = parseRouterAbEd25519YaoApplicationBindingFactsV1(preparationRecord.applicationBinding);
|
|
1632
1648
|
if (targetBinding.operation !== "registration") throw new Error("Ed25519 target binding must use registration");
|
|
1633
1649
|
return {
|
|
1650
|
+
ownershipGeneration: storedReservationGeneration(record),
|
|
1634
1651
|
reservationId: requireReservationId(record.reservationId, "Ed25519 server reservation id"),
|
|
1635
1652
|
preparation: {
|
|
1636
1653
|
kind: "ordinary_ed25519_signer_material_reservation_preparation_v1",
|
|
@@ -1642,7 +1659,11 @@ function parseEd25519ServerReservationRecord(raw) {
|
|
|
1642
1659
|
}
|
|
1643
1660
|
function parseEcdsaServerReservationRecord(raw) {
|
|
1644
1661
|
const record = requireRecord(raw, "ECDSA server reservation");
|
|
1645
|
-
requireExactKeys(record,
|
|
1662
|
+
requireExactKeys(record, Object.hasOwn(record, "ownershipGeneration") ? [
|
|
1663
|
+
"reservationId",
|
|
1664
|
+
"preparation",
|
|
1665
|
+
"ownershipGeneration"
|
|
1666
|
+
] : ["reservationId", "preparation"], "ECDSA server reservation");
|
|
1646
1667
|
const preparationRecord = requireRecord(record.preparation, "ECDSA reservation preparation");
|
|
1647
1668
|
requireExactKeys(preparationRecord, [
|
|
1648
1669
|
"kind",
|
|
@@ -1651,6 +1672,7 @@ function parseEcdsaServerReservationRecord(raw) {
|
|
|
1651
1672
|
], "ECDSA reservation preparation");
|
|
1652
1673
|
if (preparationRecord.kind !== "ordinary_ecdsa_signer_material_reservation_preparation_v1") throw new Error("ECDSA reservation preparation kind is invalid");
|
|
1653
1674
|
return {
|
|
1675
|
+
ownershipGeneration: storedReservationGeneration(record),
|
|
1654
1676
|
reservationId: requireReservationId(record.reservationId, "ECDSA server reservation id"),
|
|
1655
1677
|
preparation: {
|
|
1656
1678
|
kind: "ordinary_ecdsa_signer_material_reservation_preparation_v1",
|
|
@@ -1865,6 +1887,11 @@ function requireTime(raw, label) {
|
|
|
1865
1887
|
function errorMessage(error) {
|
|
1866
1888
|
return error instanceof Error ? error.message : String(error);
|
|
1867
1889
|
}
|
|
1890
|
+
function storedReservationGeneration(record) {
|
|
1891
|
+
const generation = Object.hasOwn(record, "ownershipGeneration") ? record.ownershipGeneration : 1;
|
|
1892
|
+
if (typeof generation !== "number" || !Number.isSafeInteger(generation) || generation < 1) throw new Error("Stored reservation ownership generation is invalid");
|
|
1893
|
+
return generation;
|
|
1894
|
+
}
|
|
1868
1895
|
//#endregion
|
|
1869
1896
|
export { D1LinkedDeviceAuthorityInstallServiceV1, parseInstalledEcdsaCustodySnapshotV1, readD1LinkedDeviceEcdsaSourceV1, readD1LinkedDeviceEd25519SourceV1 };
|
|
1870
1897
|
|
package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { mpcMaterialActivationRefsEqual, parseEcdsaRelayerKeyId, parseLinkDeviceSessionId, parseLinkedDeviceEnrollmentId, parseLinkedDeviceId, parseProviderSubject } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
2
|
import { parseWalletSessionAuthorizationId, parseWalletSessionId } from "../../../../shared-ts/src/authorization/capabilityKinds.js";
|
|
3
|
+
import { buildFullOwnerDelegatedWalletAuthorityV1, hasDelegatedWalletPermissionV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
|
|
3
4
|
import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
|
|
4
5
|
import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
|
|
5
6
|
import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
6
|
-
import { buildFullOwnerDelegatedWalletAuthorityV1, hasDelegatedWalletPermissionV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
|
|
7
7
|
import { parseSecp256k1CompressedPublicKeyB64u } from "../../../../shared-ts/src/passkey-custody/primitives.js";
|
|
8
8
|
import { routerAbMpcMaterialActivationRefFromWire } from "../../../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
|
|
9
9
|
import { deriveRouterAbEd25519YaoApplicationBindingDigestV1 } from "../../../../shared-ts/src/utils/routerAbEd25519YaoDigests.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { parseLinkDeviceSessionId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
+
import { isObject, requireCanonicalString } from "../../../../shared-ts/src/utils/validation.js";
|
|
2
3
|
import { base64UrlDecode, base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
|
|
3
4
|
import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
4
|
-
import { isObject, requireCanonicalString } from "../../../../shared-ts/src/utils/validation.js";
|
|
5
5
|
import { d1ChangedRows } from "../../../../storage/d1Sql.js";
|
|
6
6
|
//#region src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.ts
|
|
7
7
|
const NONCE_TABLE = "linked_device_request_proof_nonces";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { parseWalletAuthorityId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
-
import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
3
2
|
import { requireCanonicalString } from "../../../../shared-ts/src/utils/validation.js";
|
|
3
|
+
import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
4
4
|
import { parseLinkedDeviceSessionRecordV1 } from "../../../../core/deviceLinking/linkedDeviceSessionRecord.js";
|
|
5
5
|
//#region src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.ts
|
|
6
6
|
function parseD1LinkedDeviceSessionRowV1(row) {
|
package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { hasControlCharacter, mpcMaterialActivationRefsEqual, parseWebAuthnCredentialIdB64u } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
+
import { requireCanonicalString, requireRecord } from "../../../../shared-ts/src/utils/validation.js";
|
|
2
3
|
import { base64UrlDecode, base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
|
|
3
4
|
import { alphabetizeStringify } from "../../../../shared-ts/src/utils/digests.js";
|
|
4
5
|
import { parseDigestB64u, sha256Utf8DigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
5
|
-
import { requireCanonicalString, requireRecord } from "../../../../shared-ts/src/utils/validation.js";
|
|
6
6
|
import { routerAbMpcMaterialActivationRefFromWire } from "../../../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
|
|
7
7
|
import { parseLinkedDeviceOrdinaryMaterialSourceContributionPreparationTupleV1 } from "../../../../shared-ts/src/device-linking/sourceContribution.js";
|
|
8
8
|
import { parseLinkedDeviceTargetCredentialRegistrationResultV1, parseLinkedDeviceTargetCredentialRegistrationV1, parseLinkedDeviceTargetPreparationV1 } from "../../../../shared-ts/src/device-linking/parsers.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { parseWalletAuthMethodId, parseWebAuthnRpId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
-
import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
|
|
3
2
|
import { hasDelegatedWalletPermissionV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
|
|
3
|
+
import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
|
|
4
4
|
import { buildLinkedDeviceTargetPreparationV1 } from "../../../../shared-ts/src/device-linking/parsers.js";
|
|
5
5
|
import { computeLinkedDevicePasskeyTargetConfigurationDigestV1 } from "../../../../shared-ts/src/device-linking/digests.js";
|
|
6
6
|
import { secureRandomBase64Url } from "../../../../shared-ts/src/utils/secureRandomId.js";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { parseWebAuthnCredentialIdB64u } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
2
|
import { parseDeviceId } from "../../../../shared-ts/src/authorization/capabilityKinds.js";
|
|
3
|
+
import { buildDelegatedWalletAuthorityV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
|
|
3
4
|
import { base64UrlDecode, base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
|
|
4
5
|
import { alphabetizeStringify } from "../../../../shared-ts/src/utils/digests.js";
|
|
5
6
|
import { sha256Utf8DigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
6
|
-
import { buildDelegatedWalletAuthorityV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
|
|
7
7
|
import { buildExactAdministeredSignerManifestV1 } from "../../../../shared-ts/src/device-linking/delegatedActivationPlan.js";
|
|
8
8
|
import { walletAuthorityDigestsMatchV1 } from "../../../../shared-ts/src/authorization/walletAuthority.js";
|
|
9
9
|
import { sourceKeyManifestDigestForFamilyV1 } from "../../../../core/deviceLinking/linkedDeviceSessionRecord.js";
|
|
@@ -16,16 +16,25 @@ var CloudflareD1Ed25519YaoLifecycleDecisionStoreV1 = class {
|
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
18
|
async read(lifecycleId) {
|
|
19
|
-
const
|
|
19
|
+
const result = await this.prepareRead(lifecycleId).all();
|
|
20
|
+
return this.parseRead(lifecycleId, result);
|
|
21
|
+
}
|
|
22
|
+
prepareRead(lifecycleId) {
|
|
23
|
+
return this.database.prepare(`SELECT decision_kind, decision_id, wallet_id
|
|
20
24
|
FROM yao_lifecycle_decisions
|
|
21
25
|
WHERE namespace = ?1
|
|
22
26
|
AND org_id = ?2
|
|
23
27
|
AND project_id = ?3
|
|
24
28
|
AND env_id = ?4
|
|
25
|
-
AND lifecycle_id = ?5`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, lifecycleId)
|
|
29
|
+
AND lifecycle_id = ?5`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, lifecycleId);
|
|
30
|
+
}
|
|
31
|
+
parseRead(lifecycleId, result) {
|
|
32
|
+
if (!result.success) throw new Error("Ed25519 Yao lifecycle decision read failed");
|
|
33
|
+
const row = result.results?.[0];
|
|
26
34
|
if (!row) return null;
|
|
27
35
|
const kind = parseDecisionKind(row.decision_kind);
|
|
28
36
|
if (!kind) throw new Error("Stored Ed25519 Yao lifecycle decision has an unknown kind");
|
|
37
|
+
if (typeof row.decision_id !== "string" || typeof row.wallet_id !== "string") throw new Error("Stored Ed25519 Yao lifecycle decision has invalid identities");
|
|
29
38
|
return {
|
|
30
39
|
lifecycleId,
|
|
31
40
|
kind,
|
|
@@ -1,21 +1,111 @@
|
|
|
1
|
+
import { ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1, createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreV1, encodeRouterAbEd25519YaoProductRegistrationPartitionRecordV1, parseRouterAbEd25519YaoProductRegistrationPartitionRecordJsonV1, parseRouterAbEd25519YaoProductRegistrationPartitionRecordV1 } from "../../../domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js";
|
|
1
2
|
import { createCloudflareD1VersionedJsonRecordStore } from "../versionedJson/d1VersionedJsonRecordStore.js";
|
|
2
|
-
import {
|
|
3
|
+
import { D1WalletCeremonyActivity, ceremonySettled } from "./d1WalletCeremonyActivity.js";
|
|
4
|
+
import { collectChangedStateWallets, lifecycleWriteFenceStatements } from "./d1Ed25519YaoStateWriteFence.js";
|
|
3
5
|
//#region src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.ts
|
|
4
6
|
function createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreFromD1V1(options) {
|
|
5
|
-
|
|
7
|
+
return createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreV1(new D1LifecycleRecords(options, createLifecycleRecords(options)));
|
|
8
|
+
}
|
|
9
|
+
var D1LifecycleRecords = class {
|
|
10
|
+
constructor(options, records) {
|
|
11
|
+
this.options = options;
|
|
12
|
+
this.records = records;
|
|
13
|
+
this.observed = /* @__PURE__ */ new Map();
|
|
14
|
+
}
|
|
15
|
+
async readMany(keys) {
|
|
16
|
+
const entries = await this.records.readMany(keys);
|
|
17
|
+
this.observed.clear();
|
|
18
|
+
for (const entry of entries) if (entry.result.kind === "present") this.observed.set(entry.key, {
|
|
19
|
+
version: entry.result.version,
|
|
20
|
+
value: structuredClone(entry.result.value)
|
|
21
|
+
});
|
|
22
|
+
return entries;
|
|
23
|
+
}
|
|
24
|
+
async putMany(mutations, companion) {
|
|
25
|
+
const keys = [];
|
|
26
|
+
const wallets = /* @__PURE__ */ new Set();
|
|
27
|
+
const previousValues = /* @__PURE__ */ new Map();
|
|
28
|
+
for (const mutation of mutations) {
|
|
29
|
+
if (mutation.expectedVersion === null) continue;
|
|
30
|
+
const observed = this.observed.get(mutation.key);
|
|
31
|
+
if (observed?.version === mutation.expectedVersion) previousValues.set(mutation.key, observed.value);
|
|
32
|
+
else keys.push(mutation.key);
|
|
33
|
+
}
|
|
34
|
+
this.observed.clear();
|
|
35
|
+
const previous = keys.length === 0 ? [] : await this.records.readMany(keys);
|
|
36
|
+
for (const entry of previous) if (entry.result.kind === "present") previousValues.set(entry.key, entry.result.value);
|
|
37
|
+
const activity = new D1WalletCeremonyActivity(this.options.database, this.options.scope);
|
|
38
|
+
const projections = [];
|
|
39
|
+
for (const mutation of mutations) {
|
|
40
|
+
const previousValue = previousValues.get(mutation.key);
|
|
41
|
+
const before = previousValue === void 0 ? null : readPartition(previousValue);
|
|
42
|
+
const after = readPartition(mutation.value);
|
|
43
|
+
const changedWallets = /* @__PURE__ */ new Set();
|
|
44
|
+
collectChangedStateWallets(before, after, changedWallets);
|
|
45
|
+
for (const walletId of changedWallets) wallets.add(walletId);
|
|
46
|
+
if (after.kind === "router_ab_ed25519_yao_product_registration_ceremony_record_v1") {
|
|
47
|
+
if (changedWallets.size > 1) throw new Error("Ceremony wallet owner changed");
|
|
48
|
+
for (const walletId of changedWallets) projections.push(activity.project(this.records.storageKey(mutation.key), walletId, ceremonySettled(after.value)));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return this.records.putManyWithAdditionalStatements(mutations, [
|
|
52
|
+
...lifecycleWriteFenceStatements(this.options, wallets),
|
|
53
|
+
...projections,
|
|
54
|
+
...companion?.statements ?? []
|
|
55
|
+
], companion?.executeBatch);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
function identityVersionedJsonObject(value) {
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
function readPartition(value) {
|
|
62
|
+
const record = parseRouterAbEd25519YaoProductRegistrationPartitionRecordV1(value);
|
|
63
|
+
if (!record) throw new Error("Lifecycle mutation contains an invalid partition record");
|
|
64
|
+
return record;
|
|
65
|
+
}
|
|
66
|
+
async function evictWalletEd25519CapabilityCache(options, walletId) {
|
|
67
|
+
const records = createLifecycleRecords(options);
|
|
68
|
+
const key = ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1;
|
|
69
|
+
const current = await records.read(key);
|
|
70
|
+
if (current.kind !== "present") return;
|
|
71
|
+
const partition = readPartition(current.value);
|
|
72
|
+
if (partition.kind !== "router_ab_ed25519_yao_product_registration_shared_record_v1") throw new Error("Capability cache has an invalid partition kind");
|
|
73
|
+
const capabilities = new Map(partition.value.recoveryCapabilities);
|
|
74
|
+
const identities = new Map(partition.value.recoveryIdentityCapabilities);
|
|
75
|
+
const removed = /* @__PURE__ */ new Set();
|
|
76
|
+
for (const [capabilityKey, capability] of capabilities) {
|
|
77
|
+
if (capability.identity.applicationBinding.wallet_id !== walletId) continue;
|
|
78
|
+
if (capability.kind === "suspended") throw new Error("Relocation cleanup cannot evict an unsettled capability");
|
|
79
|
+
capabilities.delete(capabilityKey);
|
|
80
|
+
removed.add(capabilityKey);
|
|
81
|
+
}
|
|
82
|
+
if (removed.size === 0) return;
|
|
83
|
+
for (const [identity, capabilityKey] of identities) if (removed.has(capabilityKey)) identities.delete(identity);
|
|
84
|
+
const value = encodeRouterAbEd25519YaoProductRegistrationPartitionRecordV1({
|
|
85
|
+
kind: "router_ab_ed25519_yao_product_registration_shared_record_v1",
|
|
86
|
+
value: {
|
|
87
|
+
kind: partition.value.kind,
|
|
88
|
+
recoveryCapabilities: capabilities,
|
|
89
|
+
recoveryIdentityCapabilities: identities,
|
|
90
|
+
recoverySessions: partition.value.recoverySessions,
|
|
91
|
+
exportAuthorizationNonceOwners: partition.value.exportAuthorizationNonceOwners,
|
|
92
|
+
exportAuthorizationUncertainOwners: partition.value.exportAuthorizationUncertainOwners
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
if ((await records.putMany([{
|
|
96
|
+
key,
|
|
97
|
+
value,
|
|
98
|
+
expectedVersion: current.version
|
|
99
|
+
}])).kind !== "stored") throw new Error("Capability cache changed during cleanup");
|
|
100
|
+
}
|
|
101
|
+
function createLifecycleRecords(options) {
|
|
102
|
+
return createCloudflareD1VersionedJsonRecordStore({
|
|
6
103
|
...options,
|
|
7
104
|
encode: identityVersionedJsonObject,
|
|
8
105
|
parse: parseRouterAbEd25519YaoProductRegistrationPartitionRecordJsonV1
|
|
9
106
|
});
|
|
10
|
-
return createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreV1({
|
|
11
|
-
readMany: records.readMany.bind(records),
|
|
12
|
-
putMany: async (mutations, companion) => await records.putManyWithAdditionalStatements(mutations, companion?.statements ?? [])
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
function identityVersionedJsonObject(value) {
|
|
16
|
-
return value;
|
|
17
107
|
}
|
|
18
108
|
//#endregion
|
|
19
|
-
export { createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreFromD1V1 };
|
|
109
|
+
export { createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreFromD1V1, evictWalletEd25519CapabilityCache };
|
|
20
110
|
|
|
21
111
|
//# sourceMappingURL=d1Ed25519YaoProductRegistrationPartitionedStateStore.js.map
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { parseWalletId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
+
import { parseRouterAbEd25519YaoRecoveryAdmissionRequestV1 } from "../../../../shared-ts/src/utils/routerAbEd25519Yao.js";
|
|
3
|
+
//#region src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.ts
|
|
4
|
+
function collectChangedStateWallets(before, after, wallets) {
|
|
5
|
+
if (before && before.kind !== after.kind) throw new Error("Lifecycle partition kind changed");
|
|
6
|
+
if (after.kind === "router_ab_ed25519_yao_product_registration_ceremony_record_v1") {
|
|
7
|
+
collectCeremonyWallets(after, wallets);
|
|
8
|
+
if (before) collectCeremonyWallets(before, wallets);
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (before?.kind === "router_ab_ed25519_yao_product_registration_ceremony_record_v1") throw new Error("Lifecycle partition kind changed");
|
|
12
|
+
collectChangedRecoveryCapabilities(before?.value ?? null, after.value, wallets);
|
|
13
|
+
const empty = /* @__PURE__ */ new Map();
|
|
14
|
+
collectChangedOwners(before?.value.exportAuthorizationNonceOwners ?? empty, after.value.exportAuthorizationNonceOwners, walletOwner, wallets);
|
|
15
|
+
collectChangedOwners(before?.value.exportAuthorizationUncertainOwners ?? empty, after.value.exportAuthorizationUncertainOwners, walletOwner, wallets);
|
|
16
|
+
collectChangedOwners(before?.value.recoverySessions ?? empty, after.value.recoverySessions, recoverySessionOwner, wallets);
|
|
17
|
+
}
|
|
18
|
+
function collectChangedRecoveryCapabilities(before, after, wallets) {
|
|
19
|
+
for (const [key, capability] of after.recoveryCapabilities) {
|
|
20
|
+
const previous = before?.recoveryCapabilities.get(key);
|
|
21
|
+
if (JSON.stringify(previous) === JSON.stringify(capability)) continue;
|
|
22
|
+
if (previous) wallets.add(walletOwner(previous.identity.applicationBinding.wallet_id));
|
|
23
|
+
wallets.add(walletOwner(capability.identity.applicationBinding.wallet_id));
|
|
24
|
+
}
|
|
25
|
+
for (const [key, capability] of before?.recoveryCapabilities ?? []) if (capability.kind === "suspended" && !after.recoveryCapabilities.has(key)) wallets.add(walletOwner(capability.identity.applicationBinding.wallet_id));
|
|
26
|
+
const identities = new Set([...before?.recoveryIdentityCapabilities.keys() ?? [], ...after.recoveryIdentityCapabilities.keys()]);
|
|
27
|
+
for (const identity of identities) {
|
|
28
|
+
const previousKey = before?.recoveryIdentityCapabilities.get(identity);
|
|
29
|
+
const nextKey = after.recoveryIdentityCapabilities.get(identity);
|
|
30
|
+
if (previousKey === nextKey) continue;
|
|
31
|
+
if (nextKey === void 0 && previousKey !== void 0 && !after.recoveryCapabilities.has(previousKey)) continue;
|
|
32
|
+
if (previousKey !== void 0) {
|
|
33
|
+
const previous = before?.recoveryCapabilities.get(previousKey);
|
|
34
|
+
if (!previous) throw new Error("Recovery identity index has no capability owner");
|
|
35
|
+
wallets.add(walletOwner(previous.identity.applicationBinding.wallet_id));
|
|
36
|
+
}
|
|
37
|
+
if (nextKey !== void 0) {
|
|
38
|
+
const next = after.recoveryCapabilities.get(nextKey);
|
|
39
|
+
if (!next) throw new Error("Recovery identity index has no capability owner");
|
|
40
|
+
wallets.add(walletOwner(next.identity.applicationBinding.wallet_id));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function walletOwner(value) {
|
|
45
|
+
const parsed = parseWalletId(value);
|
|
46
|
+
if (!parsed.ok) throw new Error("Lifecycle wallet owner is invalid");
|
|
47
|
+
return parsed.value;
|
|
48
|
+
}
|
|
49
|
+
function recoverySessionOwner(value) {
|
|
50
|
+
const parsed = parseRouterAbEd25519YaoRecoveryAdmissionRequestV1(JSON.parse(value));
|
|
51
|
+
if (!parsed.ok) throw new Error("Stored recovery session request is invalid");
|
|
52
|
+
return walletOwner(parsed.value.application_binding.wallet_id);
|
|
53
|
+
}
|
|
54
|
+
function collectChangedOwners(before, after, owner, wallets) {
|
|
55
|
+
for (const key of new Set([...before.keys(), ...after.keys()])) {
|
|
56
|
+
const oldValue = before.get(key);
|
|
57
|
+
const newValue = after.get(key);
|
|
58
|
+
if (oldValue === newValue) continue;
|
|
59
|
+
if (oldValue !== void 0) wallets.add(owner(oldValue));
|
|
60
|
+
if (newValue !== void 0) wallets.add(owner(newValue));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function collectCeremonyWallets(record, wallets) {
|
|
64
|
+
if (record.kind === "router_ab_ed25519_yao_product_registration_shared_record_v1") return;
|
|
65
|
+
const state = record.value;
|
|
66
|
+
const owners = /* @__PURE__ */ new Set();
|
|
67
|
+
for (const authority of state.authorization.authorities) owners.add(authority.admissionRequest.application_binding.wallet_id);
|
|
68
|
+
for (const registration of state.registration.states.values()) owners.add(registration.admissionRequest.application_binding.wallet_id);
|
|
69
|
+
for (const recovery of state.recovery.recoveries.values()) owners.add(recovery.context.authorization.walletId);
|
|
70
|
+
for (const exported of state.export.exports.values()) owners.add(exported.request.application_binding.wallet_id);
|
|
71
|
+
if (owners.size > 1 || owners.size === 0 && (state.registration.admissionClaims.size > 0 || state.registration.dispatchRoots.size > 0 || state.registration.lifecycleSessions.size > 0)) throw new Error("Ceremony mutation has no unique wallet owner");
|
|
72
|
+
for (const owner of owners) wallets.add(walletOwner(owner));
|
|
73
|
+
}
|
|
74
|
+
function lifecycleWriteFenceStatements(options, wallets) {
|
|
75
|
+
const statements = [];
|
|
76
|
+
for (const walletId of wallets) statements.push(options.database.prepare(`
|
|
77
|
+
INSERT INTO router_ab_yao_versioned_json_cas_guard (guard_id)
|
|
78
|
+
SELECT 1 WHERE EXISTS (
|
|
79
|
+
SELECT 1 FROM wallet_relocation_authorization_fences
|
|
80
|
+
WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
|
|
81
|
+
AND wallet_id = ?5
|
|
82
|
+
) OR EXISTS (
|
|
83
|
+
SELECT 1 FROM wallet_execution_generations
|
|
84
|
+
WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
|
|
85
|
+
AND wallet_id = ?5 AND registration_completion = 'cancelled'
|
|
86
|
+
)`).bind(options.scope.namespace, options.scope.orgId, options.scope.projectId, options.scope.envId, walletId));
|
|
87
|
+
return statements;
|
|
88
|
+
}
|
|
89
|
+
//#endregion
|
|
90
|
+
export { collectChangedStateWallets, lifecycleWriteFenceStatements };
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=d1Ed25519YaoStateWriteFence.js.map
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { prepareD1TenantStatement } from "../../../../core/d1TenantStore.js";
|
|
2
|
+
//#region src/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.ts
|
|
3
|
+
var D1WalletCeremonyActivity = class {
|
|
4
|
+
constructor(database, scope) {
|
|
5
|
+
this.database = database;
|
|
6
|
+
this.scope = scope;
|
|
7
|
+
}
|
|
8
|
+
async hasPending(walletId) {
|
|
9
|
+
return await prepareD1TenantStatement(this.database, this.scope, `
|
|
10
|
+
SELECT 1 AS pending FROM wallet_ceremony_activity
|
|
11
|
+
WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
|
|
12
|
+
AND wallet_id = ?5 AND settled = 0 LIMIT 1`, [walletId]).first() !== null;
|
|
13
|
+
}
|
|
14
|
+
project(recordKey, walletId, settled) {
|
|
15
|
+
return prepareD1TenantStatement(this.database, this.scope, `
|
|
16
|
+
INSERT INTO wallet_ceremony_activity
|
|
17
|
+
(namespace, org_id, project_id, env_id, record_key, wallet_id, settled)
|
|
18
|
+
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)
|
|
19
|
+
ON CONFLICT (namespace, org_id, project_id, env_id, record_key)
|
|
20
|
+
DO UPDATE SET wallet_id = excluded.wallet_id, settled = excluded.settled`, [
|
|
21
|
+
recordKey,
|
|
22
|
+
walletId,
|
|
23
|
+
settled ? 1 : 0
|
|
24
|
+
]);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
function ceremonySettled(ceremony) {
|
|
28
|
+
if (ceremony.registration.admissionClaims.size > 0) return false;
|
|
29
|
+
for (const registration of ceremony.registration.states.values()) if (!registrationSettled(registration)) return false;
|
|
30
|
+
for (const recovery of ceremony.recovery.recoveries.values()) if (!recoverySettled(recovery)) return false;
|
|
31
|
+
for (const exported of ceremony.export.exports.values()) if (!exportSettled(exported)) return false;
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
function registrationSettled(state) {
|
|
35
|
+
switch (state.kind) {
|
|
36
|
+
case "activated": return state.activationConsumerBinding !== null;
|
|
37
|
+
case "admitted": return true;
|
|
38
|
+
case "executing":
|
|
39
|
+
case "failed": return false;
|
|
40
|
+
default: return assertNever(state);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function recoverySettled(state) {
|
|
44
|
+
switch (state.kind) {
|
|
45
|
+
case "promoted":
|
|
46
|
+
case "superseded": return true;
|
|
47
|
+
case "admitting":
|
|
48
|
+
case "admission_failed":
|
|
49
|
+
case "admitted":
|
|
50
|
+
case "executing":
|
|
51
|
+
case "execution_interrupted":
|
|
52
|
+
case "execution_failed":
|
|
53
|
+
case "staged":
|
|
54
|
+
case "activating":
|
|
55
|
+
case "activation_failed": return false;
|
|
56
|
+
default: return assertNever(state);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function exportSettled(state) {
|
|
60
|
+
switch (state.kind) {
|
|
61
|
+
case "completed": return true;
|
|
62
|
+
case "authorized":
|
|
63
|
+
case "admitting":
|
|
64
|
+
case "admission_failed":
|
|
65
|
+
case "admitted":
|
|
66
|
+
case "executing":
|
|
67
|
+
case "execution_failed": return false;
|
|
68
|
+
default: return assertNever(state);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function assertNever(value) {
|
|
72
|
+
throw new Error(`Unknown ceremony state: ${String(value)}`);
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
export { D1WalletCeremonyActivity, ceremonySettled };
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=d1WalletCeremonyActivity.js.map
|
|
@@ -21,6 +21,9 @@ var CloudflareD1EmailOtpChallengeIssuer = class {
|
|
|
21
21
|
this.emailOtpEnrollments = input.emailOtpEnrollments;
|
|
22
22
|
this.emailOtpRateLimits = input.emailOtpRateLimits;
|
|
23
23
|
}
|
|
24
|
+
challengeExpiresAt(nowMs) {
|
|
25
|
+
return nowMs + this.config.challengeTtlMs;
|
|
26
|
+
}
|
|
24
27
|
async create(input) {
|
|
25
28
|
try {
|
|
26
29
|
const userId = normalizeOptionalTrimmedString(input.userId);
|
|
@@ -61,8 +64,9 @@ var CloudflareD1EmailOtpChallengeIssuer = class {
|
|
|
61
64
|
}
|
|
62
65
|
if (!challengeEmail) return failure("recovery_email_missing", "Authenticated identity does not include a recovery email");
|
|
63
66
|
const nowMs = Date.now();
|
|
67
|
+
if (input.action === WALLET_EMAIL_OTP_ACTIONS.relocation && (!Number.isSafeInteger(input.expiresAtMs) || input.expiresAtMs <= nowMs || input.expiresAtMs > nowMs + this.config.challengeTtlMs)) return failure("invalid_body", "Relocation OTP expiry is invalid");
|
|
64
68
|
await this.emailOtpChallenges.pruneExpired(nowMs);
|
|
65
|
-
if (input.reuseActiveChallenge === true) {
|
|
69
|
+
if (input.reuseActiveChallenge === true && action !== WALLET_EMAIL_OTP_ACTIONS.relocation) {
|
|
66
70
|
const existing = await this.emailOtpChallenges.findLatestActive({
|
|
67
71
|
challengeSubjectId: userId,
|
|
68
72
|
walletId,
|
|
@@ -94,6 +98,7 @@ var CloudflareD1EmailOtpChallengeIssuer = class {
|
|
|
94
98
|
}
|
|
95
99
|
}
|
|
96
100
|
const rateLimit = await this.emailOtpRateLimits.consume({
|
|
101
|
+
kind: "wallet",
|
|
97
102
|
scope: "challenge",
|
|
98
103
|
action,
|
|
99
104
|
userId,
|
|
@@ -102,7 +107,7 @@ var CloudflareD1EmailOtpChallengeIssuer = class {
|
|
|
102
107
|
clientIp
|
|
103
108
|
});
|
|
104
109
|
if (!rateLimit.ok) return rateLimit;
|
|
105
|
-
await this.emailOtpChallenges.deleteActiveOverflow({
|
|
110
|
+
if (action !== WALLET_EMAIL_OTP_ACTIONS.relocation) await this.emailOtpChallenges.deleteActiveOverflow({
|
|
106
111
|
challengeSubjectId: userId,
|
|
107
112
|
walletId,
|
|
108
113
|
orgId,
|
|
@@ -112,10 +117,10 @@ var CloudflareD1EmailOtpChallengeIssuer = class {
|
|
|
112
117
|
nowMs,
|
|
113
118
|
maxActiveChallenges: this.config.maxActiveChallengesPerContext
|
|
114
119
|
});
|
|
115
|
-
const challengeId = secureRandomBase64Url(16, "email otp challenge ids");
|
|
120
|
+
const challengeId = action === WALLET_EMAIL_OTP_ACTIONS.relocation ? `relocation:${ownerProofBindingDigest}` : secureRandomBase64Url(16, "email otp challenge ids");
|
|
116
121
|
const otpCode = generateNumericOtp(this.config.codeLength);
|
|
117
|
-
const expiresAtMs = nowMs + this.config.challengeTtlMs;
|
|
118
|
-
|
|
122
|
+
const expiresAtMs = input.action === WALLET_EMAIL_OTP_ACTIONS.relocation ? input.expiresAtMs : nowMs + this.config.challengeTtlMs;
|
|
123
|
+
let record = emailOtpChallengeRecord({
|
|
119
124
|
challengeId,
|
|
120
125
|
challengeSubjectId: userId,
|
|
121
126
|
walletId,
|
|
@@ -129,17 +134,18 @@ var CloudflareD1EmailOtpChallengeIssuer = class {
|
|
|
129
134
|
expiresAtMs,
|
|
130
135
|
maxAttempts: this.config.maxAttempts
|
|
131
136
|
});
|
|
132
|
-
await this.emailOtpChallenges.
|
|
137
|
+
if (action === WALLET_EMAIL_OTP_ACTIONS.relocation) record = await this.emailOtpChallenges.putIfAbsent(record);
|
|
138
|
+
else await this.emailOtpChallenges.put(record);
|
|
133
139
|
const delivery = await this.emailOtpDelivery.deliverEmailOtpCode(record, input.requestOrigin);
|
|
134
140
|
if (!delivery.ok) {
|
|
135
|
-
await this.emailOtpChallenges.delete(challengeId);
|
|
141
|
+
if (action !== WALLET_EMAIL_OTP_ACTIONS.relocation) await this.emailOtpChallenges.delete(challengeId);
|
|
136
142
|
return delivery;
|
|
137
143
|
}
|
|
138
144
|
return {
|
|
139
145
|
ok: true,
|
|
140
146
|
challenge: {
|
|
141
147
|
challengeId,
|
|
142
|
-
issuedAtMs:
|
|
148
|
+
issuedAtMs: record.createdAtMs,
|
|
143
149
|
expiresAtMs,
|
|
144
150
|
challengeSubjectId: userId,
|
|
145
151
|
walletId,
|
|
@@ -87,20 +87,26 @@ var CloudflareD1EmailOtpChallengeStore = class {
|
|
|
87
87
|
}
|
|
88
88
|
return deletedRecords;
|
|
89
89
|
}
|
|
90
|
+
async putIfAbsent(record) {
|
|
91
|
+
await emailOtpChallengeRows.insertIfAbsent(this.prepare, record).run();
|
|
92
|
+
const stored = await this.read(record.challengeId);
|
|
93
|
+
if (!stored || stored.walletId !== record.walletId || stored.orgId !== record.orgId || stored.challengeSubjectId !== record.challengeSubjectId || stored.email !== record.email || stored.action !== record.action || stored.operation !== record.operation || stored.ownerProofBindingDigest !== record.ownerProofBindingDigest || stored.expiresAtMs !== record.expiresAtMs || stored.createdAtMs > record.createdAtMs) throw new Error("Email OTP challenge identity conflict");
|
|
94
|
+
return stored;
|
|
95
|
+
}
|
|
90
96
|
async put(record) {
|
|
91
97
|
await emailOtpChallengeRows.insert(this.prepare, record).run();
|
|
92
98
|
}
|
|
93
99
|
async updateAttemptCount(record, attemptCount) {
|
|
94
100
|
const next = emailOtpChallengeWithAttemptCount(record, attemptCount);
|
|
95
101
|
await this.prepare(`UPDATE email_otp_challenges
|
|
96
|
-
SET record_json =
|
|
97
|
-
otp_code =
|
|
98
|
-
expires_at_ms = ?
|
|
99
|
-
WHERE namespace = ?
|
|
100
|
-
AND org_id = ?
|
|
101
|
-
AND project_id = ?
|
|
102
|
-
AND env_id = ?
|
|
103
|
-
AND challenge_id =
|
|
102
|
+
SET record_json = ?5,
|
|
103
|
+
otp_code = ?6,
|
|
104
|
+
expires_at_ms = ?7
|
|
105
|
+
WHERE namespace = ?1
|
|
106
|
+
AND org_id = ?2
|
|
107
|
+
AND project_id = ?3
|
|
108
|
+
AND env_id = ?4
|
|
109
|
+
AND challenge_id = ?8`, [
|
|
104
110
|
JSON.stringify(next),
|
|
105
111
|
next.otpCode,
|
|
106
112
|
next.expiresAtMs,
|