vetkeys
vetKeys (Verifiable Encrypted Threshold Keys)
vetKeys bring on-chain privacy to the IC via the vetKD protocol: a canister requests a key derived by the subnet's threshold key-derivation infrastructure, receives it encrypted under a client-supplied transport key, and only the client decrypts it locally. No subnet node ever sees the raw key, and in this standard client-delivery pattern neither does the canister — it relays the still-encrypted key to the client. (Some flows deliberately have the canister obtain key material itself: threshold BLS signing and in-canister timelock decryption — see those sections.) Derivation is deterministic: the same (canister, context, input) always yields the same key.
Build on the maintained libraries — do not hand-roll the cryptography or the Candid interface:
| Layer | Rust | Motoko | Frontend |
|---|---|---|---|
| Package | ic-vetkeys 0.9 (crates.io) |
ic-vetkeys 0.6 (mops) |
@icp-sdk/vetkeys 0.5 (npm) |
| Management API | ic-cdk-management-canister, ic_vetkeys::management_canister |
mo:ic-vetkeys/ManagementCanister |
— |
| Low-level primitives | crate root (ic_vetkeys::…) |
— (not available, see below) | package root (@icp-sdk/vetkeys) |
@dfinity/vetkeysis legacy (frozen at 0.4.0). The package was renamed to@icp-sdk/vetkeysat 0.5.0. Frontend agent/identity types come from@icp-sdk/core(@icp-sdk/core/agent,@icp-sdk/core/principal), not@dfinity/agent/@dfinity/principal.
Also required: Rust ic-cdk = "0.20" + ic-cdk-management-canister = "0.1" (and ic-dummy-getrandom-for-wasm for IBE); Motoko ic-vetkeys 0.6 needs moc ≥ 1.13.0 / core ≥ 2.6.1; frontend also @icp-sdk/core ^5.4.