Trust assumptions and threat model
The Economics chapter traces where every lamport goes; this page traces where trust goes: what each participant must assume about the others, which of those assumptions are enforced on-chain, and which live off-chain in an operator’s configuration or a service the network operator runs. Nothing here is a hidden flaw — each item is a deliberate design boundary — but anyone holding real value in the system should know where the boundaries are.
Every on-chain guarantee below is a guarantee of the currently deployed bytecode. Who can replace that bytecode — the program upgrade authority — is a trust boundary that sits above all of them; it has its own page, the program upgrade authority policy.
For the plain-language version of what an ordinary user exposes versus keeps private — on-chain and off — start with What’s public and private; its field reference is the exact per-account inventory.
The domain authority is fully trusted for relayed mail
On-chain, SendMail accepts a message when the signer is the sender named
in the email or the active authority of the recipient’s domain — the MX
operator’s wallet, for mail relayed in from traditional SMTP. The chain
cannot verify that the from address on relayed mail is genuine; it trusts
the authority’s signature entirely. Verifying the sender is the operator’s
job, off-chain, via SPF/DKIM/DMARC (the sender_auth setting in
sithbitd’s configuration).
The consequence of a lax or compromised MX is worse than ordinary spam:
because fromboxes are keyed by the from string, a relay that accepts
a forged from lets the forger consume a trusted correspondent’s prepaid
stamps and arrive at that correspondent’s discounted price. Spoofing
through a careless operator is simultaneously stamp theft from the
impersonated sender and a bypass of the recipient’s stranger pricing.
What this means in practice:
- Operators: run
sender_authatspfor stricter on any internet-facing MX. An authority that relays forgeries is spending its own users’ stamps. The strictest setting,sender_auth = "dmarc", now enforces the sender domain’s full published DMARC policy: unaligned mail underp=quarantineis filed into the recipient’sJunkfolder (andp=rejectbounces), honoringpctsampling — a direct mitigation against forged-fromrelaying. A"dmarc"MX can additionally emit DMARC aggregate (rua) reports back to the domains it evaluates, giving those senders visibility into forgeries attempted through this relay, and per-failure forensic (ruf) reports for finer-grained visibility — see the forensic-reporting privacy note below before enabling it. - Recipients: your spam-pricing guarantee is only as strong as your domain operator’s inbound authentication. A mailbox on a well-run domain inherits its rigor; a bare-pubkey mailbox with no domain accepts only sender-signed (wallet-to-wallet) mail, which needs no such trust.
- The protocol: today there is no on-chain accountability for authorities beyond the delegate’s ability to deactivate a domain. Per-authority accountability (reputation or stake) is a recognized open design question, not current behavior — see Per-authority accountability is a known gap below for how the design handles the gap in the meantime.
Everything above is about the from claim and stamp economics; the same
operator is, by default, also trusted with your plaintext. Its IMAP/POP
storage holds an unsealed copy of every message in every mailbox on its
domain — that’s what lets it answer IMAP/POP requests at all. The one
carve-out is Lockbox, client-side end-to-end
encryption that keeps a plaintext body from ever reaching that storage — but
it ships in only two of the four GUI clients and needs both correspondents
running one; see
Lockbox narrows the domain-operator boundary
below for the exact scope. Nothing about the from-claim trust or the
envelope/header visibility above changes when lockbox is in play — it seals
the body, not the delivery decision the operator makes around it.
The same trust extends to the domain-scoped alias namespace:
the domain authority alone may map user@its-domain to a wallet, and may repoint
or remove that mapping at will. A recipient who accepts [email protected] as an
identity is trusting acme.com’s authority to have pointed it at the right
wallet — including for lockbox sealing, where the mapping
decides which key a sender seals to. This is the intended model (an organization
issues addresses under a domain it controls), but a compromised or malicious
authority can redirect its own domain’s addresses; it cannot touch the global
alias namespace or any other domain’s.
The same mapping now also governs incoming mail. A SithBit MX resolves an
inbound RCPT user@its-domain through the domain-scoped mapping before
delivering, so the authority decides not just which key a sender seals to but
which wallet actually receives mail for each local-part it issues. This is the
delivery counterpart of the alias trust above — the same authority, the same
blast radius (its own domain’s local-parts, nothing else), now extended from
native resolution to inbound relay.
Per-authority accountability is a known gap, mitigated by policy
The protocol bullet above
states the shape of the gap plainly; this is the honest accounting of it. A
domain authority is trusted entirely for the mail it relays: a malicious or
compromised authority can spoof a from address or burn a correspondent’s
prepaid stamps for any mailbox under its domain, and today the chain records
no per-authority evidence a wronged recipient could use to prove which
authority mishandled a given message. The SendMail signature names the
authority to the chain, but nothing binds that authority to a verifiable claim
a third party could later adjudicate — there is no on-chain reputation, stake,
or cryptographic receipt that would let a recipient hold a specific authority
to account after the fact.
The near-term answer is documentation and operator policy, not a protocol change. Operating a domain authority is a trusted role by construction, the same way running an organization’s mail server is: a domain owner authorizes an authority precisely because they trust it, and should authorize only authorities they are willing to trust with their users’ relayed mail. The postmaster authorization model — the delegate gates which wallets may ever become an active authority — is the accountability boundary the design leans on today: onboarding is permissioned, so a domain’s authority is a party the postmaster delegate chose to admit, not an anonymous one.
This is a known, accepted trust assumption pre-launch, stated here rather than papered over. Per-authority cryptographic accountability — a mechanism that would let a recipient prove authority misbehavior on-chain (reputation, bonded stake, or signed delivery receipts) — remains a recognized open design question and deferred future work, not current behavior.
MX-to-MX transport: opportunistic TLS is downgradeable, MTA-STS closes it
Between the sending relay and the recipient’s MX, relayed mail crosses the open internet as SMTP. The default posture on that hop is opportunistic TLS (RFC 7435): encrypt when the far end offers STARTTLS, accept whatever certificate it presents, fall back to plaintext when it offers nothing. That defeats a passive tap but not an active man-in-the-middle, who can strip the STARTTLS capability from the greeting or present his own certificate — opportunistic TLS authenticates nobody, so the relay cannot tell the attacker from the MX. (The sealed message body stays sealed regardless; what the transport does or doesn’t protect is the SMTP envelope, the headers, and any plaintext a traditional correspondent sent.)
A recipient domain closes this by publishing an MTA-STS policy (RFC 8461),
which the relay honors by default: an enforce-mode policy commits the sender
to verified TLS with a policy-matching MX, and any failure defers the mail
rather than downgrading — the stripping attack now delays delivery instead of
exposing it. Two residuals remain. First contact is trust-on-first-use: an
attacker present at the first resolution can suppress policy discovery
itself (strip the DNS answer, block the HTTPS fetch), and the relay — having
never seen a policy — delivers opportunistically. And the protection a cached
policy gives against DNS stripping lasts only as long as the cache entry — the
policy’s max_age, and only in the relay process that fetched it — so an
attacker who can outlast the cache, or who strips during a relay restart, is
back at first contact. Both are inherent to MTA-STS’s DNS-plus-HTTPS trust
base rather than implementation gaps.
DANE (RFC 7672,
implemented and on by default)
has neither residual: a recipient domain that signs its zone with DNSSEC and
publishes TLSA records for its MX hosts gets its certificate pins validated
on every delivery — there is no first-contact window to poison and no cache
to outlast, because the trust statement rides the (validated) DNS answer
itself. The relay prefers DANE over MTA-STS wherever both apply, and a bogus
or stripped-to-unsigned TLSA answer defers the mail rather than downgrading.
The remaining scope limit is the recipient’s: only domains that deploy DNSSEC
and publish TLSA records get this protection; everyone else falls back to
MTA-STS or opportunistic TLS as above. Either way, TLS-RPT (RFC 8460,
implemented behind [spooler.tlsrpt])
gives the targeted domain’s operator visibility into these attacks: a
domain publishing a TLSRPT record receives senders’ aggregated TLS outcomes,
so a STARTTLS-stripping or certificate-substitution campaign shows up in its
reports as failures instead of merely delaying mail in silence.
Forensic (ruf) reporting exposes message content
DMARC failure/forensic reporting is a materially different privacy surface
from aggregate reporting, and it is off by default for that reason. An
aggregate (rua) report is a statistical roll-up — counts of pass/fail by
source IP, no message content. A forensic (ruf) report is a copy of the
offending message itself, sent to whoever the sender domain names in its
ruf= DMARC tag — a third party you do not control. Three properties bound
that exposure:
- Headers-only by default. SithBit follows the RFC 7489 §7.3
content-minimization default: a report attaches only the offending
message’s headers (
text/rfc822-headers), not its body. Envelope and header metadata still leave your server, but the message content does not. include_body = trueis an explicit operator opt-in that leaks the full message. It attaches the completemessage/rfc822— subject, body, and all — to every forensic report. Enable it only when you need full-body forensics and trust every domain whose mail you evaluate, because you are handing that domain’sruf=operator the entire failing message.- The §7.1 gate limits who can receive reports. Before sending to any
ruf=address outside the policy domain, the server enforces the RFC 7489 §7.1 external-destination authorization check (the target must publish a<policy-domain>._report._dmarc.<target>record). An attacker cannot point a victim domain’sruf=at their own collector to harvest that domain’s inbound mail unless the target domain has itself opted in.
The net guidance: leaving [spooler.dmarc_ruf] off sends no forensic
reports at all; enabling it with the headers-only default is a modest,
metadata-level exposure to authorized report destinations; turning on
include_body is a deliberate decision to share full message content with
third parties and should be made with that squarely in view.
The marketplace sells protocol authority; DNS remains separately owned
A MailDomain’s binding to its real-world DNS name is checked once, at
mint, whichever of the three authorization routes minted it: the
delegate signing domain create by hand,
the domain-sithbit service verifying the
_solana.authority.<domain> TXT record before co-signing that same
instruction, or the permissionless
domain authorize path, which walks a
DNSSEC proof on-chain. From that moment on no instruction ever consults
DNS again: domain transfer and the
open marketplace repoint the authority
field freely, as a free-floating on-chain asset.
A marketplace sale therefore conveys exactly the on-chain half of a domain
— the SendMail injection right for its mailboxes and the 10% operator
share of DeleteMail settlement — while the DNS zone,
the MX records, the hosting, and the DKIM keys stay with whoever controls
DNS. What buying a domain does — and does not —
buy
spells that out for buyers; this section covers what can go wrong once the
two halves sit in different hands.
An existing domain locks out the new DNS owner
AuthorizeDomainByProof only mints: it requires the target domain
account to be uninitialized, so once a domain exists on-chain — by any
route, active or deactivated — a fresh, entirely valid DNSSEC proof for
the same name is refused. Buy the DNS name at the registrar after the
on-chain domain was minted and you cannot prove your way in; the recorded
authority — possibly a marketplace buyer several sales removed from any
DNS check — keeps the injection right and the settlement share.
Every way out today runs through the delegate: domain transfer
repoints the authority instantly, and domain close frees the account so
the new zone owner can re-prove — but if what the new owner needs first is
to stop the wrong key injecting mail, deactivation is bound by the
7-day timelock below. The divergence
persists until the delegate acts. The asymmetry is real: the mint path
is permissionless, the re-mint path is not.
A captured proof replays within its RRSIG window
The DNSSEC witness is public by construction — it is staged on-chain in
chunks, so anyone can copy it out of transaction history and re-stage it
under their own payer (the staging buffer is keyed on the payer and the
domain, not on any privileged key). The verifier checks that each
signature’s [inception, expiration] window contains the cluster clock
and nothing more; the program imposes no freshness ceiling of its own. A
captured proof therefore stays replayable until the earliest RRSIG
expiration in its chain — a bound set by each zone’s re-signing policy,
commonly days to a couple of weeks, with no revocation before it.
The replay bites exactly where the lockout above does not: when the domain account is free (never minted, or just closed by the delegate to resolve a lockout) at a moment the DNS name has just changed hands. The departing zone owner’s still-valid proof can re-mint the domain to the old TXT authority even though the live zone now publishes a different key — and the lockout above then makes the wrong binding stick.
Sold authority drifts from where mail actually routes
Nothing obliges a marketplace buyer to operate the domain, and the chain cannot see whether they do. While protocol authority and DNS point at different parties:
- Recipients on the domain stop receiving relayed (SMTP-in) mail:
internet mail still follows the DNS MX to the old operator’s server,
whose key can no longer sign
SendMail. What they can receive is relayed mail injected by the new authority — which, per the first section above, is trusted entirely for thefromclaim, frombox stamps and discounted correspondent pricing included. Wallet-to-wallet mail between bare pubkeys is untouched, as always. - The displaced operator still holds the zone, the MX, and the DKIM keys — and receives internet mail it can no longer deliver on-chain.
- The new authority collects the 10% operator share of every settlement on the domain’s mailboxes: income with no operating duty attached.
An honest sale coordinates the DNS name and the hosting hand-over
off-chain around the on-chain purchase; the chain neither requires nor
checks that this happened. domain get shows the on-chain state — only
the DNS zone shows who controls the name.
What the marketplace guards close — and what stays open
The marketplace’s guards close the state races inside the market, for
domains and their alias twins alike: a buy re-checks that the listing’s
recorded seller is still the name’s current authority (a stale listing
that predates a transfer can never sell the new owner’s name at the old
owner’s price); domain buy is refused while a deactivation timelock is
in flight; and transfer and close are refused while a listing is open, so
no stale holder is left positioned to collect sale proceeds. See the
listing error table for the exact
refusals.
What those guards deliberately do not close is the divergence itself. Protocol authority and DNS ownership are two different assets, and the marketplace sells only one of them — an economic and social fact of the design, not a bug, demanding the same off-chain diligence any domain-name purchase always has.
The recorded direction — a design decision, not current behavior — is a reclaim-by-proof path: a fresh DNSSEC proof by the current zone owner, submitted against an existing domain account, opening a timelocked, contestable reclaim of the on-chain authority. That would make DNS the root of trust for a domain’s whole life rather than only at mint: marketplace-bought authority becomes revocable by whoever actually controls the zone, the lockout gains a permissionless resolution, and the replay window is defused by contestability — a fresher proof beats a replayed one. The postmaster-delegation rework it was sequenced behind has landed; reclaim-by-proof itself has not — until it does, everything above is the operative behavior.
Alias auctions: escrow custody and sniping
An alias auction moves real value through the program between mutually distrustful parties — a seller, a shifting set of bidders, and whoever eventually cranks settlement — so it is worth being explicit about where custody sits and what each party can and cannot do to the others.
- The program holds the escrow, not any counterparty. A bid’s lamports
live in the auction’s on-chain escrow account, owned by the alias program,
from the moment the bid lands until it is refunded (on outbid) or split
(at settlement). No seller, bidder, operator, or cranker can withdraw or
redirect them; every movement is computed on-chain from the recorded high
bid — the refund is the exact outbid amount, and the settlement split is
the postoffice’s recorded
operator_share_bps(defaultOPERATOR_SHARE_BPS= 90/10, delegate-tunable only within its on-chain 20% cap). A bidder trusts the deployed bytecode, not the seller. - Anti-snipe blunts last-second bid timing. A bid inside the final
window pushes the deadline out (see
the auction timing rules),
so winning by landing an unbeatable bid one block before close no longer
works — any late bid re-opens a full window for others to respond. It does
not stop a determined bidder from bidding, only removes the timing
advantage; and the
created_at + 7-dayhard cap bounds how long the extensions can run, so the mechanism cannot be turned into an indefinite-lock griefing vector. - Settlement is crankable by anyone, and deterministic. After the
deadline,
settle-auctioncan be signed by the seller, the winner, or an unrelated third party, and the outcome is identical whoever cranks it: the alias repoints at the recorded high bidder and the escrow splits 90/10. A hostile or simply absent cranker cannot alter the result or capture funds — the worst they can do is not crank, which delays settlement until someone else does (both the winner, who reclaims the escrow rent, and the seller, who collects 90%, are motivated to). There is no trusted sequencer or auctioneer in the loop. - Griefing surface is priced, not eliminated. Spam bidding is fenced by
three costs stacked together: a bid must clear the reserve, then clear the
standing high bid by the minimum increment (
max(5%, 1,000,000 lamports)), and the first bidder additionally fronts the escrow account’s rent — which, per the escrow-rent flow, is reclaimed by the eventual winner, so a first-bidder-then-loser forfeits it. Those costs make throwaway bids expensive without making legitimate ones onerous. The residual, accepted surfaces: a bidder’s own funds are locked in escrow until they are outbid or the auction settles (their choice to bid, their capital at stake, refunded in full if outbid); and the seller is bound once the first bid lands — the strict no-cancel commitment that protects bidders is, symmetrically, a commitment the seller cannot escape. A bidless auction locks nothing and costs only the seller’s own listing rent.
The postoffice admin keys: a hot delegate, a hidden owner
The postoffice’s admin surface used to be a singleton — one postmaster key holding every power. Since the delegation cutover it is two trust boundaries, deliberately unequal:
- The standing delegate — a wallet recorded on the postoffice, holding the operational powers: authorize and deactivate domains, tune the capped fees, publish the root KSK, waive bulk-alias fees. It is a hot key by design (the domain-sithbit self-service flow signs with it online).
- The postmaster (owner) — not a pubkey on-chain at all, but a Merkle commitment root over a hidden key set produced in an offline key ceremony. Only the ownership operations — sweeping postoffice revenue, rotating the delegate, installing a successor commitment — spend one of those hidden keys, and each use rotates the whole set.
Domain ownership itself is still proven off-chain: domain-sithbit
checks a DNS TXT record and signs with the delegate key — so the
verifying agent and the operational key remain, today, single points of
trust for onboarding.
The on-chain design bounds the worst outcomes: the fees are capped
(MAX_POSTOFFICE_STAMP_FEE_LAMPORTS and kin), postage settles directly to
recipients and operators without passing through the postoffice, and rent
always returns to whoever paid it. What a compromised or coerced
delegate can do is concrete but operational-only:
- Deactivate any domain — halting relayed (SMTP-in) mail for every mailbox under it until the domain is reactivated. Deactivation is deliberately a reversible toggle rather than a close, so the damage is an outage, not a loss. It is also rate-limited by a two-step, 7-day timelock (see Deactivate a domain): the key can request a deactivation but cannot complete it for a week, and the request is cancelable in the meantime — so a compromised key can no longer take the relayed network down at once, only start a delayed, vetoable countdown. Reactivation stays instant, keeping the recovery direction fast.
- Refuse to authorize new domains, freezing onboarding.
- Retune the protocol fees — up to their hardcoded caps, no further.
What it can never do: move a lamport out of the postoffice, change the
commitment root, or make itself unremovable — the sweep and rotation
powers answer only to a ceremony-key proof, and a single
delegate by the owner revokes a stolen delegate entirely. The
delegate’s blast radius is an outage and a fee tweak, not a theft.
Wallet-to-wallet mail between bare pubkeys needs no domain and keeps working regardless, so even a delegate compromise never touches the wallet-to-wallet substrate — only the relayed-mail onboarding and outage layers.
Custody now has two distinct jobs: keep the ceremony seeds offline and split across vaults (they are the ownership), and treat the delegate as a rotate-on-schedule service credential. Both are covered in the postmaster key custody runbook.
The deactivation timelock
Domain deactivation is intentionally slow. The delegate issues a request that starts a 7-day clock and leaves the domain active; only after the clock elapses can a finalize actually deactivate it, and a cancel aborts the request at any point before then. The delay is a notice-and-veto window against a compromised or coerced delegate: it converts an instant, network-wide mail halt into a delayed, cancelable one. See Deactivate a domain for the flow and the CLI commands.
The mailbox close timelock prices identity-cycling
Mailbox closure is timelocked for a different reason than domain
deactivation above: not a compromised authority, but a spammer’s unit
economics. When CloseMailbox refunded rent in a single instruction, a
sender who had burned one wallet’s reputation could close, reclaim, and
recreate at effectively zero cost — the identity was disposable, which is
exactly the property a postage-priced system must deny.
Closing now takes a request that starts a 7-day clock and refunds
nothing, and a finalize after it elapses that returns both the mailbox’s
rent and the transient pending-close account’s; a cancel aborts the
request meanwhile. The one-step instruction is refused on-chain with error
94, InstantCloseDisabled. The effect on an attacker is capital stuck for
a week per burned identity, plus a week-long window in which operators can
see a mailbox announce its own exit. The effect on an honest owner is a
delay on an action they take approximately never — the rent is returned in
full, so the cost is time, not money. See
Close a mailbox.
The deliberate asymmetry: CloseKey was left instant. It is the
revocation path for a compromised delegated encryption key, and a
timelocked revocation would leave MX servers sealing new mail to a key the
attacker holds for seven more days. Timelocking a close helps the
defender; timelocking a revocation helps the attacker.
Message metadata is hashed, not hidden
No SithBit instruction or account carries an address string. A
message account stores the sender wallet, a blake3 hash of the
normalized from address (the frombox seed), the timestamp, and the
IPFS CID; the recipient appears only as the wallet the account’s PDA
seeds on, and the frombox instructions likewise carry the hash. The
human-readable From:/To: headers exist solely inside the sealed
body, readable only by the recipient’s key.
What a chain observer still learns — and should be treated as public:
- wallet-level flow: which wallet received mail, when, and which
sender wallet paid for it (accounts, signatures, and timestamps are
inherent to the chain, and history outlives
DeleteMail); - hash linkage: the same
fromaddress always hashes to the same value, so an observer can correlate “this sender identity again” and can confirm a guess of a known address by hashing it — the hash hides the string, it is not resistant to a dictionary of candidate addresses; - the CID of the sealed body (fetching it yields ciphertext).
What the observer no longer gets is the address book itself: reading
who-mails-whom as [email protected] → [email protected] now requires
already knowing both strings.
The discovery keyserver is a public enumeration surface
The account API’s
cert keyserver
(GET /v1/chain/cert?email=…) is intentionally public and unauthenticated, on
the same reasoning as a PGP keyserver or WKD: every field it returns — the
resolved wallet and its published encryption key — is already readable on-chain
by anyone. It leaks nothing a chain observer could not already fetch.
What it does add is convenience, and convenience cuts both ways. An
unauthenticated HTTP endpoint that turns an address into “does this recipient
exist, and what key seals to them” makes bulk enumeration cheap: an attacker
can probe a dictionary of candidate local-parts against a domain — one GET per
guess — to learn which addresses are live, without an RPC node or any on-chain
trace. This is the same order of exposure as the
hash-linkage dictionary attack above —
the address strings were never secret — but the keyserver lowers the effort from
“scan and correlate the chain” to a plain web request. An operator who considers
inbox-existence itself sensitive should rate-limit or otherwise front the route;
the protocol treats the underlying data as public by design.
Frombox custody favors the recipient
Two behaviors follow from the frombox being the recipient’s account (see Closing accounts):
CloseFromboxreturns the entire balance — rent and any unused prepaid stamps — to the recipient, not to whoever funded them. This is the recipient’s remediation against a sender who stockpiled cheap stamps before a price hike (raising the price never revalues stamps already bought; closing the frombox seizes them).- A sender who prepaid against their own wallet address can withdraw the
unspent remainder with
ReclaimFromboxStamps, which zeroes the stamp count and returns the balance above rent to that sender. The frombox PDA derives from the hash of the signer’s address bytes, so reproducing the derivation is the authorization: no stranger can reach a victim’s frombox, and no separate authority field exists to get wrong. This narrows — but does not close — the custody gap above. Two limits are deliberate. A frombox keyed on an email string hashes text no wallet key can reproduce, so it has no sender-side withdrawal and stays recipient-managed. And the recipient’sCloseFromboxstill sweeps any residual left behind, so reclaiming is a race the sender can enter, not a claim that outranks the owner. Funding someone else’s frombox on their behalf remains a gift with no refund path — the derivation names the payer only when the payer is the sender. Fund a frombox only as generously as you trust its owner. - Anyone can transfer extra lamports into a frombox PDA directly. The
per-send value moved onto a message is
(balance − rent) / stamps, so a topped-up frombox inflates each remaining stamp’s settlement value — at the topper’s expense, to the recipient’s (and operator’s) benefit. Not an attack on anyone else’s funds; just don’t send lamports to a frombox except throughAddStamps.
Lockbox narrows the domain-operator boundary, but only for two of the four GUI clients
Lockbox is the one mechanism anywhere in this document that lets a message escape the domain-operator boundary above for confidentiality. Before treating “I run a SithBit client” as “my mail is end-to-end encrypted,” three scope limits are worth being explicit about:
- Only the Thunderbird extension and the Outlook add-in carry it. All four GUI clients run the same wasm-signed shared core for wallet and account operations, but the webmail app and Chrome extension do not seal a message client-side before it leaves your device — mail sent or read through them stays inside the full plaintext-operator boundary, identical to the CLI’s own IMAP/POP/SMTP path. See GUI clients for the comparison.
- Both correspondents need it, on every message. Lockbox is all-or-nothing per recipient — if either side lacks the plugin, or the recipient can’t be resolved to a wallet, the message goes as ordinary plaintext rather than a broken partial seal. An operator whose users run a mix of clients still holds plaintext for every conversation that touches a non-lockbox side.
- Metadata stays visible. Even between two lockbox-capable clients, the
SMTP envelope and headers —
To,From,Subject, routing — travel unsealed, visible to every relay in the path, including the terminating domain operator, no matter what the sealed payload carries. Lockbox closes the content-reading gap, not the delivery-metadata gap; it does not make the operator’s role in delivery invisible.
A related but distinct capability is easy to conflate with lockbox: the webmail app and Chrome extension can unseal a message’s on-chain sealed body client-side, in wasm. That is not lockbox, and it does not close the operator’s plaintext copy. The on-chain ciphertext is computed server-side, at delivery time, from the same plaintext the operator already holds for IMAP/POP — see why lockbox matters. Wasm-side decryption protects the public IPFS copy from the rest of the internet; it says nothing about the copy sitting on the operator’s own disk. Only lockbox prevents that plaintext copy from existing in the first place.
Lockbox mail: the recoverable reading key
Lockbox mail can derive its X25519 reading key from the wallet — the wallet signs one fixed, domain-separated message and a KDF turns that deterministic signature into the reading key. This is what makes the key recoverable and multi-device (any device with the wallet reproduces it, with nothing to back up), but it moves the trust boundary onto that one signature: anyone who can induce the wallet to sign this exact message can reconstruct the reading key and read all mail sealed to it. A malicious dApp that shows a lookalike signing prompt is the realistic attack.
Mitigations and their limits:
- Domain separation. The signed message carries a versioned SithBit prefix, so the signature can’t be harvested from an unrelated signing request that happens to reuse the same bytes. It does not stop a prompt that deliberately signs the SithBit message.
- Approve only in the plugin. The reading-key signature should be requested only by the SithBit client; treat any other prompt asking to sign a “SithBit reading key” message as hostile.
- Forward secrecy is opt-out, not default. A user who values forward secrecy
over recoverability keeps a randomly generated delegated key instead (
sithbit mailbox key), which no signature can reconstruct — at the cost of the lost-key / multi-device pain the derived key removes.
Rotation works the same as any published key: publish a new one and re-seal future mail; already-sent ciphertext sealed to the old key stays readable only by the old key.
What is enforced on-chain
For contrast, the guarantees that need no trust in any operator: PDA
ownership and derivation checks gate every lamport move; only the recipient
can reprice a frombox; only the sender or recipient can settle a message;
stamp arithmetic is overflow-checked (a u64::MAX price is an effective
per-sender block); the stamp fee is capped; and every account class has a
close path that returns rent to its recorded payer.