TILLDEV · CRYPTOGRAPHY

What protects what

Every product's cryptography in one place: what each algorithm protects, the suite id written into what it produces, and how it fares against a large quantum computer. Where something is still classical, this page says so. The same inventory is at /cbom.json as a CycloneDX 1.6 CBOM, and tilldev secrets crypto shows it for your workspace.

01Legend

How to read it

StanceWhat it means
hybridHybrid: holds while either half does
post-quantumPost-quantum
symmetricSymmetric: quantum-adequate at 256 bits
hashHash: quantum-adequate
classicalClassical: a large quantum computer breaks it
noneNot encrypted by us

“Hybrid” pairs a classical algorithm with a post-quantum one so that breaking it needs both broken. “Symmetric” and “hash” entries use 256-bit keys or outputs, which a quantum computer weakens but does not break. Nothing here claims to be quantum-proof.

02By product

Product by product

TillSecrets

ProtectsHowStance
Secret values, backend and sync credentials, presigned-call templates, dropped valuesAES-256-GCM under the workspace’s data key · aead-aes256gcm.v1symmetric
The workspace’s data keyAES-256-GCM under a master key kept outside the database · aead-aes256gcm.v1symmetric
Value fingerprints (change detection, leak matching)HMAC-SHA256 keyed by the data keysymmetric
Pulls and leases in transit, inside TLSX-Wing, then HKDF-SHA256, then AES-256-GCM, bound to the request · xwing-aes256gcm.v1hybrid
Service, agent, presigned-call and drop-link tokensRandom, stored as SHA-256hash
Workload sign-in with a platform token or a signed AWS requestThe issuer’s RSA, ECDSA or EdDSA signature; AWS SigV4, checked by AWS
The platform chooses the algorithm. The token sent back is under X-Wing.
classical
Workload sign-in by host keyA challenge encrypted to the host’s X-Wing key, then HKDF-SHA256 and AES-256-GCM · xwing-aes256gcm.v1hybrid
A bound presigned call’s machine proofEd25519 signature by the machine’s keyclassical
Requests to your own credential endpointHMAC-SHA256 signature headersymmetric
Approvals of sensitive actionsA passkey, or a paired phone signing with Ed25519classical
Keys the vault makes for youEd25519, RSA, ML-DSA-65, SLH-DSA, ML-KEM-768, X-Wing, hybrid ML-DSA-65 + Ed25519
Your keys, for your systems; the vault does not use them.
post-quantum

TillAuth

ProtectsHowStance
Your users’ passwordsArgon2id (64 MiB, 3 passes, 4 lanes), peppered; imported bcrypt and PBKDF2 hashes are upgraded at sign-inhash
Access and ID tokensEdDSA (Ed25519) signatures, keys published as JWKSclassical
OAuth and OIDC client secrets, authenticator secrets, linked-account tokens, webhook secretsAES-256-GCM under a per-app data key, itself under a master key · aead-aes256gcm.v1symmetric
Webhook deliveriesHMAC-SHA256 signaturesymmetric
Passkey sign-inWebAuthn: the authenticator’s Ed25519, ECDSA P-256 or RSA keyclassical
Authenticator codesTOTP (RFC 6238), HMAC-SHA1symmetric

TillPulse

ProtectsHowStance
Integration credentials (trackers, SSO, vendor accounts)AES-256-GCM under a dedicated key · aead-aes256gcm.v1symmetric

TillShield

ProtectsHowStance
TillGate challenge and pass stateHMAC-SHA256symmetric
Device attestation tokens TillGate acceptsEd25519 signature by the issuerclassical

TillForge

ProtectsHowStance
Mirror credentials and webhook secretsAES-256-GCM under a per-workspace data key, itself under a master key · aead-aes256gcm.v1symmetric
Webhook deliveriesHMAC-SHA256 signaturesymmetric
Git over SSHmlkem768x25519-sha256 key exchange; Ed25519 host key
The key exchange is hybrid; the host key signature is classical.
hybrid
Commit and tag signatures made with SSH keysSSH signatures (Ed25519, ECDSA, RSA) verified against keys registered to the author or committer
A branch can refuse them and accept hybrid signatures only.
classical
Commit and tag signatures made with hybrid keys, and the commits TillForge writes (merges, browser edits)ML-DSA-65 and Ed25519 both sign the SSH signature message (SHA-512); both must verify against a key registered to the author or committerhybrid
The git server’s copy of access and branch policy, used while the control plane is unreachableEd25519 and ML-DSA-65 both sign; the git server checks both against a pinned keyhybrid
Repositories on the git server: contents, file names, LFS objectsLinux fscrypt v2 with a 512-bit key per organization: AES-256-XTS for contents, AES-256-CTS for names, per-file keys by HKDF-SHA512
File sizes, counts and timestamps are not hidden, and the running git server reads data decrypted.
symmetric
Each organization’s repository key, held by the control planeAES-256-GCM under a per-workspace data key, itself under a master key; released only to a git server that holds the organization’s repositories or serves its region, from that server’s own addresses · aead-aes256gcm.v1symmetric
Each git server’s own credentialChecked against a SHA-256 hash; kept for calls to the server under AES-256-GCM with a master key · aead-aes256gcm.v1symmetric
Repository backupsAES-256-GCM in 64 KiB chunks under a key derived by HKDF-SHA256 from the organization’s repository keysymmetric

TillCache

ProtectsHowStance
Your own backend’s credentialsAES-256-GCM under a master key · aead-aes256gcm.v1symmetric
Access tokensRandom, stored as SHA-256hash

TillNotary

ProtectsHowStance
Checkpoints and timestampsEd25519 and ML-DSA-65 both sign; a SHA-256 Merkle tree (RFC 9162) · sig-ed25519-mldsa65-sha256.v1hybrid
Logs on the higher profileEd25519 and ML-DSA-87; a SHA-384 Merkle tree · sig-ed25519-mldsa87-sha384.v1hybrid

TillArk

ProtectsHowStance
Connection strings, target and repository keysAES-256-GCM under the workspace’s data key · aead-aes256gcm.v1symmetric
Credentials sent to agentsX-Wing, then HKDF-SHA256, then AES-256-GCM, bound to the agent and job · xwing-aes256gcm.v1hybrid
Work sent to agents and backup manifestsML-DSA-65 and Ed25519 both signhybrid
Logical dumps, files and ClickHouse table partsrestic: AES-256-CTR + Poly1305-AES, in the agent before uploadsymmetric
Base backups and WALWAL-G: XChaCha20-Poly1305 (libsodium), in the agent before uploadsymmetric
Base backups and WALpgBackRest: AES-256-CBC, in the agent before upload. CBC isn’t authenticated, so a restore checks every file against SHA-1 checksums the signed manifest covers, and each WAL segment against the SHA-1 it was archived undersymmetric

TillDev

ProtectsHowStance
AI provider keysAES-256-GCM under an HKDF-SHA256 key derived from the workspace’s data key, the credential and, for a personal key, its owner · aead-aes256gcm.v1symmetric
Dashboard sessionsRS256 signed tokensclassical
API keysRandom, stored as SHA-256hash
Dashboard authenticator secretsAES-256-GCM under a dedicated key · aead-aes256gcm.v1symmetric
03In transit

TLS and SSH, measured

Measured from outside on 2026-09-30. Every endpoint below agrees on the hybrid key exchange when the client offers it; current browsers, OpenSSL 3.5+, Node 24 and OpenSSH 10 do.

EndpointKey exchangeServes
https://tilldev.devTLS 1.3 with X25519MLKEM768 when the client offers it; otherwise X25519, and TLS 1.2 is still accepted with a classical key exchangeTillDev, TillSecrets, TillPulse, TillShield, TillForge, TillNotary, TillArk
https://secrets.tilldev.devTLS 1.3 with X25519MLKEM768 when the client offers it; otherwise X25519, and TLS 1.2 is still accepted with a classical key exchangeTillSecrets
https://auth.tilldev.devTLS 1.3 with X25519MLKEM768 when the client offers it; otherwise X25519, and TLS 1.2 is still accepted with a classical key exchangeTillAuth
https://git.tilldev.devTLS 1.3 with X25519MLKEM768 when the client offers it; otherwise X25519, and TLS 1.2 is still accepted with a classical key exchangeTillForge
ssh://git.tilldev.dev:2222mlkem768x25519-sha256; Ed25519 host keyTillForge
https://cache.tilldev.devTLS 1.3 with X25519MLKEM768 when the client offers it; otherwise X25519, and TLS 1.2 is still accepted with a classical key exchangeTillCache
https://ingest.tilldev.devTLS 1.3 with X25519MLKEM768 when the client offers it; otherwise X25519, and TLS 1.2 is still accepted with a classical key exchangeTillPulse
Older clients
A client that doesn't offer X25519MLKEM768 still connects, with a classical key exchange. Recorded traffic from such a client is what a future quantum computer could open. TillSecrets pulls and leases are also encrypted to a post-quantum key inside TLS, so they don't depend on the client's TLS.

Check it yourself:

terminal
# TLS: offer only the hybrid group; the handshake fails if the server can't do it
openssl s_client -connect secrets.tilldev.dev:443 -groups X25519MLKEM768 -brief </dev/null
# Negotiated TLS1.3 group: X25519MLKEM768

# SSH to TillForge: the key exchange the server picks
ssh -p 2222 -v git@git.tilldev.dev 2>&1 | grep 'kex: algorithm'
# debug1: kex: algorithm: mlkem768x25519-sha256

# From the CLI: what this machine negotiates, and what your workspace's secrets are under
tilldev secrets crypto --tls
04Suite ids

Every ciphertext names its suite

Ciphertext stored by TillSecrets, TillForge, TillCache, TillArk, TillAuth, for AI provider keys, TillPulse integration credentials and dashboard authenticator secrets starts with the id of the suite that made it, so a stored value says how to open it and a new suite can be added without guessing:

format
aead-aes256gcm.v1|<iv hex>:<tag hex>:<ciphertext hex>     at rest
xwing-aes256gcm.v1|<KEM ciphertext>.<nonce>.<ciphertext + tag>     delivered to a host

A value without the prefix was written before suite ids, with the same AES-256-GCM. It stays readable. In TillSecrets, rotating the workspace data key rewrites everything with the prefix, and the dashboard's Cryptography page shows how many items in each store are still unlabelled. Rotating a TillAuth app's data key does the same for that app. An id the reader doesn't know is refused, not guessed at. TillNotary checkpoints carry sig-ed25519-mldsa65-sha256.v1 or sig-ed25519-mldsa87-sha384.v1.

05Honest limits

Still classical

These use signatures a large quantum computer could forge:

  • TillSecrets: workload sign-in with a platform token or a signed AWS request (The issuer’s RSA, ECDSA or EdDSA signature; AWS SigV4, checked by AWS).
  • TillSecrets: a bound presigned call’s machine proof (Ed25519 signature by the machine’s key).
  • TillSecrets: approvals of sensitive actions (A passkey, or a paired phone signing with Ed25519).
  • TillDev: dashboard sessions (RS256 signed tokens).
  • TillAuth: access and ID tokens (EdDSA (Ed25519) signatures, keys published as JWKS).
  • TillAuth: passkey sign-in (WebAuthn: the authenticator’s Ed25519, ECDSA P-256 or RSA key).
  • TillShield: device attestation tokens TillGate accepts (Ed25519 signature by the issuer).
  • TillForge: commit and tag signatures made with SSH keys (SSH signatures (Ed25519, ECDSA, RSA) verified against keys registered to the author or committer).

Signatures matter at the moment they are checked, so a future quantum computer can't reach back and forge a sign-in that already happened. The risk is to long-lived keys once such a computer exists. Browsers and WebAuthn authenticators don't offer post-quantum signatures yet.

06CBOM

Machine-readable

/cbom.json is this page as a CycloneDX 1.6 cryptography bill of materials: algorithms and protocols as cryptographic-asset components, with their primitive, mode, parameter set, OID and NIST quantum security level, and each protected thing as a data component that depends on them. Its version is the inventory revision (now 1); feed it to any tool that reads CycloneDX.

terminal
curl -s https://tilldev.dev/cbom.json | jq '.components[] | select(.type == "cryptographic-asset") | .name'

For your own keys, see post-quantum keys in TillSecrets.