Quill security whitepaper

Clare Infotech · quillchat.app · Technical summary for IT and security teams · Revised September 2026

Summary. Quill is a zero-knowledge, end-to-end encrypted messenger for business, with native clients for Android, iOS and Windows and an ASP.NET Core relay server. Content is encrypted on the client using the Signal Protocol design (X3DH + Double Ratchet, AES-256-GCM); private keys never leave the device. The server relays ciphertext, queues undelivered envelopes until acknowledged, distributes public prekey bundles, and keeps metadata-only audit records. This document states the mechanisms precisely, including the properties Quill does not provide.
Back to the security overview Prints to roughly three A4 pages.

1. Cryptographic primitives

PurposeAlgorithmImplementation
Key agreementX25519 (Curve25519 ECDH), 32-byte keysBouncyCastle (managed)
SignaturesEd25519, 64-byte signaturesBouncyCastle (managed)
Identity-key conversionEd25519 → X25519 (birational map) for DHQuill.Crypto
AEADAES-256-GCM; 12-byte random nonce, 16-byte tag; wire format nonce‖ct‖tag.NET AesGcm
KDFHKDF-SHA256 (info QuillX3DH, QuillRatchet).NET HKDF
Chain KDFHMAC-SHA256, 0x01 → message key, 0x02 → next chain key.NET HMACSHA256
CSPRNGOS entropy.NET RandomNumberGenerator
Password hashingArgon2id, per-user random saltKonscious.Security.Cryptography
Device PIN hashingPBKDF2-SHA256, 100,000 iterations, random salt, device-local.NET, client only
Local databaseSQLCipher (AES) over SQLitesqlite-net-sqlcipher
Safety numbersSHA-512 fingerprint over both identity keys, 12 × 5-digit blocksQuill.Client
TransportTLS 1.2/1.3 + application-level certificate pinningPlatform TLS + Quill pin check
Call mediaWebRTC DTLS-SRTP, peer-to-peer or TURN-relayedSIPSorcery

Secret comparisons use constant-time equality; intermediate Diffie-Hellman outputs and ephemeral private keys are zeroed after use.

2. Session establishment (X3DH)

Each account publishes a prekey bundle to the server: an Ed25519 identity public key, a signed X25519 prekey with its Ed25519 signature, and a pool of one-time X25519 prekeys (client target pool 100; the server rejects an upload of fewer than 10 or more than 1,000). A one-time prekey handed out to a requester is deleted server-side in the same operation, so it is used at most once. If the pool is exhausted the exchange proceeds without DH4.

Initiator A, responder B verify Sig(IK_B, SPK_B) → abort if invalid DH1 = DH(IK_A^x25519, SPK_B) DH2 = DH(EK_A, IK_B^x25519) DH3 = DH(EK_A, SPK_B) DH4 = DH(EK_A, OPK_B) (omitted when no one-time prekey is available) SK = HKDF-SHA256(DH1‖DH2‖DH3‖DH4, info = "QuillX3DH")

The signature on the signed prekey is verified against the responder's identity key before any of the above runs; a bundle that fails verification is rejected outright, which is what stops a malicious or compromised server from substituting its own prekey.

Identity continuity. The client pins a peer's identity key on first successful session and compares it on every later exchange. A change raises a "security key changed" warning in the conversation list and invalidates the cached session; the pin is then updated (warn-and-continue). Users who need certainty compare safety numbers out of band.

3. Message encryption (Double Ratchet)

The X3DH shared secret seeds a Double Ratchet session. Every message carries a header with the sender's current ratchet public key, the previous chain length and the message number.

4. What the server holds

DataRetentionServer can read?
Username, Argon2id password hash, workspace, roleUntil the account is deletedYes (it is metadata)
Public keys: identity, signed prekey, one-time prekeysUntil replaced, consumed or the account is deletedYes — they are public by design
Undelivered message envelopesDeleted on the recipient's delivery acknowledgement; hard expiry of at most 30 days, swept every 5 minutesNo — ciphertext only
Delivered messagesNot stored at alln/a
Encrypted attachmentsUntil unsent, the account is wiped, or destroy-allNo
Device registration and push tokenUntil the device is removed, wiped or the token is replacedYes (opaque token)
Sessions / refresh tokensRefresh window of 30 days; revoked on wipe, logout or password changeHashed server-side
Audit logOperational retention, then rotated; erased by destroy-allYes — metadata only

An audit entry is {event, userId, ip, timestamp, short detail, workspace}. For a relay the detail is the recipient id and the ciphertext length in bytes. No message content, plaintext or decryptable form is written to any log, database column or telemetry stream. Push payloads carry only the item kind (text | image | video | voice | file | location | reaction | task), the sender's username and, for a group, the group name.

5. Multi-tenancy and authorisation

6. Client hardening

Access to the app

  • PIN gate before any chat data is rendered; biometric unlock via Android BiometricPrompt or iOS LocalAuthentication (Windows: PIN only).
  • Idle auto-lock, default 30 s, user-configurable; re-locks on background.
  • Panic PIN wipes the local database and sessions and presents an empty state.

Data at rest

  • SQLCipher database per user. The key is derived from a 256-bit random per-device secret in Android Keystore / iOS Keychain / Windows DPAPI, so a copied database file cannot be opened from public facts.
  • Ephemeral conversations persist nothing; self-destruct timers and one-time-view media limit what is retained.

Screen and clipboard

  • Android FLAG_SECURE; iOS window cover on backgrounding (keeps chats out of the app switcher); Windows WDA_EXCLUDEFROMCAPTURE.
  • Clipboard contents copied from Quill are cleared after 30 seconds.

Network

  • Certificate pinning: platform hostname and chain validation first, then a check of the presented chain against pinned SHA-256 public-key hashes (leaf key plus issuing-CA backups, so a same-key renewal does not break the fleet).
  • No third-party analytics, attribution or advertising SDKs; no advertising identifier is read.

7. Administrative operations

ActionEffectScope
SuspendAccount deactivated, sign-in refused, seat releasedWorkspace admin
Delete userAccount and its server-side key material removedWorkspace admin
Remote wipeWipe signal pushed to the user's devices; server deletes all sessions, public keys, one-time prekeys, queued envelopes and push tokens for that user, forcing re-registrationWorkspace admin (plan-gated)
Destroy allDeletes users, sessions, public keys, one-time prekeys, offline queue, groups and membership, device tokens, IP whitelist and the audit log; purges the attachment store. Irreversible; rate-limited to once per 10 minutes; audited before executionPlatform super admin
IP whitelistRestricts client access to listed source addresses (admin API and the public site remain reachable so the list itself can be managed and app-store review can fetch the policy)Platform super admin
Audit log reviewMetadata events, scoped to the caller's workspaceWorkspace admin (plan-gated)

8. Infrastructure and abuse controls

9. Threat model — and what Quill does not defend against

In scope. A hostile or compelled server operator; passive or active network attackers including TLS interception; theft of the server database or attachment store; loss or brief seizure of an unlocked-but-idle device; a departing employee's device; casual shoulder-surfing and screenshotting.

Out of scope.

Non-claims. Quill holds no security certification or compliance attestation (no ISO 27001, no SOC 2, and no DPDP certification — no such scheme exists). No third-party security audit or penetration test has been commissioned. We publish no customer names, user counts or uptime figures we have not measured. Every statement in this document describes implemented behaviour in the shipping product; where a control is partial or platform-specific, we have said so instead of rounding it up.

This document is technical information, not legal advice. Deploying Quill does not by itself make an organisation compliant with India's Digital Personal Data Protection Act, 2023 or any other regulation; obligations remain with you as the data fiduciary. What Quill contributes is data minimisation (no phone numbers, no contact upload, no profiling), encryption of content in transit and at rest on the device, in-region hosting for the managed service, and administrator tools that make deletion immediate and verifiable.

10. Consequences we accept

11. Self-hosted deployment

Enterprise customers run the same server and admin-panel images on their own infrastructure with their own database, object storage, TURN and mail. Entitlement is a licence string signed with an Ed25519 key and verified offline against a public key in the deployment — the server never contacts us to validate it, and an invalid or expired licence stops the process at startup rather than degrading silently. Self-serve signup is disabled on private deployments. In this mode the metadata described in §4 lives entirely in the customer's environment.

12. Reporting a vulnerability

Send findings to security@clareinfotech.com with reproduction steps and your impact assessment. Please allow a reasonable window for a fix before publishing, test against your own trial workspace rather than other people's data, and avoid denial-of-service testing against production. We acknowledge reports, share an honest severity assessment, and credit reporters in release notes on request. There is no paid bounty programme.

Quill is published by Clare Infotech. Product overview: quillchat.app/security · Privacy policy: quillchat.app/privacy · Sales: sales@clareinfotech.com · Security: security@clareinfotech.com. This summary reflects the product as shipped at the revision date above; the implementation continues to evolve and this page is updated with it.