The trust model
The SDK trusts one thing it did not receive over the network: the trust root built into the SDK. Before it acts, the SDK checks everything else against that trust root, or against a fingerprint pinned from it:
- every device certificate (card)
- every registration
- every stored object
The trust root is built into the SDK
create fetches nothing. The trust root and the timestamp authorities’ roots ship inside the SDK
itself. No environment variable, configuration file or network response can give your application a
different root to trust. This matters because the SDK runs inside your application. If the trust
root came from anywhere reachable at runtime, anything able to reach that path could choose what
the SDK trusts.
The SDK verifies every card offline, for this tenant
A Card is a device certificate. The SDK checks every card it relies on offline against the trust
root. This covers another device’s card, an identity authority’s card and its own card. The SDK
needs no network round trip to decide whether to trust a card. The check also confirms that the
card names this tenant. A card for a different tenant fails the check, like a card signed by an
unknown authority. Either way, the operation that depended on the card fails with the error
trust-failed.
The backup key fingerprint is pinned at the first session
The first time an application opens a session in a tenant, the SDK fetches that tenant’s backup key
registration. It checks the registration against the trust root and pins its fingerprint. On every
later session, the SDK compares against that pin. It does not look the key up again. A later
backup key registration that names a different key fails with fingerprint-mismatch. The SDK
refuses any backup key it cannot match to the one it verified the first time.
Decryption happens only on the device
Every decryption happens inside the SDK, on the device that holds the device key. The Seald Healthcare Cloud stores and moves stored objects and the recovery copies of key domain keys. It never holds a data encryption key and never sees plaintext. It passes on only ciphertext, from its own storage or from a customer’s bucket. See Plaintext lifetime for what your application does with the plaintext once the SDK hands it over.
The SDK checks every stored object before it trusts it
The SDK does not trust a stored object just because it decrypted. The SDK checks its full structure
before it treats any of the content as real. A stored object fails with container-invalid when:
- it is damaged
- it belongs to a different object or version
- its key does not open it
This applies to stored objects from the Seald Healthcare Cloud’s own storage and from a customer’s bucket the tenant has authorized.
Next
- Tenants, key domains and datasets for what a
Cardcarries and what itsstatemeans. - Errors for
trust-failed,fingerprint-mismatchandcontainer-invalidalongside every other code. - Backup key and custodians for creating and proving the key behind the pinned fingerprint.