The Semparo security architecture

Last reviewed July 19, 2026 · v2.2

Patent pending. The mechanisms described on this page are the subject of U.S. patent applications filed by Semparo (U.S. Provisional Patent Application Nos. 64/108,852 and 64/108,856). Read our patent pledge for what we will and will not do with them.

Semparo holds the most sensitive things a person can write down: seed phrases, a will, the map of what they own, and the words they want their family to have after they're gone. (For everyday accounts we hold the map: what exists, where it lives, and the lawful way for your people to claim each one.) This page explains, precisely, how the system is built so that no single party can open a vault early. Not a hacker, not a court order served on us, not a rogue employee, and not Semparo itself.

By "early" we mean before a release is authorized: before a quorum of the people you chose have sworn, in writing and under penalty of perjury, and presented their printed key fragments; before the waiting periods have run; and while your power to stop everything still stands.

It is written for the skeptical reader. Every design claim links to the public standard or vendor documentation behind it, and the last section lists what we deliberately do not claim.

The full cryptographic scheme is published for open review. If you want the formal version, the whole design is written up as a paper: read it and try to break it. It has not been peer-reviewed, and it lists the exact questions we most want answered.

The threat model: our own servers are the adversary

Most products defend the perimeter and ask you to trust what is inside it. A digital legacy vault cannot work that way, because the honest answer to "what if Semparo is breached, subpoenaed, or acquired by someone you would not have chosen" has to be: it does not matter.

So the design treats the Semparo server as untrusted. For your vault, it stores and moves four things only: encrypted content, encrypted (wrapped) keys, opaque half-shares of the release key, and routing metadata. The two invariants every layer below serves:

  1. No false release. Nothing decrypts before the release protocol completes: a quorum of the people you chose, sworn and holding their printed fragments, the waiting periods run, and your standing power to stop it unexercised. When signals conflict, the system errs on the side of not releasing, because a wrongful release cannot be undone.
  2. Zero knowledge. By "zero knowledge" we mean it the way the term is used for encrypted vaults: your content is encrypted on your device before it reaches us, with keys derived from secrets only you hold. We store ciphertext. A breach of our servers yields no readable content, and support staff have nothing to look at.
The zero-knowledge boundary Three zones. Your device encrypts everything before it leaves. The Semparo servers hold only ciphertext, wrapped keys, and opaque half-shares, and cannot read any of it. Your people receive only their part when a release completes. zero-knowledge line Your device Everything is encrypted here, before it leaves. Your keys stay with you. Semparo servers Ciphertext, wrapped keys, opaque half-shares. We cannot read it Your people When a release completes, each person receives only their part.
The zero-knowledge line. Everything is sealed on your device before it reaches us. Our servers hold only ciphertext, wrapped keys, and opaque half-shares, so a breach or a subpoena finds nothing readable. When a release completes, each person receives only the part you left them.

Level 1: keys are born on your device and never leave it

When you set a password, your browser derives keys locally using Argon2 (RFC 9106), winner of the Password Hashing Competition, in its recommended Argon2id variant: a memory-hard function designed to make large-scale password cracking expensive.

Two properties matter here:

The Vault Key itself is random, wrapped under your master key, and separately wrapped under a printed Recovery Code, so you can recover from a forgotten password without us ever being able to do the same. Unwrapped keys live in memory for the session only and are zeroized after use. Every encrypted blob carries a version byte, so algorithms can be upgraded without breaking old data.

Level 2: every item is sealed once, under its own key

Each item in your vault (a letter, an account record, a seed phrase, a video) gets its own random Content Encryption Key. Content is encrypted with AES-256-GCM, the authenticated mode specified in NIST SP 800-38D, with the item's identity bound into the ciphertext as associated data, so an attacker who controls the database cannot swap one item's ciphertext for another's and have it accepted.

The seal covers everything about the item: its content, its title, and even its type. Our server cannot tell a seed phrase from a poem, and no record on our side asserts what kind of thing any item is. The release-relevant facts the server holds about an item are the waiting time you chose for it and which of your people it is addressed to. That addressing is routing metadata, held so release can deliver the right sealed parts; what the item is stays sealed.

The content is sealed exactly once. The item key is then wrapped twice: once under your Vault Key (so you can read it whenever you sign in) and once under the release key described next (so your people can read it after you're gone). Large media files are encrypted under the same per-item key and stored as opaque blobs.

Level 3: the release key that nobody holds

This is the part that makes a legacy vault different from a password manager.

The Release Wrapping Key is a random 32-byte key that exists nowhere in complete form outside an authorized release. At setup, your browser splits it using Shamir's secret sharing, the 1979 threshold scheme with information-theoretic security: any 2 of 3 shares reconstruct the key, and fewer than 2 reveal nothing at all, no matter how much computing power is applied.

Each of the three shares is itself split in two:

Reconstruction therefore requires at least two KeyKeepers to physically present their fragments, plus the matching server halves. Our database, fully leaked, contributes nothing without the paper in your KeyKeepers' hands. The cryptographic core refuses any configuration with a threshold below 2, unconditionally.

Because any 2 of 3 shares suffice, one lost letter or one unreachable KeyKeeper does not brick the release. And if you ever replace a KeyKeeper, your browser re-splits a fresh key, which retires every old fragment at once.

The release key nobody holds The release key is split into three shares, with no complete copy kept. Each share is half a server record we store and half a paper fragment printed into a KeyKeeper's letter. Any two of three rebuild the key; fewer than two reveal nothing. The release key No complete copy exists outside a release. Share 1 Server half stored by Semparo Paper fragment in a KeyKeeper's letter Share 2 Server half stored by Semparo Paper fragment in a KeyKeeper's letter Share 3 Server half stored by Semparo Paper fragment in a KeyKeeper's letter Any 2 of 3 rebuild the key. Fewer than 2 reveal nothing.
The release key nobody holds. At setup your browser splits the release key into three shares and never keeps a whole copy. Each share is half a server record we store and half a paper fragment printed into a KeyKeeper's sealed letter. Any two of the three rebuild the key; fewer than two reveal nothing at all. Our database, fully leaked, opens nothing without the paper in your KeyKeepers' hands.

Level 4: your signed manifest decides who receives what

Who gets which item is recorded in a manifest that your browser signs with a hybrid signature: Ed25519 (RFC 8032) plus ML-DSA-65 (NIST FIPS 204), and verification requires both to pass. The signing key is derived from your Vault Key; the public key is committed under the release key with an anti-rollback version counter.

At release time, the reconstruction environment verifies the manifest before anything is unwrapped. If the signature does not verify, or the manifest is missing items it should cover, there is no release. The consequence: even an attacker with full control of our servers cannot add a recipient, remove one, or alter a single byte of your directions. Only code holding your keys, in your browser, could have produced the manifest.

One honest boundary of the signature itself: it cannot stop a replay of an older manifest you validly signed, back before you changed your mind. The version counter defends against that, and pinning your latest version somewhere outside our own infrastructure, so that not even a full compromise of our servers could rewind it, is hardening in progress. Until it ships, this appears in the limits section below rather than in the guarantees.

Level 5: reconstruction happens inside attested hardware

When the release protocol finally authorizes a release (a sworn KeyKeeper quorum with their fragments, the waiting periods run, your veto unexercised), the reconstruction runs inside an AWS Nitro Enclave: an isolated compute environment with no persistent storage, no interactive access, and no network path except the one we define.

The enclave proves what code it is running through cryptographic attestation: a hardware-signed document of its exact measurements. The key that seals per-recipient material lives in AWS KMS under a policy bound to those measurements, so it is usable only by that exact, unmodified enclave code. The host machine it runs on, and we as its operators, are locked out by policy and by hardware. The release key and content keys exist in the clear only inside the enclave, transiently, and are zeroized when the operation completes. We have validated this attestation path on real Nitro hardware.

The release machinery: a state machine, not a switch

The cryptography above answers "can it be opened." A separate policy layer answers "should it be, now." One thing we never do in that layer: decide what happened to you. The protocol runs on what can be sworn to it and proven to it, and on nothing else. Opening a vault is a guarded state machine:

Every transition in this machine is recorded in the audit trail described below.

Post-quantum, at every durable layer

A message recorded for a birthday thirty years from now must survive thirty years of cryptanalysis, including the harvest-now-decrypt-later pattern: adversaries recording encrypted traffic today to decrypt when quantum computers mature. That is CISA's framing, and it is the reason we did not wait.

NIST finalized the first post-quantum encryption standards in August 2024. Semparo's durable layers use them today, in hybrid constructions that remain secure if either the classical or the post-quantum half holds:

Layer Construction Standard
Content encryption AES-256-GCM (256-bit keys retain a comfortable margin against quantum search) FIPS 197 / SP 800-38D
Key transport to another party (release delivery) Hybrid X25519 (RFC 7748) + ML-KEM-768 FIPS 203
Signatures (manifest, audit checkpoints) Hybrid Ed25519 + ML-DSA-65, both must verify RFC 8032 / FIPS 204
Threshold split of the release key Shamir over GF(256): information-theoretic, immune to quantum attack by construction Shamir 1979

If hybrid post-quantum feels exotic: Signal ships it in PQXDH since 2023 and Apple ships it in iMessage (PQ3) since 2024, for messages far more ephemeral than a legacy vault. For thirty-year secrets it is not exotic. It is the floor.

Recipients: the honest trust model

Your recipients are grieving relatives, possibly decades from now. They cannot be expected to have kept a secret key safe since the day you set up your vault. So recipient access works differently, and we describe it exactly rather than rounding it up to a claim it does not meet.

At release, a recipient proves identity against the details you recorded, then receives two one-time codes over two separate channels (email and phone). The codes are HOTP (RFC 4226) values whose secrets live inside the enclave, and the enclave validates both internally, so a compromised host cannot forge a "valid" result. The recipient's browser generates a fresh hybrid X25519 + ML-KEM keypair for the session; the enclave seals the recipient's key material to that browser in the pattern of HPKE (RFC 9180), and decryption happens client-side.

The honest part: because recipients hold no durable secret, their protection is the enclave, the dual channels, and the release-window policy, not owner-grade zero knowledge. The exchange is relayed by our (untrusted) host, so this protection ultimately rests on the enclave's attestation rather than on anything the recipient holds; surfacing that attestation for the recipient's browser to verify directly is on the roadmap. An attacker who controls both a recipient's email and phone during the release window could impersonate that recipient for their entitled items. We consider that trade explicit and correct for people who cannot be asked to do key management, and we say it here so you do not have to discover it in the fine print.

The audit trail

Every consequential event (a report, a KeyKeeper's sworn confirmation, a state transition, an access) is appended to a hash-chained audit log: each entry binds the hash of the previous one, written in the same database transaction as the event itself, in a table the database refuses to update or delete from. Chain heads are checkpointed with the same hybrid post-quantum signature scheme as the manifest (under a separate, server-held signing key), so an external auditor can verify the chain's integrity without holding any symmetric secret of ours. The honest caveat: until checkpoints are anchored externally, a fully compromised server could forge future checkpoints, though never rewrite the past ones an auditor already holds. Anchoring to external timestamping services is planned, and we will say so here when it ships rather than before.

What we can read, and what we can't

Zero knowledge applies to your vault's contents. It does not apply to the handful of operational details we need to run the service, so we say exactly what those are and how each is protected.

At rest, our database holds no readable personal information. Two different mechanisms get us there:

In operation, the only things our servers can read are these, and nothing more:

Independent review

This document describes the full design, and the deeper architecture documents publish alongside it. The client encryption core, the code that encrypts in your browser before anything reaches us, will be source-available: the repository goes public ahead of general availability, for anyone to read, diff, and audit, and this page links it the day it does. The license will not permit reuse, so it is not OSI open source.

The formal cryptographic scheme behind this design is written up as a paper and published for open review: read it, check it, and try to break it. It has not been peer-reviewed, and the paper itself lists the exact questions we most want answered.

Before we accept real vaults at general availability, we publish an assurance inventory you can check item by item: machine-checked formal verification of the release protocol, with the model published; an inventory of every cryptographic dependency and its own public audit; and NIST test-vector conformance with a public harness. A commercial third-party audit and penetration test are on the roadmap, funded by revenue, and those reports will be published in full, findings included. If you break something before then, we want to know: contacts@semparo.com, or through our coordinated disclosure policy.

What we do not claim

Trust comes from the limits as much as the guarantees:

References

Argon2id, RFC 9106 · HKDF, RFC 5869 · AES, FIPS 197 · GCM, NIST SP 800-38D · X25519, RFC 7748 · ML-KEM, FIPS 203 · Ed25519, RFC 8032 · ML-DSA, FIPS 204 · HPKE, RFC 9180 · HOTP, RFC 4226 · Shamir, How to Share a Secret (1979) · NIST post-quantum standards announcement · CISA on quantum readiness · Apple iMessage PQ3 · Signal PQXDH · AWS Nitro Enclaves · Nitro Enclaves attestation