Deep Dive: How JumpTerm Encrypts Your Vault

·Alex Chen

The Key Hierarchy

JumpTerm uses a three-layer key hierarchy. Your passphrase is the root of trust. It feeds into Argon2id with a per-vault random salt to produce a 256-bit key-encryption key (KEK). The KEK wraps a randomly generated vault master key (VMK) using XChaCha20-Poly1305. The VMK encrypts individual vault items, each with a unique random nonce.

This hierarchy exists so that changing your passphrase is fast (re-wrap the VMK) and adding a new device is secure (encrypt the VMK to the device's public key). The VMK is the only secret that needs to be transferred between devices.

Item-Level Encryption

Each vault item -- a connection profile, a private key, a snippet -- is encrypted independently with the VMK. This means we can sync individual items without decrypting the entire vault. When you add a new connection on your laptop, only that item's ciphertext is sent to the server and relayed to your other devices.

The nonce for each encryption is generated using a cryptographically secure random number generator. XChaCha20's 192-bit nonce space makes nonce reuse practically impossible even across billions of items.

Sync Protocol

The sync protocol uses a simple last-writer-wins model with vector clocks for conflict detection. Each device maintains a local version counter. When a vault item is modified, the counter increments and the item is re-encrypted with a new nonce. The server merges updates based on vector clock comparisons and flags conflicts for manual resolution when two devices modify the same item concurrently.

All sync traffic is protected by TLS in addition to the E2EE layer. The TLS layer prevents network observers from seeing even the ciphertext, while the E2EE layer protects against server-side access.