Security

The threat model,
in plain English.

Chat Hoarding app holds three things you care about: your WhatsApp message content, your encryption key, and your purchase identity. Here is where each lives, what touches it, and how to verify those claims.

Cryptography

Crypt15 backups are decrypted with AES-256-GCM (Apple's CryptoKit). The 32-byte root key derives from your 64-digit hex string via an HMAC-SHA256-based key derivation (the `encryptionLoop` construction from wa-crypt-tools, info string 'backup encryption'). It is not standard HKDF; it matches WhatsApp's Android client byte-for-byte so the same key the phone uses unlocks the archive. The GCM authentication tag is verified before any plaintext is written to disk, so invalid keys fail loud and never produce partial output.

Network surface

Android companion: zero. No INTERNET permission in AndroidManifest.xml. Mac app: four endpoints. (1) /api/licenses/auth/request-otp, (2) /api/licenses/auth/activate, (3) /api/licenses/auth/validate (email + device fingerprint), (4) signed update feed at chathoarding.app/appcast.xml. Plus the DMG download endpoint when you opt to update.

Update integrity

EdDSA-signed (Ed25519) update feed. The public key is baked into Chat Hoarding for Mac at compile time. The app refuses to install an update without a matching signature, even if the feed XML were swapped at the CDN.

Code signing

macOS DMG is Developer-ID signed and notarized by Apple. The Android APK is signed with our keystore; we publish the SHA-256 of the signing certificate so you can verify any APK you find against the canonical signature.

Build reproducibility

Mac builds are checked-in via xcodegen + Swift Package Manager pinned versions. Android via Gradle wrapper-pinned AGP and a checked-in lockfile. A clean clone of the repo + the same Xcode/Android Studio versions reproduces a bitwise-identical app (modulo the embedded signing cert).

At-rest archive encryption (roadmap)

v1.0 will optionally wrap .tarc bundles with age (X25519 + ChaCha20-Poly1305 + scrypt) using a passphrase you set at create time. Until then, .tarc files are unencrypted on disk; rely on FileVault and Keychain-protected backups.

Responsible disclosure

Email [email protected] with subject "Security disclosure". We acknowledge within 72 hours and credit you in the next release notes (or keep it private, your call). We do not yet run a paid bounty program; we do offer free lifetime licenses for disclosures we ship a fix for.

See also /privacy for the data we store and /terms for the license.

Security model: what we do, what we don't · Chat Hoarding