AgentVault’s crypto library (
@agentvault/crypto) implements all of these requirements.
If you are building a custom integration, follow this guide to ensure compatibility.Cryptographic Primitives
AgentVault uses a carefully chosen set of modern primitives via libsodium.| Purpose | Algorithm | Notes |
|---|---|---|
| Symmetric encryption | XChaCha20-Poly1305 | AEAD cipher with 192-bit nonce |
| Key exchange | X25519 (Curve25519 ECDH) | Used in X3DH handshake |
| Digital signatures | Ed25519 | Identity keys, message authentication |
| Hashing | BLAKE2b | Invite token hashing, KDF inputs |
| Key derivation | HKDF-SHA-256 | Ratchet chain key derivation |
Key Exchange: X3DH
AgentVault uses the Extended Triple Diffie-Hellman (X3DH) protocol to establish shared secrets between an owner and an agent device. The handshake occurs during device enrollment.Identity key generation
Each device generates a long-term Ed25519 identity key pair stored in OS secure storage
(Keychain on iOS, Keystore on Android,
expo-secure-store cross-platform).Ephemeral key generation
The initiating device generates a one-time X25519 ephemeral key pair for the handshake.
Triple DH computation
Three DH computations produce the shared secret:
- DH(identity_A, ephemeral_B)
- DH(ephemeral_A, identity_B)
- DH(ephemeral_A, ephemeral_B)
Double Ratchet Protocol
After the X3DH handshake, all messages are encrypted using the Double Ratchet algorithm, which provides forward secrecy and break-in recovery.How It Works
The Double Ratchet combines two ratcheting mechanisms:- Symmetric-key ratchet (chain keys) — Derives a new message key for each message using HKDF. Old keys are deleted after use, providing forward secrecy.
- Diffie-Hellman ratchet — Periodically performs a new DH key exchange to provide break-in recovery. If a key is compromised, future messages remain secure after the next DH ratchet step.
Ratchet Advancement
Device Key Handling
Proper key storage is critical to the security model.Requirements
| Requirement | Implementation |
|---|---|
| Private key storage | OS secure storage (Keychain, Keystore, expo-secure-store) |
| Key logging | Never log private key material under any circumstances |
| Session state | Encrypt local ratchet state at rest |
| Key deletion | Delete message keys immediately after decryption |
| Debug logging | Disable all crypto debug logs in production builds |
Key Types and Lifecycle
Identity Key Pair (Ed25519)
Identity Key Pair (Ed25519)
- Generated once per device during enrollment
- Stored permanently in OS secure storage
- Used to sign messages and derive DH shared secrets
- Survives app updates; lost only on device wipe or explicit revocation
Ephemeral Key Pair (X25519)
Ephemeral Key Pair (X25519)
- Generated during X3DH handshake
- Used once to establish the initial shared secret
- Deleted after the Double Ratchet is initialized
Chain Keys (HKDF-derived)
Chain Keys (HKDF-derived)
- Derived from the root key via HKDF after each DH ratchet step
- Used to derive individual message keys
- Advanced (replaced) after each message
Message Keys (XChaCha20-Poly1305)
Message Keys (XChaCha20-Poly1305)
- Derived from the current chain key
- Used to encrypt/decrypt exactly one message
- Deleted immediately after use to ensure forward secrecy
Library Choices
Recommended: @agentvault/crypto
The @agentvault/crypto npm package provides a complete implementation of AgentVault’s
cryptographic protocol.
Custom Implementations
If you are building a custom integration in a language other than TypeScript, use any libsodium binding that provides:crypto_aead_xchacha20poly1305_ietf_encrypt/decryptcrypto_scalarmult(X25519)crypto_sign_ed25519keypair generation and signingcrypto_generichash(BLAKE2b)crypto_kdf_hkdf_sha256_extract/expand(or equivalent HKDF)
Forward Secrecy Guarantees
AgentVault’s protocol provides two levels of forward secrecy:| Property | Mechanism | Guarantee |
|---|---|---|
| Forward secrecy | Symmetric ratchet (chain key advancement) | Compromising a message key does not reveal past messages |
| Break-in recovery | DH ratchet (periodic re-keying) | Compromising a long-term key does not reveal future messages after the next DH step |
Ensuring Forward Secrecy in Your Integration
- Delete message keys after use. Never cache or persist decrypted message keys.
- Advance the ratchet on every message. Skipping ratchet steps weakens forward secrecy.
- Re-key on member removal. When a device is revoked, all remaining sessions must re-key.
- Verify epoch consistency. Ensure both parties agree on the current ratchet state.
Validation Tests
Any custom cryptographic integration should pass these test categories before deployment.Required Test Cases
Required Test Cases
| Category | Test |
|---|---|
| Replay attacks | Reject messages with previously seen nonces or sequence numbers |
| Out-of-order delivery | Correctly decrypt messages received out of order (within the skip window) |
| Corrupt ciphertext | Reject tampered ciphertext (Poly1305 MAC verification failure) |
| Device revocation | Refuse to encrypt/decrypt after a device has been revoked |
| Key deletion | Verify that message keys are not recoverable after decryption |
| Ratchet advancement | Confirm that each message produces a unique ciphertext even for identical plaintext |
Operational Safeguards
| Safeguard | Rationale |
|---|---|
| Disable debug logs in production | Crypto debug logs may leak key material or plaintext |
| Validate JWT before any DB access | Prevents unauthorized access to encrypted message store |
| Rate limit enrollment endpoints | Prevents brute-force attacks on the X3DH handshake (5 attempts per IP per 10 minutes) |
| Use BYTEA columns for crypto material | Never store keys or ciphertext as TEXT — binary storage prevents encoding issues |
| Generic error messages | Auth and enrollment failures must not leak information about valid identities |