@wlfi-agent/cli 1.4.13 → 1.4.14
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/Cargo.lock +3968 -0
- package/Cargo.toml +50 -0
- package/README.md +426 -6
- package/crates/vault-cli-admin/Cargo.toml +26 -0
- package/crates/vault-cli-admin/src/io_utils.rs +500 -0
- package/crates/vault-cli-admin/src/main.rs +3990 -0
- package/crates/vault-cli-admin/src/shared_config.rs +624 -0
- package/crates/vault-cli-admin/src/tui/amounts.rs +180 -0
- package/crates/vault-cli-admin/src/tui/token_rpc.rs +250 -0
- package/crates/vault-cli-admin/src/tui/utils.rs +82 -0
- package/crates/vault-cli-admin/src/tui.rs +3410 -0
- package/crates/vault-cli-agent/Cargo.toml +24 -0
- package/crates/vault-cli-agent/src/io_utils.rs +576 -0
- package/crates/vault-cli-agent/src/main.rs +833 -0
- package/crates/vault-cli-daemon/Cargo.toml +28 -0
- package/crates/vault-cli-daemon/src/bin/wlfi-agent-system-keychain.rs +216 -0
- package/crates/vault-cli-daemon/src/main.rs +644 -0
- package/crates/vault-cli-daemon/src/relay_sync.rs +894 -0
- package/crates/vault-cli-daemon/tests/system_keychain_helper_acl.rs +167 -0
- package/crates/vault-daemon/Cargo.toml +32 -0
- package/crates/vault-daemon/src/daemon_parts/api_impl_and_utils.rs +1041 -0
- package/crates/vault-daemon/src/daemon_parts/core_helpers.rs +1256 -0
- package/crates/vault-daemon/src/daemon_parts/types_api_rpc.rs +622 -0
- package/crates/vault-daemon/src/lib.rs +54 -0
- package/crates/vault-daemon/src/persistence.rs +441 -0
- package/crates/vault-daemon/src/tests.rs +237 -0
- package/crates/vault-daemon/src/tests_parts/part1.rs +1224 -0
- package/crates/vault-daemon/src/tests_parts/part2.rs +1021 -0
- package/crates/vault-daemon/src/tests_parts/part3.rs +835 -0
- package/crates/vault-daemon/src/tests_parts/part4.rs +604 -0
- package/crates/vault-domain/Cargo.toml +20 -0
- package/crates/vault-domain/src/action.rs +849 -0
- package/crates/vault-domain/src/address.rs +51 -0
- package/crates/vault-domain/src/approval.rs +90 -0
- package/crates/vault-domain/src/constants.rs +4 -0
- package/crates/vault-domain/src/error.rs +54 -0
- package/crates/vault-domain/src/keys.rs +71 -0
- package/crates/vault-domain/src/lib.rs +42 -0
- package/crates/vault-domain/src/nonce.rs +102 -0
- package/crates/vault-domain/src/policy.rs +172 -0
- package/crates/vault-domain/src/request.rs +53 -0
- package/crates/vault-domain/src/scope.rs +24 -0
- package/crates/vault-domain/src/session.rs +50 -0
- package/crates/vault-domain/src/signature.rs +34 -0
- package/crates/vault-domain/src/tests.rs +651 -0
- package/crates/vault-domain/src/u128_as_decimal_string.rs +44 -0
- package/crates/vault-policy/Cargo.toml +17 -0
- package/crates/vault-policy/src/engine.rs +301 -0
- package/crates/vault-policy/src/error.rs +81 -0
- package/crates/vault-policy/src/lib.rs +17 -0
- package/crates/vault-policy/src/report.rs +34 -0
- package/crates/vault-policy/src/tests.rs +891 -0
- package/crates/vault-policy/src/tests_explain.rs +78 -0
- package/crates/vault-sdk-agent/Cargo.toml +21 -0
- package/crates/vault-sdk-agent/src/lib.rs +711 -0
- package/crates/vault-signer/Cargo.toml +25 -0
- package/crates/vault-signer/src/lib.rs +731 -0
- package/crates/vault-signer/tests/secure_enclave_acl.rs +54 -0
- package/crates/vault-transport-unix/Cargo.toml +24 -0
- package/crates/vault-transport-unix/src/lib.rs +1640 -0
- package/crates/vault-transport-xpc/Cargo.toml +25 -0
- package/crates/vault-transport-xpc/src/client_codec_api.rs +635 -0
- package/crates/vault-transport-xpc/src/lib.rs +680 -0
- package/crates/vault-transport-xpc/src/tests.rs +818 -0
- package/crates/vault-transport-xpc/tests/e2e_flow.rs +773 -0
- package/dist/cli.cjs +35088 -0
- package/dist/cli.cjs.map +1 -0
- package/package.json +49 -43
- package/packages/cache/.turbo/turbo-build.log +52 -0
- package/packages/cache/dist/chunk-2QFWMUXT.cjs +43 -0
- package/packages/cache/dist/chunk-2QFWMUXT.cjs.map +1 -0
- package/packages/cache/dist/chunk-4U63TZTQ.js +43 -0
- package/packages/cache/dist/chunk-4U63TZTQ.js.map +1 -0
- package/packages/cache/dist/chunk-ALQ6H7KG.cjs +404 -0
- package/packages/cache/dist/chunk-ALQ6H7KG.cjs.map +1 -0
- package/packages/cache/dist/chunk-FGJEEF5N.js +404 -0
- package/packages/cache/dist/chunk-FGJEEF5N.js.map +1 -0
- package/packages/cache/dist/chunk-UYNEHZHB.cjs +45 -0
- package/packages/cache/dist/chunk-UYNEHZHB.cjs.map +1 -0
- package/packages/cache/dist/chunk-VXVMPG3W.js +45 -0
- package/packages/cache/dist/chunk-VXVMPG3W.js.map +1 -0
- package/packages/cache/dist/client/index.cjs +11 -0
- package/packages/cache/dist/client/index.cjs.map +1 -0
- package/packages/cache/dist/client/index.d.cts +15 -0
- package/packages/cache/dist/client/index.d.ts +15 -0
- package/packages/cache/dist/client/index.js +11 -0
- package/packages/cache/dist/client/index.js.map +1 -0
- package/packages/cache/dist/errors/index.cjs +11 -0
- package/packages/cache/dist/errors/index.cjs.map +1 -0
- package/packages/cache/dist/errors/index.d.cts +26 -0
- package/packages/cache/dist/errors/index.d.ts +26 -0
- package/packages/cache/dist/errors/index.js +11 -0
- package/packages/cache/dist/errors/index.js.map +1 -0
- package/packages/cache/dist/index.cjs +29 -0
- package/packages/cache/dist/index.cjs.map +1 -0
- package/packages/cache/dist/index.d.cts +4 -0
- package/packages/cache/dist/index.d.ts +4 -0
- package/packages/cache/dist/index.js +29 -0
- package/packages/cache/dist/index.js.map +1 -0
- package/packages/cache/dist/service/index.cjs +15 -0
- package/packages/cache/dist/service/index.cjs.map +1 -0
- package/packages/cache/dist/service/index.d.cts +184 -0
- package/packages/cache/dist/service/index.d.ts +184 -0
- package/packages/cache/dist/service/index.js +15 -0
- package/packages/cache/dist/service/index.js.map +1 -0
- package/packages/cache/node_modules/.bin/jiti +17 -0
- package/packages/cache/node_modules/.bin/tsc +17 -0
- package/packages/cache/node_modules/.bin/tsserver +17 -0
- package/packages/cache/node_modules/.bin/tsup +17 -0
- package/packages/cache/node_modules/.bin/tsup-node +17 -0
- package/packages/cache/node_modules/.bin/tsx +17 -0
- package/packages/cache/node_modules/.bin/vitest +17 -0
- package/packages/cache/package.json +48 -0
- package/packages/cache/src/client/index.ts +56 -0
- package/packages/cache/src/errors/index.ts +53 -0
- package/packages/cache/src/index.ts +3 -0
- package/packages/cache/src/service/index.test.ts +263 -0
- package/packages/cache/src/service/index.ts +678 -0
- package/packages/cache/tsconfig.json +13 -0
- package/packages/cache/tsup.config.ts +13 -0
- package/packages/cache/vitest.config.ts +16 -0
- package/packages/config/.turbo/turbo-build.log +18 -0
- package/packages/config/dist/index.cjs +1037 -0
- package/packages/config/dist/index.cjs.map +1 -0
- package/packages/config/dist/index.d.ts +131 -0
- package/packages/config/node_modules/.bin/jiti +17 -0
- package/packages/config/node_modules/.bin/tsc +17 -0
- package/packages/config/node_modules/.bin/tsserver +17 -0
- package/packages/config/node_modules/.bin/tsup +17 -0
- package/packages/config/node_modules/.bin/tsup-node +17 -0
- package/packages/config/node_modules/.bin/tsx +17 -0
- package/packages/config/package.json +21 -0
- package/packages/config/src/index.js +1 -0
- package/packages/config/src/index.ts +1282 -0
- package/packages/config/tsconfig.json +4 -0
- package/packages/rpc/.turbo/turbo-build.log +32 -0
- package/packages/rpc/dist/_esm-BCLXDO2R.cjs +3660 -0
- package/packages/rpc/dist/_esm-BCLXDO2R.cjs.map +1 -0
- package/packages/rpc/dist/ccip-OWJLAW55.cjs +16 -0
- package/packages/rpc/dist/ccip-OWJLAW55.cjs.map +1 -0
- package/packages/rpc/dist/chunk-APQIFZ3B.cjs +6247 -0
- package/packages/rpc/dist/chunk-APQIFZ3B.cjs.map +1 -0
- package/packages/rpc/dist/chunk-CDO2GWRD.cjs +410 -0
- package/packages/rpc/dist/chunk-CDO2GWRD.cjs.map +1 -0
- package/packages/rpc/dist/chunk-QGTNTFJ7.cjs +2249 -0
- package/packages/rpc/dist/chunk-QGTNTFJ7.cjs.map +1 -0
- package/packages/rpc/dist/chunk-TZDTAHWR.cjs +44 -0
- package/packages/rpc/dist/chunk-TZDTAHWR.cjs.map +1 -0
- package/packages/rpc/dist/index.cjs +7342 -0
- package/packages/rpc/dist/index.cjs.map +1 -0
- package/packages/rpc/dist/index.d.ts +3857 -0
- package/packages/rpc/dist/secp256k1-WCNM675D.cjs +18 -0
- package/packages/rpc/dist/secp256k1-WCNM675D.cjs.map +1 -0
- package/packages/rpc/node_modules/.bin/jiti +17 -0
- package/packages/rpc/node_modules/.bin/tsc +17 -0
- package/packages/rpc/node_modules/.bin/tsserver +17 -0
- package/packages/rpc/node_modules/.bin/tsup +17 -0
- package/packages/rpc/node_modules/.bin/tsup-node +17 -0
- package/packages/rpc/node_modules/.bin/tsx +17 -0
- package/packages/rpc/package.json +25 -0
- package/packages/rpc/src/index.ts +206 -0
- package/packages/rpc/tsconfig.json +4 -0
- package/packages/typescript/base.json +36 -0
- package/packages/typescript/nextjs.json +17 -0
- package/packages/typescript/package.json +10 -0
- package/packages/ui/.turbo/turbo-build.log +44 -0
- package/packages/ui/dist/chunk-MOAFBKSA.js +11 -0
- package/packages/ui/dist/chunk-MOAFBKSA.js.map +1 -0
- package/packages/ui/dist/components/badge.d.ts +12 -0
- package/packages/ui/dist/components/badge.js +31 -0
- package/packages/ui/dist/components/badge.js.map +1 -0
- package/packages/ui/dist/components/button.d.ts +13 -0
- package/packages/ui/dist/components/button.js +40 -0
- package/packages/ui/dist/components/button.js.map +1 -0
- package/packages/ui/dist/components/card.d.ts +10 -0
- package/packages/ui/dist/components/card.js +39 -0
- package/packages/ui/dist/components/card.js.map +1 -0
- package/packages/ui/dist/components/input.d.ts +5 -0
- package/packages/ui/dist/components/input.js +28 -0
- package/packages/ui/dist/components/input.js.map +1 -0
- package/packages/ui/dist/components/label.d.ts +5 -0
- package/packages/ui/dist/components/label.js +13 -0
- package/packages/ui/dist/components/label.js.map +1 -0
- package/packages/ui/dist/components/separator.d.ts +5 -0
- package/packages/ui/dist/components/separator.js +13 -0
- package/packages/ui/dist/components/separator.js.map +1 -0
- package/packages/ui/dist/components/textarea.d.ts +5 -0
- package/packages/ui/dist/components/textarea.js +27 -0
- package/packages/ui/dist/components/textarea.js.map +1 -0
- package/packages/ui/dist/tailwind.d.ts +56 -0
- package/packages/ui/dist/tailwind.js +60 -0
- package/packages/ui/dist/tailwind.js.map +1 -0
- package/packages/ui/dist/utils/cn.d.ts +5 -0
- package/packages/ui/dist/utils/cn.js +7 -0
- package/packages/ui/dist/utils/cn.js.map +1 -0
- package/packages/ui/node_modules/.bin/jiti +17 -0
- package/packages/ui/node_modules/.bin/tsc +17 -0
- package/packages/ui/node_modules/.bin/tsserver +17 -0
- package/packages/ui/node_modules/.bin/tsup +17 -0
- package/packages/ui/node_modules/.bin/tsup-node +17 -0
- package/packages/ui/node_modules/.bin/tsx +17 -0
- package/packages/ui/package.json +69 -0
- package/packages/ui/src/components/badge.tsx +27 -0
- package/packages/ui/src/components/button.tsx +40 -0
- package/packages/ui/src/components/card.tsx +31 -0
- package/packages/ui/src/components/input.tsx +21 -0
- package/packages/ui/src/components/label.tsx +6 -0
- package/packages/ui/src/components/separator.tsx +6 -0
- package/packages/ui/src/components/textarea.tsx +20 -0
- package/packages/ui/src/globals.css +70 -0
- package/packages/ui/src/tailwind.ts +56 -0
- package/packages/ui/src/utils/cn.ts +6 -0
- package/packages/ui/tsconfig.json +20 -0
- package/packages/ui/tsup.config.ts +20 -0
- package/pnpm-workspace.yaml +4 -0
- package/scripts/install-rust-binaries.mjs +84 -0
- package/scripts/launchd/install-user-daemon.sh +358 -0
- package/scripts/launchd/run-vault-daemon.sh +5 -0
- package/scripts/launchd/run-wlfi-agent-daemon.sh +73 -0
- package/scripts/launchd/uninstall-user-daemon.sh +103 -0
- package/src/cli.ts +2121 -0
- package/src/lib/admin-guard.js +1 -0
- package/src/lib/admin-guard.ts +185 -0
- package/src/lib/admin-passthrough.ts +33 -0
- package/src/lib/admin-reset.ts +751 -0
- package/src/lib/admin-setup.ts +1612 -0
- package/src/lib/agent-auth-clear.js +1 -0
- package/src/lib/agent-auth-clear.ts +58 -0
- package/src/lib/agent-auth-forwarding.js +1 -0
- package/src/lib/agent-auth-forwarding.ts +149 -0
- package/src/lib/agent-auth-migrate.js +1 -0
- package/src/lib/agent-auth-migrate.ts +150 -0
- package/src/lib/agent-auth-revoke.ts +103 -0
- package/src/lib/agent-auth-rotate.ts +107 -0
- package/src/lib/agent-auth-token.js +1 -0
- package/src/lib/agent-auth-token.ts +25 -0
- package/src/lib/agent-auth.ts +89 -0
- package/src/lib/asset-broadcast.js +1 -0
- package/src/lib/asset-broadcast.ts +285 -0
- package/src/lib/bootstrap-artifacts.js +1 -0
- package/src/lib/bootstrap-artifacts.ts +205 -0
- package/src/lib/bootstrap-credentials.js +1 -0
- package/src/lib/bootstrap-credentials.ts +832 -0
- package/src/lib/config-amounts.js +1 -0
- package/src/lib/config-amounts.ts +189 -0
- package/src/lib/config-mutation.ts +27 -0
- package/src/lib/fs-trust.js +1 -0
- package/src/lib/fs-trust.ts +537 -0
- package/src/lib/keychain.js +1 -0
- package/src/lib/keychain.ts +225 -0
- package/src/lib/local-admin-access.ts +106 -0
- package/src/lib/network-selection.js +1 -0
- package/src/lib/network-selection.ts +71 -0
- package/src/lib/passthrough-security.js +1 -0
- package/src/lib/passthrough-security.ts +114 -0
- package/src/lib/rpc-guard.js +1 -0
- package/src/lib/rpc-guard.ts +7 -0
- package/src/lib/rust-spawn-options.js +1 -0
- package/src/lib/rust-spawn-options.ts +98 -0
- package/src/lib/rust.js +1 -0
- package/src/lib/rust.ts +143 -0
- package/src/lib/signed-tx.js +1 -0
- package/src/lib/signed-tx.ts +116 -0
- package/src/lib/status-repair-cli.ts +116 -0
- package/src/lib/sudo.js +1 -0
- package/src/lib/sudo.ts +172 -0
- package/src/lib/vault-password-forwarding.js +1 -0
- package/src/lib/vault-password-forwarding.ts +155 -0
- package/src/lib/wallet-profile.js +1 -0
- package/src/lib/wallet-profile.ts +332 -0
- package/src/lib/wallet-repair.js +1 -0
- package/src/lib/wallet-repair.ts +304 -0
- package/src/lib/wallet-setup.js +1 -0
- package/src/lib/wallet-setup.ts +1466 -0
- package/src/lib/wallet-status.js +1 -0
- package/src/lib/wallet-status.ts +640 -0
- package/tsconfig.base.json +17 -0
- package/tsconfig.json +10 -0
- package/tsup.config.ts +25 -0
- package/turbo.json +41 -0
- package/LICENSE.md +0 -1
- package/dist/wlfa/index.cjs +0 -250
- package/dist/wlfa/index.d.cts +0 -1
- package/dist/wlfa/index.d.ts +0 -1
- package/dist/wlfa/index.js +0 -250
- package/dist/wlfc/index.cjs +0 -1839
- package/dist/wlfc/index.d.cts +0 -1
- package/dist/wlfc/index.d.ts +0 -1
- package/dist/wlfc/index.js +0 -1839
|
@@ -0,0 +1,622 @@
|
|
|
1
|
+
/// Daemon-level errors.
|
|
2
|
+
pub(crate) const MAX_AUTH_SECRET_BYTES: usize = 16 * 1024;
|
|
3
|
+
|
|
4
|
+
#[derive(Debug, Error)]
|
|
5
|
+
pub enum DaemonError {
|
|
6
|
+
/// Password mismatch.
|
|
7
|
+
#[error("authentication failed")]
|
|
8
|
+
AuthenticationFailed,
|
|
9
|
+
/// Lease id was not issued by daemon.
|
|
10
|
+
#[error("lease is unknown")]
|
|
11
|
+
UnknownLease,
|
|
12
|
+
/// Lease is expired or not yet valid.
|
|
13
|
+
#[error("lease has expired or is not active yet")]
|
|
14
|
+
InvalidLease,
|
|
15
|
+
/// Lease issuance denied because active lease capacity was reached.
|
|
16
|
+
#[error("too many active leases")]
|
|
17
|
+
TooManyActiveLeases,
|
|
18
|
+
/// Vault key id not found.
|
|
19
|
+
#[error("unknown vault key id: {0}")]
|
|
20
|
+
UnknownVaultKey(Uuid),
|
|
21
|
+
/// Agent key id not found.
|
|
22
|
+
#[error("unknown agent key id: {0}")]
|
|
23
|
+
UnknownAgentKey(Uuid),
|
|
24
|
+
/// Policy id not found.
|
|
25
|
+
#[error("unknown policy id: {0}")]
|
|
26
|
+
UnknownPolicy(Uuid),
|
|
27
|
+
/// Manual approval request id not found.
|
|
28
|
+
#[error("unknown manual approval request id: {0}")]
|
|
29
|
+
UnknownManualApprovalRequest(Uuid),
|
|
30
|
+
/// Agent key token did not match provisioned secret.
|
|
31
|
+
#[error("agent authentication failed")]
|
|
32
|
+
AgentAuthenticationFailed,
|
|
33
|
+
/// Request payload did not match declared action.
|
|
34
|
+
#[error("sign request payload/action mismatch")]
|
|
35
|
+
PayloadActionMismatch,
|
|
36
|
+
/// Request payload exceeded configured daemon limit.
|
|
37
|
+
#[error("sign request payload exceeds max bytes ({max_bytes})")]
|
|
38
|
+
PayloadTooLarge {
|
|
39
|
+
/// Maximum allowed payload size in bytes.
|
|
40
|
+
max_bytes: usize,
|
|
41
|
+
},
|
|
42
|
+
/// Request timestamp bounds were invalid.
|
|
43
|
+
#[error("request timestamp bounds are invalid")]
|
|
44
|
+
InvalidRequestTimestamps,
|
|
45
|
+
/// Request has expired.
|
|
46
|
+
#[error("request has expired")]
|
|
47
|
+
RequestExpired,
|
|
48
|
+
/// Request ID was already consumed.
|
|
49
|
+
#[error("request id already used")]
|
|
50
|
+
RequestReplayDetected,
|
|
51
|
+
/// Agent-key policy attachment was invalid.
|
|
52
|
+
#[error("invalid agent policy attachment: {0}")]
|
|
53
|
+
InvalidPolicyAttachment(String),
|
|
54
|
+
/// Nonce reservation request was invalid.
|
|
55
|
+
#[error("invalid nonce reservation request: {0}")]
|
|
56
|
+
InvalidNonceReservation(String),
|
|
57
|
+
/// Nonce reservation id was not found.
|
|
58
|
+
#[error("unknown nonce reservation id: {0}")]
|
|
59
|
+
UnknownNonceReservation(Uuid),
|
|
60
|
+
/// Signing a broadcast tx requires a matching nonce reservation.
|
|
61
|
+
#[error("missing nonce reservation for chain_id {chain_id} and nonce {nonce}")]
|
|
62
|
+
MissingNonceReservation {
|
|
63
|
+
/// EVM chain id.
|
|
64
|
+
chain_id: u64,
|
|
65
|
+
/// Transaction nonce.
|
|
66
|
+
nonce: u64,
|
|
67
|
+
},
|
|
68
|
+
/// Policy payload was invalid.
|
|
69
|
+
#[error("invalid policy payload: {0}")]
|
|
70
|
+
InvalidPolicy(String),
|
|
71
|
+
/// Relay configuration payload was invalid.
|
|
72
|
+
#[error("invalid relay configuration: {0}")]
|
|
73
|
+
InvalidRelayConfig(String),
|
|
74
|
+
/// Request requires explicit manual approval before signing can continue.
|
|
75
|
+
#[error("manual approval required (request {approval_request_id})")]
|
|
76
|
+
ManualApprovalRequired {
|
|
77
|
+
approval_request_id: Uuid,
|
|
78
|
+
relay_url: Option<String>,
|
|
79
|
+
frontend_url: Option<String>,
|
|
80
|
+
},
|
|
81
|
+
/// Existing manual approval request was rejected.
|
|
82
|
+
#[error("manual approval request {approval_request_id} was rejected")]
|
|
83
|
+
ManualApprovalRejected { approval_request_id: Uuid },
|
|
84
|
+
/// Policy engine denied request.
|
|
85
|
+
#[error("policy check failed: {0}")]
|
|
86
|
+
Policy(#[from] PolicyError),
|
|
87
|
+
/// Signer backend failed.
|
|
88
|
+
#[error("signer backend error: {0}")]
|
|
89
|
+
Signer(#[from] SignerError),
|
|
90
|
+
/// Password hash failed.
|
|
91
|
+
#[error("password hash error: {0}")]
|
|
92
|
+
PasswordHash(String),
|
|
93
|
+
/// Daemon configuration is invalid.
|
|
94
|
+
#[error("invalid daemon configuration: {0}")]
|
|
95
|
+
InvalidConfig(String),
|
|
96
|
+
/// Transport or serialization layer failed.
|
|
97
|
+
#[error("transport error: {0}")]
|
|
98
|
+
Transport(String),
|
|
99
|
+
/// Persistent-state storage failed.
|
|
100
|
+
#[error("persistent state error: {0}")]
|
|
101
|
+
Persistence(String),
|
|
102
|
+
/// Internal locking failure.
|
|
103
|
+
#[error("internal lock poisoned")]
|
|
104
|
+
LockPoisoned,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/// Daemon runtime configuration.
|
|
108
|
+
#[derive(Debug, Clone)]
|
|
109
|
+
pub struct DaemonConfig {
|
|
110
|
+
/// Lease time-to-live.
|
|
111
|
+
pub lease_ttl: Duration,
|
|
112
|
+
/// Maximum number of active leases retained in memory.
|
|
113
|
+
pub max_active_leases: usize,
|
|
114
|
+
/// Maximum payload size accepted by `sign_for_agent`.
|
|
115
|
+
pub max_sign_payload_bytes: usize,
|
|
116
|
+
/// Maximum accepted request TTL (`expires_at - requested_at`).
|
|
117
|
+
pub max_request_ttl: Duration,
|
|
118
|
+
/// Maximum accepted future skew for `requested_at`.
|
|
119
|
+
pub max_request_clock_skew: Duration,
|
|
120
|
+
/// Default nonce reservation lease duration.
|
|
121
|
+
pub nonce_reservation_ttl: Duration,
|
|
122
|
+
/// Consecutive failed admin password attempts allowed before temporary lockout.
|
|
123
|
+
pub max_failed_admin_auth_attempts: u32,
|
|
124
|
+
/// Temporary lockout duration after too many failed admin password attempts.
|
|
125
|
+
pub admin_auth_lockout: Duration,
|
|
126
|
+
/// Argon2 memory cost in KiB.
|
|
127
|
+
pub argon2_memory_kib: u32,
|
|
128
|
+
/// Argon2 time cost (iterations).
|
|
129
|
+
pub argon2_time_cost: u32,
|
|
130
|
+
/// Argon2 parallelism.
|
|
131
|
+
pub argon2_parallelism: u32,
|
|
132
|
+
/// Relay poll cadence for encrypted approval updates.
|
|
133
|
+
pub relay_poll_interval: Duration,
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
impl Default for DaemonConfig {
|
|
137
|
+
fn default() -> Self {
|
|
138
|
+
Self {
|
|
139
|
+
lease_ttl: Duration::minutes(30),
|
|
140
|
+
max_active_leases: 1_024,
|
|
141
|
+
max_sign_payload_bytes: 32 * 1024,
|
|
142
|
+
max_request_ttl: Duration::minutes(5),
|
|
143
|
+
max_request_clock_skew: Duration::seconds(30),
|
|
144
|
+
nonce_reservation_ttl: Duration::minutes(2),
|
|
145
|
+
max_failed_admin_auth_attempts: 5,
|
|
146
|
+
admin_auth_lockout: Duration::seconds(30),
|
|
147
|
+
argon2_memory_kib: 19_456,
|
|
148
|
+
argon2_time_cost: 2,
|
|
149
|
+
argon2_parallelism: 1,
|
|
150
|
+
relay_poll_interval: Duration::seconds(1),
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// Transport-neutral daemon API.
|
|
156
|
+
#[async_trait]
|
|
157
|
+
pub trait KeyManagerDaemonApi: Send + Sync {
|
|
158
|
+
/// Issues a short-lived admin lease after validating vault password.
|
|
159
|
+
async fn issue_lease(&self, vault_password: &str) -> Result<Lease, DaemonError>;
|
|
160
|
+
|
|
161
|
+
/// Adds or replaces a policy by `policy.id`.
|
|
162
|
+
async fn add_policy(
|
|
163
|
+
&self,
|
|
164
|
+
session: &AdminSession,
|
|
165
|
+
policy: SpendingPolicy,
|
|
166
|
+
) -> Result<(), DaemonError>;
|
|
167
|
+
|
|
168
|
+
/// Lists all policies ordered by priority for an authenticated admin session.
|
|
169
|
+
async fn list_policies(
|
|
170
|
+
&self,
|
|
171
|
+
session: &AdminSession,
|
|
172
|
+
) -> Result<Vec<SpendingPolicy>, DaemonError>;
|
|
173
|
+
|
|
174
|
+
/// Disables a policy by id.
|
|
175
|
+
///
|
|
176
|
+
/// Disabled policies remain listed but are ignored during evaluation.
|
|
177
|
+
async fn disable_policy(
|
|
178
|
+
&self,
|
|
179
|
+
session: &AdminSession,
|
|
180
|
+
policy_id: Uuid,
|
|
181
|
+
) -> Result<(), DaemonError>;
|
|
182
|
+
|
|
183
|
+
/// Creates a vault key through configured signer backend.
|
|
184
|
+
async fn create_vault_key(
|
|
185
|
+
&self,
|
|
186
|
+
session: &AdminSession,
|
|
187
|
+
request: KeyCreateRequest,
|
|
188
|
+
) -> Result<VaultKey, DaemonError>;
|
|
189
|
+
|
|
190
|
+
/// Exports a software-backed private key when the signer backend supports it.
|
|
191
|
+
///
|
|
192
|
+
/// Backends such as Secure Enclave return `None` because the private key is
|
|
193
|
+
/// intentionally non-exportable.
|
|
194
|
+
async fn export_vault_private_key(
|
|
195
|
+
&self,
|
|
196
|
+
session: &AdminSession,
|
|
197
|
+
vault_key_id: Uuid,
|
|
198
|
+
) -> Result<Option<String>, DaemonError>;
|
|
199
|
+
|
|
200
|
+
/// Creates an agent key attached to all policies or a selected subset.
|
|
201
|
+
///
|
|
202
|
+
/// Returns an auth token that must be sent with each agent sign request.
|
|
203
|
+
async fn create_agent_key(
|
|
204
|
+
&self,
|
|
205
|
+
session: &AdminSession,
|
|
206
|
+
vault_key_id: Uuid,
|
|
207
|
+
attachment: PolicyAttachment,
|
|
208
|
+
) -> Result<AgentCredentials, DaemonError>;
|
|
209
|
+
|
|
210
|
+
/// Rotates the bearer token for an existing agent key.
|
|
211
|
+
///
|
|
212
|
+
/// Returns the newly issued token.
|
|
213
|
+
async fn rotate_agent_auth_token(
|
|
214
|
+
&self,
|
|
215
|
+
session: &AdminSession,
|
|
216
|
+
agent_key_id: Uuid,
|
|
217
|
+
) -> Result<String, DaemonError>;
|
|
218
|
+
|
|
219
|
+
/// Revokes an agent key and its auth token.
|
|
220
|
+
async fn revoke_agent_key(
|
|
221
|
+
&self,
|
|
222
|
+
session: &AdminSession,
|
|
223
|
+
agent_key_id: Uuid,
|
|
224
|
+
) -> Result<(), DaemonError>;
|
|
225
|
+
|
|
226
|
+
/// Lists manual approval requests for an authenticated admin session.
|
|
227
|
+
async fn list_manual_approval_requests(
|
|
228
|
+
&self,
|
|
229
|
+
session: &AdminSession,
|
|
230
|
+
) -> Result<Vec<ManualApprovalRequest>, DaemonError>;
|
|
231
|
+
|
|
232
|
+
/// Applies an approval or rejection decision to a pending approval request.
|
|
233
|
+
async fn decide_manual_approval_request(
|
|
234
|
+
&self,
|
|
235
|
+
session: &AdminSession,
|
|
236
|
+
approval_request_id: Uuid,
|
|
237
|
+
decision: ManualApprovalDecision,
|
|
238
|
+
rejection_reason: Option<String>,
|
|
239
|
+
) -> Result<ManualApprovalRequest, DaemonError>;
|
|
240
|
+
|
|
241
|
+
/// Updates the relay API URL and optional frontend base URL used by the daemon.
|
|
242
|
+
async fn set_relay_config(
|
|
243
|
+
&self,
|
|
244
|
+
session: &AdminSession,
|
|
245
|
+
relay_url: Option<String>,
|
|
246
|
+
frontend_url: Option<String>,
|
|
247
|
+
) -> Result<RelayConfig, DaemonError>;
|
|
248
|
+
|
|
249
|
+
/// Returns the current relay configuration and daemon identity metadata.
|
|
250
|
+
async fn get_relay_config(&self, session: &AdminSession) -> Result<RelayConfig, DaemonError>;
|
|
251
|
+
|
|
252
|
+
/// Evaluates an agent request against current policy state without signing
|
|
253
|
+
/// or recording spend.
|
|
254
|
+
async fn evaluate_for_agent(
|
|
255
|
+
&self,
|
|
256
|
+
request: SignRequest,
|
|
257
|
+
) -> Result<PolicyEvaluation, DaemonError>;
|
|
258
|
+
|
|
259
|
+
/// Returns an explanation for policy evaluation without signing or spend mutation.
|
|
260
|
+
async fn explain_for_agent(
|
|
261
|
+
&self,
|
|
262
|
+
request: SignRequest,
|
|
263
|
+
) -> Result<PolicyExplanation, DaemonError>;
|
|
264
|
+
|
|
265
|
+
/// Reserves a unique nonce for a future broadcast transaction.
|
|
266
|
+
async fn reserve_nonce(
|
|
267
|
+
&self,
|
|
268
|
+
request: NonceReservationRequest,
|
|
269
|
+
) -> Result<NonceReservation, DaemonError>;
|
|
270
|
+
|
|
271
|
+
/// Releases a previously reserved nonce lease.
|
|
272
|
+
async fn release_nonce(&self, request: NonceReleaseRequest) -> Result<(), DaemonError>;
|
|
273
|
+
|
|
274
|
+
/// Evaluates policy and signs payload on success.
|
|
275
|
+
async fn sign_for_agent(&self, request: SignRequest) -> Result<Signature, DaemonError>;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/// RPC request type for transport adapters.
|
|
279
|
+
#[derive(Clone, Serialize, Deserialize)]
|
|
280
|
+
#[serde(tag = "method", content = "params")]
|
|
281
|
+
pub enum DaemonRpcRequest {
|
|
282
|
+
/// Issue lease.
|
|
283
|
+
IssueLease {
|
|
284
|
+
/// Admin vault password.
|
|
285
|
+
vault_password: String,
|
|
286
|
+
},
|
|
287
|
+
/// Add policy.
|
|
288
|
+
AddPolicy {
|
|
289
|
+
/// Admin session.
|
|
290
|
+
session: AdminSession,
|
|
291
|
+
/// Policy payload.
|
|
292
|
+
policy: SpendingPolicy,
|
|
293
|
+
},
|
|
294
|
+
/// List policies.
|
|
295
|
+
ListPolicies {
|
|
296
|
+
/// Admin session.
|
|
297
|
+
session: AdminSession,
|
|
298
|
+
},
|
|
299
|
+
/// Disable policy.
|
|
300
|
+
DisablePolicy {
|
|
301
|
+
/// Admin session.
|
|
302
|
+
session: AdminSession,
|
|
303
|
+
/// Policy id to disable.
|
|
304
|
+
policy_id: Uuid,
|
|
305
|
+
},
|
|
306
|
+
/// Create vault key.
|
|
307
|
+
CreateVaultKey {
|
|
308
|
+
/// Admin session.
|
|
309
|
+
session: AdminSession,
|
|
310
|
+
/// Create key request.
|
|
311
|
+
request: KeyCreateRequest,
|
|
312
|
+
},
|
|
313
|
+
/// Create agent key.
|
|
314
|
+
CreateAgentKey {
|
|
315
|
+
/// Admin session.
|
|
316
|
+
session: AdminSession,
|
|
317
|
+
/// Backing vault key.
|
|
318
|
+
vault_key_id: Uuid,
|
|
319
|
+
/// Attachment mode.
|
|
320
|
+
attachment: PolicyAttachment,
|
|
321
|
+
},
|
|
322
|
+
/// Export a software-backed vault private key when supported.
|
|
323
|
+
ExportVaultPrivateKey {
|
|
324
|
+
/// Admin session.
|
|
325
|
+
session: AdminSession,
|
|
326
|
+
/// Vault key id.
|
|
327
|
+
vault_key_id: Uuid,
|
|
328
|
+
},
|
|
329
|
+
/// Rotate agent auth token.
|
|
330
|
+
RotateAgentAuthToken {
|
|
331
|
+
/// Admin session.
|
|
332
|
+
session: AdminSession,
|
|
333
|
+
/// Agent key id.
|
|
334
|
+
agent_key_id: Uuid,
|
|
335
|
+
},
|
|
336
|
+
/// Revoke agent key.
|
|
337
|
+
RevokeAgentKey {
|
|
338
|
+
/// Admin session.
|
|
339
|
+
session: AdminSession,
|
|
340
|
+
/// Agent key id.
|
|
341
|
+
agent_key_id: Uuid,
|
|
342
|
+
},
|
|
343
|
+
/// List manual approval requests.
|
|
344
|
+
ListManualApprovalRequests {
|
|
345
|
+
/// Admin session.
|
|
346
|
+
session: AdminSession,
|
|
347
|
+
},
|
|
348
|
+
/// Decide a manual approval request.
|
|
349
|
+
DecideManualApprovalRequest {
|
|
350
|
+
/// Admin session.
|
|
351
|
+
session: AdminSession,
|
|
352
|
+
/// Approval request id.
|
|
353
|
+
approval_request_id: Uuid,
|
|
354
|
+
/// Approval decision.
|
|
355
|
+
decision: ManualApprovalDecision,
|
|
356
|
+
/// Optional rejection reason.
|
|
357
|
+
rejection_reason: Option<String>,
|
|
358
|
+
},
|
|
359
|
+
/// Set daemon relay configuration.
|
|
360
|
+
SetRelayConfig {
|
|
361
|
+
/// Admin session.
|
|
362
|
+
session: AdminSession,
|
|
363
|
+
/// Relay API URL.
|
|
364
|
+
relay_url: Option<String>,
|
|
365
|
+
/// Frontend base URL used for approval deep links.
|
|
366
|
+
frontend_url: Option<String>,
|
|
367
|
+
},
|
|
368
|
+
/// Read daemon relay configuration.
|
|
369
|
+
GetRelayConfig {
|
|
370
|
+
/// Admin session.
|
|
371
|
+
session: AdminSession,
|
|
372
|
+
},
|
|
373
|
+
/// Evaluate for agent without signing.
|
|
374
|
+
EvaluateForAgent {
|
|
375
|
+
/// Sign request payload.
|
|
376
|
+
request: SignRequest,
|
|
377
|
+
},
|
|
378
|
+
/// Explain policy decision for agent request without signing.
|
|
379
|
+
ExplainForAgent {
|
|
380
|
+
/// Sign request payload.
|
|
381
|
+
request: SignRequest,
|
|
382
|
+
},
|
|
383
|
+
/// Reserve a nonce for future broadcast signing.
|
|
384
|
+
ReserveNonce {
|
|
385
|
+
/// Reservation request payload.
|
|
386
|
+
request: NonceReservationRequest,
|
|
387
|
+
},
|
|
388
|
+
/// Release an existing nonce reservation.
|
|
389
|
+
ReleaseNonce {
|
|
390
|
+
/// Release request payload.
|
|
391
|
+
request: NonceReleaseRequest,
|
|
392
|
+
},
|
|
393
|
+
/// Sign for agent.
|
|
394
|
+
SignForAgent {
|
|
395
|
+
/// Sign request payload.
|
|
396
|
+
request: SignRequest,
|
|
397
|
+
},
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
impl DaemonRpcRequest {
|
|
401
|
+
pub fn zeroize_secrets(&mut self) {
|
|
402
|
+
match self {
|
|
403
|
+
Self::IssueLease { vault_password } => vault_password.zeroize(),
|
|
404
|
+
Self::AddPolicy { session, .. }
|
|
405
|
+
| Self::ListPolicies { session }
|
|
406
|
+
| Self::DisablePolicy { session, .. }
|
|
407
|
+
| Self::CreateVaultKey { session, .. }
|
|
408
|
+
| Self::CreateAgentKey { session, .. }
|
|
409
|
+
| Self::ExportVaultPrivateKey { session, .. }
|
|
410
|
+
| Self::RotateAgentAuthToken { session, .. }
|
|
411
|
+
| Self::RevokeAgentKey { session, .. }
|
|
412
|
+
| Self::ListManualApprovalRequests { session }
|
|
413
|
+
| Self::DecideManualApprovalRequest { session, .. }
|
|
414
|
+
| Self::SetRelayConfig { session, .. }
|
|
415
|
+
| Self::GetRelayConfig { session } => session.zeroize_secrets(),
|
|
416
|
+
Self::EvaluateForAgent { request }
|
|
417
|
+
| Self::ExplainForAgent { request }
|
|
418
|
+
| Self::SignForAgent { request } => request.zeroize_secrets(),
|
|
419
|
+
Self::ReserveNonce { request } => request.zeroize_secrets(),
|
|
420
|
+
Self::ReleaseNonce { request } => request.zeroize_secrets(),
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
impl std::fmt::Debug for DaemonRpcRequest {
|
|
426
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
427
|
+
match self {
|
|
428
|
+
Self::IssueLease { .. } => f
|
|
429
|
+
.debug_struct("IssueLease")
|
|
430
|
+
.field("vault_password", &"<redacted>")
|
|
431
|
+
.finish(),
|
|
432
|
+
Self::AddPolicy { session, policy } => f
|
|
433
|
+
.debug_struct("AddPolicy")
|
|
434
|
+
.field("session", session)
|
|
435
|
+
.field("policy", policy)
|
|
436
|
+
.finish(),
|
|
437
|
+
Self::ListPolicies { session } => f
|
|
438
|
+
.debug_struct("ListPolicies")
|
|
439
|
+
.field("session", session)
|
|
440
|
+
.finish(),
|
|
441
|
+
Self::DisablePolicy { session, policy_id } => f
|
|
442
|
+
.debug_struct("DisablePolicy")
|
|
443
|
+
.field("session", session)
|
|
444
|
+
.field("policy_id", policy_id)
|
|
445
|
+
.finish(),
|
|
446
|
+
Self::CreateVaultKey { session, request } => f
|
|
447
|
+
.debug_struct("CreateVaultKey")
|
|
448
|
+
.field("session", session)
|
|
449
|
+
.field("request", request)
|
|
450
|
+
.finish(),
|
|
451
|
+
Self::CreateAgentKey {
|
|
452
|
+
session,
|
|
453
|
+
vault_key_id,
|
|
454
|
+
attachment,
|
|
455
|
+
} => f
|
|
456
|
+
.debug_struct("CreateAgentKey")
|
|
457
|
+
.field("session", session)
|
|
458
|
+
.field("vault_key_id", vault_key_id)
|
|
459
|
+
.field("attachment", attachment)
|
|
460
|
+
.finish(),
|
|
461
|
+
Self::ExportVaultPrivateKey {
|
|
462
|
+
session,
|
|
463
|
+
vault_key_id,
|
|
464
|
+
} => f
|
|
465
|
+
.debug_struct("ExportVaultPrivateKey")
|
|
466
|
+
.field("session", session)
|
|
467
|
+
.field("vault_key_id", vault_key_id)
|
|
468
|
+
.finish(),
|
|
469
|
+
Self::RotateAgentAuthToken {
|
|
470
|
+
session,
|
|
471
|
+
agent_key_id,
|
|
472
|
+
} => f
|
|
473
|
+
.debug_struct("RotateAgentAuthToken")
|
|
474
|
+
.field("session", session)
|
|
475
|
+
.field("agent_key_id", agent_key_id)
|
|
476
|
+
.finish(),
|
|
477
|
+
Self::RevokeAgentKey {
|
|
478
|
+
session,
|
|
479
|
+
agent_key_id,
|
|
480
|
+
} => f
|
|
481
|
+
.debug_struct("RevokeAgentKey")
|
|
482
|
+
.field("session", session)
|
|
483
|
+
.field("agent_key_id", agent_key_id)
|
|
484
|
+
.finish(),
|
|
485
|
+
Self::ListManualApprovalRequests { session } => f
|
|
486
|
+
.debug_struct("ListManualApprovalRequests")
|
|
487
|
+
.field("session", session)
|
|
488
|
+
.finish(),
|
|
489
|
+
Self::DecideManualApprovalRequest {
|
|
490
|
+
session,
|
|
491
|
+
approval_request_id,
|
|
492
|
+
decision,
|
|
493
|
+
rejection_reason,
|
|
494
|
+
} => f
|
|
495
|
+
.debug_struct("DecideManualApprovalRequest")
|
|
496
|
+
.field("session", session)
|
|
497
|
+
.field("approval_request_id", approval_request_id)
|
|
498
|
+
.field("decision", decision)
|
|
499
|
+
.field("rejection_reason", rejection_reason)
|
|
500
|
+
.finish(),
|
|
501
|
+
Self::SetRelayConfig {
|
|
502
|
+
session,
|
|
503
|
+
relay_url,
|
|
504
|
+
frontend_url,
|
|
505
|
+
} => f
|
|
506
|
+
.debug_struct("SetRelayConfig")
|
|
507
|
+
.field("session", session)
|
|
508
|
+
.field("relay_url", relay_url)
|
|
509
|
+
.field("frontend_url", frontend_url)
|
|
510
|
+
.finish(),
|
|
511
|
+
Self::GetRelayConfig { session } => f
|
|
512
|
+
.debug_struct("GetRelayConfig")
|
|
513
|
+
.field("session", session)
|
|
514
|
+
.finish(),
|
|
515
|
+
Self::EvaluateForAgent { request } => f
|
|
516
|
+
.debug_struct("EvaluateForAgent")
|
|
517
|
+
.field("request", request)
|
|
518
|
+
.finish(),
|
|
519
|
+
Self::ExplainForAgent { request } => f
|
|
520
|
+
.debug_struct("ExplainForAgent")
|
|
521
|
+
.field("request", request)
|
|
522
|
+
.finish(),
|
|
523
|
+
Self::ReserveNonce { request } => f
|
|
524
|
+
.debug_struct("ReserveNonce")
|
|
525
|
+
.field("request", request)
|
|
526
|
+
.finish(),
|
|
527
|
+
Self::ReleaseNonce { request } => f
|
|
528
|
+
.debug_struct("ReleaseNonce")
|
|
529
|
+
.field("request", request)
|
|
530
|
+
.finish(),
|
|
531
|
+
Self::SignForAgent { request } => f
|
|
532
|
+
.debug_struct("SignForAgent")
|
|
533
|
+
.field("request", request)
|
|
534
|
+
.finish(),
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/// RPC response type for transport adapters.
|
|
540
|
+
#[derive(Clone, Serialize, Deserialize)]
|
|
541
|
+
#[serde(tag = "type", content = "data")]
|
|
542
|
+
pub enum DaemonRpcResponse {
|
|
543
|
+
/// No return data.
|
|
544
|
+
Unit,
|
|
545
|
+
/// Lease response.
|
|
546
|
+
Lease(Lease),
|
|
547
|
+
/// Policy list response.
|
|
548
|
+
Policies(Vec<SpendingPolicy>),
|
|
549
|
+
/// Policy evaluation response.
|
|
550
|
+
PolicyEvaluation(PolicyEvaluation),
|
|
551
|
+
/// Policy explanation response.
|
|
552
|
+
PolicyExplanation(PolicyExplanation),
|
|
553
|
+
/// Vault key response.
|
|
554
|
+
VaultKey(VaultKey),
|
|
555
|
+
/// Agent key + auth token response.
|
|
556
|
+
AgentCredentials(AgentCredentials),
|
|
557
|
+
/// Exported software-backed private key response.
|
|
558
|
+
PrivateKey(Option<String>),
|
|
559
|
+
/// Rotated auth token response.
|
|
560
|
+
AuthToken(String),
|
|
561
|
+
/// Manual approval request list response.
|
|
562
|
+
ManualApprovalRequests(Vec<ManualApprovalRequest>),
|
|
563
|
+
/// Single manual approval request response.
|
|
564
|
+
ManualApprovalRequest(ManualApprovalRequest),
|
|
565
|
+
/// Relay config response.
|
|
566
|
+
RelayConfig(RelayConfig),
|
|
567
|
+
/// Nonce reservation response.
|
|
568
|
+
NonceReservation(NonceReservation),
|
|
569
|
+
/// Signature response.
|
|
570
|
+
Signature(Signature),
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
impl DaemonRpcResponse {
|
|
574
|
+
pub fn zeroize_secrets(&mut self) {
|
|
575
|
+
match self {
|
|
576
|
+
Self::AgentCredentials(credentials) => credentials.zeroize_secrets(),
|
|
577
|
+
Self::PrivateKey(Some(private_key)) => private_key.zeroize(),
|
|
578
|
+
Self::PrivateKey(None) => {}
|
|
579
|
+
Self::AuthToken(token) => token.zeroize(),
|
|
580
|
+
_ => {}
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
impl std::fmt::Debug for DaemonRpcResponse {
|
|
586
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
587
|
+
match self {
|
|
588
|
+
Self::Unit => f.write_str("Unit"),
|
|
589
|
+
Self::Lease(lease) => f.debug_tuple("Lease").field(lease).finish(),
|
|
590
|
+
Self::Policies(policies) => f.debug_tuple("Policies").field(policies).finish(),
|
|
591
|
+
Self::PolicyEvaluation(evaluation) => {
|
|
592
|
+
f.debug_tuple("PolicyEvaluation").field(evaluation).finish()
|
|
593
|
+
}
|
|
594
|
+
Self::PolicyExplanation(explanation) => f
|
|
595
|
+
.debug_tuple("PolicyExplanation")
|
|
596
|
+
.field(explanation)
|
|
597
|
+
.finish(),
|
|
598
|
+
Self::VaultKey(key) => f.debug_tuple("VaultKey").field(key).finish(),
|
|
599
|
+
Self::AgentCredentials(credentials) => f
|
|
600
|
+
.debug_tuple("AgentCredentials")
|
|
601
|
+
.field(credentials)
|
|
602
|
+
.finish(),
|
|
603
|
+
Self::PrivateKey(Some(_)) => f.debug_tuple("PrivateKey").field(&"<redacted>").finish(),
|
|
604
|
+
Self::PrivateKey(None) => f.debug_tuple("PrivateKey").field(&"<none>").finish(),
|
|
605
|
+
Self::AuthToken(_) => f.debug_tuple("AuthToken").field(&"<redacted>").finish(),
|
|
606
|
+
Self::ManualApprovalRequests(requests) => f
|
|
607
|
+
.debug_tuple("ManualApprovalRequests")
|
|
608
|
+
.field(requests)
|
|
609
|
+
.finish(),
|
|
610
|
+
Self::ManualApprovalRequest(request) => f
|
|
611
|
+
.debug_tuple("ManualApprovalRequest")
|
|
612
|
+
.field(request)
|
|
613
|
+
.finish(),
|
|
614
|
+
Self::RelayConfig(config) => f.debug_tuple("RelayConfig").field(config).finish(),
|
|
615
|
+
Self::NonceReservation(reservation) => f
|
|
616
|
+
.debug_tuple("NonceReservation")
|
|
617
|
+
.field(reservation)
|
|
618
|
+
.finish(),
|
|
619
|
+
Self::Signature(signature) => f.debug_tuple("Signature").field(signature).finish(),
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//! Core daemon authorization and signing pipeline.
|
|
2
|
+
//!
|
|
3
|
+
//! This crate is transport-agnostic: CLIs, SDKs, and XPC adapters call the
|
|
4
|
+
//! same [`KeyManagerDaemonApi`] trait.
|
|
5
|
+
|
|
6
|
+
#![forbid(unsafe_code)]
|
|
7
|
+
|
|
8
|
+
use std::collections::HashMap;
|
|
9
|
+
use std::sync::{Arc, RwLock};
|
|
10
|
+
|
|
11
|
+
use argon2::password_hash::rand_core::OsRng as PasswordOsRng;
|
|
12
|
+
use argon2::password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, SaltString};
|
|
13
|
+
use argon2::{Argon2, ParamsBuilder};
|
|
14
|
+
use async_trait::async_trait;
|
|
15
|
+
use k256::ecdsa::{RecoveryId, Signature as K256Signature, VerifyingKey};
|
|
16
|
+
use serde::{Deserialize, Serialize};
|
|
17
|
+
use sha2::{Digest, Sha256};
|
|
18
|
+
use thiserror::Error;
|
|
19
|
+
use time::{Duration, OffsetDateTime};
|
|
20
|
+
use uuid::Uuid;
|
|
21
|
+
use vault_domain::{
|
|
22
|
+
manual_approval_capability_token, AdminSession, AgentAction, AgentCredentials, AgentKey, Lease,
|
|
23
|
+
ManualApprovalDecision, ManualApprovalRequest, ManualApprovalStatus, NonceReleaseRequest,
|
|
24
|
+
NonceReservation, NonceReservationRequest, PolicyAttachment, RelayConfig, SignRequest,
|
|
25
|
+
Signature, SpendEvent, SpendingPolicy, VaultKey,
|
|
26
|
+
};
|
|
27
|
+
use vault_policy::{
|
|
28
|
+
PolicyDecision, PolicyEngine, PolicyError, PolicyEvaluation, PolicyExplanation,
|
|
29
|
+
};
|
|
30
|
+
use vault_signer::{KeyCreateRequest, SignerError, VaultSignerBackend};
|
|
31
|
+
use zeroize::Zeroize;
|
|
32
|
+
|
|
33
|
+
mod persistence;
|
|
34
|
+
|
|
35
|
+
pub use persistence::PersistentStoreConfig;
|
|
36
|
+
use persistence::{EncryptedStateStore, PersistedDaemonState};
|
|
37
|
+
|
|
38
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
39
|
+
pub struct RelayRegistrationSnapshot {
|
|
40
|
+
pub relay_config: RelayConfig,
|
|
41
|
+
pub relay_private_key_hex: String,
|
|
42
|
+
pub vault_public_key_hex: Option<String>,
|
|
43
|
+
pub ethereum_address: Option<String>,
|
|
44
|
+
pub policies: Vec<SpendingPolicy>,
|
|
45
|
+
pub agent_keys: Vec<AgentKey>,
|
|
46
|
+
pub manual_approval_requests: Vec<ManualApprovalRequest>,
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
include!("daemon_parts/types_api_rpc.rs");
|
|
50
|
+
include!("daemon_parts/core_helpers.rs");
|
|
51
|
+
include!("daemon_parts/api_impl_and_utils.rs");
|
|
52
|
+
|
|
53
|
+
#[cfg(test)]
|
|
54
|
+
mod tests;
|