- Add `rekey.proto` with `ContributePassphrase` / `ContributeRecoveryPassphrase` / `RekeyResult`
- Wire `rekey` as a 4th vault stream payload in `vault.proto` and gRPC dispatch
- Add `RekeyRootKey` message to `Vault` actor: generates new random seal key, re-encrypts root key, writes new `root_key_history` row
- Add `StartRekey`, `ContributeRekey`, `ContributeRecoveryRekey` messages to `VaultCoordinator`; `finalize_rekey` uses threshold-1 fast path identical to bootstrap
- `execute_replace_operator` now UPDATEs `operator_identity.public_key` in-place (avoids FK constraint violation), deletes stale `operator` share row, then triggers `StartRekey`
- `execute_update_shamir_parameters` triggers `StartRekey` instead of warning stub
- `ProposalKind::ReplaceOperator` carries `old_operator_id`; encode/decode updated accordingly
- `GlobalActors::spawn` extracts `vault_coordinator` before `Ok(Self { … })` so it can be cloned into `ProposalManager::new`
- Add `handle_rekey` in session handlers forwarding passphrase contributions to `VaultCoordinator`
- Fix test: rename `replace_operator_inserts_identity_row` → `replace_operator_updates_pubkey_and_starts_rekey`, assert count stays 1 and pubkey is updated
28 lines
675 B
Protocol Buffer
28 lines
675 B
Protocol Buffer
syntax = "proto3";
|
|
|
|
package arbiter.operator.vault;
|
|
|
|
import "google/protobuf/empty.proto";
|
|
import "shared/vault.proto";
|
|
import "operator/vault/bootstrap.proto";
|
|
import "operator/vault/rekey.proto";
|
|
import "operator/vault/unseal.proto";
|
|
|
|
message Request {
|
|
oneof payload {
|
|
google.protobuf.Empty query_state = 1;
|
|
unseal.Request unseal = 2;
|
|
bootstrap.Request bootstrap = 3;
|
|
rekey.Request rekey = 4;
|
|
}
|
|
}
|
|
|
|
message Response {
|
|
oneof payload {
|
|
arbiter.shared.VaultState state = 1;
|
|
unseal.Response unseal = 2;
|
|
bootstrap.Response bootstrap = 3;
|
|
rekey.Response rekey = 4;
|
|
}
|
|
}
|