@seams/wallet-server 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +8 -0
- package/artifact-manifest.json +464 -0
- package/cloudflare-router-ab/build/deriver-a/index.js +2 -0
- package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/deriver-a/package.json +16 -0
- package/cloudflare-router-ab/build/deriver-a/worker/shim.mjs +4 -0
- package/cloudflare-router-ab/build/deriver-b/index.js +2 -0
- package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/deriver-b/package.json +16 -0
- package/cloudflare-router-ab/build/deriver-b/worker/shim.mjs +4 -0
- package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/router/index.js +2 -0
- package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/router/package.json +16 -0
- package/cloudflare-router-ab/build/router/worker/shim.mjs +4 -0
- package/cloudflare-router-ab/build/signing-worker/index.js +2 -0
- package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/signing-worker/package.json +16 -0
- package/cloudflare-router-ab/build/signing-worker/worker/shim.mjs +4 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/index.js +2 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/package.json +16 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/worker/shim.mjs +4 -0
- package/cloudflare-router-ab/env/tenant-root-control-plane.local.example +6 -0
- package/cloudflare-router-ab/migrations/deriver-a/0001_role_private_storage.sql +14 -0
- package/cloudflare-router-ab/migrations/deriver-a/0002_tenant_root_role_shares.sql +32 -0
- package/cloudflare-router-ab/migrations/deriver-a/0003_tenant_root_command_replays.sql +76 -0
- package/cloudflare-router-ab/migrations/deriver-a/0004_tenant_root_creation_admission.sql +7 -0
- package/cloudflare-router-ab/migrations/deriver-a/0005_tenant_root_refresh_state.sql +15 -0
- package/cloudflare-router-ab/migrations/deriver-a/0006_tenant_root_restore_import_keys.sql +119 -0
- package/cloudflare-router-ab/migrations/deriver-a/0007_tenant_root_restore_refresh_attempts.sql +103 -0
- package/cloudflare-router-ab/migrations/deriver-a/0008_tenant_root_restore_promotion.sql +40 -0
- package/cloudflare-router-ab/migrations/deriver-a/0009_tenant_root_restore_preactivation_cleanup.sql +8 -0
- package/cloudflare-router-ab/migrations/deriver-a/0010_tenant_root_recovery_attempts.sql +26 -0
- package/cloudflare-router-ab/migrations/deriver-a/0011_tenant_root_source_retirement.sql +100 -0
- package/cloudflare-router-ab/migrations/deriver-b/0001_role_private_storage.sql +14 -0
- package/cloudflare-router-ab/migrations/deriver-b/0002_tenant_root_role_shares.sql +32 -0
- package/cloudflare-router-ab/migrations/deriver-b/0003_tenant_root_command_replays.sql +76 -0
- package/cloudflare-router-ab/migrations/deriver-b/0004_tenant_root_creation_admission.sql +7 -0
- package/cloudflare-router-ab/migrations/deriver-b/0005_tenant_root_refresh_state.sql +15 -0
- package/cloudflare-router-ab/migrations/deriver-b/0006_tenant_root_restore_import_keys.sql +119 -0
- package/cloudflare-router-ab/migrations/deriver-b/0007_tenant_root_restore_refresh_attempts.sql +103 -0
- package/cloudflare-router-ab/migrations/deriver-b/0008_tenant_root_restore_promotion.sql +40 -0
- package/cloudflare-router-ab/migrations/deriver-b/0009_tenant_root_restore_preactivation_cleanup.sql +8 -0
- package/cloudflare-router-ab/migrations/deriver-b/0010_tenant_root_recovery_attempts.sql +26 -0
- package/cloudflare-router-ab/migrations/deriver-b/0011_tenant_root_source_retirement.sql +100 -0
- package/cloudflare-router-ab/migrations/signing-worker/0001_private_storage.sql +67 -0
- package/cloudflare-router-ab/migrations/signing-worker/0002_activation_revocation_fences.sql +3 -0
- package/cloudflare-router-ab/scripts/bootstrap-local-tenant-root.mjs +182 -0
- package/cloudflare-router-ab/scripts/initialize-local-wallet.mjs +17 -0
- package/cloudflare-router-ab/scripts/local-key-material.mjs +29 -0
- package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +1110 -0
- package/cloudflare-router-ab/scripts/start-local-role-workers.mjs +333 -0
- package/cloudflare-router-ab/scripts/start-local-wallet-system.mjs +427 -0
- package/cloudflare-router-ab/wrangler.deriver-a.toml +123 -0
- package/cloudflare-router-ab/wrangler.deriver-b.toml +123 -0
- package/cloudflare-router-ab/wrangler.router.toml +126 -0
- package/cloudflare-router-ab/wrangler.signing-worker.toml +86 -0
- package/cloudflare-router-ab/wrangler.tenant-root-control-plane.toml +56 -0
- package/dist/esm/authorization/capabilityPolicy.js +96 -0
- package/dist/esm/authorization/domain.js +434 -0
- package/dist/esm/authorization/factorEvidence.js +405 -0
- package/dist/esm/authorization/service.js +319 -0
- package/dist/esm/authorization/vaultProxyUse.js +295 -0
- package/dist/esm/cloud-host.js +126 -0
- package/dist/esm/core/AuthService.js +2 -0
- package/dist/esm/core/EmailOtpRecords.js +361 -0
- package/dist/esm/core/EmailOtpStores.js +1460 -0
- package/dist/esm/core/IdentityStore.js +617 -0
- package/dist/esm/core/NearPublicKeyStore.js +242 -0
- package/dist/esm/core/RegistrationCeremonyStore.js +2101 -0
- package/dist/esm/core/SessionService.js +255 -0
- package/dist/esm/core/ThresholdService/config.js +111 -0
- package/dist/esm/core/ThresholdService/ecdsaClientRootProof.js +27 -0
- package/dist/esm/core/ThresholdService/evmCryptoWasm.js +167 -0
- package/dist/esm/core/ThresholdService/index.js +4 -0
- package/dist/esm/core/ThresholdService/kv.js +368 -0
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +360 -0
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillLiveSession.js +282 -0
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.js +272 -0
- package/dist/esm/core/ThresholdService/routerAb/internalServiceHttp.js +57 -0
- package/dist/esm/core/ThresholdService/routerAbEcdsaSigningWorkerWasm.js +115 -0
- package/dist/esm/core/ThresholdService/routerAbNormalSigningPolicy.js +31 -0
- package/dist/esm/core/ThresholdService/secureRandomId.js +9 -0
- package/dist/esm/core/ThresholdService/stores/CloudflareDurableObjectStore.js +603 -0
- package/dist/esm/core/ThresholdService/stores/EcdsaSigningStore.js +422 -0
- package/dist/esm/core/ThresholdService/stores/KeyStore.js +140 -0
- package/dist/esm/core/ThresholdService/stores/SessionStore.js +437 -0
- package/dist/esm/core/ThresholdService/stores/StoreConfig.js +13 -0
- package/dist/esm/core/ThresholdService/stores/WalletSessionStore.js +722 -0
- package/dist/esm/core/ThresholdService/validation.js +718 -0
- package/dist/esm/core/WalletAuthMethodStore.js +180 -0
- package/dist/esm/core/WalletStore.js +495 -0
- package/dist/esm/core/WebAuthnAuthenticatorStore.js +485 -0
- package/dist/esm/core/WebAuthnCredentialBindingStore.js +594 -0
- package/dist/esm/core/WebAuthnLoginChallengeStore.js +432 -0
- package/dist/esm/core/WebAuthnSyncChallengeStore.js +434 -0
- package/dist/esm/core/authService/AuthService.js +611 -0
- package/dist/esm/core/authService/bytes.js +22 -0
- package/dist/esm/core/authService/configValues.js +15 -0
- package/dist/esm/core/authService/emailOtpChallengeOperations.js +126 -0
- package/dist/esm/core/authService/emailOtpChallengeProof.js +214 -0
- package/dist/esm/core/authService/emailOtpChallengeVerification.js +335 -0
- package/dist/esm/core/authService/emailOtpChallenges.js +260 -0
- package/dist/esm/core/authService/emailOtpConfig.js +231 -0
- package/dist/esm/core/authService/emailOtpDelivery.js +169 -0
- package/dist/esm/core/authService/emailOtpEnrollment.js +141 -0
- package/dist/esm/core/authService/emailOtpGrant.js +74 -0
- package/dist/esm/core/authService/emailOtpRegistrationEnrollment.js +322 -0
- package/dist/esm/core/authService/emailOtpSeal.js +78 -0
- package/dist/esm/core/authService/emailOtpUnlock.js +264 -0
- package/dist/esm/core/authService/githubOAuth.js +140 -0
- package/dist/esm/core/authService/googleEmailOtpErrors.js +6 -0
- package/dist/esm/core/authService/googleEmailOtpOperations.js +141 -0
- package/dist/esm/core/authService/googleEmailOtpRegistration.js +674 -0
- package/dist/esm/core/authService/identity.js +57 -0
- package/dist/esm/core/authService/identityOperations.js +32 -0
- package/dist/esm/core/authService/nearAccountOperations.js +229 -0
- package/dist/esm/core/authService/nearPrivateKeySigning.js +110 -0
- package/dist/esm/core/authService/nearPublicKeyMetadata.js +127 -0
- package/dist/esm/core/authService/nearTransactions.js +139 -0
- package/dist/esm/core/authService/oidcVerification.js +262 -0
- package/dist/esm/core/authService/portableCrypto.js +19 -0
- package/dist/esm/core/authService/rateLimits.js +117 -0
- package/dist/esm/core/authService/record.js +8 -0
- package/dist/esm/core/authService/registrationThresholdHelpers.js +131 -0
- package/dist/esm/core/authService/runtime.js +45 -0
- package/dist/esm/core/authService/signerWasmUrls.js +20 -0
- package/dist/esm/core/authService/storeRegistry.js +113 -0
- package/dist/esm/core/authService/thresholdEcdsaKeyInventory.js +146 -0
- package/dist/esm/core/authService/thresholdRuntimePolicy.js +19 -0
- package/dist/esm/core/authService/thresholdStoreSummary.js +32 -0
- package/dist/esm/core/authService/walletRegistrationPlanning.js +49 -0
- package/dist/esm/core/authService/wasm.js +78 -0
- package/dist/esm/core/authService/webauthn.js +746 -0
- package/dist/esm/core/authService/webauthnAuthority.js +17 -0
- package/dist/esm/core/authService/webauthnOidcHelpers.js +91 -0
- package/dist/esm/core/authService/webauthnWalletBinding.js +157 -0
- package/dist/esm/core/config.js +110 -0
- package/dist/esm/core/d1IdentityStore.js +340 -0
- package/dist/esm/core/d1WalletAuthMethodStore.js +768 -0
- package/dist/esm/core/d1WalletStore.js +724 -0
- package/dist/esm/core/defaultConfigsServer.js +9 -0
- package/dist/esm/core/deviceLinking/index.js +5 -0
- package/dist/esm/core/deviceLinking/linkedDeviceEd25519ExportRoot.js +0 -0
- package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +211 -0
- package/dist/esm/core/deviceLinking/linkedDeviceManagement.js +279 -0
- package/dist/esm/core/deviceLinking/linkedDeviceSession.js +1419 -0
- package/dist/esm/core/deviceLinking/requestProof.js +172 -0
- package/dist/esm/core/errors.js +54 -0
- package/dist/esm/core/hostedAccountIds.js +225 -0
- package/dist/esm/core/keyMaterialBrands.js +58 -0
- package/dist/esm/core/logger.js +39 -0
- package/dist/esm/core/nearKeys.js +20 -0
- package/dist/esm/core/nearRelayerAccountProvisioning.js +713 -0
- package/dist/esm/core/nearSignerWasmRuntime.js +87 -0
- package/dist/esm/core/registrationContracts.js +2 -0
- package/dist/esm/core/routerAbSigning/RouterAbEcdsaPresignRuntime.js +88 -0
- package/dist/esm/core/routerAbSigning/RouterAbNormalSigningRuntime.js +101 -0
- package/dist/esm/core/routerAbSigning/createCloudflareDurableObjectRouterAbSigningRuntimes.js +39 -0
- package/dist/esm/core/routerAbSigning/createRouterAbSigningRuntimes.js +91 -0
- package/dist/esm/core/rpcClients/near/NearClient.js +389 -0
- package/dist/esm/core/sessionValidation.js +0 -0
- package/dist/esm/core/signingLanes/LaneAggregateRevocationApplicationService.js +86 -0
- package/dist/esm/core/signingLanes/LaneEffectJournalStore.js +0 -0
- package/dist/esm/core/signingLanes/LaneEnrollmentActivation.js +324 -0
- package/dist/esm/core/signingLanes/LaneEnrollmentRevocation.js +173 -0
- package/dist/esm/core/signingLanes/LaneLifecycleApplicationService.js +200 -0
- package/dist/esm/core/signingLanes/LaneLifecycleStore.js +24 -0
- package/dist/esm/core/signingLanes/SigningLaneStore.js +0 -0
- package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +296 -0
- package/dist/esm/core/signingLanes/WalletKeyStore.js +0 -0
- package/dist/esm/core/signingLanes/ecdsaServerRetirement.js +78 -0
- package/dist/esm/core/signingLanes/ed25519ServerRetirement.js +71 -0
- package/dist/esm/core/signingLanes/index.js +8 -0
- package/dist/esm/core/signingLanes/signingWorkerLaneMaterialIdentity.js +0 -0
- package/dist/esm/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.js +305 -0
- package/dist/esm/core/threeRouteRegistrationContracts.js +5 -0
- package/dist/esm/core/thresholdEcdsaChainTarget.js +49 -0
- package/dist/esm/core/types.js +8 -0
- package/dist/esm/core/utils.js +14 -0
- package/dist/esm/delegateAction/index.js +136 -0
- package/dist/esm/hosted-wallet-gateway-worker.js +18 -0
- package/dist/esm/hosted-wallet-gateway.js +701 -0
- package/dist/esm/index.js +53 -0
- package/dist/esm/local-hosted-wallet-gateway-worker.js +23 -0
- package/dist/esm/node_modules/@near-js/types/lib/esm/provider/response.js +17 -0
- package/dist/esm/router/auth/authRequestValidation.js +264 -0
- package/dist/esm/router/auth/commonRouterUtils.js +305 -0
- package/dist/esm/router/auth/routerApiCredentialAuth.js +91 -0
- package/dist/esm/router/auth/routerApiKeyAuth.js +63 -0
- package/dist/esm/router/auth/walletSessionFailure.js +49 -0
- package/dist/esm/router/auth/webAuthnCredentialCodecs.js +107 -0
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthBoundary.js +84 -0
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthConfig.js +321 -0
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +1581 -0
- package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +1820 -0
- package/dist/esm/router/cloudflare/d1/authorization/d1VaultProxyStore.js +122 -0
- package/dist/esm/router/cloudflare/d1/authorization/walletSessionAuthorityProjection.js +119 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +1831 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEd25519ExportRootStore.js +118 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpGrantStore.js +81 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpTargetFactor.js +539 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceManagementService.js +92 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +560 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +136 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRouteService.js +95 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.js +91 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionService.js +15 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.js +732 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSourceContributionPreparationPlanner.js +195 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetAuthenticatorStore.js +100 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +867 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.js +169 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.js +255 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkSourceReader.js +128 -0
- package/dist/esm/router/cloudflare/d1/deviceLinking/index.js +15 -0
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoCapabilityPersistence.js +311 -0
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js +21 -0
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoWalletSigner.js +65 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +216 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeService.js +326 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +346 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +495 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpDeliveryRuntime.js +157 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpEnrollmentStore.js +248 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpGrantStore.js +66 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.js +76 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +539 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +404 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRegistrationEnrollmentFinalizer.js +200 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpServerSealRuntime.js +84 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationAttemptStore.js +217 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationRecords.js +485 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +509 -0
- package/dist/esm/router/cloudflare/d1/identity/d1IdentityRecords.js +51 -0
- package/dist/esm/router/cloudflare/d1/identity/d1IdentityService.js +135 -0
- package/dist/esm/router/cloudflare/d1/near/d1NearPublicKeyStore.js +62 -0
- package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +272 -0
- package/dist/esm/router/cloudflare/d1/oidc/d1OidcVerificationService.js +132 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyEnvelopeStore.js +628 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.js +871 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +823 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpAttemptStore.js +38 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpRecords.js +304 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpService.js +793 -0
- package/dist/esm/router/cloudflare/d1/registration/d1EvmFamilyEcdsaRegistrationBranch.js +120 -0
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +317 -0
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +2084 -0
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +309 -0
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationIntentService.js +120 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +263 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +3887 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +182 -0
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +399 -0
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +486 -0
- package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +146 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1EcdsaLanePrivateBindingResolver.js +10 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneAggregateRevocationApplicationService.js +22 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneEffectJournalStore.js +167 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneEnrollmentGateway.js +38 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLifecycleApplicationService.js +20 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLifecycleStore.js +1459 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLockStore.js +114 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneProtocolCommitter.js +16 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneRecords.js +170 -0
- package/dist/esm/router/cloudflare/d1/signingLanes/index.js +10 -0
- package/dist/esm/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.js +412 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +1396 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodBoundary.js +285 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +2018 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +792 -0
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +635 -0
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnRecords.js +538 -0
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnStore.js +264 -0
- package/dist/esm/router/cloudflare/durableObjects/thresholdStore.js +514 -0
- package/dist/esm/router/cloudflare/durableObjects/versionedJsonRecordStore.js +192 -0
- package/dist/esm/router/cloudflare/runtime/cloudflare.types.js +0 -0
- package/dist/esm/router/cloudflare/runtime/cloudflareSignerWasm.js +8 -0
- package/dist/esm/router/cloudflare/runtime/createCloudflareRouter.js +19 -0
- package/dist/esm/router/cloudflare/runtime/createSelfHostedCloudflareSigningWorker.js +94 -0
- package/dist/esm/router/cloudflare/runtime/ed25519SessionAdapter.js +106 -0
- package/dist/esm/router/cloudflare/runtime/environment.js +25 -0
- package/dist/esm/router/cloudflare/runtime/routerAbPrewarm.js +34 -0
- package/dist/esm/router/cloudflare/runtime/routerAbServiceBindings.js +33 -0
- package/dist/esm/router/cloudflare/runtime/sessionAdapterRuntime.js +104 -0
- package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +168 -0
- package/dist/esm/router/cloudflare/runtime/tenantRootCreationGrant.js +147 -0
- package/dist/esm/router/cloudflare/runtime/walletConsoleOps.js +143 -0
- package/dist/esm/router/cloudflare/runtime/walletConsoleOpsClient.js +227 -0
- package/dist/esm/router/cloudflare/runtime/walletConsoleTenantRootLineage.js +30 -0
- package/dist/esm/router/cloudflare/runtime/walletControlOps.js +107 -0
- package/dist/esm/router/cloudflare/runtime/walletGateway.js +149 -0
- package/dist/esm/router/cloudflare/runtime/walletRuntimeOps.js +322 -0
- package/dist/esm/router/cloudflare/runtime/walletRuntimeOpsHandler.js +48 -0
- package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.js +597 -0
- package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.js +272 -0
- package/dist/esm/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js +477 -0
- package/dist/esm/router/cloudflare/signingLanes/index.js +4 -0
- package/dist/esm/router/cloudflare/signingLanes/linkedDeviceEd25519CeremonyBinding.js +32 -0
- package/dist/esm/router/cloudflare-adaptor.js +45 -0
- package/dist/esm/router/cloudflare.js +42794 -0
- package/dist/esm/router/domains/ecdsa/routerAbEcdsaStrictRegistration.js +738 -0
- package/dist/esm/router/domains/ecdsa/thresholdEcdsaRequestValidation.js +134 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +368 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +624 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.js +143 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js +270 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRunner.js +31 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js +162 -0
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +1366 -0
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +465 -0
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js +1609 -0
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +540 -0
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js +394 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js +572 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js +555 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.js +268 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +329 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js +423 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js +432 -0
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationTwoPhaseRunner.js +58 -0
- package/dist/esm/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.js +0 -0
- package/dist/esm/router/domains/ed25519Yao/session/routerAbEd25519YaoWalletSession.js +0 -0
- package/dist/esm/router/domains/ed25519Yao/session/thresholdEd25519RequestValidation.js +275 -0
- package/dist/esm/router/domains/emailOtp/emailOtpExportPolicy.js +70 -0
- package/dist/esm/router/domains/emailOtp/emailOtpRequestValidation.js +34 -0
- package/dist/esm/router/domains/emailOtp/emailOtpRouteHandlers.js +218 -0
- package/dist/esm/router/domains/emailOtp/emailOtpSessionRouteHelpers.js +210 -0
- package/dist/esm/router/domains/passkeyCustody/envelopeRevocationAdmission.js +26 -0
- package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.js +107 -0
- package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrievalRoute.js +45 -0
- package/dist/esm/router/domains/passkeyCustody/registrationCustodyOutcome.js +47 -0
- package/dist/esm/router/domains/passkeyCustody/verifiedCustodyFactor.js +46 -0
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.js +32 -0
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +170 -0
- package/dist/esm/router/domains/passkeyCustody/walletRecoveryAttempt.js +64 -0
- package/dist/esm/router/domains/passkeyCustody/walletRecoveryFinalization.js +652 -0
- package/dist/esm/router/domains/passkeyCustody/walletRecoveryKeyManifest.js +396 -0
- package/dist/esm/router/domains/passkeyCustody/walletRecoveryRotation.js +87 -0
- package/dist/esm/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.js +89 -0
- package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmissionCore.js +106 -0
- package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +2669 -0
- package/dist/esm/router/domains/signingOperations/walletExecutionAdmission.js +228 -0
- package/dist/esm/router/domains/syncAccount/syncAccountRequestValidation.js +78 -0
- package/dist/esm/router/domains/tenantRoot/tenantRootCustodyLineage.js +0 -0
- package/dist/esm/router/domains/tenantRoot/tenantRootEcdsaWalletSessionComposition.js +55 -0
- package/dist/esm/router/domains/tenantRoot/tenantRootEd25519WalletSessionComposition.js +56 -0
- package/dist/esm/router/domains/tenantRoot/tenantRootIdentityResolution.js +111 -0
- package/dist/esm/router/domains/walletRegistration/walletRegistrationInputs.js +0 -0
- package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +2199 -0
- package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +155 -0
- package/dist/esm/router/domains/walletUnlock/walletUnlockRequestedCapabilitiesValidation.js +84 -0
- package/dist/esm/router/domains/walletUnlock/walletUnlockRouteHandlers.js +1142 -0
- package/dist/esm/router/express-adaptor.js +84 -0
- package/dist/esm/router/express.js +26616 -0
- package/dist/esm/router/framework/apiCredentialPorts.js +11 -0
- package/dist/esm/router/framework/applyRouteMetering.js +26 -0
- package/dist/esm/router/framework/authServicePort.js +30 -0
- package/dist/esm/router/framework/enforceRoutePolicy.js +92 -0
- package/dist/esm/router/framework/http.js +87 -0
- package/dist/esm/router/framework/logger.js +7 -0
- package/dist/esm/router/framework/modules.js +34 -0
- package/dist/esm/router/framework/ror/index.js +5 -0
- package/dist/esm/router/framework/ror/normalize.js +57 -0
- package/dist/esm/router/framework/ror/options.js +33 -0
- package/dist/esm/router/framework/ror/provider.js +33 -0
- package/dist/esm/router/framework/ror/staticProvider.js +24 -0
- package/dist/esm/router/framework/routeAuthPolicy.js +16 -0
- package/dist/esm/router/framework/routeDefinitions.js +446 -0
- package/dist/esm/router/framework/routeExecutionContext.js +24 -0
- package/dist/esm/router/framework/routeExtensions.js +50 -0
- package/dist/esm/router/framework/routeMeteringPolicy.js +0 -0
- package/dist/esm/router/framework/routeRequestValidation.js +32 -0
- package/dist/esm/router/framework/routeResponses.js +33 -0
- package/dist/esm/router/framework/routerApi.js +42 -0
- package/dist/esm/router/framework/routerApiRouteSurface.js +54 -0
- package/dist/esm/router/framework/routerApiWebhooks.js +60 -0
- package/dist/esm/router/framework/runtimeSnapshotConsumer.js +145 -0
- package/dist/esm/router/framework/versionedJsonRecordStore.js +0 -0
- package/dist/esm/router/ror-adaptor.js +5 -0
- package/dist/esm/router/ror.js +178 -0
- package/dist/esm/router/transport/fetch/createFetchRouter.js +309 -0
- package/dist/esm/router/transport/fetch/fetchRouter.types.js +0 -0
- package/dist/esm/router/transport/fetch/routes/auth.js +219 -0
- package/dist/esm/router/transport/fetch/routes/deviceLinking.js +1196 -0
- package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +264 -0
- package/dist/esm/router/transport/fetch/routes/deviceManagement.js +289 -0
- package/dist/esm/router/transport/fetch/routes/health.js +42 -0
- package/dist/esm/router/transport/fetch/routes/nearPublicKeys.js +39 -0
- package/dist/esm/router/transport/fetch/routes/normalSigningRouterProxy.js +118 -0
- package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +1618 -0
- package/dist/esm/router/transport/fetch/routes/sessions.js +1033 -0
- package/dist/esm/router/transport/fetch/routes/syncAccount.js +187 -0
- package/dist/esm/router/transport/fetch/routes/syncAccountBootstrap.js +214 -0
- package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +1729 -0
- package/dist/esm/router/transport/fetch/routes/thresholdEd25519.js +1321 -0
- package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +228 -0
- package/dist/esm/router/transport/fetch/routes/walletRegistration.js +73 -0
- package/dist/esm/router/transport/fetch/routes/webauthnAuthenticators.js +43 -0
- package/dist/esm/router/transport/fetch/routes/wellKnown.js +48 -0
- package/dist/esm/shared-ts/src/authorization/capabilityKinds.js +224 -0
- package/dist/esm/shared-ts/src/authorization/delegatedAuthority.js +134 -0
- package/dist/esm/shared-ts/src/authorization/index.js +6 -0
- package/dist/esm/shared-ts/src/authorization/operationFingerprint.js +58 -0
- package/dist/esm/shared-ts/src/authorization/walletAuthority.js +802 -0
- package/dist/esm/shared-ts/src/authorization/walletCustodyOperation.js +18 -0
- package/dist/esm/shared-ts/src/authorization/walletSessionIssuance.js +5 -0
- package/dist/esm/shared-ts/src/device-linking/committedSignerPackages.js +332 -0
- package/dist/esm/shared-ts/src/device-linking/contracts.js +8 -0
- package/dist/esm/shared-ts/src/device-linking/delegatedActivationPlan.js +132 -0
- package/dist/esm/shared-ts/src/device-linking/digests.js +273 -0
- package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +158 -0
- package/dist/esm/shared-ts/src/device-linking/index.js +9 -0
- package/dist/esm/shared-ts/src/device-linking/parsers.js +1412 -0
- package/dist/esm/shared-ts/src/device-linking/requestProof.js +114 -0
- package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +563 -0
- package/dist/esm/shared-ts/src/device-linking/walletSessionCredentialDelivery.js +207 -0
- package/dist/esm/shared-ts/src/near/actions.js +75 -0
- package/dist/esm/shared-ts/src/passkey-custody/ceremonyCommitPayload.js +69 -0
- package/dist/esm/shared-ts/src/passkey-custody/credentialActivity.js +81 -0
- package/dist/esm/shared-ts/src/passkey-custody/custodyEnvelope.js +272 -0
- package/dist/esm/shared-ts/src/passkey-custody/custodySecretBinding.js +175 -0
- package/dist/esm/shared-ts/src/passkey-custody/index.js +5 -0
- package/dist/esm/shared-ts/src/passkey-custody/primitives.js +92 -0
- package/dist/esm/shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.js +53 -0
- package/dist/esm/shared-ts/src/signing-lanes/execution.js +14 -0
- package/dist/esm/shared-ts/src/signing-lanes/index.js +11 -0
- package/dist/esm/shared-ts/src/signing-lanes/linkedEcdsaScope.js +1 -0
- package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +91 -0
- package/dist/esm/shared-ts/src/signing-lanes/participantDigest.js +124 -0
- package/dist/esm/shared-ts/src/signing-lanes/participants.js +262 -0
- package/dist/esm/shared-ts/src/signing-lanes/recordParsers.js +143 -0
- package/dist/esm/shared-ts/src/signing-lanes/rotation.js +8 -0
- package/dist/esm/shared-ts/src/signing-lanes/rotationDigests.js +397 -0
- package/dist/esm/shared-ts/src/signing-lanes/rotationLifecycle.js +313 -0
- package/dist/esm/shared-ts/src/signing-lanes/rotationParsers.js +1620 -0
- package/dist/esm/shared-ts/src/tenant-root/index.js +2 -0
- package/dist/esm/shared-ts/src/tenant-root/tenantRootIdentity.js +198 -0
- package/dist/esm/shared-ts/src/tenant-root/tenantRootOperationRecord.js +440 -0
- package/dist/esm/shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.js +85 -0
- package/dist/esm/shared-ts/src/threshold/participants.js +26 -0
- package/dist/esm/shared-ts/src/threshold/sessionPolicy.js +9 -0
- package/dist/esm/shared-ts/src/threshold/signingRootScope.js +40 -0
- package/dist/esm/shared-ts/src/utils/addAuthMethodRegistration.js +104 -0
- package/dist/esm/shared-ts/src/utils/addWalletAuthMethod.js +36 -0
- package/dist/esm/shared-ts/src/utils/base58.js +28 -0
- package/dist/esm/shared-ts/src/utils/base64.js +70 -0
- package/dist/esm/shared-ts/src/utils/canonicalPrimitives.js +27 -0
- package/dist/esm/shared-ts/src/utils/digests.js +33 -0
- package/dist/esm/shared-ts/src/utils/domainIds.js +309 -0
- package/dist/esm/shared-ts/src/utils/ecdsaCapabilityActivation.js +34 -0
- package/dist/esm/shared-ts/src/utils/ecdsaKeyFactsInventory.js +46 -0
- package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +38 -0
- package/dist/esm/shared-ts/src/utils/emailOtpRecoveryKey.js +10 -0
- package/dist/esm/shared-ts/src/utils/encoders.js +2 -0
- package/dist/esm/shared-ts/src/utils/errors.js +88 -0
- package/dist/esm/shared-ts/src/utils/evmRpcResults.js +97 -0
- package/dist/esm/shared-ts/src/utils/jsonRpc.js +64 -0
- package/dist/esm/shared-ts/src/utils/keccak.js +150 -0
- package/dist/esm/shared-ts/src/utils/near.js +99 -0
- package/dist/esm/shared-ts/src/utils/nearRpcResults.js +205 -0
- package/dist/esm/shared-ts/src/utils/normalize.js +87 -0
- package/dist/esm/shared-ts/src/utils/registrationEstablishedSession.js +201 -0
- package/dist/esm/shared-ts/src/utils/registrationIntent.js +1268 -0
- package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +1655 -0
- package/dist/esm/shared-ts/src/utils/routerAbEd25519Yao.js +984 -0
- package/dist/esm/shared-ts/src/utils/routerAbNormalSigningIdentity.js +118 -0
- package/dist/esm/shared-ts/src/utils/routerAbPublicKeyset.js +138 -0
- package/dist/esm/shared-ts/src/utils/routerAbTraceContext.js +36 -0
- package/dist/esm/shared-ts/src/utils/secureRandomId.js +35 -0
- package/dist/esm/shared-ts/src/utils/signingSessionSeal.js +118 -0
- package/dist/esm/shared-ts/src/utils/thresholdEcdsaKeyHandle.js +28 -0
- package/dist/esm/shared-ts/src/utils/validation.js +23 -0
- package/dist/esm/shared-ts/src/utils/walletAddSignerActivation.js +32 -0
- package/dist/esm/shared-ts/src/utils/walletAuthAuthority.js +207 -0
- package/dist/esm/shared-ts/src/utils/walletSessionFailure.js +15 -0
- package/dist/esm/shared-ts/src/utils/webauthnDeviceInfo.js +207 -0
- package/dist/esm/shared-ts/src/wallet-recovery/backupAcknowledgement.js +66 -0
- package/dist/esm/shared-ts/src/wallet-recovery/index.js +10 -0
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeIssuance.js +1 -0
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeLocator.js +34 -0
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeReservation.js +80 -0
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodes.js +4 -0
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryKeyId.js +53 -0
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryCommittedProjection.js +108 -0
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.js +157 -0
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEnvelopeSet.js +233 -0
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryRotation.js +3 -0
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryTarget.js +29 -0
- package/dist/esm/storage/d1Sql.js +85 -0
- package/dist/esm/storage/tenantRoute.js +89 -0
- package/dist/esm/tenant-root.js +5 -0
- package/dist/esm/threshold/session/signingSessionSeal/crypto/cipher.js +204 -0
- package/dist/esm/threshold/session/signingSessionSeal/crypto/shamir3PassWasm.js +87 -0
- package/dist/esm/threshold/session/signingSessionSeal/guards/backends.js +192 -0
- package/dist/esm/threshold/session/signingSessionSeal/guards/index.js +121 -0
- package/dist/esm/threshold/session/signingSessionSeal/idempotency.js +38 -0
- package/dist/esm/threshold/session/signingSessionSeal/idempotencyBackends.js +131 -0
- package/dist/esm/threshold/session/signingSessionSeal/idempotencyRecords.js +55 -0
- package/dist/esm/threshold/session/signingSessionSeal/index.js +13 -0
- package/dist/esm/threshold/session/signingSessionSeal/observability/audit.js +38 -0
- package/dist/esm/threshold/session/signingSessionSeal/options.js +54 -0
- package/dist/esm/threshold/session/signingSessionSeal/routesOptions.js +45 -0
- package/dist/esm/threshold/session/signingSessionSeal/service.js +316 -0
- package/dist/esm/threshold/session/signingSessionSeal/signingSessionSeal.types.js +0 -0
- package/dist/esm/threshold/session/signingSessionSeal/transport/express.js +151 -0
- package/dist/esm/threshold/session/signingSessionSeal/transport/fetch.js +106 -0
- package/dist/esm/threshold/session/signingSessionSeal/transport/shared.js +159 -0
- package/dist/esm/threshold/statusCodes.js +39 -0
- package/dist/esm/wasm/evm_crypto/pkg/evm_crypto.js +601 -0
- package/dist/esm/wasm/evm_crypto/pkg/evm_crypto_bg.wasm +0 -0
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker.js +1078 -0
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
- package/dist/esm/wasm/router_ab_ecdsa_signing_worker/pkg/router_ab_ecdsa_signing_worker.js +503 -0
- package/dist/esm/wasm/router_ab_ecdsa_signing_worker/pkg/router_ab_ecdsa_signing_worker_bg.wasm +0 -0
- package/dist/esm/wasm/shamir3pass_runtime/pkg/shamir3pass_runtime.js +393 -0
- package/dist/esm/wasm/shamir3pass_runtime/pkg/shamir3pass_runtime_bg.wasm +0 -0
- package/dist/esm/wasm/signer.js +2 -0
- package/dist/types/shared-ts/src/authorization/capabilityKinds.d.ts +147 -0
- package/dist/types/shared-ts/src/authorization/capabilityKinds.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/authorization/delegatedAuthority.d.ts +44 -0
- package/dist/types/shared-ts/src/authorization/index.d.ts +7 -0
- package/dist/types/shared-ts/src/authorization/operationFingerprint.d.ts +39 -0
- package/dist/types/shared-ts/src/authorization/operationFingerprint.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/authorization/walletAuthority.d.ts +168 -0
- package/dist/types/shared-ts/src/authorization/walletAuthority.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/authorization/walletCustodyOperation.d.ts +10 -0
- package/dist/types/shared-ts/src/authorization/walletSessionIssuance.d.ts +28 -0
- package/dist/types/shared-ts/src/device-linking/activeWalletSession.d.ts +3 -0
- package/dist/types/shared-ts/src/device-linking/activeWalletSession.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/device-linking/committedSignerPackages.d.ts +71 -0
- package/dist/types/shared-ts/src/device-linking/contracts.d.ts +843 -0
- package/dist/types/shared-ts/src/device-linking/contracts.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/device-linking/delegatedActivationPlan.d.ts +37 -0
- package/dist/types/shared-ts/src/device-linking/digests.d.ts +23 -0
- package/dist/types/shared-ts/src/device-linking/ed25519ExportRoot.d.ts +93 -0
- package/dist/types/shared-ts/src/device-linking/index.d.ts +11 -0
- package/dist/types/shared-ts/src/device-linking/parsers.d.ts +124 -0
- package/dist/types/shared-ts/src/device-linking/requestProof.d.ts +26 -0
- package/dist/types/shared-ts/src/device-linking/sourceContribution.d.ts +182 -0
- package/dist/types/shared-ts/src/device-linking/walletSessionCredentialDelivery.d.ts +84 -0
- package/dist/types/shared-ts/src/index.d.ts +10 -0
- package/dist/types/shared-ts/src/near/actions.d.ts +141 -0
- package/dist/types/shared-ts/src/near/delegate.d.ts +55 -0
- package/dist/types/shared-ts/src/near/index.d.ts +3 -0
- package/dist/types/shared-ts/src/passkey-custody/ceremonyCommitPayload.d.ts +211 -0
- package/dist/types/shared-ts/src/passkey-custody/credentialActivity.d.ts +49 -0
- package/dist/types/shared-ts/src/passkey-custody/credentialObservations.d.ts +74 -0
- package/dist/types/shared-ts/src/passkey-custody/custodyEnvelope.d.ts +191 -0
- package/dist/types/shared-ts/src/passkey-custody/custodySecretBinding.d.ts +140 -0
- package/dist/types/shared-ts/src/passkey-custody/envelopeIndex.d.ts +29 -0
- package/dist/types/shared-ts/src/passkey-custody/index.d.ts +9 -0
- package/dist/types/shared-ts/src/passkey-custody/kekContext.d.ts +34 -0
- package/dist/types/shared-ts/src/passkey-custody/passkeyCustody.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/passkey-custody/primitives.d.ts +34 -0
- package/dist/types/shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.d.ts +27 -0
- package/dist/types/shared-ts/src/signing-lanes/execution.d.ts +91 -0
- package/dist/types/shared-ts/src/signing-lanes/execution.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/signing-lanes/ids.d.ts +18 -0
- package/dist/types/shared-ts/src/signing-lanes/index.d.ts +14 -0
- package/dist/types/shared-ts/src/signing-lanes/linkedEcdsaScope.d.ts +62 -0
- package/dist/types/shared-ts/src/signing-lanes/linkedEcdsaScope.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/signing-lanes/ownerContinuity.d.ts +30 -0
- package/dist/types/shared-ts/src/signing-lanes/ownerContinuity.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/signing-lanes/participantDigest.d.ts +48 -0
- package/dist/types/shared-ts/src/signing-lanes/participantDigest.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/signing-lanes/participants.d.ts +89 -0
- package/dist/types/shared-ts/src/signing-lanes/recordParsers.d.ts +128 -0
- package/dist/types/shared-ts/src/signing-lanes/records.d.ts +160 -0
- package/dist/types/shared-ts/src/signing-lanes/records.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/signing-lanes/rotation.d.ts +894 -0
- package/dist/types/shared-ts/src/signing-lanes/rotation.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/signing-lanes/rotationDigests.d.ts +32 -0
- package/dist/types/shared-ts/src/signing-lanes/rotationLifecycle.d.ts +99 -0
- package/dist/types/shared-ts/src/signing-lanes/rotationParsers.d.ts +67 -0
- package/dist/types/shared-ts/src/signing-lanes/validation.d.ts +11 -0
- package/dist/types/shared-ts/src/tenant-root/index.d.ts +3 -0
- package/dist/types/shared-ts/src/tenant-root/tenantRootIdentity.d.ts +72 -0
- package/dist/types/shared-ts/src/tenant-root/tenantRootOperationRecord.d.ts +192 -0
- package/dist/types/shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.d.ts +77 -0
- package/dist/types/shared-ts/src/threshold/ed25519OperationFingerprint.d.ts +130 -0
- package/dist/types/shared-ts/src/threshold/index.d.ts +7 -0
- package/dist/types/shared-ts/src/threshold/participants.d.ts +38 -0
- package/dist/types/shared-ts/src/threshold/secp256k1.d.ts +39 -0
- package/dist/types/shared-ts/src/threshold/sessionPolicy.d.ts +5 -0
- package/dist/types/shared-ts/src/threshold/signingRootScope.d.ts +24 -0
- package/dist/types/shared-ts/src/utils/addAuthMethodRegistration.d.ts +63 -0
- package/dist/types/shared-ts/src/utils/addWalletAuthMethod.d.ts +295 -0
- package/dist/types/shared-ts/src/utils/addWalletAuthMethod.typecheck.d.ts +11 -0
- package/dist/types/shared-ts/src/utils/authenticatorOptions.d.ts +25 -0
- package/dist/types/shared-ts/src/utils/base58.d.ts +17 -0
- package/dist/types/shared-ts/src/utils/base64.d.ts +53 -0
- package/dist/types/shared-ts/src/utils/bigint.d.ts +3 -0
- package/dist/types/shared-ts/src/utils/canonicalPrimitives.d.ts +12 -0
- package/dist/types/shared-ts/src/utils/digests.d.ts +6 -0
- package/dist/types/shared-ts/src/utils/domainIds.d.ts +140 -0
- package/dist/types/shared-ts/src/utils/domainIds.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/ecdsaCapabilityActivation.d.ts +29 -0
- package/dist/types/shared-ts/src/utils/ecdsaKeyFactsInventory.d.ts +24 -0
- package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +30 -0
- package/dist/types/shared-ts/src/utils/emailOtpRecoveryKey.d.ts +31 -0
- package/dist/types/shared-ts/src/utils/encoders.d.ts +3 -0
- package/dist/types/shared-ts/src/utils/errors.d.ts +44 -0
- package/dist/types/shared-ts/src/utils/evmRpcResults.d.ts +31 -0
- package/dist/types/shared-ts/src/utils/generated/routerAbEd25519YaoCore.d.ts +128 -0
- package/dist/types/shared-ts/src/utils/index.d.ts +34 -0
- package/dist/types/shared-ts/src/utils/jsonRpc.d.ts +30 -0
- package/dist/types/shared-ts/src/utils/keccak.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/near.d.ts +81 -0
- package/dist/types/shared-ts/src/utils/nearRpcResults.d.ts +101 -0
- package/dist/types/shared-ts/src/utils/normalize.d.ts +57 -0
- package/dist/types/shared-ts/src/utils/paillier.d.ts +37 -0
- package/dist/types/shared-ts/src/utils/recoveryDomain.d.ts +12 -0
- package/dist/types/shared-ts/src/utils/registrationEstablishedSession.d.ts +85 -0
- package/dist/types/shared-ts/src/utils/registrationIntent.d.ts +621 -0
- package/dist/types/shared-ts/src/utils/registrationIntent.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/routerAbEcdsaDerivation.d.ts +715 -0
- package/dist/types/shared-ts/src/utils/routerAbEcdsaDerivation.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/routerAbEcdsaDerivationRefresh.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/routerAbEd25519Yao.d.ts +339 -0
- package/dist/types/shared-ts/src/utils/routerAbEd25519Yao.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/routerAbNormalSigningIdentity.d.ts +71 -0
- package/dist/types/shared-ts/src/utils/routerAbPublicKeyset.d.ts +51 -0
- package/dist/types/shared-ts/src/utils/routerAbTraceContext.d.ts +16 -0
- package/dist/types/shared-ts/src/utils/secureRandomId.d.ts +6 -0
- package/dist/types/shared-ts/src/utils/signerDomain.d.ts +75 -0
- package/dist/types/shared-ts/src/utils/signerDomain.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/signerSlot.d.ts +11 -0
- package/dist/types/shared-ts/src/utils/signingSessionSeal.d.ts +153 -0
- package/dist/types/shared-ts/src/utils/signingSessionSeal.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/theme.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/thresholdEcdsaKeyHandle.d.ts +11 -0
- package/dist/types/shared-ts/src/utils/validation.d.ts +35 -0
- package/dist/types/shared-ts/src/utils/walletAddSignerActivation.d.ts +23 -0
- package/dist/types/shared-ts/src/utils/walletAuthAuthority.d.ts +150 -0
- package/dist/types/shared-ts/src/utils/walletAuthAuthority.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/walletCapabilityBindings.d.ts +106 -0
- package/dist/types/shared-ts/src/utils/walletCapabilityBindings.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/walletSessionFailure.d.ts +13 -0
- package/dist/types/shared-ts/src/utils/webauthnDeviceInfo.d.ts +48 -0
- package/dist/types/shared-ts/src/wallet-recovery/backupAcknowledgement.d.ts +56 -0
- package/dist/types/shared-ts/src/wallet-recovery/index.d.ts +10 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeAttempt.d.ts +59 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeIssuance.d.ts +37 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeLocator.d.ts +22 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeReservation.d.ts +79 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodes.d.ts +11 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryEnvelopes.d.ts +42 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryKekContext.d.ts +37 -0
- package/dist/types/shared-ts/src/wallet-recovery/recoveryKeyId.d.ts +58 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecovery.typecheck.d.ts +2 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryCommittedProjection.d.ts +110 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.d.ts +29 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryEnvelopeSet.d.ts +115 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryRotation.d.ts +18 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryTarget.d.ts +12 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryTarget.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/capabilityPolicy.d.ts +45 -0
- package/dist/types/wallet-server/src/authorization/capabilityPolicy.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/domain.d.ts +454 -0
- package/dist/types/wallet-server/src/authorization/domain.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/factorEvidence.d.ts +165 -0
- package/dist/types/wallet-server/src/authorization/factorEvidence.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/service.d.ts +227 -0
- package/dist/types/wallet-server/src/authorization/vaultProxyUse.d.ts +75 -0
- package/dist/types/wallet-server/src/cloud-host.d.ts +94 -0
- package/dist/types/wallet-server/src/core/AuthService.d.ts +3 -0
- package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +33 -0
- package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +336 -0
- package/dist/types/wallet-server/src/core/IdentityStore.d.ts +57 -0
- package/dist/types/wallet-server/src/core/NearPublicKeyStore.d.ts +58 -0
- package/dist/types/wallet-server/src/core/RegistrationCeremonyStore.d.ts +551 -0
- package/dist/types/wallet-server/src/core/SessionService.d.ts +70 -0
- package/dist/types/wallet-server/src/core/ThresholdService/config.d.ts +23 -0
- package/dist/types/wallet-server/src/core/ThresholdService/ecdsaClientRootProof.d.ts +12 -0
- package/dist/types/wallet-server/src/core/ThresholdService/evmCryptoWasm.d.ts +32 -0
- package/dist/types/wallet-server/src/core/ThresholdService/index.d.ts +4 -0
- package/dist/types/wallet-server/src/core/ThresholdService/kv.d.ts +52 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +45 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillLiveSession.d.ts +93 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.d.ts +138 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/internalServiceHttp.d.ts +30 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAbEcdsaSigningWorkerWasm.d.ts +17 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAbNormalSigningPolicy.d.ts +21 -0
- package/dist/types/wallet-server/src/core/ThresholdService/secureRandomId.d.ts +2 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/CloudflareDurableObjectStore.d.ts +128 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/EcdsaSigningStore.d.ts +76 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/KeyStore.d.ts +39 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/SessionStore.d.ts +102 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/StoreConfig.d.ts +3 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/ThresholdStoreConfig.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/WalletSessionStore.d.ts +98 -0
- package/dist/types/wallet-server/src/core/ThresholdService/thresholdEd25519AuthorityScope.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/core/ThresholdService/validation.d.ts +193 -0
- package/dist/types/wallet-server/src/core/WalletAuthMethodStore.d.ts +12 -0
- package/dist/types/wallet-server/src/core/WalletStore.d.ts +143 -0
- package/dist/types/wallet-server/src/core/WalletStore.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/core/WebAuthnAuthenticatorStore.d.ts +62 -0
- package/dist/types/wallet-server/src/core/WebAuthnCredentialBindingStore.d.ts +116 -0
- package/dist/types/wallet-server/src/core/WebAuthnCredentialBindingStore.typecheck.d.ts +13 -0
- package/dist/types/wallet-server/src/core/WebAuthnLoginChallengeStore.d.ts +50 -0
- package/dist/types/wallet-server/src/core/WebAuthnSyncChallengeStore.d.ts +50 -0
- package/dist/types/wallet-server/src/core/authService/AuthService.d.ts +493 -0
- package/dist/types/wallet-server/src/core/authService/bytes.d.ts +4 -0
- package/dist/types/wallet-server/src/core/authService/configValues.d.ts +7 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpChallengeOperations.d.ts +108 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpChallengeProof.d.ts +177 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpChallengeVerification.d.ts +46 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpChallenges.d.ts +110 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpConfig.d.ts +34 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpDelivery.d.ts +65 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpEnrollment.d.ts +79 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpGrant.d.ts +42 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpRegistrationEnrollment.d.ts +116 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpSeal.d.ts +35 -0
- package/dist/types/wallet-server/src/core/authService/emailOtpUnlock.d.ts +70 -0
- package/dist/types/wallet-server/src/core/authService/githubOAuth.d.ts +35 -0
- package/dist/types/wallet-server/src/core/authService/googleEmailOtpErrors.d.ts +2 -0
- package/dist/types/wallet-server/src/core/authService/googleEmailOtpOperations.d.ts +126 -0
- package/dist/types/wallet-server/src/core/authService/googleEmailOtpRegistration.d.ts +172 -0
- package/dist/types/wallet-server/src/core/authService/identity.d.ts +25 -0
- package/dist/types/wallet-server/src/core/authService/identityOperations.d.ts +19 -0
- package/dist/types/wallet-server/src/core/authService/nearAccountOperations.d.ts +55 -0
- package/dist/types/wallet-server/src/core/authService/nearPrivateKeySigning.d.ts +16 -0
- package/dist/types/wallet-server/src/core/authService/nearPublicKeyMetadata.d.ts +43 -0
- package/dist/types/wallet-server/src/core/authService/nearTransactions.d.ts +49 -0
- package/dist/types/wallet-server/src/core/authService/oidcVerification.d.ts +65 -0
- package/dist/types/wallet-server/src/core/authService/portableCrypto.d.ts +3 -0
- package/dist/types/wallet-server/src/core/authService/rateLimits.d.ts +30 -0
- package/dist/types/wallet-server/src/core/authService/record.d.ts +2 -0
- package/dist/types/wallet-server/src/core/authService/registrationThresholdHelpers.d.ts +37 -0
- package/dist/types/wallet-server/src/core/authService/runtime.d.ts +20 -0
- package/dist/types/wallet-server/src/core/authService/signerWasmUrls.d.ts +3 -0
- package/dist/types/wallet-server/src/core/authService/storeRegistry.d.ts +58 -0
- package/dist/types/wallet-server/src/core/authService/thresholdEcdsaKeyInventory.d.ts +72 -0
- package/dist/types/wallet-server/src/core/authService/thresholdRuntimePolicy.d.ts +4 -0
- package/dist/types/wallet-server/src/core/authService/thresholdStoreSummary.d.ts +3 -0
- package/dist/types/wallet-server/src/core/authService/walletRegistrationPlanning.d.ts +19 -0
- package/dist/types/wallet-server/src/core/authService/wasm.d.ts +12 -0
- package/dist/types/wallet-server/src/core/authService/webauthn.d.ts +207 -0
- package/dist/types/wallet-server/src/core/authService/webauthnAuthority.d.ts +5 -0
- package/dist/types/wallet-server/src/core/authService/webauthnOidcHelpers.d.ts +52 -0
- package/dist/types/wallet-server/src/core/authService/webauthnWalletBinding.d.ts +48 -0
- package/dist/types/wallet-server/src/core/config.d.ts +13 -0
- package/dist/types/wallet-server/src/core/d1IdentityStore.d.ts +44 -0
- package/dist/types/wallet-server/src/core/d1WalletAuthMethodStore.d.ts +214 -0
- package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +108 -0
- package/dist/types/wallet-server/src/core/defaultConfigsServer.d.ts +5 -0
- package/dist/types/wallet-server/src/core/deviceLinking/index.d.ts +5 -0
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceEd25519ExportRoot.d.ts +36 -0
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceEmailOtpGrant.d.ts +87 -0
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceManagement.d.ts +137 -0
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceSession.d.ts +462 -0
- package/dist/types/wallet-server/src/core/deviceLinking/requestProof.d.ts +55 -0
- package/dist/types/wallet-server/src/core/errors.d.ts +10 -0
- package/dist/types/wallet-server/src/core/hostedAccountIds.d.ts +31 -0
- package/dist/types/wallet-server/src/core/keyMaterialBrands.d.ts +28 -0
- package/dist/types/wallet-server/src/core/keyMaterialBrands.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/core/logger.d.ts +21 -0
- package/dist/types/wallet-server/src/core/nearKeys.d.ts +3 -0
- package/dist/types/wallet-server/src/core/nearRelayerAccountProvisioning.d.ts +78 -0
- package/dist/types/wallet-server/src/core/nearSignerWasmRuntime.d.ts +3 -0
- package/dist/types/wallet-server/src/core/registrationContracts.d.ts +747 -0
- package/dist/types/wallet-server/src/core/registrationRequests.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbEcdsaPresignRuntime.d.ts +53 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbNormalSigningRuntime.d.ts +71 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/createCloudflareDurableObjectRouterAbSigningRuntimes.d.ts +28 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/createRouterAbSigningRuntimes.d.ts +16 -0
- package/dist/types/wallet-server/src/core/rpcClients/near/NearClient.d.ts +134 -0
- package/dist/types/wallet-server/src/core/sessionValidation.d.ts +9 -0
- package/dist/types/wallet-server/src/core/signingLanes/LaneAggregateRevocationApplicationService.d.ts +35 -0
- package/dist/types/wallet-server/src/core/signingLanes/LaneEffectJournalStore.d.ts +63 -0
- package/dist/types/wallet-server/src/core/signingLanes/LaneEnrollmentActivation.d.ts +13 -0
- package/dist/types/wallet-server/src/core/signingLanes/LaneEnrollmentRevocation.d.ts +24 -0
- package/dist/types/wallet-server/src/core/signingLanes/LaneLifecycleApplicationService.d.ts +141 -0
- package/dist/types/wallet-server/src/core/signingLanes/LaneLifecycleStore.d.ts +229 -0
- package/dist/types/wallet-server/src/core/signingLanes/SigningLaneStore.d.ts +15 -0
- package/dist/types/wallet-server/src/core/signingLanes/WalletExecutionLaneProjection.d.ts +59 -0
- package/dist/types/wallet-server/src/core/signingLanes/WalletKeyStore.d.ts +13 -0
- package/dist/types/wallet-server/src/core/signingLanes/ecdsaServerRetirement.d.ts +58 -0
- package/dist/types/wallet-server/src/core/signingLanes/ed25519ServerRetirement.d.ts +30 -0
- package/dist/types/wallet-server/src/core/signingLanes/index.d.ts +11 -0
- package/dist/types/wallet-server/src/core/signingLanes/signingWorkerLaneMaterialIdentity.d.ts +21 -0
- package/dist/types/wallet-server/src/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.d.ts +155 -0
- package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +442 -0
- package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.typecheck.d.ts +58 -0
- package/dist/types/wallet-server/src/core/thresholdEcdsaChainTarget.d.ts +15 -0
- package/dist/types/wallet-server/src/core/types.d.ts +757 -0
- package/dist/types/wallet-server/src/core/utils.d.ts +3 -0
- package/dist/types/wallet-server/src/delegateAction/index.d.ts +88 -0
- package/dist/types/wallet-server/src/hosted-wallet-gateway-worker.d.ts +10 -0
- package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +126 -0
- package/dist/types/wallet-server/src/index.d.ts +34 -0
- package/dist/types/wallet-server/src/local-hosted-wallet-gateway-worker.d.ts +13 -0
- package/dist/types/wallet-server/src/router/auth/authRequestValidation.d.ts +97 -0
- package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +142 -0
- package/dist/types/wallet-server/src/router/auth/routerApiCredentialAuth.d.ts +26 -0
- package/dist/types/wallet-server/src/router/auth/routerApiKeyAuth.d.ts +16 -0
- package/dist/types/wallet-server/src/router/auth/walletSessionFailure.d.ts +14 -0
- package/dist/types/wallet-server/src/router/auth/webAuthnCredentialCodecs.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthBoundary.d.ts +28 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +192 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +174 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1VaultProxyStore.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/walletSessionAuthorityProjection.d.ts +24 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +241 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEd25519ExportRootStore.d.ts +23 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpGrantStore.d.ts +32 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpTargetFactor.d.ts +118 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceManagementService.d.ts +22 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.d.ts +80 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.d.ts +29 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRouteService.d.ts +17 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.d.ts +37 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionService.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.d.ts +149 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSourceContributionPreparationPlanner.d.ts +38 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetAuthenticatorStore.d.ts +19 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.d.ts +220 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.d.ts +88 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.d.ts +54 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkSourceReader.d.ts +23 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/index.d.ts +15 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoCapabilityPersistence.d.ts +33 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.d.ts +6 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoWalletSigner.d.ts +27 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.d.ts +80 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeService.d.ts +48 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +64 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.d.ts +126 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpDeliveryRuntime.d.ts +22 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpEnrollmentStore.d.ts +68 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpGrantStore.d.ts +15 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +37 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +186 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.d.ts +45 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRegistrationEnrollmentFinalizer.d.ts +124 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpServerSealRuntime.d.ts +24 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationAttemptStore.d.ts +51 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationRecords.d.ts +69 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.d.ts +57 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/identity/d1IdentityRecords.d.ts +38 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/identity/d1IdentityService.d.ts +31 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/near/d1NearPublicKeyStore.d.ts +30 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/oidc/d1OidcBoundary.d.ts +60 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/oidc/d1OidcVerificationService.d.ts +39 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyEnvelopeStore.d.ts +335 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.d.ts +448 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +256 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpAttemptStore.d.ts +32 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpRecords.d.ts +116 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpService.d.ts +180 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1EvmFamilyEcdsaRegistrationBranch.d.ts +24 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +86 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.d.ts +121 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +84 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationIntentService.d.ts +31 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +49 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +369 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetup.d.ts +106 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.d.ts +104 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.d.ts +70 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +26 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1EcdsaLanePrivateBindingResolver.d.ts +4 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneAggregateRevocationApplicationService.d.ts +4 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneEffectJournalStore.d.ts +25 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneEnrollmentGateway.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLifecycleApplicationService.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLifecycleStore.d.ts +51 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLockStore.d.ts +28 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneProtocolCommitter.d.ts +5 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneRecords.d.ts +107 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/index.d.ts +10 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.d.ts +118 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +114 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodBoundary.d.ts +90 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +359 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +143 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.d.ts +42 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnRecords.d.ts +135 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnStore.d.ts +89 -0
- package/dist/types/wallet-server/src/router/cloudflare/durableObjects/thresholdStore.d.ts +19 -0
- package/dist/types/wallet-server/src/router/cloudflare/durableObjects/versionedJsonRecordStore.d.ts +32 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/cloudflare.types.d.ts +30 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/cloudflareSignerWasm.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/createCloudflareRouter.d.ts +5 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/createSelfHostedCloudflareSigningWorker.d.ts +23 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/ed25519SessionAdapter.d.ts +16 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/environment.d.ts +5 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/routerAbPrewarm.d.ts +9 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/routerAbServiceBindings.d.ts +11 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/sessionAdapterRuntime.d.ts +28 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/staticWalletConsoleBinding.d.ts +27 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/tenantRootCreationGrant.d.ts +24 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +143 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOpsClient.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleTenantRootLineage.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletControlOps.d.ts +21 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +30 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRuntimeOps.d.ts +64 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRuntimeOpsHandler.d.ts +3 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.d.ts +217 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.d.ts +73 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.d.ts +100 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/index.d.ts +4 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/linkedDeviceEd25519CeremonyBinding.d.ts +6 -0
- package/dist/types/wallet-server/src/router/cloudflare-adaptor.d.ts +75 -0
- package/dist/types/wallet-server/src/router/domains/ecdsa/routerAbEcdsaStrictRegistration.d.ts +199 -0
- package/dist/types/wallet-server/src/router/domains/ecdsa/thresholdEcdsaRequestValidation.d.ts +32 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +172 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.d.ts +156 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.d.ts +59 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.d.ts +47 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRunner.d.ts +29 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.d.ts +20 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +271 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.d.ts +12 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.d.ts +509 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryActivation.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.d.ts +14 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.d.ts +20 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.d.ts +56 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.d.ts +200 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.d.ts +70 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.d.ts +73 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.d.ts +9 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.d.ts +131 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationTwoPhaseRunner.d.ts +62 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.d.ts +17 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/session/routerAbEd25519YaoWalletSession.d.ts +178 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/session/routerAbEd25519YaoWalletSession.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/session/thresholdEd25519RequestValidation.d.ts +19 -0
- package/dist/types/wallet-server/src/router/domains/emailOtp/emailOtpExportPolicy.d.ts +32 -0
- package/dist/types/wallet-server/src/router/domains/emailOtp/emailOtpRequestValidation.d.ts +13 -0
- package/dist/types/wallet-server/src/router/domains/emailOtp/emailOtpRouteHandlers.d.ts +35 -0
- package/dist/types/wallet-server/src/router/domains/emailOtp/emailOtpSessionRouteHelpers.d.ts +134 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/envelopeRevocationAdmission.d.ts +31 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.d.ts +85 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrievalRoute.d.ts +42 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/registrationCustodyOutcome.d.ts +38 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/verifiedCustodyFactor.d.ts +35 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.d.ts +56 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +65 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletRecoveryAttempt.d.ts +59 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletRecoveryFinalization.d.ts +81 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletRecoveryKeyManifest.d.ts +184 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletRecoveryRotation.d.ts +31 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.d.ts +32 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmissionCore.d.ts +48 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbPrivateSigningWorker.d.ts +909 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/walletExecutionAdmission.d.ts +104 -0
- package/dist/types/wallet-server/src/router/domains/syncAccount/syncAccountRequestValidation.d.ts +30 -0
- package/dist/types/wallet-server/src/router/domains/tenantRoot/tenantRootCustodyLineage.d.ts +14 -0
- package/dist/types/wallet-server/src/router/domains/tenantRoot/tenantRootEcdsaWalletSessionComposition.d.ts +35 -0
- package/dist/types/wallet-server/src/router/domains/tenantRoot/tenantRootEd25519WalletSessionComposition.d.ts +35 -0
- package/dist/types/wallet-server/src/router/domains/tenantRoot/tenantRootIdentityResolution.d.ts +56 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +78 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +91 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationSetupPayload.d.ts +105 -0
- package/dist/types/wallet-server/src/router/domains/walletUnlock/walletUnlockRequestedCapabilitiesValidation.d.ts +39 -0
- package/dist/types/wallet-server/src/router/domains/walletUnlock/walletUnlockRouteHandlers.d.ts +172 -0
- package/dist/types/wallet-server/src/router/express-adaptor.d.ts +22 -0
- package/dist/types/wallet-server/src/router/framework/apiCredentialPorts.d.ts +82 -0
- package/dist/types/wallet-server/src/router/framework/applyRouteMetering.d.ts +23 -0
- package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +1392 -0
- package/dist/types/wallet-server/src/router/framework/enforceRoutePolicy.d.ts +48 -0
- package/dist/types/wallet-server/src/router/framework/http.d.ts +12 -0
- package/dist/types/wallet-server/src/router/framework/logger.d.ts +5 -0
- package/dist/types/wallet-server/src/router/framework/modules.d.ts +17 -0
- package/dist/types/wallet-server/src/router/framework/ror/index.d.ts +7 -0
- package/dist/types/wallet-server/src/router/framework/ror/normalize.d.ts +14 -0
- package/dist/types/wallet-server/src/router/framework/ror/options.d.ts +9 -0
- package/dist/types/wallet-server/src/router/framework/ror/provider.d.ts +17 -0
- package/dist/types/wallet-server/src/router/framework/ror/staticProvider.d.ts +11 -0
- package/dist/types/wallet-server/src/router/framework/routeAuthPolicy.d.ts +34 -0
- package/dist/types/wallet-server/src/router/framework/routeDefinitions.d.ts +27 -0
- package/dist/types/wallet-server/src/router/framework/routeDefinitions.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/framework/routeExecutionContext.d.ts +29 -0
- package/dist/types/wallet-server/src/router/framework/routeExtensions.d.ts +27 -0
- package/dist/types/wallet-server/src/router/framework/routeMeteringPolicy.d.ts +17 -0
- package/dist/types/wallet-server/src/router/framework/routeRequestValidation.d.ts +5 -0
- package/dist/types/wallet-server/src/router/framework/routeResponses.d.ts +17 -0
- package/dist/types/wallet-server/src/router/framework/routerApi.d.ts +221 -0
- package/dist/types/wallet-server/src/router/framework/routerApiRouteSurface.d.ts +14 -0
- package/dist/types/wallet-server/src/router/framework/routerApiWebhooks.d.ts +12 -0
- package/dist/types/wallet-server/src/router/framework/runtimeSnapshotConsumer.d.ts +28 -0
- package/dist/types/wallet-server/src/router/framework/versionedJsonRecordStore.d.ts +20 -0
- package/dist/types/wallet-server/src/router/ror-adaptor.d.ts +3 -0
- package/dist/types/wallet-server/src/router/transport/fetch/createFetchRouter.d.ts +8 -0
- package/dist/types/wallet-server/src/router/transport/fetch/fetchRouter.types.d.ts +23 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/auth.d.ts +3 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinking.d.ts +202 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.d.ts +92 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceManagement.d.ts +29 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/health.d.ts +4 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/nearPublicKeys.d.ts +3 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/normalSigningRouterProxy.d.ts +33 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/passkeyCustody.d.ts +66 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/sessions.d.ts +31 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/syncAccount.d.ts +3 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/syncAccountBootstrap.d.ts +128 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +87 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEd25519.d.ts +47 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/walletExecutionLanePreflight.d.ts +4 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/walletRegistration.d.ts +3 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/webauthnAuthenticators.d.ts +3 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/wellKnown.d.ts +3 -0
- package/dist/types/wallet-server/src/storage/d1Sql.d.ts +14 -0
- package/dist/types/wallet-server/src/storage/tenantRoute.d.ts +136 -0
- package/dist/types/wallet-server/src/storage/tenantRoute.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/tenant-root.d.ts +5 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/crypto/cipher.d.ts +45 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/crypto/shamir3PassWasm.d.ts +16 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/guards/backends.d.ts +23 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/guards/index.d.ts +46 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/idempotency.d.ts +3 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/idempotencyBackends.d.ts +24 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/idempotencyRecords.d.ts +22 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/index.d.ts +23 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/observability/audit.d.ts +9 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/options.d.ts +9 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/routesOptions.d.ts +20 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/service.d.ts +3 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/signingSessionSeal.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/signingSessionSeal.types.d.ts +148 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/transport/express.d.ts +12 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/transport/fetch.d.ts +13 -0
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/transport/shared.d.ts +24 -0
- package/dist/types/wallet-server/src/threshold/statusCodes.d.ts +10 -0
- package/dist/types/wallet-server/src/wasm/signer.d.ts +8 -0
- package/migrations/d1-signer/0001_signer_d1_initial.sql +2486 -0
- package/migrations/d1-signer/0002_signer_post_103_canonical_upgrade.sql +1576 -0
- package/migrations/d1-signer/0003_r107_wallet_authorization.sql +299 -0
- package/migrations/d1-signer/0004_remove_legacy_email_recovery.sql +14 -0
- package/migrations/d1-signer/0005_r103p8_linked_owner_auth_bindings.sql +92 -0
- package/migrations/d1-signer/0006_r103p8_linked_device_custody_transfers.sql +77 -0
- package/migrations/d1-signer/0007_r103p8_wallet_session_auth_method_provenance.sql +18 -0
- package/migrations/d1-signer/0008_r103p8_linked_device_session_cas_guard.sql +35 -0
- package/migrations/d1-signer/0009_linked_device_email_otp.sql +405 -0
- package/migrations/d1-signer/0010_linked_device_session_target_factor.sql +78 -0
- package/migrations/d1-signer/0011_linked_device_ed25519_export_root.sql +9 -0
- package/migrations/d1-signer/0012_versioned_json_cas_guard.sql +3 -0
- package/migrations/d1-signer/0013_linked_device_export_authorization.sql +133 -0
- package/migrations/d1-signer/0014_wallet_recovery_code_locators.sql +19 -0
- package/migrations/d1-signer/0015_r103e_authority_baseline.sql +259 -0
- package/migrations/d1-signer/0016_r103e_wallet_session_authorizations_v2.sql +133 -0
- package/migrations/d1-signer/0017_r103e_link_session_state.sql +83 -0
- package/migrations/d1-signer/0018_r103e_linked_device_authority_installations.sql +34 -0
- package/migrations/d1-signer/0019_r103e_email_otp_device_methods.sql +3 -0
- package/migrations/d1-signer/0020_r103e_wallet_session_operation_credentials.sql +12 -0
- package/migrations/d1-signer/0021_linked_device_source_contribution_transcripts.sql +64 -0
- package/migrations/d1-signer/0022_r109c_multi_auth_email_cardinality.sql +118 -0
- package/migrations/d1-signer/0023_r109d_first_email_linked_device.sql +111 -0
- package/migrations/d1-signer/0024_r103f_v2_authorized_operation_claim.sql +99 -0
- package/migrations/d1-signer/0025_r109d_email_enrollment_wallet_cardinality.sql +57 -0
- package/migrations/d1-signer/0026_r115_wallet_recovery_authority_provenance.sql +253 -0
- package/migrations/d1-signer/0027_r115_email_otp_recovery_bootstrap.sql +90 -0
- package/migrations/d1-signer/0028_r103f_phase1_additive_schema_bridge.sql +1119 -0
- package/migrations/d1-signer/0029_r103f_phase0_registration_replay_tokens.sql +135 -0
- package/migrations/d1-signer/0030_r103f_wallet_session_client_capability.sql +17 -0
- package/migrations/d1-signer/0031_r103f_delete_registration_replay_tokens.sql +4 -0
- package/migrations/d1-signer/0032_r103f_exact_authorized_operation_enforcement.sql +149 -0
- package/migrations/d1-signer/0033_r103f_linked_delivery_recipient.sql +6 -0
- package/migrations/d1-signer/0034_r103f_exact_wallet_session_cutover.sql +743 -0
- package/migrations/d1-signer/0035_r103f_linked_delivery_acknowledgement_cleanup_window.sql +413 -0
- package/package.json +132 -0
- package/scripts/d1-local-migrate-signer.mjs +148 -0
- package/src/README.md +75 -0
- package/wrangler.local-hosted-wallet-gateway.toml +37 -0
|
@@ -0,0 +1,1831 @@
|
|
|
1
|
+
import { mpcMaterialActivationRefsEqual, parseLinkDeviceSessionId, parseWalletAuthMethodId, parseWalletAuthorityId, parseWalletId, parseWalletKeyId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
+
import { parseDeviceId, parsePrincipalId, parseTenantId, parseWalletSessionMintId } from "../../../../shared-ts/src/authorization/capabilityKinds.js";
|
|
3
|
+
import { base64UrlDecode, base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
|
|
4
|
+
import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
5
|
+
import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
|
|
6
|
+
import { buildDelegatedWalletAuthorityV1, parseDelegatedWalletPermissionSetV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
|
|
7
|
+
import { assertLinkedDeviceWalletSessionCredentialDeliveryIntegrityV1, buildLinkedDeviceWalletSessionCredentialDeliveryBindingV1, computeLinkedDeviceActivationCleanupReceiptDigestB64u, computeLinkedDeviceWalletSessionCredentialDeliveryAadDigestB64u, computeLinkedDeviceWalletSessionCredentialEnvelopeDigestB64u, encodeLinkedDeviceWalletSessionCredentialDeliveryAadV1, parseLinkedDeviceActivationCleanupReceiptV1, parseLinkedDeviceWalletSessionCredentialDeliveryV1 } from "../../../../shared-ts/src/device-linking/walletSessionCredentialDelivery.js";
|
|
8
|
+
import { buildActiveWalletAuthorityV1, buildPendingWalletAuthorityV1, buildWalletSignerActivationSetV1, computeWalletAuthorityDigestB64u, computeWalletSignerActivationSetDigestB64u, walletAuthorityDigestsMatchV1 } from "../../../../shared-ts/src/authorization/walletAuthority.js";
|
|
9
|
+
import { buildWalletAuthMethodRecordV2, sameWalletAuthMethodRecordV2 } from "../../../../shared-ts/src/utils/registrationIntent.js";
|
|
10
|
+
import { unknownWebAuthnAuthenticatorDeviceInfo } from "../../../../shared-ts/src/utils/webauthnDeviceInfo.js";
|
|
11
|
+
import { routerAbMpcMaterialActivationRefFromWire } from "../../../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
|
|
12
|
+
import { parseRouterAbEd25519YaoApplicationBindingFactsV1, parseRouterAbEd25519YaoCeremonyBindingV1, sameRouterAbEd25519YaoActivationBindingV1 } from "../../../../shared-ts/src/utils/routerAbEd25519Yao.js";
|
|
13
|
+
import { assertLinkedDeviceOrdinaryMaterialSourceContributionMatchesContextV1, parseLinkedDeviceEcdsaSourceContributionPackageV1, parseLinkedDeviceEcdsaSourceDerivationV1, parseLinkedDeviceOrdinaryMaterialSourceContributionV1 } from "../../../../shared-ts/src/device-linking/sourceContribution.js";
|
|
14
|
+
import { computeCommittedSignerPackageSetDigestB64u, parseCommittedAuthorityPackagesV1 } from "../../../../shared-ts/src/device-linking/committedSignerPackages.js";
|
|
15
|
+
import { parseLocalAuthorityActivationFinalAckV1 } from "../../../../shared-ts/src/device-linking/parsers.js";
|
|
16
|
+
import { computeWalletSessionInstallationReceiptDigestB64u, computeWalletSessionOperationCredentialDigestB64u } from "../../../../shared-ts/src/device-linking/digests.js";
|
|
17
|
+
import { computeLinkedDevicePublicKeyDigestV1 } from "../../../../shared-ts/src/device-linking/requestProof.js";
|
|
18
|
+
import { buildPersistedActiveWalletSessionAuthorizationV2, walletSessionAuthorizationV2RecordsEqual } from "../../../../authorization/domain.js";
|
|
19
|
+
import { secureRandomBase64Url } from "../../../../shared-ts/src/utils/secureRandomId.js";
|
|
20
|
+
import { d1ChangedRows, parseD1JsonColumn } from "../../../../storage/d1Sql.js";
|
|
21
|
+
import { prepareD1WebAuthnCredentialBindingInsertStatement } from "../../../../core/WebAuthnCredentialBindingStore.js";
|
|
22
|
+
import { prepareD1WebAuthnAuthenticatorInsertStatement } from "../webauthn/d1WebAuthnStore.js";
|
|
23
|
+
import { buildAuthorityActiveSessionRecordV1, buildAuthorityPendingLocalInstallSessionRecordV1 } from "../../../../core/deviceLinking/linkedDeviceSession.js";
|
|
24
|
+
import { linkedDeviceX25519RecipientPublicKeyB64uV1 } from "./d1LinkedDeviceSourceContributionPreparationPlanner.js";
|
|
25
|
+
//#region src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.ts
|
|
26
|
+
var LinkedDeviceActivationIntegrityErrorV1 = class extends Error {
|
|
27
|
+
constructor(message) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.name = "LinkedDeviceActivationIntegrityErrorV1";
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
/** Exact-method cleanup remains available for five minutes after server receipt creation. */
|
|
33
|
+
const LINKED_DEVICE_ACKNOWLEDGEMENT_CLEANUP_WINDOW_MS = 300 * 1e3;
|
|
34
|
+
var D1LinkedDeviceAuthorityInstallServiceV1 = class {
|
|
35
|
+
constructor(options) {
|
|
36
|
+
this.options = options;
|
|
37
|
+
this.nowV1 = options.nowV1 ?? Date.now;
|
|
38
|
+
}
|
|
39
|
+
async commitPendingAuthorityV1(input) {
|
|
40
|
+
try {
|
|
41
|
+
const nowMs = requireTime(input.nowMs, "nowMs");
|
|
42
|
+
const session = await this.options.sessionService.getSessionV1({
|
|
43
|
+
linkSessionId: input.linkSessionId,
|
|
44
|
+
nowMs
|
|
45
|
+
});
|
|
46
|
+
if (!session) return {
|
|
47
|
+
kind: "conflict",
|
|
48
|
+
message: "linked-device session was not found"
|
|
49
|
+
};
|
|
50
|
+
const sourceContributionPreparation = requireSourceContributionPreparations(session);
|
|
51
|
+
await validateVerifiedLinkInput(input, nowMs, this.options.authMethodStore, sourceContributionPreparation);
|
|
52
|
+
const existing = await this.readInstallation(input.linkSessionId);
|
|
53
|
+
const allocation = await this.prepareAuthorityAllocation(input, existing);
|
|
54
|
+
const expectedAuthorityId = allocation.authorityId;
|
|
55
|
+
if (existing) {
|
|
56
|
+
await assertStoredPackageDigest(existing);
|
|
57
|
+
assertRetryInput(existing, input, expectedAuthorityId);
|
|
58
|
+
if (allocation.statement) await this.options.database.batch([allocation.statement]);
|
|
59
|
+
if (session.state.state !== "authority_pending_local_install" && session.state.state !== "active") return {
|
|
60
|
+
kind: "conflict",
|
|
61
|
+
message: "stored authority installation has no pending session"
|
|
62
|
+
};
|
|
63
|
+
return {
|
|
64
|
+
kind: "replayed",
|
|
65
|
+
packages: existing.packages,
|
|
66
|
+
ordinarySignerMaterialPreparations: sourceContributionPreparation,
|
|
67
|
+
session
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
if (session.state.state !== "provisioning") return {
|
|
71
|
+
kind: "conflict",
|
|
72
|
+
message: `linked-device session is ${session.state.state}`
|
|
73
|
+
};
|
|
74
|
+
const authorityId = expectedAuthorityId;
|
|
75
|
+
const emailOtpEnrollmentStatements = await this.prepareEmailOtpEnrollmentStatements(input);
|
|
76
|
+
const reservations = await this.reserveSignerMaterial(input, sourceContributionPreparation);
|
|
77
|
+
const activationSet = buildActivationSet(input.signerManifest, reservations);
|
|
78
|
+
const pendingAuthMethod = buildPendingAuthMethod(input, authorityId, nowMs);
|
|
79
|
+
const sourceManifestDigestB64u = await digestJson(input.signerManifest);
|
|
80
|
+
const packageSetDigestB64u = await computeCommittedSignerPackageSetDigestB64u({
|
|
81
|
+
authorityId,
|
|
82
|
+
walletId: input.walletId,
|
|
83
|
+
enrollmentId: input.enrollmentId,
|
|
84
|
+
linkSessionId: input.linkSessionId,
|
|
85
|
+
deviceId: input.targetDeviceId,
|
|
86
|
+
authMethodId: pendingAuthMethod.walletAuthMethodId,
|
|
87
|
+
permissions: input.permissions,
|
|
88
|
+
sourceManifestDigestB64u,
|
|
89
|
+
signerPackages: reservations.packages,
|
|
90
|
+
ed25519ExportRootPackageDigestB64u: input.ed25519ExportRootPackage ? await digestJson(input.ed25519ExportRootPackage) : null,
|
|
91
|
+
targetFactorVerificationDigestB64u: input.targetFactor.verificationDigestB64u
|
|
92
|
+
});
|
|
93
|
+
const pendingAuthority = await buildPendingAuthority({
|
|
94
|
+
authorityId,
|
|
95
|
+
input,
|
|
96
|
+
activationSet,
|
|
97
|
+
packageSetDigestB64u,
|
|
98
|
+
nowMs
|
|
99
|
+
});
|
|
100
|
+
const packages = {
|
|
101
|
+
kind: "committed_authority_packages_v1",
|
|
102
|
+
authority: pendingAuthority,
|
|
103
|
+
authMethod: pendingAuthMethod,
|
|
104
|
+
signerPackages: reservations.packages,
|
|
105
|
+
ed25519ExportRootPackage: input.ed25519ExportRootPackage,
|
|
106
|
+
packageSetDigestB64u
|
|
107
|
+
};
|
|
108
|
+
const nextSession = buildAuthorityPendingLocalInstallSessionRecordV1({
|
|
109
|
+
record: session,
|
|
110
|
+
authorityId,
|
|
111
|
+
packageSetDigestB64u,
|
|
112
|
+
nowMs
|
|
113
|
+
});
|
|
114
|
+
const packageStatement = await this.buildInstallationInsertStatement({
|
|
115
|
+
input,
|
|
116
|
+
packages,
|
|
117
|
+
serverReservationIds: reservations.serverReservationIds,
|
|
118
|
+
nowMs
|
|
119
|
+
});
|
|
120
|
+
const sessionStatements = this.options.sessionStore.buildAuthorityPendingLocalInstallCasStatementsV1({
|
|
121
|
+
linkSessionId: session.linkSessionId,
|
|
122
|
+
expectedRevision: session.revision,
|
|
123
|
+
nextRecord: nextSession,
|
|
124
|
+
nowMs
|
|
125
|
+
});
|
|
126
|
+
const committed = await this.options.authorityStore.commitPendingAuthorityWithStatements({
|
|
127
|
+
authority: pendingAuthority,
|
|
128
|
+
authMethod: pendingAuthMethod
|
|
129
|
+
}, [
|
|
130
|
+
...allocation.statement ? [allocation.statement] : [],
|
|
131
|
+
...emailOtpEnrollmentStatements,
|
|
132
|
+
packageStatement,
|
|
133
|
+
...sessionStatements
|
|
134
|
+
]);
|
|
135
|
+
if (committed.kind === "conflict") {
|
|
136
|
+
const replay = await this.readInstallation(input.linkSessionId);
|
|
137
|
+
if (replay) {
|
|
138
|
+
await assertStoredPackageDigest(replay);
|
|
139
|
+
const replaySession = await this.options.sessionService.getSessionV1({
|
|
140
|
+
linkSessionId: input.linkSessionId,
|
|
141
|
+
nowMs
|
|
142
|
+
});
|
|
143
|
+
if (replaySession) return {
|
|
144
|
+
kind: "replayed",
|
|
145
|
+
packages: replay.packages,
|
|
146
|
+
ordinarySignerMaterialPreparations: sourceContributionPreparation,
|
|
147
|
+
session: replaySession
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
kind: "conflict",
|
|
152
|
+
message: "wallet authority commit conflicts with an existing record"
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
if (committed.kind === "replayed") {
|
|
156
|
+
const replay = await this.readInstallation(input.linkSessionId);
|
|
157
|
+
if (!replay) return {
|
|
158
|
+
kind: "conflict",
|
|
159
|
+
message: "authority replay package is missing"
|
|
160
|
+
};
|
|
161
|
+
await assertStoredPackageDigest(replay);
|
|
162
|
+
const replaySession = await this.options.sessionService.getSessionV1({
|
|
163
|
+
linkSessionId: input.linkSessionId,
|
|
164
|
+
nowMs
|
|
165
|
+
});
|
|
166
|
+
if (!replaySession) return {
|
|
167
|
+
kind: "conflict",
|
|
168
|
+
message: "authority replay session is missing"
|
|
169
|
+
};
|
|
170
|
+
return {
|
|
171
|
+
kind: "replayed",
|
|
172
|
+
packages: replay.packages,
|
|
173
|
+
ordinarySignerMaterialPreparations: sourceContributionPreparation,
|
|
174
|
+
session: replaySession
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
kind: "committed",
|
|
179
|
+
packages,
|
|
180
|
+
ordinarySignerMaterialPreparations: reservations.ordinarySignerMaterialPreparations,
|
|
181
|
+
session: nextSession
|
|
182
|
+
};
|
|
183
|
+
} catch (error) {
|
|
184
|
+
return {
|
|
185
|
+
kind: "invalid_input",
|
|
186
|
+
message: errorMessage(error)
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async activateInstalledAuthorityV1(input) {
|
|
191
|
+
let stage = "receipt_validation";
|
|
192
|
+
try {
|
|
193
|
+
const nowMs = requireTime(input.nowMs ?? this.nowV1(), "nowMs");
|
|
194
|
+
const receipt = input.receipt;
|
|
195
|
+
const stored = await this.readInstallationByAuthority(receipt.authorityId);
|
|
196
|
+
if (!stored) return {
|
|
197
|
+
kind: "integrity_error",
|
|
198
|
+
message: "authority installation was not found"
|
|
199
|
+
};
|
|
200
|
+
await assertStoredPackageDigest(stored);
|
|
201
|
+
assertReceiptMatchesInstallation(receipt, stored, nowMs);
|
|
202
|
+
const session = await this.options.sessionService.getSessionV1({
|
|
203
|
+
linkSessionId: stored.linkSessionId,
|
|
204
|
+
nowMs
|
|
205
|
+
});
|
|
206
|
+
if (!session) return {
|
|
207
|
+
kind: "integrity_error",
|
|
208
|
+
message: "linked-device session was not found"
|
|
209
|
+
};
|
|
210
|
+
const authority = await this.options.authorityStore.readById(stored.authorityId);
|
|
211
|
+
const authMethod = await this.options.authMethodStore.readByIdV2({ walletAuthMethodId: stored.authMethodId });
|
|
212
|
+
if (!authority || !authMethod) return {
|
|
213
|
+
kind: "integrity_error",
|
|
214
|
+
message: "pending authority records are missing"
|
|
215
|
+
};
|
|
216
|
+
if (!sameAuthority(authority, stored.packages.authority) || !sameAuthMethod(authMethod, stored.packages.authMethod)) return {
|
|
217
|
+
kind: "integrity_error",
|
|
218
|
+
message: "pending authority records do not match committed packages"
|
|
219
|
+
};
|
|
220
|
+
if (authority.state === "active" && authMethod.status === "active" && session.state.state === "active") {
|
|
221
|
+
stage = "wallet_session_issuance";
|
|
222
|
+
const activeSession = await this.options.sessionService.getSessionV1({
|
|
223
|
+
linkSessionId: stored.linkSessionId,
|
|
224
|
+
nowMs
|
|
225
|
+
});
|
|
226
|
+
if (!activeSession || activeSession.state.state !== "active" || activeSession.state.authorityId !== authority.authorityId || activeSession.packageSetDigestB64u !== stored.packageSetDigestB64u) throw new LinkedDeviceActivationIntegrityErrorV1("linked-device authority replay did not retain an active session");
|
|
227
|
+
const walletSession = await this.readCommittedWalletSession(authority, authMethod, receipt.installedAtMs);
|
|
228
|
+
const sealedDelivery = await this.readCredentialDelivery(stored.linkSessionId);
|
|
229
|
+
if (!sealedDelivery) throw new LinkedDeviceActivationIntegrityErrorV1("linked-device Wallet Session credential delivery is missing");
|
|
230
|
+
await this.assertCredentialDeliveryMatchesCommittedSession({
|
|
231
|
+
stored,
|
|
232
|
+
receipt,
|
|
233
|
+
walletSession,
|
|
234
|
+
delivery: sealedDelivery
|
|
235
|
+
});
|
|
236
|
+
return {
|
|
237
|
+
kind: "active",
|
|
238
|
+
outcome: "replayed",
|
|
239
|
+
authority,
|
|
240
|
+
authMethod,
|
|
241
|
+
session: activeSession,
|
|
242
|
+
walletSession,
|
|
243
|
+
deliveryBinding: buildLinkedDeviceWalletSessionCredentialDeliveryBindingV1(sealedDelivery.aad),
|
|
244
|
+
sealedDelivery
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
if (authority.state !== "pending_local_install" || authMethod.status !== "pending_local_install" || session.state.state !== "authority_pending_local_install") return {
|
|
248
|
+
kind: "integrity_error",
|
|
249
|
+
message: "authority activation state is inconsistent"
|
|
250
|
+
};
|
|
251
|
+
if (!stored.deliveryRecipientPublicKey65B64u) throw new LinkedDeviceActivationIntegrityErrorV1("linked-device installation has no credential delivery recipient");
|
|
252
|
+
const activeAuthority = await buildActiveAuthority(authority, receipt.installedAtMs);
|
|
253
|
+
const activeAuthMethod = buildActiveAuthMethod(authMethod, receipt.installedAtMs);
|
|
254
|
+
const passkeyCredentialStatements = await buildPasskeyCredentialPromotionStatements({
|
|
255
|
+
database: this.options.database,
|
|
256
|
+
scope: this.options.scope,
|
|
257
|
+
listWalletEd25519Signers: this.options.listWalletEd25519Signers,
|
|
258
|
+
authority: activeAuthority,
|
|
259
|
+
authMethod: activeAuthMethod,
|
|
260
|
+
activatedAtMs: receipt.installedAtMs
|
|
261
|
+
});
|
|
262
|
+
stage = "server_worker_activation";
|
|
263
|
+
await this.activateReservations(stored, receipt.installedAtMs);
|
|
264
|
+
stage = "wallet_session_issuance";
|
|
265
|
+
const nextSession = buildAuthorityActiveSessionRecordV1({
|
|
266
|
+
record: session,
|
|
267
|
+
activatedAtMs: receipt.installedAtMs,
|
|
268
|
+
nowMs
|
|
269
|
+
});
|
|
270
|
+
const sessionStatements = this.options.sessionStore.buildAuthorityActivationCasStatementsV1({
|
|
271
|
+
linkSessionId: session.linkSessionId,
|
|
272
|
+
expectedRevision: session.revision,
|
|
273
|
+
nextRecord: nextSession,
|
|
274
|
+
nowMs
|
|
275
|
+
});
|
|
276
|
+
const preparedWalletSession = await this.options.authorizationService.prepareWalletSessionAuthorizationV2(this.buildWalletSessionAuthorizationInput(activeAuthority, activeAuthMethod, receipt.installedAtMs));
|
|
277
|
+
const operationCredential = {
|
|
278
|
+
kind: "opaque_wallet_session_operation_credential_v1",
|
|
279
|
+
token: `wst_${secureRandomBase64Url(32, "linked-device Wallet Session operation credential")}`,
|
|
280
|
+
walletSessionId: preparedWalletSession.session.walletSessionId
|
|
281
|
+
};
|
|
282
|
+
const credentialDigestB64u = await computeWalletSessionOperationCredentialDigestB64u(operationCredential);
|
|
283
|
+
const walletSessionStatements = this.options.authorizationStore.prepareDirectWalletSessionAuthorizationV2Statements(buildPersistedActiveWalletSessionAuthorizationV2({
|
|
284
|
+
session: preparedWalletSession.session,
|
|
285
|
+
quota: preparedWalletSession.quota,
|
|
286
|
+
primaryOperationCredentialDigestB64u: credentialDigestB64u
|
|
287
|
+
}));
|
|
288
|
+
const installationReceiptDigestB64u = await computeWalletSessionInstallationReceiptDigestB64u(receipt);
|
|
289
|
+
const sealedDelivery = await sealLinkedDeviceWalletSessionCredentialV1({
|
|
290
|
+
scope: this.options.scope,
|
|
291
|
+
tenantId: this.options.tenantId,
|
|
292
|
+
linkSessionId: stored.linkSessionId,
|
|
293
|
+
authorityId: activeAuthority.authorityId,
|
|
294
|
+
walletId: activeAuthority.walletId,
|
|
295
|
+
walletAuthMethodId: activeAuthMethod.walletAuthMethodId,
|
|
296
|
+
authorizationId: preparedWalletSession.session.authorizationId,
|
|
297
|
+
walletSessionId: preparedWalletSession.session.walletSessionId,
|
|
298
|
+
quotaId: preparedWalletSession.quota.quotaId,
|
|
299
|
+
principalId: preparedWalletSession.session.principalId,
|
|
300
|
+
credentialDigestB64u,
|
|
301
|
+
recipientPublicKey65B64u: stored.deliveryRecipientPublicKey65B64u,
|
|
302
|
+
issuedAtMs: preparedWalletSession.session.createdAtMs,
|
|
303
|
+
expiresAtMs: preparedWalletSession.session.expiresAtMs,
|
|
304
|
+
installationReceiptDigestB64u,
|
|
305
|
+
operationCredential
|
|
306
|
+
});
|
|
307
|
+
const installationActivationStatement = this.buildInstallationActivationStatement({
|
|
308
|
+
stored,
|
|
309
|
+
receipt
|
|
310
|
+
});
|
|
311
|
+
const deliveryStatement = this.buildCredentialDeliveryInsertStatement(sealedDelivery);
|
|
312
|
+
stage = "authority_activation";
|
|
313
|
+
const activation = await this.options.authorityStore.activatePendingAuthorityWithStatements({
|
|
314
|
+
pendingAuthority: authority,
|
|
315
|
+
activeAuthority,
|
|
316
|
+
pendingAuthMethod: authMethod,
|
|
317
|
+
activeAuthMethod
|
|
318
|
+
}, [
|
|
319
|
+
...sessionStatements,
|
|
320
|
+
...walletSessionStatements,
|
|
321
|
+
installationActivationStatement,
|
|
322
|
+
deliveryStatement,
|
|
323
|
+
...passkeyCredentialStatements
|
|
324
|
+
]);
|
|
325
|
+
if (activation.kind === "conflict") {
|
|
326
|
+
const replay = await this.readActivationReplayAfterCasRace({
|
|
327
|
+
stored,
|
|
328
|
+
receipt,
|
|
329
|
+
expectedPendingAuthority: authority,
|
|
330
|
+
expectedPendingAuthMethod: authMethod,
|
|
331
|
+
nowMs
|
|
332
|
+
});
|
|
333
|
+
if (replay) return replay;
|
|
334
|
+
return {
|
|
335
|
+
kind: "integrity_error",
|
|
336
|
+
message: "authority activation conflicts with another transition"
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
const persistedSession = activation.kind === "replayed" ? await this.options.sessionService.getSessionV1({
|
|
340
|
+
linkSessionId: stored.linkSessionId,
|
|
341
|
+
nowMs
|
|
342
|
+
}) : nextSession;
|
|
343
|
+
if (!persistedSession || persistedSession.state.state !== "active" || persistedSession.state.authorityId !== activation.authority.authorityId || persistedSession.packageSetDigestB64u !== stored.packageSetDigestB64u) throw new LinkedDeviceActivationIntegrityErrorV1("linked-device authority activation replay did not commit an active session");
|
|
344
|
+
stage = "wallet_session_issuance";
|
|
345
|
+
const walletSession = await this.readCommittedWalletSession(activation.authority, activation.authMethod, receipt.installedAtMs);
|
|
346
|
+
const persistedDelivery = activation.kind === "replayed" ? await this.readCredentialDelivery(stored.linkSessionId) : sealedDelivery;
|
|
347
|
+
if (!persistedDelivery) throw new LinkedDeviceActivationIntegrityErrorV1("linked-device Wallet Session credential delivery is missing");
|
|
348
|
+
return {
|
|
349
|
+
kind: "active",
|
|
350
|
+
outcome: activation.kind === "replayed" ? "replayed" : "activated",
|
|
351
|
+
authority: activation.authority,
|
|
352
|
+
authMethod: activation.authMethod,
|
|
353
|
+
session: persistedSession,
|
|
354
|
+
walletSession,
|
|
355
|
+
deliveryBinding: buildLinkedDeviceWalletSessionCredentialDeliveryBindingV1(persistedDelivery.aad),
|
|
356
|
+
sealedDelivery: persistedDelivery
|
|
357
|
+
};
|
|
358
|
+
} catch (error) {
|
|
359
|
+
if (error instanceof LinkedDeviceActivationIntegrityErrorV1) return {
|
|
360
|
+
kind: "integrity_error",
|
|
361
|
+
message: error.message
|
|
362
|
+
};
|
|
363
|
+
if (stage === "server_worker_activation") return {
|
|
364
|
+
kind: "pending_local_install",
|
|
365
|
+
authorityId: input.receipt.authorityId,
|
|
366
|
+
reason: "server_worker_activation_pending"
|
|
367
|
+
};
|
|
368
|
+
if (stage === "wallet_session_issuance") return {
|
|
369
|
+
kind: "pending_local_install",
|
|
370
|
+
authorityId: input.receipt.authorityId,
|
|
371
|
+
reason: "wallet_session_issuance_pending"
|
|
372
|
+
};
|
|
373
|
+
return {
|
|
374
|
+
kind: "integrity_error",
|
|
375
|
+
message: errorMessage(error)
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
async readActivationReplayAfterCasRace(input) {
|
|
380
|
+
const authority = await this.options.authorityStore.readById(input.stored.authorityId);
|
|
381
|
+
const authMethod = await this.options.authMethodStore.readByIdV2({ walletAuthMethodId: input.stored.authMethodId });
|
|
382
|
+
if (!authority || !authMethod) return null;
|
|
383
|
+
const expectedAuthority = await buildActiveAuthority(input.expectedPendingAuthority, input.receipt.installedAtMs);
|
|
384
|
+
const expectedAuthMethod = buildActiveAuthMethod(input.expectedPendingAuthMethod, input.receipt.installedAtMs);
|
|
385
|
+
if (authority.state !== "active" || authMethod.status !== "active" || !sameActiveAuthority(authority, expectedAuthority) || !sameWalletAuthMethodRecordV2(authMethod, expectedAuthMethod)) return null;
|
|
386
|
+
const session = await this.options.sessionService.getSessionV1({
|
|
387
|
+
linkSessionId: input.stored.linkSessionId,
|
|
388
|
+
nowMs: input.nowMs
|
|
389
|
+
});
|
|
390
|
+
if (!session || session.state.state !== "active" || session.state.authorityId !== authority.authorityId || session.packageSetDigestB64u !== input.stored.packageSetDigestB64u) return null;
|
|
391
|
+
const walletSession = await this.readCommittedWalletSession(authority, authMethod, input.receipt.installedAtMs);
|
|
392
|
+
const sealedDelivery = await this.readCredentialDelivery(input.stored.linkSessionId);
|
|
393
|
+
if (!sealedDelivery) throw new LinkedDeviceActivationIntegrityErrorV1("linked-device Wallet Session credential delivery is missing after activation race");
|
|
394
|
+
await this.assertCredentialDeliveryMatchesCommittedSession({
|
|
395
|
+
stored: input.stored,
|
|
396
|
+
receipt: input.receipt,
|
|
397
|
+
walletSession,
|
|
398
|
+
delivery: sealedDelivery
|
|
399
|
+
});
|
|
400
|
+
return {
|
|
401
|
+
kind: "active",
|
|
402
|
+
outcome: "replayed",
|
|
403
|
+
authority,
|
|
404
|
+
authMethod,
|
|
405
|
+
session,
|
|
406
|
+
walletSession,
|
|
407
|
+
deliveryBinding: buildLinkedDeviceWalletSessionCredentialDeliveryBindingV1(sealedDelivery.aad),
|
|
408
|
+
sealedDelivery
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
async readCommittedAuthorityPackagesV1(input) {
|
|
412
|
+
const nowMs = requireTime(input.requestedAtMs, "requestedAtMs");
|
|
413
|
+
if (input.session.state.state !== "provisioning" && input.session.state.state !== "authority_pending_local_install" && input.session.state.state !== "active") throw new Error("committed authority packages are unavailable before provisioning");
|
|
414
|
+
const stored = await this.readInstallation(input.session.linkSessionId);
|
|
415
|
+
if (!stored && input.session.state.state === "provisioning") return null;
|
|
416
|
+
if (!stored) throw new Error("committed authority packages were not found");
|
|
417
|
+
await assertStoredPackageDigest(stored);
|
|
418
|
+
if (stored.deviceId !== input.session.state.deviceId) throw new Error("committed authority package device does not match the session");
|
|
419
|
+
if (input.session.state.state !== "provisioning" && (input.session.state.authorityId !== stored.authorityId || input.session.state.packageSetDigestB64u !== stored.packageSetDigestB64u)) throw new Error("committed authority package identity does not match the session");
|
|
420
|
+
if (stored.packages.authority.createdAtMs > nowMs) throw new Error("committed authority package timestamp is from the future");
|
|
421
|
+
return stored.packages;
|
|
422
|
+
}
|
|
423
|
+
async readInstalledEd25519AuthorityByIdentityV1(input) {
|
|
424
|
+
try {
|
|
425
|
+
const walletId = parseWalletId(input.walletId);
|
|
426
|
+
const authorityId = parseWalletAuthorityId(input.authorityId);
|
|
427
|
+
const walletAuthMethodId = parseWalletAuthMethodId(input.walletAuthMethodId);
|
|
428
|
+
if (!walletId.ok || !authorityId.ok || !walletAuthMethodId.ok) return null;
|
|
429
|
+
const stored = await this.readInstallationByAuthority(authorityId.value);
|
|
430
|
+
if (!stored || stored.walletId !== walletId.value || stored.authorityId !== authorityId.value || stored.authMethodId !== walletAuthMethodId.value) return null;
|
|
431
|
+
await assertStoredPackageDigest(stored);
|
|
432
|
+
return projectInstalledEd25519Authority(stored);
|
|
433
|
+
} catch {
|
|
434
|
+
return null;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
async readInstalledEd25519AuthorityByMaterialActivationV1(input) {
|
|
438
|
+
try {
|
|
439
|
+
const walletId = parseWalletId(input.walletId);
|
|
440
|
+
if (!walletId.ok) return null;
|
|
441
|
+
const storedRows = await this.readInstallationsByWallet(walletId.value);
|
|
442
|
+
for (const stored of storedRows) await assertStoredPackageDigest(stored);
|
|
443
|
+
const candidates = storedRows.filter((stored) => stored.packages.signerPackages.ed25519 !== void 0 && mpcMaterialActivationRefsEqual(stored.packages.signerPackages.ed25519.materialActivation, input.materialActivation));
|
|
444
|
+
if (candidates.length !== 1) return null;
|
|
445
|
+
const stored = candidates[0];
|
|
446
|
+
return stored ? projectInstalledEd25519Authority(stored) : null;
|
|
447
|
+
} catch {
|
|
448
|
+
return null;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
async readInstalledEcdsaAuthorityByIdentityV1(input) {
|
|
452
|
+
try {
|
|
453
|
+
const walletId = parseWalletId(input.walletId);
|
|
454
|
+
const authorityId = parseWalletAuthorityId(input.authorityId);
|
|
455
|
+
const walletAuthMethodId = parseWalletAuthMethodId(input.walletAuthMethodId);
|
|
456
|
+
if (!walletId.ok || !authorityId.ok || !walletAuthMethodId.ok) return null;
|
|
457
|
+
const stored = await this.readInstallationByAuthority(authorityId.value);
|
|
458
|
+
if (!stored || stored.walletId !== walletId.value || stored.authorityId !== authorityId.value || stored.authMethodId !== walletAuthMethodId.value) return null;
|
|
459
|
+
await assertStoredPackageDigest(stored);
|
|
460
|
+
return projectInstalledEcdsaAuthority(stored);
|
|
461
|
+
} catch {
|
|
462
|
+
return null;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
async readInstalledEcdsaAuthorityByMaterialActivationV1(input) {
|
|
466
|
+
try {
|
|
467
|
+
const walletId = parseWalletId(input.walletId);
|
|
468
|
+
if (!walletId.ok) return null;
|
|
469
|
+
const storedRows = await this.readInstallationsByWallet(walletId.value);
|
|
470
|
+
for (const stored of storedRows) await assertStoredPackageDigest(stored);
|
|
471
|
+
const candidates = storedRows.filter((stored) => stored.packages.signerPackages.ecdsa !== void 0 && mpcMaterialActivationRefsEqual(stored.packages.signerPackages.ecdsa.materialActivation, input.materialActivation));
|
|
472
|
+
if (candidates.length !== 1) return null;
|
|
473
|
+
const stored = candidates[0];
|
|
474
|
+
return stored ? projectInstalledEcdsaAuthority(stored) : null;
|
|
475
|
+
} catch {
|
|
476
|
+
return null;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
async readActivationCleanupReceiptV1(input) {
|
|
480
|
+
const nowMs = requireTime(input.requestedAtMs, "requestedAtMs");
|
|
481
|
+
const row = await this.readCredentialDeliveryRow(input.linkSessionId);
|
|
482
|
+
if (!row) return null;
|
|
483
|
+
if (row.lifecycle_kind !== "acknowledged" && row.lifecycle_kind !== "cleanup_complete") return null;
|
|
484
|
+
if (row.cleanup_receipt_json === null || row.cleanup_receipt_json === void 0) throw new LinkedDeviceActivationIntegrityErrorV1("acknowledged linked-device credential delivery has no cleanup receipt");
|
|
485
|
+
const cleanupReceipt = parseLinkedDeviceActivationCleanupReceiptV1(parseD1JsonColumn(row.cleanup_receipt_json));
|
|
486
|
+
if (cleanupReceipt.expiresAtMs <= nowMs) return null;
|
|
487
|
+
const storedAck = row.acknowledgement_receipt_json === null || row.acknowledgement_receipt_json === void 0 ? null : parseLocalAuthorityActivationFinalAckV1(parseD1JsonColumn(row.acknowledgement_receipt_json));
|
|
488
|
+
if (!storedAck) throw new LinkedDeviceActivationIntegrityErrorV1("acknowledged linked-device credential delivery has no acknowledgement receipt");
|
|
489
|
+
assertAcknowledgementMatchesCleanupReceipt(storedAck, cleanupReceipt);
|
|
490
|
+
await assertCleanupReceiptMatchesDeliveryRow(cleanupReceipt, row);
|
|
491
|
+
const installation = await this.readInstallation(input.linkSessionId);
|
|
492
|
+
if (!installation || installation.walletId !== cleanupReceipt.walletId || installation.authorityId !== cleanupReceipt.authorityId || installation.authMethodId !== cleanupReceipt.walletAuthMethodId || installation.packageSetDigestB64u !== cleanupReceipt.packageSetDigestB64u) throw new LinkedDeviceActivationIntegrityErrorV1("activation cleanup receipt does not match the installation row");
|
|
493
|
+
return cleanupReceipt;
|
|
494
|
+
}
|
|
495
|
+
async acknowledgeLocalAuthorityActivationV1(input) {
|
|
496
|
+
const nowMs = requireTime(input.requestedAtMs, "requestedAtMs");
|
|
497
|
+
const acknowledgement = parseLocalAuthorityActivationFinalAckV1(input.acknowledgement);
|
|
498
|
+
if (acknowledgement.acknowledgedAtMs > nowMs) throw new Error("active authority acknowledgement is from the future");
|
|
499
|
+
if (input.authentication.kind === "exact_wallet_session") {
|
|
500
|
+
await this.assertExactAcknowledgementAuthenticationV1({
|
|
501
|
+
acknowledgement,
|
|
502
|
+
authentication: input.authentication,
|
|
503
|
+
nowMs
|
|
504
|
+
});
|
|
505
|
+
const persistedCleanupReceipt = await this.readActivationCleanupReceiptV1({
|
|
506
|
+
linkSessionId: acknowledgement.linkSessionId,
|
|
507
|
+
requestedAtMs: nowMs
|
|
508
|
+
});
|
|
509
|
+
if (persistedCleanupReceipt) {
|
|
510
|
+
assertAcknowledgementMatchesCleanupReceipt(acknowledgement, persistedCleanupReceipt);
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
const durableSession = await this.options.sessionStore.getSessionV1(acknowledgement.linkSessionId);
|
|
514
|
+
const session = durableSession ? null : await this.options.sessionService.getSessionV1({
|
|
515
|
+
linkSessionId: acknowledgement.linkSessionId,
|
|
516
|
+
nowMs
|
|
517
|
+
});
|
|
518
|
+
if (durableSession && durableSession.state.state !== "active") throw new Error("active authority acknowledgement requires an active link session");
|
|
519
|
+
const cleanupSession = durableSession;
|
|
520
|
+
const devicePublicKeyB64u = durableSession?.qrPayload.devicePublicKeyB64u ?? session?.qrPayload.devicePublicKeyB64u;
|
|
521
|
+
if (!devicePublicKeyB64u) throw new LinkedDeviceActivationIntegrityErrorV1("exact Wallet Session acknowledgement has no durable cleanup receipt or device identity");
|
|
522
|
+
const prepared = await this.prepareActivationAcknowledgementV1({
|
|
523
|
+
acknowledgement,
|
|
524
|
+
devicePublicKeyB64u,
|
|
525
|
+
nowMs
|
|
526
|
+
});
|
|
527
|
+
await this.commitAcknowledgementCleanupV1({
|
|
528
|
+
prepared,
|
|
529
|
+
session: cleanupSession,
|
|
530
|
+
nowMs
|
|
531
|
+
});
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
const providedSession = input.authentication.kind === "live" ? input.authentication.session : null;
|
|
535
|
+
const session = providedSession ? await this.options.sessionService.getSessionV1({
|
|
536
|
+
linkSessionId: providedSession.linkSessionId,
|
|
537
|
+
nowMs
|
|
538
|
+
}) : null;
|
|
539
|
+
if (providedSession && session && session.revision !== providedSession.revision) throw new Error("active authority acknowledgement session is stale");
|
|
540
|
+
if (!session) {
|
|
541
|
+
const persistedCleanupReceipt = await this.readActivationCleanupReceiptV1({
|
|
542
|
+
linkSessionId: acknowledgement.linkSessionId,
|
|
543
|
+
requestedAtMs: nowMs
|
|
544
|
+
});
|
|
545
|
+
if (input.authentication.kind === "cleanup_receipt" && (!persistedCleanupReceipt || await computeLinkedDeviceActivationCleanupReceiptDigestB64u(input.authentication.receipt) !== await computeLinkedDeviceActivationCleanupReceiptDigestB64u(persistedCleanupReceipt))) throw new LinkedDeviceActivationIntegrityErrorV1("activation cleanup receipt authentication does not match the persisted receipt");
|
|
546
|
+
const cleanupReceipt = persistedCleanupReceipt;
|
|
547
|
+
if (!cleanupReceipt) throw new Error("active authority acknowledgement session is stale or missing");
|
|
548
|
+
if (providedSession && providedSession.qrPayload.devicePublicKeyB64u !== cleanupReceipt.devicePublicKeyB64u) throw new LinkedDeviceActivationIntegrityErrorV1("active authority acknowledgement cleanup receipt device does not match the session");
|
|
549
|
+
assertAcknowledgementMatchesCleanupReceipt(acknowledgement, cleanupReceipt);
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
if (session.state.state !== "active") throw new Error("active authority acknowledgement requires an active link session");
|
|
553
|
+
if (acknowledgement.linkSessionId !== session.linkSessionId || acknowledgement.authorityId !== session.state.authorityId || acknowledgement.packageSetDigestB64u !== session.packageSetDigestB64u) throw new Error("active authority acknowledgement identity does not match the session");
|
|
554
|
+
const prepared = await this.prepareActivationAcknowledgementV1({
|
|
555
|
+
acknowledgement,
|
|
556
|
+
devicePublicKeyB64u: session.qrPayload.devicePublicKeyB64u,
|
|
557
|
+
nowMs
|
|
558
|
+
});
|
|
559
|
+
await this.commitAcknowledgementCleanupV1({
|
|
560
|
+
prepared,
|
|
561
|
+
session,
|
|
562
|
+
nowMs
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
async commitAcknowledgementCleanupV1(input) {
|
|
566
|
+
const beforeDeleteStatements = [
|
|
567
|
+
this.buildCredentialDeliveryAcknowledgementStatement(input.prepared),
|
|
568
|
+
this.buildAuthorityAllocationDeleteStatement(input.prepared.acknowledgement.linkSessionId),
|
|
569
|
+
this.buildCredentialDeliveryCleanupStateStatement({
|
|
570
|
+
linkSessionId: input.prepared.acknowledgement.linkSessionId,
|
|
571
|
+
from: "pending",
|
|
572
|
+
to: "allocation_removed"
|
|
573
|
+
})
|
|
574
|
+
];
|
|
575
|
+
const afterDeleteStatements = [this.buildCredentialDeliveryCleanupStateStatement({
|
|
576
|
+
linkSessionId: input.prepared.acknowledgement.linkSessionId,
|
|
577
|
+
from: "allocation_removed",
|
|
578
|
+
to: "session_removed"
|
|
579
|
+
}), this.buildCredentialDeliveryCleanupCompleteStatement(input.prepared.acknowledgement.linkSessionId)];
|
|
580
|
+
try {
|
|
581
|
+
if (input.session) {
|
|
582
|
+
const deleted = await this.options.sessionStore.deleteActiveSessionWithStatementsV1({
|
|
583
|
+
linkSessionId: input.session.linkSessionId,
|
|
584
|
+
expectedRevision: input.session.revision,
|
|
585
|
+
authorityId: input.prepared.acknowledgement.authorityId,
|
|
586
|
+
packageSetDigestB64u: input.prepared.acknowledgement.packageSetDigestB64u,
|
|
587
|
+
nowMs: input.nowMs,
|
|
588
|
+
beforeDeleteStatements,
|
|
589
|
+
afterDeleteStatements
|
|
590
|
+
});
|
|
591
|
+
if (deleted.outcome !== "applied" && deleted.outcome !== "replayed" && deleted.outcome !== "deleted") {
|
|
592
|
+
const detail = "message" in deleted && deleted.message ? `: ${deleted.message}` : "";
|
|
593
|
+
throw new Error(`active authority cleanup failed: ${deleted.outcome}${detail}`);
|
|
594
|
+
}
|
|
595
|
+
} else await this.options.database.batch([...beforeDeleteStatements, ...afterDeleteStatements]);
|
|
596
|
+
} catch (error) {
|
|
597
|
+
const replay = await this.readActivationCleanupReceiptV1({
|
|
598
|
+
linkSessionId: input.prepared.acknowledgement.linkSessionId,
|
|
599
|
+
requestedAtMs: input.nowMs
|
|
600
|
+
});
|
|
601
|
+
if (replay) {
|
|
602
|
+
assertAcknowledgementMatchesCleanupReceipt(input.prepared.acknowledgement, replay);
|
|
603
|
+
return;
|
|
604
|
+
}
|
|
605
|
+
throw error;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
async assertExactAcknowledgementAuthenticationV1(input) {
|
|
609
|
+
if (input.authentication.expiresAtMs <= input.nowMs) throw new Error("exact Wallet Session acknowledgement authentication is expired");
|
|
610
|
+
const stored = await this.readInstallation(input.acknowledgement.linkSessionId);
|
|
611
|
+
if (!stored) throw new LinkedDeviceActivationIntegrityErrorV1("exact Wallet Session acknowledgement installation is missing");
|
|
612
|
+
const expectedPrincipalId = requireParsed(parsePrincipalId(`linked-device:${String(stored.deviceId)}`), "principalId");
|
|
613
|
+
if (input.authentication.tenantId !== this.options.tenantId || input.authentication.walletId !== stored.walletId || input.authentication.authorityId !== stored.authorityId || input.authentication.walletAuthMethodId !== stored.authMethodId || input.authentication.principalId !== expectedPrincipalId) throw new LinkedDeviceActivationIntegrityErrorV1("exact Wallet Session acknowledgement identity does not match the installation");
|
|
614
|
+
if (input.acknowledgement.authorityId !== stored.authorityId || input.acknowledgement.packageSetDigestB64u !== stored.packageSetDigestB64u) throw new LinkedDeviceActivationIntegrityErrorV1("exact Wallet Session acknowledgement does not match the installation");
|
|
615
|
+
}
|
|
616
|
+
async prepareActivationAcknowledgementV1(input) {
|
|
617
|
+
const stored = await this.readInstallation(input.acknowledgement.linkSessionId);
|
|
618
|
+
if (!stored) throw new Error("active authority installation was not found");
|
|
619
|
+
await assertStoredPackageDigest(stored);
|
|
620
|
+
if (stored.authorityId !== input.acknowledgement.authorityId || stored.packageSetDigestB64u !== input.acknowledgement.packageSetDigestB64u || stored.activatedAtMs === null || stored.installedRecordSetDigestB64u === null || input.acknowledgement.acknowledgedAtMs < stored.activatedAtMs) throw new Error("active authority acknowledgement does not match the activation record");
|
|
621
|
+
const authority = await this.options.authorityStore.readById(stored.authorityId);
|
|
622
|
+
const authMethod = await this.options.authMethodStore.readByIdV2({ walletAuthMethodId: stored.authMethodId });
|
|
623
|
+
if (!authority || authority.state !== "active" || !authMethod || authMethod.status !== "active") throw new LinkedDeviceActivationIntegrityErrorV1("active authority acknowledgement has no active authority records");
|
|
624
|
+
const receipt = buildInstallationReceiptFromStoredInstallation(stored);
|
|
625
|
+
const installationReceiptDigestB64u = await computeWalletSessionInstallationReceiptDigestB64u(receipt);
|
|
626
|
+
if (input.acknowledgement.installationReceiptDigestB64u !== installationReceiptDigestB64u) throw new Error("active authority acknowledgement installation receipt digest does not match the commit");
|
|
627
|
+
const delivery = await this.readCredentialDelivery(input.acknowledgement.linkSessionId);
|
|
628
|
+
if (!delivery) {
|
|
629
|
+
const cleanupReceipt = await this.readActivationCleanupReceiptV1({
|
|
630
|
+
linkSessionId: input.acknowledgement.linkSessionId,
|
|
631
|
+
requestedAtMs: input.nowMs
|
|
632
|
+
});
|
|
633
|
+
if (cleanupReceipt) {
|
|
634
|
+
assertAcknowledgementMatchesCleanupReceipt(input.acknowledgement, cleanupReceipt);
|
|
635
|
+
throw new LinkedDeviceActivationIntegrityErrorV1("active authority acknowledgement delivery was already cleaned up");
|
|
636
|
+
}
|
|
637
|
+
throw new LinkedDeviceActivationIntegrityErrorV1("active authority acknowledgement credential delivery is missing");
|
|
638
|
+
}
|
|
639
|
+
await this.assertCredentialDeliveryMatchesStoredInstallation({
|
|
640
|
+
stored,
|
|
641
|
+
receipt,
|
|
642
|
+
delivery
|
|
643
|
+
});
|
|
644
|
+
if (delivery.aad.authorizationId !== input.acknowledgement.authorizationId || delivery.aad.walletSessionId !== input.acknowledgement.walletSessionId || delivery.aad.credentialDigestB64u !== input.acknowledgement.credentialDigestB64u) throw new LinkedDeviceActivationIntegrityErrorV1("active authority acknowledgement Wallet Session identity does not match the delivery");
|
|
645
|
+
const authExpiresAtMs = input.nowMs + LINKED_DEVICE_ACKNOWLEDGEMENT_CLEANUP_WINDOW_MS;
|
|
646
|
+
if (!Number.isSafeInteger(authExpiresAtMs)) throw new Error("active authority acknowledgement is expired");
|
|
647
|
+
const cleanupReceipt = {
|
|
648
|
+
kind: "linked_device_activation_cleanup_receipt_v1",
|
|
649
|
+
devicePublicKeyB64u: input.devicePublicKeyB64u,
|
|
650
|
+
devicePublicKeyDigestB64u: await computeLinkedDevicePublicKeyDigestV1(input.devicePublicKeyB64u),
|
|
651
|
+
linkSessionId: input.acknowledgement.linkSessionId,
|
|
652
|
+
walletId: stored.walletId,
|
|
653
|
+
authorityId: stored.authorityId,
|
|
654
|
+
walletAuthMethodId: stored.authMethodId,
|
|
655
|
+
packageSetDigestB64u: stored.packageSetDigestB64u,
|
|
656
|
+
authorizationId: input.acknowledgement.authorizationId,
|
|
657
|
+
walletSessionId: input.acknowledgement.walletSessionId,
|
|
658
|
+
credentialDigestB64u: input.acknowledgement.credentialDigestB64u,
|
|
659
|
+
installationReceiptDigestB64u,
|
|
660
|
+
acknowledgedAtMs: input.acknowledgement.acknowledgedAtMs,
|
|
661
|
+
expiresAtMs: authExpiresAtMs
|
|
662
|
+
};
|
|
663
|
+
return {
|
|
664
|
+
acknowledgement: input.acknowledgement,
|
|
665
|
+
cleanupReceipt,
|
|
666
|
+
delivery,
|
|
667
|
+
authBindingDigestB64u: delivery.recipientBindingDigestB64u,
|
|
668
|
+
authExpiresAtMs
|
|
669
|
+
};
|
|
670
|
+
}
|
|
671
|
+
async assertCredentialDeliveryMatchesStoredInstallation(input) {
|
|
672
|
+
const recipientPublicKey65B64u = input.stored.deliveryRecipientPublicKey65B64u;
|
|
673
|
+
const aad = input.delivery.aad;
|
|
674
|
+
const expectedPrincipalId = requireParsed(parsePrincipalId(`linked-device:${String(input.stored.deviceId)}`), "principalId");
|
|
675
|
+
const installationReceiptDigestB64u = await computeWalletSessionInstallationReceiptDigestB64u(input.receipt);
|
|
676
|
+
if (!recipientPublicKey65B64u || aad.namespace !== this.options.scope.namespace || aad.orgId !== this.options.scope.orgId || aad.projectId !== this.options.scope.projectId || aad.envId !== this.options.scope.envId || aad.linkSessionId !== input.stored.linkSessionId || aad.tenantId !== this.options.tenantId || aad.principalId !== expectedPrincipalId || aad.walletId !== input.stored.walletId || aad.authorityId !== input.stored.authorityId || aad.walletAuthMethodId !== input.stored.authMethodId || aad.recipientPublicKey65B64u !== recipientPublicKey65B64u || input.delivery.installationReceiptDigestB64u !== installationReceiptDigestB64u) throw new LinkedDeviceActivationIntegrityErrorV1("linked-device Wallet Session credential delivery identity is inconsistent with its commit");
|
|
677
|
+
await assertLinkedDeviceWalletSessionCredentialDeliveryIntegrityV1(input.delivery);
|
|
678
|
+
}
|
|
679
|
+
async assertCredentialDeliveryMatchesCommittedSession(input) {
|
|
680
|
+
await this.assertCredentialDeliveryMatchesStoredInstallation(input);
|
|
681
|
+
const session = input.walletSession.session;
|
|
682
|
+
const aad = input.delivery.aad;
|
|
683
|
+
if (aad.tenantId !== session.tenantId || aad.principalId !== session.principalId || aad.authorizationId !== session.authorizationId || aad.walletSessionId !== session.walletSessionId || aad.quotaId !== input.walletSession.quota.quotaId || aad.credentialDigestB64u !== input.walletSession.primaryOperationCredentialDigestB64u || aad.issuedAtMs !== session.createdAtMs || aad.expiresAtMs !== session.expiresAtMs) throw new LinkedDeviceActivationIntegrityErrorV1("linked-device Wallet Session credential delivery identity is inconsistent with its commit");
|
|
684
|
+
}
|
|
685
|
+
buildCredentialDeliveryAcknowledgementStatement(input) {
|
|
686
|
+
const acknowledgementJson = JSON.stringify(input.acknowledgement);
|
|
687
|
+
const cleanupReceiptJson = JSON.stringify(input.cleanupReceipt);
|
|
688
|
+
const delivery = input.delivery;
|
|
689
|
+
return this.options.database.prepare(`UPDATE linked_device_wallet_session_credential_deliveries_v1
|
|
690
|
+
SET lifecycle_kind = 'acknowledged', sealed_envelope_json = NULL,
|
|
691
|
+
acknowledged_at_ms = ?, acknowledgement_receipt_json = ?,
|
|
692
|
+
cleanup_state = 'pending', cleanup_receipt_json = ?,
|
|
693
|
+
acknowledgement_auth_binding_digest_b64u = ?,
|
|
694
|
+
acknowledgement_auth_package_set_digest_b64u = ?,
|
|
695
|
+
acknowledgement_auth_expires_at_ms = ?
|
|
696
|
+
WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
|
|
697
|
+
AND link_session_id = ? AND lifecycle_kind = 'issued'
|
|
698
|
+
AND tenant_id = ? AND authorization_id = ? AND wallet_session_id = ?
|
|
699
|
+
AND quota_id = ? AND principal_id = ? AND authority_id = ?
|
|
700
|
+
AND wallet_id = ? AND wallet_auth_method_id = ?
|
|
701
|
+
AND credential_digest_b64u = ? AND aad_digest_b64u = ?
|
|
702
|
+
AND sealed_envelope_digest_b64u = ? AND installation_receipt_digest_b64u = ?`).bind(input.acknowledgement.acknowledgedAtMs, acknowledgementJson, cleanupReceiptJson, String(input.authBindingDigestB64u), String(input.acknowledgement.packageSetDigestB64u), input.authExpiresAtMs, this.options.scope.namespace, this.options.scope.orgId, this.options.scope.projectId, this.options.scope.envId, String(input.acknowledgement.linkSessionId), String(delivery.aad.tenantId), String(delivery.aad.authorizationId), String(delivery.aad.walletSessionId), String(delivery.aad.quotaId), String(delivery.aad.principalId), String(delivery.aad.authorityId), String(delivery.aad.walletId), String(delivery.aad.walletAuthMethodId), String(delivery.aad.credentialDigestB64u), String(delivery.aadDigestB64u), String(delivery.envelopeDigestB64u), String(delivery.installationReceiptDigestB64u));
|
|
703
|
+
}
|
|
704
|
+
buildAuthorityAllocationDeleteStatement(linkSessionId) {
|
|
705
|
+
return this.options.database.prepare(`DELETE FROM linked_device_authority_allocations
|
|
706
|
+
WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
|
|
707
|
+
AND link_session_id = ?`).bind(this.options.scope.namespace, this.options.scope.orgId, this.options.scope.projectId, this.options.scope.envId, String(linkSessionId));
|
|
708
|
+
}
|
|
709
|
+
buildCredentialDeliveryCleanupStateStatement(input) {
|
|
710
|
+
return this.options.database.prepare(`UPDATE linked_device_wallet_session_credential_deliveries_v1
|
|
711
|
+
SET cleanup_state = ?
|
|
712
|
+
WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
|
|
713
|
+
AND link_session_id = ? AND lifecycle_kind = 'acknowledged'
|
|
714
|
+
AND cleanup_state = ?`).bind(input.to, this.options.scope.namespace, this.options.scope.orgId, this.options.scope.projectId, this.options.scope.envId, String(input.linkSessionId), input.from);
|
|
715
|
+
}
|
|
716
|
+
buildCredentialDeliveryCleanupCompleteStatement(linkSessionId) {
|
|
717
|
+
return this.options.database.prepare(`UPDATE linked_device_wallet_session_credential_deliveries_v1
|
|
718
|
+
SET lifecycle_kind = 'cleanup_complete', cleanup_state = 'complete',
|
|
719
|
+
cleanup_completed_at_ms = ?
|
|
720
|
+
WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
|
|
721
|
+
AND link_session_id = ? AND lifecycle_kind = 'acknowledged'
|
|
722
|
+
AND cleanup_state = 'session_removed'`).bind(this.nowV1(), this.options.scope.namespace, this.options.scope.orgId, this.options.scope.projectId, this.options.scope.envId, String(linkSessionId));
|
|
723
|
+
}
|
|
724
|
+
async reserveSignerMaterial(input, sourceContributionPreparation) {
|
|
725
|
+
assertRecipientRequestsMatchManifest(input);
|
|
726
|
+
let ed25519;
|
|
727
|
+
let ecdsa;
|
|
728
|
+
let ed25519Preparation;
|
|
729
|
+
let ecdsaPreparation;
|
|
730
|
+
for (const signer of input.signerManifest.signers) {
|
|
731
|
+
const sourceContribution = sourceContributionForSigner(input, signer);
|
|
732
|
+
const prepared = sourceContributionPreparationForSigner(sourceContributionPreparation, signer);
|
|
733
|
+
const targetMaterialActivation = targetMaterialActivationForPreparation(prepared);
|
|
734
|
+
const sourceMaterialActivation = sourceMaterialActivationForSigner(input, signer);
|
|
735
|
+
assertLinkedDeviceOrdinaryMaterialSourceContributionMatchesContextV1({
|
|
736
|
+
contribution: sourceContribution,
|
|
737
|
+
linkSessionId: input.linkSessionId,
|
|
738
|
+
enrollmentId: input.enrollmentId,
|
|
739
|
+
sourceAuthorityId: input.sourceAuthority.authority.authorityId,
|
|
740
|
+
walletKeyId: signer.walletKeyId,
|
|
741
|
+
targetDeviceId: input.targetDeviceId,
|
|
742
|
+
targetFactorVerificationDigestB64u: input.targetFactor.verificationDigestB64u,
|
|
743
|
+
sourceMaterialActivation,
|
|
744
|
+
targetMaterialActivation,
|
|
745
|
+
sourceSigner: signer.keyFamily === "ed25519" ? {
|
|
746
|
+
keyFamily: "ed25519",
|
|
747
|
+
walletKeyId: signer.walletKeyId,
|
|
748
|
+
registeredPublicKeyB64u: signer.registeredPublicKeyB64u
|
|
749
|
+
} : {
|
|
750
|
+
keyFamily: "ecdsa_secp256k1",
|
|
751
|
+
walletKeyId: signer.walletKeyId,
|
|
752
|
+
thresholdPublicKey33B64u: signer.thresholdPublicKey33B64u
|
|
753
|
+
}
|
|
754
|
+
});
|
|
755
|
+
const preparation = workerReservationPreparationForContribution({
|
|
756
|
+
sourceContributionPreparation: prepared,
|
|
757
|
+
sourceContribution
|
|
758
|
+
});
|
|
759
|
+
if (signer.keyFamily === "ed25519") {
|
|
760
|
+
if (preparation.keyFamily !== "ed25519") throw new Error("ordinary material reservation preparation family does not match signer");
|
|
761
|
+
const workerPreparation = preparation.preparation;
|
|
762
|
+
assertPreparationActivationMatches(targetMaterialActivation, workerPreparation.sourceContribution.targetMaterialActivation);
|
|
763
|
+
const reservation = await this.options.reservationService.reserveOrdinaryInactiveSignerMaterialV1({
|
|
764
|
+
kind: "ordinary_ed25519_signer_material_reservation_request_v1",
|
|
765
|
+
keyFamily: "ed25519",
|
|
766
|
+
signer,
|
|
767
|
+
plannedActivationRef: targetMaterialActivation,
|
|
768
|
+
preparation: workerPreparation
|
|
769
|
+
});
|
|
770
|
+
if (reservation.keyFamily !== "ed25519") throw new Error("ordinary material reservation returned the wrong family");
|
|
771
|
+
ed25519 = reservation;
|
|
772
|
+
ed25519Preparation = workerPreparation;
|
|
773
|
+
continue;
|
|
774
|
+
}
|
|
775
|
+
if (preparation.keyFamily !== "ecdsa_secp256k1") throw new Error("ordinary material reservation preparation family does not match signer");
|
|
776
|
+
const workerPreparation = preparation.preparation;
|
|
777
|
+
assertPreparationActivationMatches(targetMaterialActivation, workerPreparation.sourceContribution.binding.target.activation);
|
|
778
|
+
const reservation = await this.options.reservationService.reserveOrdinaryInactiveSignerMaterialV1({
|
|
779
|
+
kind: "ordinary_ecdsa_signer_material_reservation_request_v1",
|
|
780
|
+
keyFamily: "ecdsa_secp256k1",
|
|
781
|
+
signer,
|
|
782
|
+
plannedActivationRef: targetMaterialActivation,
|
|
783
|
+
preparation: workerPreparation
|
|
784
|
+
});
|
|
785
|
+
if (reservation.keyFamily !== "ecdsa_secp256k1") throw new Error("ordinary material reservation returned the wrong family");
|
|
786
|
+
ecdsa = reservation;
|
|
787
|
+
ecdsaPreparation = workerPreparation;
|
|
788
|
+
}
|
|
789
|
+
if (!ed25519 && !ecdsa) throw new Error("signer manifest produced no reservations");
|
|
790
|
+
if (ed25519 && ecdsa) {
|
|
791
|
+
if (!ed25519Preparation || !ecdsaPreparation) throw new Error("signer material reservation preparation was not retained");
|
|
792
|
+
return {
|
|
793
|
+
packages: {
|
|
794
|
+
kind: "committed_signer_package_set_v1",
|
|
795
|
+
keyFamilies: ["ed25519", "ecdsa_secp256k1"],
|
|
796
|
+
ed25519: committedEd25519Package(ed25519),
|
|
797
|
+
ecdsa: committedEcdsaPackage(ecdsa)
|
|
798
|
+
},
|
|
799
|
+
ordinarySignerMaterialPreparations: sourceContributionPreparation,
|
|
800
|
+
serverReservationIds: {
|
|
801
|
+
ed25519: {
|
|
802
|
+
reservationId: ed25519.serverMaterial.reservationId,
|
|
803
|
+
preparation: ed25519Preparation
|
|
804
|
+
},
|
|
805
|
+
ecdsa_secp256k1: {
|
|
806
|
+
reservationId: ecdsa.serverMaterial.reservationId,
|
|
807
|
+
preparation: ecdsaPreparation
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
};
|
|
811
|
+
}
|
|
812
|
+
if (ed25519) {
|
|
813
|
+
if (!ed25519Preparation) throw new Error("Ed25519 reservation preparation was not retained");
|
|
814
|
+
return {
|
|
815
|
+
packages: {
|
|
816
|
+
kind: "committed_signer_package_set_v1",
|
|
817
|
+
keyFamilies: ["ed25519"],
|
|
818
|
+
ed25519: committedEd25519Package(ed25519)
|
|
819
|
+
},
|
|
820
|
+
ordinarySignerMaterialPreparations: sourceContributionPreparation,
|
|
821
|
+
serverReservationIds: { ed25519: {
|
|
822
|
+
reservationId: ed25519.serverMaterial.reservationId,
|
|
823
|
+
preparation: ed25519Preparation
|
|
824
|
+
} }
|
|
825
|
+
};
|
|
826
|
+
}
|
|
827
|
+
if (!ecdsa) throw new Error("signer manifest produced no ECDSA reservation");
|
|
828
|
+
if (!ecdsaPreparation) throw new Error("ECDSA reservation preparation was not retained");
|
|
829
|
+
return {
|
|
830
|
+
packages: {
|
|
831
|
+
kind: "committed_signer_package_set_v1",
|
|
832
|
+
keyFamilies: ["ecdsa_secp256k1"],
|
|
833
|
+
ecdsa: committedEcdsaPackage(ecdsa)
|
|
834
|
+
},
|
|
835
|
+
ordinarySignerMaterialPreparations: sourceContributionPreparation,
|
|
836
|
+
serverReservationIds: { ecdsa_secp256k1: {
|
|
837
|
+
reservationId: ecdsa.serverMaterial.reservationId,
|
|
838
|
+
preparation: ecdsaPreparation
|
|
839
|
+
} }
|
|
840
|
+
};
|
|
841
|
+
}
|
|
842
|
+
async activateReservations(stored, activatedAtMs) {
|
|
843
|
+
const activation = this.options.materialActivation;
|
|
844
|
+
for (const family of stored.packages.signerPackages.keyFamilies) {
|
|
845
|
+
if (family === "ed25519") {
|
|
846
|
+
const packageValue = stored.packages.signerPackages.ed25519;
|
|
847
|
+
const reservation = stored.serverReservationIds.ed25519;
|
|
848
|
+
if (!reservation || !packageValue) throw new Error("server reservation for ed25519 is missing");
|
|
849
|
+
await activation.activateOrdinaryInactiveSignerMaterialV1({
|
|
850
|
+
keyFamily: "ed25519",
|
|
851
|
+
reservationId: reservation.reservationId,
|
|
852
|
+
materialActivation: packageValue.materialActivation,
|
|
853
|
+
activatedAtMs,
|
|
854
|
+
preparation: {
|
|
855
|
+
keyFamily: "ed25519",
|
|
856
|
+
preparation: reservation.preparation
|
|
857
|
+
}
|
|
858
|
+
});
|
|
859
|
+
continue;
|
|
860
|
+
}
|
|
861
|
+
const packageValue = stored.packages.signerPackages.ecdsa;
|
|
862
|
+
const reservation = stored.serverReservationIds.ecdsa_secp256k1;
|
|
863
|
+
if (!reservation || !packageValue) throw new Error("server reservation for ECDSA is missing");
|
|
864
|
+
await activation.activateOrdinaryInactiveSignerMaterialV1({
|
|
865
|
+
keyFamily: "ecdsa_secp256k1",
|
|
866
|
+
reservationId: reservation.reservationId,
|
|
867
|
+
materialActivation: packageValue.materialActivation,
|
|
868
|
+
activatedAtMs,
|
|
869
|
+
preparation: {
|
|
870
|
+
keyFamily: "ecdsa_secp256k1",
|
|
871
|
+
preparation: reservation.preparation
|
|
872
|
+
}
|
|
873
|
+
});
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
async readCommittedWalletSession(authority, authMethod, issuedAtMs) {
|
|
877
|
+
const prepared = await this.options.authorizationService.prepareWalletSessionAuthorizationV2(this.buildWalletSessionAuthorizationInput(authority, authMethod, issuedAtMs));
|
|
878
|
+
const committed = await this.options.authorizationService.readWalletSessionAuthorizationV2ByMint({
|
|
879
|
+
tenantId: prepared.session.tenantId,
|
|
880
|
+
principalId: prepared.session.principalId,
|
|
881
|
+
walletId: prepared.session.walletId,
|
|
882
|
+
authorityId: prepared.session.authorityId,
|
|
883
|
+
walletAuthMethodId: prepared.session.walletAuthMethodId,
|
|
884
|
+
mintId: prepared.session.mintId
|
|
885
|
+
});
|
|
886
|
+
if (!committed || committed.retiredAtMs !== null) throw new LinkedDeviceActivationIntegrityErrorV1("linked-device Wallet Session authorization is not active");
|
|
887
|
+
if (!walletSessionAuthorizationV2RecordsEqual(committed.session, prepared.session)) throw new LinkedDeviceActivationIntegrityErrorV1("linked-device Wallet Session authorization differs from its commit");
|
|
888
|
+
return {
|
|
889
|
+
session: committed.session,
|
|
890
|
+
quota: prepared.quota,
|
|
891
|
+
primaryOperationCredentialDigestB64u: committed.primaryOperationCredentialDigestB64u
|
|
892
|
+
};
|
|
893
|
+
}
|
|
894
|
+
buildInstallationActivationStatement(input) {
|
|
895
|
+
return this.options.database.prepare(`UPDATE linked_device_authority_installations
|
|
896
|
+
SET installed_record_set_digest_b64u = ?, activated_at_ms = ?, updated_at_ms = ?
|
|
897
|
+
WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
|
|
898
|
+
AND link_session_id = ? AND package_set_digest_b64u = ?
|
|
899
|
+
AND installed_record_set_digest_b64u IS NULL AND activated_at_ms IS NULL`).bind(String(input.receipt.installedRecordSetDigestB64u), input.receipt.installedAtMs, input.receipt.installedAtMs, this.options.scope.namespace, this.options.scope.orgId, this.options.scope.projectId, this.options.scope.envId, String(input.stored.linkSessionId), String(input.stored.packageSetDigestB64u));
|
|
900
|
+
}
|
|
901
|
+
buildCredentialDeliveryInsertStatement(delivery) {
|
|
902
|
+
const aad = delivery.aad;
|
|
903
|
+
return this.options.database.prepare(`INSERT INTO linked_device_wallet_session_credential_deliveries_v1 (
|
|
904
|
+
namespace, org_id, project_id, env_id, link_session_id, tenant_id,
|
|
905
|
+
authorization_id, wallet_session_id, quota_id, principal_id,
|
|
906
|
+
authority_id, wallet_id, wallet_auth_method_id, credential_digest_b64u,
|
|
907
|
+
recipient_kind, recipient_public_key_b64u, recipient_binding_digest_b64u,
|
|
908
|
+
envelope_alg, aad_digest_b64u, sealed_envelope_json, sealed_envelope_digest_b64u,
|
|
909
|
+
installation_receipt_digest_b64u, issued_at_ms, expires_at_ms,
|
|
910
|
+
lifecycle_kind, acknowledged_at_ms, acknowledgement_receipt_json,
|
|
911
|
+
cleanup_state, cleanup_receipt_json, cleanup_completed_at_ms,
|
|
912
|
+
acknowledgement_auth_binding_digest_b64u,
|
|
913
|
+
acknowledgement_auth_package_set_digest_b64u,
|
|
914
|
+
acknowledgement_auth_expires_at_ms
|
|
915
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'p256_ecdh', ?, ?,
|
|
916
|
+
'p256-ecdh-aes256gcm-v1', ?, ?, ?, ?, ?, ?, 'issued', NULL, NULL,
|
|
917
|
+
'pending', NULL, NULL, NULL, NULL, NULL)`).bind(aad.namespace, aad.orgId, aad.projectId, aad.envId, String(aad.linkSessionId), String(aad.tenantId), String(aad.authorizationId), String(aad.walletSessionId), String(aad.quotaId), String(aad.principalId), String(aad.authorityId), String(aad.walletId), String(aad.walletAuthMethodId), String(aad.credentialDigestB64u), aad.recipientPublicKey65B64u, String(delivery.recipientBindingDigestB64u), String(delivery.aadDigestB64u), JSON.stringify(delivery.envelope), String(delivery.envelopeDigestB64u), String(delivery.installationReceiptDigestB64u), aad.issuedAtMs, aad.expiresAtMs);
|
|
918
|
+
}
|
|
919
|
+
async readCredentialDelivery(linkSessionId) {
|
|
920
|
+
const row = await this.readCredentialDeliveryRow(linkSessionId);
|
|
921
|
+
if (!row || row.lifecycle_kind !== "issued") return null;
|
|
922
|
+
return parseStoredCredentialDelivery(row);
|
|
923
|
+
}
|
|
924
|
+
async readCredentialDeliveryRow(linkSessionId) {
|
|
925
|
+
return await this.options.database.prepare(`SELECT * FROM linked_device_wallet_session_credential_deliveries_v1
|
|
926
|
+
WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
|
|
927
|
+
AND link_session_id = ?
|
|
928
|
+
LIMIT 1`).bind(this.options.scope.namespace, this.options.scope.orgId, this.options.scope.projectId, this.options.scope.envId, String(linkSessionId)).first();
|
|
929
|
+
}
|
|
930
|
+
buildWalletSessionAuthorizationInput(authority, authMethod, issuedAtMs) {
|
|
931
|
+
const tenantId = requireParsed(parseTenantId(this.options.tenantId), "tenantId");
|
|
932
|
+
const principalId = requireParsed(parsePrincipalId(`linked-device:${String(authority.principal.deviceId)}`), "principalId");
|
|
933
|
+
const mintId = requireParsed(parseWalletSessionMintId(`linked-device-authority:${String(authority.authorityId)}`), "mintId");
|
|
934
|
+
const ttlMs = this.options.walletSessionTtlMs ?? 900 * 1e3;
|
|
935
|
+
const remainingUses = this.options.walletSessionRemainingUses ?? 100;
|
|
936
|
+
if (!Number.isSafeInteger(ttlMs) || ttlMs <= 0 || !Number.isSafeInteger(remainingUses) || remainingUses <= 0) throw new Error("ordinary Wallet Session policy is invalid");
|
|
937
|
+
return {
|
|
938
|
+
tenantId,
|
|
939
|
+
principalId,
|
|
940
|
+
walletId: authority.walletId,
|
|
941
|
+
authority,
|
|
942
|
+
walletAuthMethodId: authMethod.walletAuthMethodId,
|
|
943
|
+
mintId,
|
|
944
|
+
remainingUses,
|
|
945
|
+
issuedAtMs,
|
|
946
|
+
expiresAtMs: issuedAtMs + ttlMs
|
|
947
|
+
};
|
|
948
|
+
}
|
|
949
|
+
async markInstalled(stored, receipt) {
|
|
950
|
+
if (d1ChangedRows(await this.options.database.prepare(`UPDATE linked_device_authority_installations
|
|
951
|
+
SET installed_record_set_digest_b64u = ?, activated_at_ms = ?, updated_at_ms = ?
|
|
952
|
+
WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
|
|
953
|
+
AND link_session_id = ? AND package_set_digest_b64u = ?
|
|
954
|
+
AND (installed_record_set_digest_b64u IS NULL OR installed_record_set_digest_b64u = ?)`).bind(String(receipt.installedRecordSetDigestB64u), receipt.installedAtMs, receipt.installedAtMs, this.options.scope.namespace, this.options.scope.orgId, this.options.scope.projectId, this.options.scope.envId, String(stored.linkSessionId), String(stored.packageSetDigestB64u), String(receipt.installedRecordSetDigestB64u)).run()) !== 1) {
|
|
955
|
+
if ((await this.readInstallation(stored.linkSessionId))?.installedRecordSetDigestB64u !== receipt.installedRecordSetDigestB64u) throw new Error("installation acknowledgement conflicts with a prior receipt");
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
async prepareAuthorityAllocation(input, existing) {
|
|
959
|
+
const current = await this.readAuthorityAllocation(input.linkSessionId);
|
|
960
|
+
if (current) {
|
|
961
|
+
assertAuthorityAllocationMatches(current, input, existing);
|
|
962
|
+
return {
|
|
963
|
+
authorityId: current.authorityId,
|
|
964
|
+
statement: null
|
|
965
|
+
};
|
|
966
|
+
}
|
|
967
|
+
const candidate = existing?.authorityId ?? requireParsed(parseWalletAuthorityId(`wallet-authority:${secureRandomBase64Url(32, "linked-device wallet authority id")}`), "authorityId");
|
|
968
|
+
return {
|
|
969
|
+
authorityId: candidate,
|
|
970
|
+
statement: this.options.database.prepare(`INSERT INTO linked_device_authority_allocations (
|
|
971
|
+
namespace, org_id, project_id, env_id, link_session_id,
|
|
972
|
+
authority_id, wallet_id, enrollment_id, device_id, created_at_ms
|
|
973
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).bind(this.options.scope.namespace, this.options.scope.orgId, this.options.scope.projectId, this.options.scope.envId, String(input.linkSessionId), String(candidate), String(input.walletId), String(input.enrollmentId), String(input.targetDeviceId), input.nowMs)
|
|
974
|
+
};
|
|
975
|
+
}
|
|
976
|
+
async prepareEmailOtpEnrollmentStatements(input) {
|
|
977
|
+
if (input.targetFactor.kind !== "verified_email_otp_target_v1") return [];
|
|
978
|
+
if (input.targetFactor.enrollment.kind !== "new_enrollment") return [];
|
|
979
|
+
const material = input.emailOtpEnrollment;
|
|
980
|
+
if (!material) throw new Error("new Email OTP target is missing enrollment material");
|
|
981
|
+
const finalizer = this.options.emailOtpEnrollmentFinalizer;
|
|
982
|
+
if (!finalizer) throw new Error("new Email OTP target enrollment finalizer is not configured");
|
|
983
|
+
const prepared = await finalizer.prepareLinkedDeviceEnrollment({
|
|
984
|
+
walletId: String(input.walletId),
|
|
985
|
+
orgId: this.options.scope.orgId,
|
|
986
|
+
authSubjectId: input.targetFactor.providerUserId,
|
|
987
|
+
verifiedEmail: input.targetFactor.targetEmail,
|
|
988
|
+
material,
|
|
989
|
+
nowMs: input.nowMs
|
|
990
|
+
});
|
|
991
|
+
if (!prepared.ok) throw new Error(prepared.message);
|
|
992
|
+
return prepared.statements;
|
|
993
|
+
}
|
|
994
|
+
async readAuthorityAllocation(linkSessionId) {
|
|
995
|
+
const row = await this.options.database.prepare(`SELECT authority_id, wallet_id, enrollment_id, device_id
|
|
996
|
+
FROM linked_device_authority_allocations
|
|
997
|
+
WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
|
|
998
|
+
AND link_session_id = ?
|
|
999
|
+
LIMIT 1`).bind(this.options.scope.namespace, this.options.scope.orgId, this.options.scope.projectId, this.options.scope.envId, String(linkSessionId)).first();
|
|
1000
|
+
if (!row) return null;
|
|
1001
|
+
return parseAuthorityAllocation(row);
|
|
1002
|
+
}
|
|
1003
|
+
async buildInstallationInsertStatement(input) {
|
|
1004
|
+
return this.options.database.prepare(`INSERT INTO linked_device_authority_installations (
|
|
1005
|
+
namespace, org_id, project_id, env_id, link_session_id, authority_id,
|
|
1006
|
+
wallet_id, auth_method_id, device_id, package_set_digest_b64u,
|
|
1007
|
+
target_factor_verification_digest_b64u, target_factor_verified_at_ms,
|
|
1008
|
+
source_manifest_digest_b64u, delivery_recipient_public_key_b64u, packages_json,
|
|
1009
|
+
server_reservation_ids_json, installed_record_set_digest_b64u,
|
|
1010
|
+
activated_at_ms, created_at_ms, updated_at_ms
|
|
1011
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).bind(this.options.scope.namespace, this.options.scope.orgId, this.options.scope.projectId, this.options.scope.envId, String(input.input.linkSessionId), String(input.packages.authority.authorityId), String(input.packages.authority.walletId), String(input.packages.authMethod.walletAuthMethodId), String(input.input.targetDeviceId), String(input.packages.packageSetDigestB64u), String(input.input.targetFactor.verificationDigestB64u), input.input.targetFactor.verifiedAtMs, await digestJson(input.input.signerManifest), input.input.deliveryRecipientPublicKey65B64u, JSON.stringify(input.packages), JSON.stringify({
|
|
1012
|
+
ed25519: input.serverReservationIds.ed25519 ?? null,
|
|
1013
|
+
ecdsa_secp256k1: input.serverReservationIds.ecdsa_secp256k1 ?? null
|
|
1014
|
+
}), null, null, input.nowMs, input.nowMs);
|
|
1015
|
+
}
|
|
1016
|
+
async readInstallation(linkSessionId) {
|
|
1017
|
+
const row = await this.options.database.prepare(`SELECT * FROM linked_device_authority_installations
|
|
1018
|
+
WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
|
|
1019
|
+
AND link_session_id = ? LIMIT 1`).bind(this.options.scope.namespace, this.options.scope.orgId, this.options.scope.projectId, this.options.scope.envId, String(linkSessionId)).first();
|
|
1020
|
+
return row ? parseStoredInstallationRow(row) : null;
|
|
1021
|
+
}
|
|
1022
|
+
async readInstallationByAuthority(authorityId) {
|
|
1023
|
+
const row = await this.options.database.prepare(`SELECT * FROM linked_device_authority_installations
|
|
1024
|
+
WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
|
|
1025
|
+
AND authority_id = ? LIMIT 1`).bind(this.options.scope.namespace, this.options.scope.orgId, this.options.scope.projectId, this.options.scope.envId, String(authorityId)).first();
|
|
1026
|
+
return row ? parseStoredInstallationRow(row) : null;
|
|
1027
|
+
}
|
|
1028
|
+
async readInstallationsByWallet(walletId) {
|
|
1029
|
+
return ((await this.options.database.prepare(`SELECT * FROM linked_device_authority_installations
|
|
1030
|
+
WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
|
|
1031
|
+
AND wallet_id = ?
|
|
1032
|
+
ORDER BY link_session_id ASC`).bind(this.options.scope.namespace, this.options.scope.orgId, this.options.scope.projectId, this.options.scope.envId, String(walletId)).all()).results ?? []).map(parseStoredInstallationRow);
|
|
1033
|
+
}
|
|
1034
|
+
};
|
|
1035
|
+
function assertRecipientRequestsMatchManifest(input) {
|
|
1036
|
+
if (input.ordinarySignerMaterialRecipientRequests.length !== input.signerManifest.signers.length) throw new Error("ordinary signer material recipient requests do not match the signer manifest");
|
|
1037
|
+
if (input.sourceContribution.length !== input.signerManifest.signers.length) throw new Error("ordinary source contributions do not match the signer manifest");
|
|
1038
|
+
for (const signer of input.signerManifest.signers) {
|
|
1039
|
+
recipientRequestForSigner(input, signer);
|
|
1040
|
+
sourceContributionForSigner(input, signer);
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
function recipientRequestForSigner(input, signer) {
|
|
1044
|
+
const matches = input.ordinarySignerMaterialRecipientRequests.filter((request) => request.walletKeyId === signer.walletKeyId && request.keyFamily === signer.keyFamily);
|
|
1045
|
+
if (matches.length !== 1) throw new Error(`ordinary signer material recipient request for ${String(signer.walletKeyId)} is missing or duplicated`);
|
|
1046
|
+
const request = matches[0];
|
|
1047
|
+
if (!request) throw new Error("ordinary signer material recipient request is missing");
|
|
1048
|
+
return request;
|
|
1049
|
+
}
|
|
1050
|
+
function sourceContributionForSigner(input, signer) {
|
|
1051
|
+
const matches = input.sourceContribution.filter((contribution) => contribution.walletKeyId === signer.walletKeyId && contribution.keyFamily === signer.keyFamily);
|
|
1052
|
+
if (matches.length !== 1) throw new Error(`ordinary source contribution for ${String(signer.walletKeyId)} is missing or duplicated`);
|
|
1053
|
+
const contribution = matches[0];
|
|
1054
|
+
if (!contribution) throw new Error("ordinary source contribution is missing");
|
|
1055
|
+
return contribution;
|
|
1056
|
+
}
|
|
1057
|
+
function sourceMaterialActivationForSigner(input, signer) {
|
|
1058
|
+
const activation = signer.keyFamily === "ed25519" ? input.sourceAuthority.authority.signerActivations.ed25519?.materialActivation : input.sourceAuthority.authority.signerActivations.ecdsa?.materialActivation;
|
|
1059
|
+
if (!activation) throw new Error(`ordinary source activation for ${String(signer.walletKeyId)} is missing`);
|
|
1060
|
+
return activation;
|
|
1061
|
+
}
|
|
1062
|
+
function sourceContributionPreparationForSigner(preparations, signer) {
|
|
1063
|
+
const preparation = preparations.find((candidate) => signer.keyFamily === "ed25519" ? "kind" in candidate : !("kind" in candidate));
|
|
1064
|
+
if (!preparation) throw new Error(`source contribution preparation for ${signer.keyFamily} is missing`);
|
|
1065
|
+
return preparation;
|
|
1066
|
+
}
|
|
1067
|
+
function workerReservationPreparationForContribution(input) {
|
|
1068
|
+
if ("kind" in input.sourceContributionPreparation) {
|
|
1069
|
+
if (input.sourceContribution.keyFamily !== "ed25519") throw new Error("Ed25519 source contribution preparation family does not match contribution");
|
|
1070
|
+
return {
|
|
1071
|
+
keyFamily: "ed25519",
|
|
1072
|
+
preparation: {
|
|
1073
|
+
kind: "ordinary_ed25519_signer_material_reservation_preparation_v1",
|
|
1074
|
+
sourceContribution: input.sourceContribution,
|
|
1075
|
+
targetBinding: input.sourceContributionPreparation.targetAdmission.binding,
|
|
1076
|
+
applicationBinding: input.sourceContributionPreparation.applicationBinding
|
|
1077
|
+
}
|
|
1078
|
+
};
|
|
1079
|
+
}
|
|
1080
|
+
if (input.sourceContribution.keyFamily !== "ecdsa_secp256k1") throw new Error("ECDSA source contribution preparation family does not match contribution");
|
|
1081
|
+
return {
|
|
1082
|
+
keyFamily: "ecdsa_secp256k1",
|
|
1083
|
+
preparation: {
|
|
1084
|
+
kind: "ordinary_ecdsa_signer_material_reservation_preparation_v1",
|
|
1085
|
+
sourceDerivation: input.sourceContribution.sourceDerivation,
|
|
1086
|
+
sourceContribution: input.sourceContribution.package
|
|
1087
|
+
}
|
|
1088
|
+
};
|
|
1089
|
+
}
|
|
1090
|
+
function targetMaterialActivationForPreparation(preparation) {
|
|
1091
|
+
return "kind" in preparation ? preparation.targetMaterialActivation : preparation.target.activation;
|
|
1092
|
+
}
|
|
1093
|
+
async function validateVerifiedLinkInput(input, nowMs, authMethodStore, sourceContributionPreparation) {
|
|
1094
|
+
if (input.sourceAuthority.authority.state !== "active") throw new Error("source authority must be active");
|
|
1095
|
+
if (input.sourceAuthority.authority.walletId !== input.walletId) throw new Error("source authority wallet does not match link wallet");
|
|
1096
|
+
if (input.sourceAuthority.authority.authorityDigestB64u !== input.sourceAuthority.authorityDigestB64u) throw new Error("source authority digest is unverified");
|
|
1097
|
+
if (!await walletAuthorityDigestsMatchV1(input.sourceAuthority.authority)) throw new Error("source authority digest does not match its canonical record");
|
|
1098
|
+
const sourceAuthMethod = await authMethodStore.readByIdV2({ walletAuthMethodId: input.sourceAuthority.authMethodId });
|
|
1099
|
+
if (!sourceAuthMethod || sourceAuthMethod.status !== "active" || sourceAuthMethod.walletId !== input.walletId || sourceAuthMethod.walletAuthorityId !== input.sourceAuthority.authority.authorityId) throw new Error("source auth method is not active for the verified authority");
|
|
1100
|
+
if (input.sourceAuthority.verifiedRevocationEpoch !== input.sourceAuthority.authority.revocationEpoch) throw new Error("source authority revocation epoch is stale");
|
|
1101
|
+
if (input.sourceAuthority.verifiedAtMs > nowMs || input.targetFactor.verifiedAtMs > nowMs) throw new Error("link verification is from the future");
|
|
1102
|
+
if (input.targetFactor.authMethod.walletId !== input.walletId) throw new Error("target auth method wallet does not match link wallet");
|
|
1103
|
+
if (input.targetFactor.kind === "verified_email_otp_target_v1") {
|
|
1104
|
+
if (input.targetFactor.enrollment.kind === "new_enrollment" ? input.emailOtpEnrollment === null : input.emailOtpEnrollment !== null) throw new Error("Email OTP target enrollment material does not match its branch");
|
|
1105
|
+
} else if (input.emailOtpEnrollment !== null) throw new Error("Passkey target cannot carry Email OTP enrollment material");
|
|
1106
|
+
if (input.signerManifest.signers.some((signer) => signer.walletId !== input.walletId)) throw new Error("signer manifest wallet does not match link wallet");
|
|
1107
|
+
assertRecipientRequestsMatchManifest(input);
|
|
1108
|
+
const permissions = parseDelegatedWalletPermissionSetV1(input.permissions);
|
|
1109
|
+
if (!permissions.ok) throw new Error(permissions.error.message);
|
|
1110
|
+
const attenuation = validateDelegatedWalletAuthorityAttenuationV1({
|
|
1111
|
+
parent: buildDelegatedWalletAuthorityV1({ permissions: input.sourceAuthority.authority.permissions }),
|
|
1112
|
+
child: buildDelegatedWalletAuthorityV1({ permissions: permissions.value })
|
|
1113
|
+
});
|
|
1114
|
+
if (!attenuation.ok) throw new Error(attenuation.error.message);
|
|
1115
|
+
if (!input.sourceAuthority.authority.permissions.includes("link_devices")) throw new Error("source authority cannot link devices");
|
|
1116
|
+
if (!Number.isSafeInteger(input.sourceAuthority.authority.revocationEpoch) || input.sourceAuthority.authority.revocationEpoch < 0) throw new Error("source authority revocation epoch is invalid");
|
|
1117
|
+
assertSourceContributionPreparationsMatchInputV1(input, sourceContributionPreparation);
|
|
1118
|
+
}
|
|
1119
|
+
function requireSourceContributionPreparations(session) {
|
|
1120
|
+
const preparations = session.sourceContributionPreparation;
|
|
1121
|
+
if (!preparations) throw new Error("linked-device source contribution preparations are missing from the session");
|
|
1122
|
+
return preparations;
|
|
1123
|
+
}
|
|
1124
|
+
function assertSourceContributionPreparationsMatchInputV1(input, preparations) {
|
|
1125
|
+
if (input.sourceContribution.length !== input.signerManifest.signers.length || preparations.length !== input.signerManifest.signers.length || input.ordinarySignerMaterialRecipientRequests.length !== input.signerManifest.signers.length) throw new Error("linked-device source contributions do not match the signer manifest");
|
|
1126
|
+
for (let index = 0; index < input.signerManifest.signers.length; index += 1) {
|
|
1127
|
+
const signer = input.signerManifest.signers[index];
|
|
1128
|
+
const contribution = input.sourceContribution[index];
|
|
1129
|
+
const preparation = preparations[index];
|
|
1130
|
+
const request = input.ordinarySignerMaterialRecipientRequests[index];
|
|
1131
|
+
if (!signer || !contribution || !preparation || !request) throw new Error(`linked-device source contribution ${index} is incomplete`);
|
|
1132
|
+
if (signer.keyFamily !== contribution.keyFamily || signer.keyFamily !== request.keyFamily || signer.walletKeyId !== request.walletKeyId) throw new Error(`linked-device source contribution ${index} family differs from the manifest`);
|
|
1133
|
+
const targetMaterialActivation = targetMaterialActivationForPreparation(preparation);
|
|
1134
|
+
assertLinkedDeviceOrdinaryMaterialSourceContributionMatchesContextV1({
|
|
1135
|
+
contribution,
|
|
1136
|
+
linkSessionId: input.linkSessionId,
|
|
1137
|
+
enrollmentId: input.enrollmentId,
|
|
1138
|
+
sourceAuthorityId: input.sourceAuthority.authority.authorityId,
|
|
1139
|
+
walletKeyId: signer.walletKeyId,
|
|
1140
|
+
targetDeviceId: input.targetDeviceId,
|
|
1141
|
+
targetFactorVerificationDigestB64u: input.targetFactor.verificationDigestB64u,
|
|
1142
|
+
sourceMaterialActivation: sourceMaterialActivationForSigner(input, signer),
|
|
1143
|
+
targetMaterialActivation,
|
|
1144
|
+
sourceSigner: signer.keyFamily === "ed25519" ? {
|
|
1145
|
+
keyFamily: "ed25519",
|
|
1146
|
+
walletKeyId: signer.walletKeyId,
|
|
1147
|
+
registeredPublicKeyB64u: signer.registeredPublicKeyB64u
|
|
1148
|
+
} : {
|
|
1149
|
+
keyFamily: "ecdsa_secp256k1",
|
|
1150
|
+
walletKeyId: signer.walletKeyId,
|
|
1151
|
+
thresholdPublicKey33B64u: signer.thresholdPublicKey33B64u
|
|
1152
|
+
}
|
|
1153
|
+
});
|
|
1154
|
+
assertPreparationMatchesContributionV1(preparation, contribution, request);
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
function assertPreparationMatchesContributionV1(preparation, contribution, request) {
|
|
1158
|
+
if ("kind" in preparation) {
|
|
1159
|
+
if (contribution.keyFamily !== "ed25519" || preparation.sourceRegisteredPublicKeyB64u !== contribution.sourceRegisteredPublicKeyB64u || !mpcMaterialActivationRefsEqual(preparation.targetMaterialActivation, contribution.targetMaterialActivation) || preparation.targetClientRecipientPublicKeyB64u !== contribution.targetClientRecipientPublicKeyB64u || preparation.targetSigningWorkerRecipientPublicKeyB64u !== contribution.targetSigningWorkerRecipientPublicKeyB64u || !sameLinkedDeviceEd25519BindingsV1(preparation.sourceBinding, contribution.sourceBinding) || !("recipientPublicKeyB64u" in request) || request.recipientPublicKeyB64u !== preparation.targetClientRecipientPublicKeyB64u) throw new Error("Ed25519 source contribution differs from its persisted preparation");
|
|
1160
|
+
return;
|
|
1161
|
+
}
|
|
1162
|
+
if (contribution.keyFamily !== "ecdsa_secp256k1" || !mpcMaterialActivationRefsEqual(preparation.source.activation, contribution.sourceSigner.activation) || !mpcMaterialActivationRefsEqual(preparation.target.activation, contribution.target.activation) || preparation.source.thresholdPublicKey33B64u !== contribution.sourceSigner.thresholdPublicKey33B64u || preparation.target.clientRecipientPublicKeyB64u !== contribution.target.clientRecipientPublicKeyB64u || preparation.target.signingWorkerRecipientPublicKeyB64u !== contribution.target.signingWorkerRecipientPublicKeyB64u || !("clientEphemeralPublicKey" in request) || linkedDeviceX25519RecipientPublicKeyB64uV1(request.clientEphemeralPublicKey) !== preparation.target.clientRecipientPublicKeyB64u) throw new Error("ECDSA source contribution differs from its persisted preparation");
|
|
1163
|
+
}
|
|
1164
|
+
function assertPreparationActivationMatches(expected, actual) {
|
|
1165
|
+
if (!mpcMaterialActivationRefsEqual(expected, actual)) throw new Error("ordinary material preparation activation differs from the persisted target activation");
|
|
1166
|
+
}
|
|
1167
|
+
async function buildPendingAuthority(input) {
|
|
1168
|
+
const activationDigest = await computeWalletSignerActivationSetDigestB64u(input.activationSet);
|
|
1169
|
+
const draft = {
|
|
1170
|
+
kind: "wallet_authority_v1",
|
|
1171
|
+
authorityId: input.authorityId,
|
|
1172
|
+
walletId: input.input.walletId,
|
|
1173
|
+
principal: {
|
|
1174
|
+
kind: "owner_device",
|
|
1175
|
+
deviceId: input.input.targetDeviceId
|
|
1176
|
+
},
|
|
1177
|
+
provenance: {
|
|
1178
|
+
kind: "device_link",
|
|
1179
|
+
enrollmentId: input.input.enrollmentId,
|
|
1180
|
+
sourceAuthorityId: input.input.sourceAuthority.authority.authorityId,
|
|
1181
|
+
linkSessionId: input.input.linkSessionId
|
|
1182
|
+
},
|
|
1183
|
+
permissions: input.input.permissions,
|
|
1184
|
+
signerActivations: input.activationSet,
|
|
1185
|
+
signerActivationSetDigestB64u: activationDigest,
|
|
1186
|
+
authorityDigestB64u: input.packageSetDigestB64u,
|
|
1187
|
+
revocationEpoch: 0,
|
|
1188
|
+
createdAtMs: input.nowMs,
|
|
1189
|
+
updatedAtMs: input.nowMs,
|
|
1190
|
+
state: "pending_local_install",
|
|
1191
|
+
localInstallPackageSetDigestB64u: input.packageSetDigestB64u
|
|
1192
|
+
};
|
|
1193
|
+
const authorityDigestB64u = await computeWalletAuthorityDigestB64u(draft);
|
|
1194
|
+
return buildPendingWalletAuthorityV1({
|
|
1195
|
+
...draft,
|
|
1196
|
+
authorityDigestB64u
|
|
1197
|
+
});
|
|
1198
|
+
}
|
|
1199
|
+
function buildPendingAuthMethod(input, authorityId, nowMs) {
|
|
1200
|
+
const draft = input.targetFactor.authMethod;
|
|
1201
|
+
if (draft.createdAtMs > nowMs) throw new Error("target auth method is from the future");
|
|
1202
|
+
if (draft.kind === "passkey") {
|
|
1203
|
+
const record = buildWalletAuthMethodRecordV2({
|
|
1204
|
+
version: "wallet_auth_method_v2",
|
|
1205
|
+
walletAuthMethodId: draft.walletAuthMethodId,
|
|
1206
|
+
walletId: draft.walletId,
|
|
1207
|
+
walletAuthorityId: authorityId,
|
|
1208
|
+
kind: "passkey",
|
|
1209
|
+
status: "pending_local_install",
|
|
1210
|
+
rpId: draft.rpId,
|
|
1211
|
+
credentialIdB64u: draft.credentialIdB64u,
|
|
1212
|
+
credentialPublicKeyB64u: draft.credentialPublicKeyB64u,
|
|
1213
|
+
counter: draft.counter,
|
|
1214
|
+
createdAtMs: draft.createdAtMs,
|
|
1215
|
+
updatedAtMs: nowMs
|
|
1216
|
+
});
|
|
1217
|
+
if (record.status !== "pending_local_install") throw new Error("auth method builder returned a non-pending record");
|
|
1218
|
+
return record;
|
|
1219
|
+
}
|
|
1220
|
+
const record = buildWalletAuthMethodRecordV2({
|
|
1221
|
+
version: "wallet_auth_method_v2",
|
|
1222
|
+
walletAuthMethodId: draft.walletAuthMethodId,
|
|
1223
|
+
walletId: draft.walletId,
|
|
1224
|
+
walletAuthorityId: authorityId,
|
|
1225
|
+
kind: "email_otp",
|
|
1226
|
+
status: "pending_local_install",
|
|
1227
|
+
emailHashHex: draft.emailHashHex,
|
|
1228
|
+
registrationAuthorityId: draft.registrationAuthorityId,
|
|
1229
|
+
createdAtMs: draft.createdAtMs,
|
|
1230
|
+
updatedAtMs: nowMs
|
|
1231
|
+
});
|
|
1232
|
+
if (record.status !== "pending_local_install") throw new Error("auth method builder returned a non-pending record");
|
|
1233
|
+
return record;
|
|
1234
|
+
}
|
|
1235
|
+
function buildActivationSet(manifest, reservations) {
|
|
1236
|
+
const ed25519 = reservations.packages.ed25519;
|
|
1237
|
+
const ecdsa = reservations.packages.ecdsa;
|
|
1238
|
+
if (ed25519 && ecdsa) return buildWalletSignerActivationSetV1({
|
|
1239
|
+
manifest,
|
|
1240
|
+
materialActivations: {
|
|
1241
|
+
keyFamilies: ["ed25519", "ecdsa_secp256k1"],
|
|
1242
|
+
ed25519: ed25519.materialActivation,
|
|
1243
|
+
ecdsa: ecdsa.materialActivation
|
|
1244
|
+
}
|
|
1245
|
+
});
|
|
1246
|
+
if (ed25519) return buildWalletSignerActivationSetV1({
|
|
1247
|
+
manifest,
|
|
1248
|
+
materialActivations: {
|
|
1249
|
+
keyFamilies: ["ed25519"],
|
|
1250
|
+
ed25519: ed25519.materialActivation
|
|
1251
|
+
}
|
|
1252
|
+
});
|
|
1253
|
+
if (!ecdsa) throw new Error("committed signer packages are empty");
|
|
1254
|
+
return buildWalletSignerActivationSetV1({
|
|
1255
|
+
manifest,
|
|
1256
|
+
materialActivations: {
|
|
1257
|
+
keyFamilies: ["ecdsa_secp256k1"],
|
|
1258
|
+
ecdsa: ecdsa.materialActivation
|
|
1259
|
+
}
|
|
1260
|
+
});
|
|
1261
|
+
}
|
|
1262
|
+
function committedEd25519Package(reservation) {
|
|
1263
|
+
return {
|
|
1264
|
+
kind: "committed_ed25519_signer_package_v1",
|
|
1265
|
+
materialActivation: reservation.materialActivation,
|
|
1266
|
+
targetBinding: reservation.targetBinding,
|
|
1267
|
+
applicationBinding: reservation.applicationBinding,
|
|
1268
|
+
participantIds: reservation.participantIds,
|
|
1269
|
+
activationReceipt: reservation.activationReceipt,
|
|
1270
|
+
deriver_a_client_package: reservation.clientMaterial.deriver_a_client_package,
|
|
1271
|
+
deriver_b_client_package: reservation.clientMaterial.deriver_b_client_package
|
|
1272
|
+
};
|
|
1273
|
+
}
|
|
1274
|
+
function committedEcdsaPackage(reservation) {
|
|
1275
|
+
return {
|
|
1276
|
+
kind: "committed_ecdsa_signer_package_v1",
|
|
1277
|
+
materialActivation: reservation.materialActivation,
|
|
1278
|
+
encryptedTargetClientShare: reservation.clientMaterial.encryptedTargetClientShare,
|
|
1279
|
+
activationReceipt: reservation.activationReceipt
|
|
1280
|
+
};
|
|
1281
|
+
}
|
|
1282
|
+
async function buildActiveAuthority(pending, activatedAtMs) {
|
|
1283
|
+
const draft = {
|
|
1284
|
+
kind: "wallet_authority_v1",
|
|
1285
|
+
authorityId: pending.authorityId,
|
|
1286
|
+
walletId: pending.walletId,
|
|
1287
|
+
principal: pending.principal,
|
|
1288
|
+
provenance: pending.provenance,
|
|
1289
|
+
permissions: pending.permissions,
|
|
1290
|
+
signerActivations: pending.signerActivations,
|
|
1291
|
+
signerActivationSetDigestB64u: pending.signerActivationSetDigestB64u,
|
|
1292
|
+
authorityDigestB64u: pending.authorityDigestB64u,
|
|
1293
|
+
revocationEpoch: pending.revocationEpoch,
|
|
1294
|
+
createdAtMs: pending.createdAtMs,
|
|
1295
|
+
updatedAtMs: activatedAtMs,
|
|
1296
|
+
state: "active",
|
|
1297
|
+
activatedAtMs
|
|
1298
|
+
};
|
|
1299
|
+
return buildActiveWalletAuthorityV1({
|
|
1300
|
+
...draft,
|
|
1301
|
+
authorityDigestB64u: await computeWalletAuthorityDigestB64u(draft)
|
|
1302
|
+
});
|
|
1303
|
+
}
|
|
1304
|
+
function buildActiveAuthMethod(pending, activatedAtMs) {
|
|
1305
|
+
if (pending.kind === "passkey") {
|
|
1306
|
+
const record = buildWalletAuthMethodRecordV2({
|
|
1307
|
+
version: "wallet_auth_method_v2",
|
|
1308
|
+
walletAuthMethodId: pending.walletAuthMethodId,
|
|
1309
|
+
walletId: pending.walletId,
|
|
1310
|
+
walletAuthorityId: pending.walletAuthorityId,
|
|
1311
|
+
kind: "passkey",
|
|
1312
|
+
status: "active",
|
|
1313
|
+
rpId: pending.rpId,
|
|
1314
|
+
credentialIdB64u: pending.credentialIdB64u,
|
|
1315
|
+
credentialPublicKeyB64u: pending.credentialPublicKeyB64u,
|
|
1316
|
+
counter: pending.counter,
|
|
1317
|
+
createdAtMs: pending.createdAtMs,
|
|
1318
|
+
updatedAtMs: activatedAtMs,
|
|
1319
|
+
activatedAtMs
|
|
1320
|
+
});
|
|
1321
|
+
if (record.status !== "active") throw new Error("auth method builder returned a non-active record");
|
|
1322
|
+
return record;
|
|
1323
|
+
}
|
|
1324
|
+
const record = buildWalletAuthMethodRecordV2({
|
|
1325
|
+
version: "wallet_auth_method_v2",
|
|
1326
|
+
walletAuthMethodId: pending.walletAuthMethodId,
|
|
1327
|
+
walletId: pending.walletId,
|
|
1328
|
+
walletAuthorityId: pending.walletAuthorityId,
|
|
1329
|
+
kind: "email_otp",
|
|
1330
|
+
status: "active",
|
|
1331
|
+
emailHashHex: pending.emailHashHex,
|
|
1332
|
+
registrationAuthorityId: pending.registrationAuthorityId,
|
|
1333
|
+
createdAtMs: pending.createdAtMs,
|
|
1334
|
+
updatedAtMs: activatedAtMs,
|
|
1335
|
+
activatedAtMs
|
|
1336
|
+
});
|
|
1337
|
+
if (record.status !== "active") throw new Error("auth method builder returned a non-active record");
|
|
1338
|
+
return record;
|
|
1339
|
+
}
|
|
1340
|
+
async function buildPasskeyCredentialPromotionStatements(input) {
|
|
1341
|
+
if (input.authMethod.kind !== "passkey") return [];
|
|
1342
|
+
const signer = await resolveLinkedDeviceEd25519Signer({
|
|
1343
|
+
authority: input.authority,
|
|
1344
|
+
listWalletEd25519Signers: input.listWalletEd25519Signers
|
|
1345
|
+
});
|
|
1346
|
+
const bindingBase = {
|
|
1347
|
+
version: "webauthn_credential_binding_v1",
|
|
1348
|
+
rpId: input.authMethod.rpId,
|
|
1349
|
+
credentialIdB64u: input.authMethod.credentialIdB64u,
|
|
1350
|
+
userId: input.authMethod.walletId,
|
|
1351
|
+
createdAtMs: input.authMethod.createdAtMs,
|
|
1352
|
+
updatedAtMs: input.activatedAtMs
|
|
1353
|
+
};
|
|
1354
|
+
const binding = signer ? {
|
|
1355
|
+
...bindingBase,
|
|
1356
|
+
nearAccountId: signer.nearAccountId,
|
|
1357
|
+
nearEd25519SigningKeyId: signer.nearEd25519SigningKeyId,
|
|
1358
|
+
signerSlot: signer.signerSlot,
|
|
1359
|
+
publicKey: signer.publicKey,
|
|
1360
|
+
relayerKeyId: signer.signingWorkerId,
|
|
1361
|
+
keyVersion: signer.keyVersion,
|
|
1362
|
+
recoveryExportCapable: signer.recoveryExportCapable,
|
|
1363
|
+
clientParticipantId: signer.participantIds[0],
|
|
1364
|
+
relayerParticipantId: signer.participantIds[1],
|
|
1365
|
+
participantIds: [...signer.participantIds],
|
|
1366
|
+
runtimePolicyScope: signer.runtimePolicyScope
|
|
1367
|
+
} : bindingBase;
|
|
1368
|
+
return [prepareD1WebAuthnAuthenticatorInsertStatement({
|
|
1369
|
+
database: input.database,
|
|
1370
|
+
scope: input.scope,
|
|
1371
|
+
userId: input.authMethod.walletId,
|
|
1372
|
+
record: {
|
|
1373
|
+
credentialIdB64u: input.authMethod.credentialIdB64u,
|
|
1374
|
+
credentialPublicKeyB64u: input.authMethod.credentialPublicKeyB64u,
|
|
1375
|
+
counter: input.authMethod.counter,
|
|
1376
|
+
createdAtMs: input.authMethod.createdAtMs,
|
|
1377
|
+
updatedAtMs: input.activatedAtMs,
|
|
1378
|
+
deviceInfo: unknownWebAuthnAuthenticatorDeviceInfo()
|
|
1379
|
+
}
|
|
1380
|
+
}), prepareD1WebAuthnCredentialBindingInsertStatement({
|
|
1381
|
+
database: input.database,
|
|
1382
|
+
scope: input.scope,
|
|
1383
|
+
record: binding
|
|
1384
|
+
})];
|
|
1385
|
+
}
|
|
1386
|
+
async function resolveLinkedDeviceEd25519Signer(input) {
|
|
1387
|
+
const activation = input.authority.signerActivations.ed25519;
|
|
1388
|
+
if (!activation) return null;
|
|
1389
|
+
const matches = (await input.listWalletEd25519Signers(input.authority.walletId)).filter((signer) => linkedDeviceEd25519SignerMatchesAuthority(signer, activation.signer));
|
|
1390
|
+
if (matches.length === 0) throw new Error("linked authority Ed25519 signer record is missing");
|
|
1391
|
+
if (matches.length > 1) throw new Error("linked authority Ed25519 signer record is ambiguous");
|
|
1392
|
+
const signer = matches[0];
|
|
1393
|
+
if (!signer) throw new Error("linked authority Ed25519 signer record is missing");
|
|
1394
|
+
return signer;
|
|
1395
|
+
}
|
|
1396
|
+
function linkedDeviceEd25519SignerMatchesAuthority(signer, authoritySigner) {
|
|
1397
|
+
const walletKeyId = parseWalletKeyId(`wallet-key:ed25519:${signer.walletId}:${signer.nearEd25519SigningKeyId}`);
|
|
1398
|
+
if (!walletKeyId.ok) return false;
|
|
1399
|
+
return signer.walletId === authoritySigner.walletId && walletKeyId.value === authoritySigner.walletKeyId && authoritySigner.registeredPublicKeyB64u === base64UrlEncode(Uint8Array.from(signer.activeYaoCapability.activationResult.public_receipt.registered_public_key));
|
|
1400
|
+
}
|
|
1401
|
+
function projectInstalledEd25519Authority(stored) {
|
|
1402
|
+
if (stored.activatedAtMs === null || stored.installedRecordSetDigestB64u === null) return null;
|
|
1403
|
+
const packages = stored.packages;
|
|
1404
|
+
if (packages.authority.authorityId !== stored.authorityId || packages.authority.walletId !== stored.walletId || packages.authMethod.walletAuthMethodId !== stored.authMethodId || packages.authMethod.walletId !== stored.walletId || packages.authMethod.walletAuthorityId !== stored.authorityId || packages.authority.provenance.kind !== "device_link" || packages.authority.provenance.linkSessionId !== stored.linkSessionId || packages.authority.principal.deviceId !== stored.deviceId) return null;
|
|
1405
|
+
const signerPackage = packages.signerPackages.ed25519;
|
|
1406
|
+
const authorityActivation = packages.authority.signerActivations.ed25519;
|
|
1407
|
+
if (!signerPackage || !authorityActivation) return null;
|
|
1408
|
+
if (!mpcMaterialActivationRefsEqual(signerPackage.materialActivation, authorityActivation.materialActivation) || !mpcMaterialActivationRefsEqual(signerPackage.materialActivation, routerAbMpcMaterialActivationRefFromWire(signerPackage.targetBinding.material_activation)) || !mpcMaterialActivationRefsEqual(signerPackage.materialActivation, routerAbMpcMaterialActivationRefFromWire(signerPackage.activationReceipt.material_activation))) return null;
|
|
1409
|
+
if (signerPackage.targetBinding.operation !== "registration" || signerPackage.applicationBinding.wallet_id !== String(stored.walletId) || base64UrlEncode(Uint8Array.from(signerPackage.activationReceipt.registered_public_key)) !== String(authorityActivation.signer.registeredPublicKeyB64u)) return null;
|
|
1410
|
+
return {
|
|
1411
|
+
walletId: stored.walletId,
|
|
1412
|
+
authorityId: stored.authorityId,
|
|
1413
|
+
walletAuthMethodId: stored.authMethodId,
|
|
1414
|
+
linkSessionId: stored.linkSessionId,
|
|
1415
|
+
deviceId: stored.deviceId,
|
|
1416
|
+
materialActivation: signerPackage.materialActivation,
|
|
1417
|
+
targetBinding: signerPackage.targetBinding,
|
|
1418
|
+
targetSessionId: signerPackage.targetBinding.lifecycle.session_id,
|
|
1419
|
+
applicationBinding: signerPackage.applicationBinding,
|
|
1420
|
+
participantIds: signerPackage.participantIds,
|
|
1421
|
+
activationReceipt: signerPackage.activationReceipt,
|
|
1422
|
+
installedRecordSetDigestB64u: stored.installedRecordSetDigestB64u,
|
|
1423
|
+
activatedAtMs: stored.activatedAtMs
|
|
1424
|
+
};
|
|
1425
|
+
}
|
|
1426
|
+
function projectInstalledEcdsaAuthority(stored) {
|
|
1427
|
+
if (stored.activatedAtMs === null || stored.installedRecordSetDigestB64u === null) return null;
|
|
1428
|
+
const packages = stored.packages;
|
|
1429
|
+
if (packages.authority.authorityId !== stored.authorityId || packages.authority.walletId !== stored.walletId || packages.authMethod.walletAuthMethodId !== stored.authMethodId || packages.authMethod.walletId !== stored.walletId || packages.authMethod.walletAuthorityId !== stored.authorityId || packages.authority.provenance.kind !== "device_link" || packages.authority.provenance.linkSessionId !== stored.linkSessionId || packages.authority.principal.deviceId !== stored.deviceId) return null;
|
|
1430
|
+
const signerPackage = packages.signerPackages.ecdsa;
|
|
1431
|
+
const authorityActivation = packages.authority.signerActivations.ecdsa;
|
|
1432
|
+
if (!signerPackage || !authorityActivation) return null;
|
|
1433
|
+
const receipt = signerPackage.activationReceipt;
|
|
1434
|
+
const source = receipt.binding.source;
|
|
1435
|
+
const target = receipt.binding.target;
|
|
1436
|
+
const sourceScope = receipt.sourceDerivation.sourceNormalSigning.scope;
|
|
1437
|
+
const targetScope = receipt.normalSigning.scope;
|
|
1438
|
+
const authorityEthereumAddress = ecdsaAuthorityEvmAddressB64u(authorityActivation.signer.evmAddress);
|
|
1439
|
+
if (authorityEthereumAddress === null || !mpcMaterialActivationRefsEqual(signerPackage.materialActivation, authorityActivation.materialActivation) || !mpcMaterialActivationRefsEqual(signerPackage.materialActivation, target.activation) || !mpcMaterialActivationRefsEqual(signerPackage.materialActivation, routerAbMpcMaterialActivationRefFromWire(targetScope.material_activation)) || String(receipt.binding.linkSessionId) !== String(stored.linkSessionId) || String(receipt.binding.enrollmentId) !== String(packages.authority.provenance.enrollmentId) || String(receipt.binding.sourceAuthorityId) !== String(packages.authority.provenance.sourceAuthorityId) || target.targetDeviceId !== stored.deviceId || target.targetFactorVerificationDigestB64u !== stored.targetFactorVerificationDigestB64u || signerPackage.encryptedTargetClientShare.recipientPublicKeyB64u !== target.clientRecipientPublicKeyB64u || sourceScope.wallet_id !== String(stored.walletId) || targetScope.wallet_id !== String(stored.walletId) || !mpcMaterialActivationRefsEqual(routerAbMpcMaterialActivationRefFromWire(sourceScope.material_activation), source.activation) || sourceScope.public_identity.client_share_retry_counter !== targetScope.public_identity.client_share_retry_counter || sourceScope.public_identity.server_share_retry_counter !== targetScope.public_identity.server_share_retry_counter || targetScope.signing_worker.server_id !== target.activation.signingWorker || targetScope.public_identity.derivation_client_share_public_key33_b64u !== receipt.binding.targetClientPublicKey33B64u || targetScope.public_identity.server_public_key33_b64u !== receipt.targetRelayerPublicKey33B64u || targetScope.public_identity.threshold_public_key33_b64u !== receipt.thresholdPublicKey33B64u || targetScope.public_identity.ethereum_address20_b64u !== receipt.thresholdEthereumAddress20B64u || authorityActivation.signer.walletId !== stored.walletId || authorityActivation.signer.thresholdPublicKey33B64u !== receipt.thresholdPublicKey33B64u || authorityEthereumAddress !== receipt.thresholdEthereumAddress20B64u) return null;
|
|
1440
|
+
return {
|
|
1441
|
+
walletId: stored.walletId,
|
|
1442
|
+
authorityId: stored.authorityId,
|
|
1443
|
+
walletAuthMethodId: stored.authMethodId,
|
|
1444
|
+
linkSessionId: stored.linkSessionId,
|
|
1445
|
+
deviceId: stored.deviceId,
|
|
1446
|
+
materialActivation: signerPackage.materialActivation,
|
|
1447
|
+
signer: authorityActivation.signer,
|
|
1448
|
+
activationReceipt: receipt,
|
|
1449
|
+
installedRecordSetDigestB64u: stored.installedRecordSetDigestB64u,
|
|
1450
|
+
activatedAtMs: stored.activatedAtMs
|
|
1451
|
+
};
|
|
1452
|
+
}
|
|
1453
|
+
function ecdsaAuthorityEvmAddressB64u(value) {
|
|
1454
|
+
if (!/^0x[0-9a-fA-F]{40}$/.test(value)) return null;
|
|
1455
|
+
const bytes = new Uint8Array(20);
|
|
1456
|
+
for (let index = 0; index < bytes.length; index += 1) bytes[index] = Number.parseInt(value.slice(2 + index * 2, 4 + index * 2), 16);
|
|
1457
|
+
return base64UrlEncode(bytes);
|
|
1458
|
+
}
|
|
1459
|
+
function parseStoredInstallationRow(row) {
|
|
1460
|
+
const packages = parseCommittedAuthorityPackagesV1(parseD1JsonColumn(row.packages_json));
|
|
1461
|
+
const linkSessionId = requireParsed(parseLinkDeviceSessionId(row.link_session_id), "link_session_id");
|
|
1462
|
+
const authorityId = requireParsed(parseWalletAuthorityId(row.authority_id), "authority_id");
|
|
1463
|
+
const walletId = requireParsed(parseWalletId(row.wallet_id), "wallet_id");
|
|
1464
|
+
const authMethodId = requireParsed(parseWalletAuthMethodId(row.auth_method_id), "auth_method_id");
|
|
1465
|
+
const deviceId = requireParsed(parseDeviceId(row.device_id), "device_id");
|
|
1466
|
+
const packageSetDigestB64u = requireDigest(row.package_set_digest_b64u, "package_set_digest_b64u");
|
|
1467
|
+
const targetFactorVerificationDigestB64u = requireDigest(row.target_factor_verification_digest_b64u, "target_factor_verification_digest_b64u");
|
|
1468
|
+
const targetFactorVerifiedAtMs = requireTime(row.target_factor_verified_at_ms, "target_factor_verified_at_ms");
|
|
1469
|
+
const sourceManifestDigestB64u = requireDigest(row.source_manifest_digest_b64u, "source_manifest_digest_b64u");
|
|
1470
|
+
const deliveryRecipientPublicKey65B64u = row.delivery_recipient_public_key_b64u == null ? null : requireP256PublicKey(row.delivery_recipient_public_key_b64u, "delivery_recipient_public_key_b64u");
|
|
1471
|
+
if (packages.authority.authorityId !== authorityId || packages.authority.walletId !== walletId || packages.authMethod.walletAuthMethodId !== authMethodId || packages.packageSetDigestB64u !== packageSetDigestB64u) throw new Error("stored authority installation identity does not match packages");
|
|
1472
|
+
return {
|
|
1473
|
+
linkSessionId,
|
|
1474
|
+
authorityId,
|
|
1475
|
+
walletId,
|
|
1476
|
+
authMethodId,
|
|
1477
|
+
deviceId,
|
|
1478
|
+
packageSetDigestB64u,
|
|
1479
|
+
targetFactorVerificationDigestB64u,
|
|
1480
|
+
targetFactorVerifiedAtMs,
|
|
1481
|
+
sourceManifestDigestB64u,
|
|
1482
|
+
deliveryRecipientPublicKey65B64u,
|
|
1483
|
+
packages,
|
|
1484
|
+
serverReservationIds: parseServerReservationIds(parseD1JsonColumn(row.server_reservation_ids_json)),
|
|
1485
|
+
installedRecordSetDigestB64u: row.installed_record_set_digest_b64u == null ? null : requireDigest(row.installed_record_set_digest_b64u, "installed_record_set_digest_b64u"),
|
|
1486
|
+
activatedAtMs: row.activated_at_ms == null ? null : requireTime(row.activated_at_ms, "activated_at_ms")
|
|
1487
|
+
};
|
|
1488
|
+
}
|
|
1489
|
+
function parseStoredCredentialDelivery(row) {
|
|
1490
|
+
const envelope = parseD1JsonColumn(row.sealed_envelope_json);
|
|
1491
|
+
return parseLinkedDeviceWalletSessionCredentialDeliveryV1({
|
|
1492
|
+
kind: "linked_device_wallet_session_credential_delivery_v1",
|
|
1493
|
+
aad: {
|
|
1494
|
+
kind: "linked_device_wallet_session_credential_delivery_aad_v1",
|
|
1495
|
+
namespace: row.namespace,
|
|
1496
|
+
orgId: row.org_id,
|
|
1497
|
+
projectId: row.project_id,
|
|
1498
|
+
envId: row.env_id,
|
|
1499
|
+
tenantId: row.tenant_id,
|
|
1500
|
+
principalId: row.principal_id,
|
|
1501
|
+
linkSessionId: row.link_session_id,
|
|
1502
|
+
walletId: row.wallet_id,
|
|
1503
|
+
authorityId: row.authority_id,
|
|
1504
|
+
walletAuthMethodId: row.wallet_auth_method_id,
|
|
1505
|
+
authorizationId: row.authorization_id,
|
|
1506
|
+
walletSessionId: row.wallet_session_id,
|
|
1507
|
+
quotaId: row.quota_id,
|
|
1508
|
+
credentialDigestB64u: row.credential_digest_b64u,
|
|
1509
|
+
recipientPublicKey65B64u: row.recipient_public_key_b64u,
|
|
1510
|
+
issuedAtMs: row.issued_at_ms,
|
|
1511
|
+
expiresAtMs: row.expires_at_ms
|
|
1512
|
+
},
|
|
1513
|
+
aadDigestB64u: row.aad_digest_b64u,
|
|
1514
|
+
recipientBindingDigestB64u: row.recipient_binding_digest_b64u,
|
|
1515
|
+
envelope,
|
|
1516
|
+
envelopeDigestB64u: row.sealed_envelope_digest_b64u,
|
|
1517
|
+
installationReceiptDigestB64u: row.installation_receipt_digest_b64u
|
|
1518
|
+
});
|
|
1519
|
+
}
|
|
1520
|
+
function buildInstallationReceiptFromStoredInstallation(stored) {
|
|
1521
|
+
if (stored.installedRecordSetDigestB64u === null || stored.activatedAtMs === null) throw new LinkedDeviceActivationIntegrityErrorV1("active linked-device installation has no activation receipt");
|
|
1522
|
+
return {
|
|
1523
|
+
kind: "local_authority_installation_receipt_v1",
|
|
1524
|
+
authorityId: stored.authorityId,
|
|
1525
|
+
walletId: stored.walletId,
|
|
1526
|
+
authMethodId: stored.authMethodId,
|
|
1527
|
+
deviceId: stored.deviceId,
|
|
1528
|
+
packageSetDigestB64u: stored.packageSetDigestB64u,
|
|
1529
|
+
installedActivationRefs: stored.packages.authority.signerActivations,
|
|
1530
|
+
installedRecordSetDigestB64u: stored.installedRecordSetDigestB64u,
|
|
1531
|
+
targetFactorVerificationDigestB64u: stored.targetFactorVerificationDigestB64u,
|
|
1532
|
+
installedAtMs: stored.activatedAtMs
|
|
1533
|
+
};
|
|
1534
|
+
}
|
|
1535
|
+
function assertAcknowledgementMatchesCleanupReceipt(acknowledgement, cleanupReceipt) {
|
|
1536
|
+
if (acknowledgement.linkSessionId !== cleanupReceipt.linkSessionId || acknowledgement.authorityId !== cleanupReceipt.authorityId || acknowledgement.packageSetDigestB64u !== cleanupReceipt.packageSetDigestB64u || acknowledgement.authorizationId !== cleanupReceipt.authorizationId || acknowledgement.walletSessionId !== cleanupReceipt.walletSessionId || acknowledgement.credentialDigestB64u !== cleanupReceipt.credentialDigestB64u || acknowledgement.installationReceiptDigestB64u !== cleanupReceipt.installationReceiptDigestB64u || acknowledgement.acknowledgedAtMs !== cleanupReceipt.acknowledgedAtMs) throw new LinkedDeviceActivationIntegrityErrorV1("activation acknowledgement does not match the cleanup receipt");
|
|
1537
|
+
}
|
|
1538
|
+
async function assertCleanupReceiptMatchesDeliveryRow(cleanupReceipt, row) {
|
|
1539
|
+
if (await computeLinkedDevicePublicKeyDigestV1(cleanupReceipt.devicePublicKeyB64u) !== cleanupReceipt.devicePublicKeyDigestB64u) throw new LinkedDeviceActivationIntegrityErrorV1("activation cleanup receipt device key digest is invalid");
|
|
1540
|
+
if (!(String(row.link_session_id) === String(cleanupReceipt.linkSessionId) && String(row.wallet_id) === String(cleanupReceipt.walletId) && String(row.authority_id) === String(cleanupReceipt.authorityId) && String(row.wallet_auth_method_id) === String(cleanupReceipt.walletAuthMethodId) && String(row.authorization_id) === String(cleanupReceipt.authorizationId) && String(row.wallet_session_id) === String(cleanupReceipt.walletSessionId) && String(row.credential_digest_b64u) === String(cleanupReceipt.credentialDigestB64u) && String(row.installation_receipt_digest_b64u) === String(cleanupReceipt.installationReceiptDigestB64u) && Number(row.acknowledged_at_ms) === cleanupReceipt.acknowledgedAtMs && String(row.acknowledgement_auth_package_set_digest_b64u) === String(cleanupReceipt.packageSetDigestB64u) && Number(row.acknowledgement_auth_expires_at_ms) === cleanupReceipt.expiresAtMs)) throw new LinkedDeviceActivationIntegrityErrorV1("activation cleanup receipt does not match the delivery row");
|
|
1541
|
+
}
|
|
1542
|
+
function parseAuthorityAllocation(row) {
|
|
1543
|
+
return {
|
|
1544
|
+
authorityId: requireParsed(parseWalletAuthorityId(row.authority_id), "authority_id"),
|
|
1545
|
+
walletId: requireParsed(parseWalletId(row.wallet_id), "wallet_id"),
|
|
1546
|
+
enrollmentId: requireText(row.enrollment_id, "enrollment_id"),
|
|
1547
|
+
deviceId: requireParsed(parseDeviceId(row.device_id), "device_id")
|
|
1548
|
+
};
|
|
1549
|
+
}
|
|
1550
|
+
function assertAuthorityAllocationMatches(allocation, input, existing) {
|
|
1551
|
+
if (allocation.walletId !== input.walletId || allocation.enrollmentId !== input.enrollmentId || allocation.deviceId !== input.targetDeviceId || existing !== null && allocation.authorityId !== existing.authorityId) throw new Error("wallet authority allocation does not match the link session");
|
|
1552
|
+
}
|
|
1553
|
+
async function assertStoredPackageDigest(stored) {
|
|
1554
|
+
if (stored.packages.authority.provenance.kind !== "device_link") throw new Error("stored authority installation provenance is invalid");
|
|
1555
|
+
if (await computeCommittedSignerPackageSetDigestB64u({
|
|
1556
|
+
authorityId: stored.authorityId,
|
|
1557
|
+
walletId: stored.walletId,
|
|
1558
|
+
enrollmentId: stored.packages.authority.provenance.enrollmentId,
|
|
1559
|
+
linkSessionId: stored.linkSessionId,
|
|
1560
|
+
deviceId: stored.deviceId,
|
|
1561
|
+
authMethodId: stored.authMethodId,
|
|
1562
|
+
permissions: stored.packages.authority.permissions,
|
|
1563
|
+
sourceManifestDigestB64u: stored.sourceManifestDigestB64u,
|
|
1564
|
+
signerPackages: stored.packages.signerPackages,
|
|
1565
|
+
ed25519ExportRootPackageDigestB64u: stored.packages.ed25519ExportRootPackage ? await digestJson(stored.packages.ed25519ExportRootPackage) : null,
|
|
1566
|
+
targetFactorVerificationDigestB64u: stored.targetFactorVerificationDigestB64u
|
|
1567
|
+
}) !== stored.packageSetDigestB64u) throw new Error("stored authority installation package digest does not match its canonical contents");
|
|
1568
|
+
}
|
|
1569
|
+
function parseServerReservationIds(raw) {
|
|
1570
|
+
const record = requireRecord(raw, "server reservation ids");
|
|
1571
|
+
requireExactKeys(record, ["ed25519", "ecdsa_secp256k1"], "server reservation ids");
|
|
1572
|
+
const result = {};
|
|
1573
|
+
if (record.ed25519 !== void 0 && record.ed25519 !== null) result.ed25519 = parseEd25519ServerReservationRecord(record.ed25519);
|
|
1574
|
+
if (record.ecdsa_secp256k1 !== void 0 && record.ecdsa_secp256k1 !== null) result.ecdsa_secp256k1 = parseEcdsaServerReservationRecord(record.ecdsa_secp256k1);
|
|
1575
|
+
return result;
|
|
1576
|
+
}
|
|
1577
|
+
function parseEd25519ServerReservationRecord(raw) {
|
|
1578
|
+
const record = requireRecord(raw, "Ed25519 server reservation");
|
|
1579
|
+
requireExactKeys(record, ["reservationId", "preparation"], "Ed25519 server reservation");
|
|
1580
|
+
const preparationRecord = requireRecord(record.preparation, "Ed25519 reservation preparation");
|
|
1581
|
+
requireExactKeys(preparationRecord, [
|
|
1582
|
+
"kind",
|
|
1583
|
+
"sourceContribution",
|
|
1584
|
+
"targetBinding",
|
|
1585
|
+
"applicationBinding"
|
|
1586
|
+
], "Ed25519 reservation preparation");
|
|
1587
|
+
if (preparationRecord.kind !== "ordinary_ed25519_signer_material_reservation_preparation_v1") throw new Error("Ed25519 reservation preparation kind is invalid");
|
|
1588
|
+
const sourceContribution = parseLinkedDeviceOrdinaryMaterialSourceContributionV1(preparationRecord.sourceContribution);
|
|
1589
|
+
if (sourceContribution.keyFamily !== "ed25519") throw new Error("Ed25519 reservation source contribution family is invalid");
|
|
1590
|
+
const targetBinding = parseRouterAbEd25519YaoCeremonyBindingV1(preparationRecord.targetBinding);
|
|
1591
|
+
const applicationBinding = parseRouterAbEd25519YaoApplicationBindingFactsV1(preparationRecord.applicationBinding);
|
|
1592
|
+
if (targetBinding.operation !== "registration") throw new Error("Ed25519 target binding must use registration");
|
|
1593
|
+
return {
|
|
1594
|
+
reservationId: requireReservationId(record.reservationId, "Ed25519 server reservation id"),
|
|
1595
|
+
preparation: {
|
|
1596
|
+
kind: "ordinary_ed25519_signer_material_reservation_preparation_v1",
|
|
1597
|
+
sourceContribution,
|
|
1598
|
+
targetBinding,
|
|
1599
|
+
applicationBinding
|
|
1600
|
+
}
|
|
1601
|
+
};
|
|
1602
|
+
}
|
|
1603
|
+
function parseEcdsaServerReservationRecord(raw) {
|
|
1604
|
+
const record = requireRecord(raw, "ECDSA server reservation");
|
|
1605
|
+
requireExactKeys(record, ["reservationId", "preparation"], "ECDSA server reservation");
|
|
1606
|
+
const preparationRecord = requireRecord(record.preparation, "ECDSA reservation preparation");
|
|
1607
|
+
requireExactKeys(preparationRecord, [
|
|
1608
|
+
"kind",
|
|
1609
|
+
"sourceDerivation",
|
|
1610
|
+
"sourceContribution"
|
|
1611
|
+
], "ECDSA reservation preparation");
|
|
1612
|
+
if (preparationRecord.kind !== "ordinary_ecdsa_signer_material_reservation_preparation_v1") throw new Error("ECDSA reservation preparation kind is invalid");
|
|
1613
|
+
return {
|
|
1614
|
+
reservationId: requireReservationId(record.reservationId, "ECDSA server reservation id"),
|
|
1615
|
+
preparation: {
|
|
1616
|
+
kind: "ordinary_ecdsa_signer_material_reservation_preparation_v1",
|
|
1617
|
+
sourceDerivation: parseLinkedDeviceEcdsaSourceDerivationV1(preparationRecord.sourceDerivation),
|
|
1618
|
+
sourceContribution: parseLinkedDeviceEcdsaSourceContributionPackageV1(preparationRecord.sourceContribution)
|
|
1619
|
+
}
|
|
1620
|
+
};
|
|
1621
|
+
}
|
|
1622
|
+
function requireRecord(raw, label) {
|
|
1623
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) throw new Error(`${label} is invalid`);
|
|
1624
|
+
return raw;
|
|
1625
|
+
}
|
|
1626
|
+
function requireExactKeys(record, keys, label) {
|
|
1627
|
+
const expected = new Set(keys);
|
|
1628
|
+
if (Object.keys(record).length !== keys.length || Object.keys(record).some((key) => !expected.has(key))) throw new Error(`${label} contains unknown or missing fields`);
|
|
1629
|
+
}
|
|
1630
|
+
function requireReservationId(raw, label) {
|
|
1631
|
+
if (typeof raw !== "string" || !raw.trim()) throw new Error(`${label} is invalid`);
|
|
1632
|
+
return raw;
|
|
1633
|
+
}
|
|
1634
|
+
function requireText(raw, label) {
|
|
1635
|
+
if (typeof raw !== "string" || !raw.trim()) throw new Error(`${label} is invalid`);
|
|
1636
|
+
return raw;
|
|
1637
|
+
}
|
|
1638
|
+
function assertRetryInput(stored, input, expectedAuthorityId) {
|
|
1639
|
+
if (stored.authorityId !== expectedAuthorityId || stored.walletId !== input.walletId || stored.linkSessionId !== input.linkSessionId || stored.deviceId !== input.targetDeviceId || stored.targetFactorVerificationDigestB64u !== input.targetFactor.verificationDigestB64u || stored.authMethodId !== input.targetFactor.authMethod.walletAuthMethodId) throw new Error("pending authority retry does not match the committed link input");
|
|
1640
|
+
}
|
|
1641
|
+
function assertReceiptMatchesInstallation(receipt, stored, nowMs) {
|
|
1642
|
+
if (receipt.walletId !== stored.walletId || receipt.authMethodId !== stored.authMethodId || receipt.deviceId !== stored.deviceId || receipt.packageSetDigestB64u !== stored.packageSetDigestB64u || receipt.targetFactorVerificationDigestB64u !== stored.targetFactorVerificationDigestB64u) throw new Error("local authority installation receipt identity does not match committed packages");
|
|
1643
|
+
if (!sameActivationSet(receipt.installedActivationRefs, stored.packages.authority.signerActivations)) throw new Error("local authority installation activation refs do not match committed authority");
|
|
1644
|
+
if (!Number.isSafeInteger(receipt.installedAtMs) || receipt.installedAtMs < stored.targetFactorVerifiedAtMs || receipt.installedAtMs < stored.packages.authority.createdAtMs || receipt.installedAtMs > nowMs) throw new Error("local authority installation receipt time is invalid");
|
|
1645
|
+
if (stored.installedRecordSetDigestB64u && stored.installedRecordSetDigestB64u !== receipt.installedRecordSetDigestB64u) throw new Error("local authority installation receipt record digest conflicts with prior receipt");
|
|
1646
|
+
if (stored.activatedAtMs !== null && stored.activatedAtMs !== receipt.installedAtMs) throw new Error("local authority installation time conflicts with prior receipt");
|
|
1647
|
+
}
|
|
1648
|
+
function sameActivationSet(left, right) {
|
|
1649
|
+
if (left.kind !== right.kind || left.keyFamilies.length !== right.keyFamilies.length) return false;
|
|
1650
|
+
for (let index = 0; index < left.keyFamilies.length; index += 1) if (left.keyFamilies[index] !== right.keyFamilies[index]) return false;
|
|
1651
|
+
const leftEd25519 = left.ed25519;
|
|
1652
|
+
const rightEd25519 = right.ed25519;
|
|
1653
|
+
if (leftEd25519) {
|
|
1654
|
+
if (!rightEd25519 || leftEd25519.kind !== rightEd25519.kind) return false;
|
|
1655
|
+
if (!sameEd25519Signer(leftEd25519.signer, rightEd25519.signer)) return false;
|
|
1656
|
+
if (!mpcMaterialActivationRefsEqual(leftEd25519.materialActivation, rightEd25519.materialActivation)) return false;
|
|
1657
|
+
}
|
|
1658
|
+
const leftEcdsa = left.ecdsa;
|
|
1659
|
+
const rightEcdsa = right.ecdsa;
|
|
1660
|
+
if (leftEcdsa) {
|
|
1661
|
+
if (!rightEcdsa || leftEcdsa.kind !== rightEcdsa.kind) return false;
|
|
1662
|
+
if (!sameEcdsaSigner(leftEcdsa.signer, rightEcdsa.signer)) return false;
|
|
1663
|
+
if (!mpcMaterialActivationRefsEqual(leftEcdsa.materialActivation, rightEcdsa.materialActivation)) return false;
|
|
1664
|
+
}
|
|
1665
|
+
return true;
|
|
1666
|
+
}
|
|
1667
|
+
function sameEd25519Signer(left, right) {
|
|
1668
|
+
return left.kind === right.kind && left.keyFamily === "ed25519" && right.keyFamily === "ed25519" && left.walletId === right.walletId && left.walletKeyId === right.walletKeyId && left.registeredPublicKeyB64u === right.registeredPublicKeyB64u;
|
|
1669
|
+
}
|
|
1670
|
+
function sameEcdsaSigner(left, right) {
|
|
1671
|
+
return left.kind === right.kind && left.keyFamily === "ecdsa_secp256k1" && right.keyFamily === "ecdsa_secp256k1" && left.walletId === right.walletId && left.walletKeyId === right.walletKeyId && left.thresholdPublicKey33B64u === right.thresholdPublicKey33B64u && left.evmAddress === right.evmAddress;
|
|
1672
|
+
}
|
|
1673
|
+
function sameAuthority(left, right) {
|
|
1674
|
+
if (left.state === "revoked") return false;
|
|
1675
|
+
if (left.state === "pending_local_install") return sameAuthorityStableFields(left, right) && right.state === "pending_local_install" && left.authorityDigestB64u === right.authorityDigestB64u && left.revocationEpoch === right.revocationEpoch && left.createdAtMs === right.createdAtMs && left.updatedAtMs === right.updatedAtMs && left.localInstallPackageSetDigestB64u === right.localInstallPackageSetDigestB64u;
|
|
1676
|
+
return sameAuthorityStableFields(left, right);
|
|
1677
|
+
}
|
|
1678
|
+
function sameActiveAuthority(left, right) {
|
|
1679
|
+
return sameAuthorityStableFields(left, right) && left.state === right.state && left.authorityDigestB64u === right.authorityDigestB64u && left.revocationEpoch === right.revocationEpoch && left.createdAtMs === right.createdAtMs && left.updatedAtMs === right.updatedAtMs && left.activatedAtMs === right.activatedAtMs;
|
|
1680
|
+
}
|
|
1681
|
+
function sameAuthorityStableFields(left, right) {
|
|
1682
|
+
return left.kind === right.kind && left.authorityId === right.authorityId && left.walletId === right.walletId && left.principal.kind === right.principal.kind && left.principal.deviceId === right.principal.deviceId && sameAuthorityProvenance(left.provenance, right.provenance) && samePermissionSet(left.permissions, right.permissions) && sameActivationSet(left.signerActivations, right.signerActivations) && left.signerActivationSetDigestB64u === right.signerActivationSetDigestB64u;
|
|
1683
|
+
}
|
|
1684
|
+
function sameAuthorityProvenance(left, right) {
|
|
1685
|
+
if (left.kind !== right.kind) return false;
|
|
1686
|
+
switch (left.kind) {
|
|
1687
|
+
case "wallet_registration": return true;
|
|
1688
|
+
case "device_link": return right.kind === "device_link" && left.enrollmentId === right.enrollmentId && left.sourceAuthorityId === right.sourceAuthorityId && left.linkSessionId === right.linkSessionId;
|
|
1689
|
+
case "wallet_recovery": return right.kind === "wallet_recovery" && left.recoveryOperationId === right.recoveryOperationId && left.continuityAuthorityId === right.continuityAuthorityId;
|
|
1690
|
+
}
|
|
1691
|
+
}
|
|
1692
|
+
function samePermissionSet(left, right) {
|
|
1693
|
+
if (left.length !== right.length) return false;
|
|
1694
|
+
for (let index = 0; index < left.length; index += 1) if (left[index] !== right[index]) return false;
|
|
1695
|
+
return true;
|
|
1696
|
+
}
|
|
1697
|
+
function sameAuthMethod(left, right) {
|
|
1698
|
+
if (left.walletAuthMethodId !== right.walletAuthMethodId || left.walletAuthorityId !== right.walletAuthorityId || left.walletId !== right.walletId) return false;
|
|
1699
|
+
if (!("kind" in left) || !("kind" in right) || left.kind !== right.kind || left.kind === void 0) return false;
|
|
1700
|
+
if (left.kind === "passkey") return right.kind === "passkey" && left.rpId === right.rpId && left.credentialIdB64u === right.credentialIdB64u && left.credentialPublicKeyB64u === right.credentialPublicKeyB64u && left.counter === right.counter;
|
|
1701
|
+
return right.kind === "email_otp" && left.emailHashHex === right.emailHashHex && left.registrationAuthorityId === right.registrationAuthorityId;
|
|
1702
|
+
}
|
|
1703
|
+
function sameLinkedDeviceEd25519BindingsV1(left, right) {
|
|
1704
|
+
if (!isLinkedDeviceEd25519ActivationBindingV1(left) || !isLinkedDeviceEd25519ActivationBindingV1(right)) return false;
|
|
1705
|
+
return sameRouterAbEd25519YaoActivationBindingV1(left, right);
|
|
1706
|
+
}
|
|
1707
|
+
function isLinkedDeviceEd25519ActivationBindingV1(value) {
|
|
1708
|
+
switch (value.operation) {
|
|
1709
|
+
case "registration": return value.lifecycle.work_kind === "registration_prepare" && value.lifecycle.primitive_request_kind === "registration";
|
|
1710
|
+
case "recovery": return value.lifecycle.work_kind === "recovery" && value.lifecycle.primitive_request_kind === "recovery";
|
|
1711
|
+
default: return false;
|
|
1712
|
+
}
|
|
1713
|
+
}
|
|
1714
|
+
async function digestJson(value) {
|
|
1715
|
+
return parseDigestB64u(base64UrlEncode(await sha256BytesUtf8(alphabetizeStringify(value))));
|
|
1716
|
+
}
|
|
1717
|
+
async function sealLinkedDeviceWalletSessionCredentialV1(input) {
|
|
1718
|
+
const recipientPublicKey = requireP256PublicKey(input.recipientPublicKey65B64u, "recipientPublicKey65B64u");
|
|
1719
|
+
const aad = {
|
|
1720
|
+
kind: "linked_device_wallet_session_credential_delivery_aad_v1",
|
|
1721
|
+
namespace: input.scope.namespace,
|
|
1722
|
+
orgId: input.scope.orgId,
|
|
1723
|
+
projectId: input.scope.projectId,
|
|
1724
|
+
envId: input.scope.envId,
|
|
1725
|
+
tenantId: input.tenantId,
|
|
1726
|
+
principalId: input.principalId,
|
|
1727
|
+
linkSessionId: input.linkSessionId,
|
|
1728
|
+
walletId: input.walletId,
|
|
1729
|
+
authorityId: input.authorityId,
|
|
1730
|
+
walletAuthMethodId: input.walletAuthMethodId,
|
|
1731
|
+
authorizationId: input.authorizationId,
|
|
1732
|
+
walletSessionId: input.walletSessionId,
|
|
1733
|
+
quotaId: input.quotaId,
|
|
1734
|
+
credentialDigestB64u: input.credentialDigestB64u,
|
|
1735
|
+
recipientPublicKey65B64u: recipientPublicKey,
|
|
1736
|
+
issuedAtMs: input.issuedAtMs,
|
|
1737
|
+
expiresAtMs: input.expiresAtMs
|
|
1738
|
+
};
|
|
1739
|
+
const aadBytes = new TextEncoder().encode(encodeLinkedDeviceWalletSessionCredentialDeliveryAadV1(aad));
|
|
1740
|
+
const plaintext = new TextEncoder().encode(alphabetizeStringify(input.operationCredential));
|
|
1741
|
+
let recipientBytes = null;
|
|
1742
|
+
let nonce = null;
|
|
1743
|
+
try {
|
|
1744
|
+
recipientBytes = base64UrlDecode(recipientPublicKey);
|
|
1745
|
+
const importedRecipient = await crypto.subtle.importKey("raw", recipientBytes, {
|
|
1746
|
+
name: "ECDH",
|
|
1747
|
+
namedCurve: "P-256"
|
|
1748
|
+
}, false, []);
|
|
1749
|
+
const serverKeyPair = await crypto.subtle.generateKey({
|
|
1750
|
+
name: "ECDH",
|
|
1751
|
+
namedCurve: "P-256"
|
|
1752
|
+
}, false, ["deriveKey"]);
|
|
1753
|
+
const encryptionKey = await crypto.subtle.deriveKey({
|
|
1754
|
+
name: "ECDH",
|
|
1755
|
+
public: importedRecipient
|
|
1756
|
+
}, serverKeyPair.privateKey, {
|
|
1757
|
+
name: "AES-GCM",
|
|
1758
|
+
length: 256
|
|
1759
|
+
}, false, ["encrypt"]);
|
|
1760
|
+
nonce = crypto.getRandomValues(new Uint8Array(12));
|
|
1761
|
+
const ciphertext = new Uint8Array(await crypto.subtle.encrypt({
|
|
1762
|
+
name: "AES-GCM",
|
|
1763
|
+
iv: nonce,
|
|
1764
|
+
additionalData: aadBytes,
|
|
1765
|
+
tagLength: 128
|
|
1766
|
+
}, encryptionKey, plaintext));
|
|
1767
|
+
const serverPublicKey = new Uint8Array(await crypto.subtle.exportKey("raw", serverKeyPair.publicKey));
|
|
1768
|
+
try {
|
|
1769
|
+
const envelope = {
|
|
1770
|
+
kind: "linked_device_wallet_session_credential_envelope_v1",
|
|
1771
|
+
algorithm: "p256-ecdh-aes256gcm-v1",
|
|
1772
|
+
serverEphemeralPublicKey65B64u: base64UrlEncode(serverPublicKey),
|
|
1773
|
+
nonce12B64u: base64UrlEncode(nonce),
|
|
1774
|
+
ciphertextB64u: base64UrlEncode(ciphertext)
|
|
1775
|
+
};
|
|
1776
|
+
return {
|
|
1777
|
+
kind: "linked_device_wallet_session_credential_delivery_v1",
|
|
1778
|
+
aad,
|
|
1779
|
+
aadDigestB64u: await computeLinkedDeviceWalletSessionCredentialDeliveryAadDigestB64u(aad),
|
|
1780
|
+
recipientBindingDigestB64u: await digestJson({
|
|
1781
|
+
domain: "seams/linked-device/delivery-recipient/v1",
|
|
1782
|
+
recipientPublicKey65B64u: recipientPublicKey
|
|
1783
|
+
}),
|
|
1784
|
+
envelope,
|
|
1785
|
+
envelopeDigestB64u: await computeLinkedDeviceWalletSessionCredentialEnvelopeDigestB64u(envelope),
|
|
1786
|
+
installationReceiptDigestB64u: input.installationReceiptDigestB64u
|
|
1787
|
+
};
|
|
1788
|
+
} finally {
|
|
1789
|
+
serverPublicKey.fill(0);
|
|
1790
|
+
ciphertext.fill(0);
|
|
1791
|
+
}
|
|
1792
|
+
} finally {
|
|
1793
|
+
recipientBytes?.fill(0);
|
|
1794
|
+
nonce?.fill(0);
|
|
1795
|
+
aadBytes.fill(0);
|
|
1796
|
+
plaintext.fill(0);
|
|
1797
|
+
}
|
|
1798
|
+
}
|
|
1799
|
+
function requireP256PublicKey(raw, label) {
|
|
1800
|
+
const encoded = requireText(raw, label);
|
|
1801
|
+
const bytes = base64UrlDecode(encoded);
|
|
1802
|
+
try {
|
|
1803
|
+
if (bytes.length !== 65 || bytes[0] !== 4 || base64UrlEncode(bytes) !== encoded) throw new Error(`${label} must be a canonical uncompressed P-256 point`);
|
|
1804
|
+
return encoded;
|
|
1805
|
+
} finally {
|
|
1806
|
+
bytes.fill(0);
|
|
1807
|
+
}
|
|
1808
|
+
}
|
|
1809
|
+
function requireParsed(result, label) {
|
|
1810
|
+
if (!result.ok) throw new Error(`${label} ${result.error.message}`);
|
|
1811
|
+
return result.value;
|
|
1812
|
+
}
|
|
1813
|
+
function requireDigest(raw, label) {
|
|
1814
|
+
try {
|
|
1815
|
+
return parseDigestB64u(raw);
|
|
1816
|
+
} catch (error) {
|
|
1817
|
+
throw new Error(`${label} ${errorMessage(error)}`);
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
function requireTime(raw, label) {
|
|
1821
|
+
const value = typeof raw === "number" ? raw : Number(raw);
|
|
1822
|
+
if (!Number.isSafeInteger(value) || value < 0) throw new Error(`${label} must be a non-negative safe integer`);
|
|
1823
|
+
return value;
|
|
1824
|
+
}
|
|
1825
|
+
function errorMessage(error) {
|
|
1826
|
+
return error instanceof Error ? error.message : String(error);
|
|
1827
|
+
}
|
|
1828
|
+
//#endregion
|
|
1829
|
+
export { D1LinkedDeviceAuthorityInstallServiceV1 };
|
|
1830
|
+
|
|
1831
|
+
//# sourceMappingURL=d1LinkedDeviceAuthorityInstallService.js.map
|