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: three endpoints. (1) POST /api/licenses/validate (license key, hashed device ID, Mac name, macOS version) on activation and periodic re-check, (2) POST /api/licenses/devices/deactivate when you release this Mac's seat, (3) 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. The download page lists the SHA-256 checksum of every release file, so you can check any DMG or APK you find against the canonical build.

Build reproducibility

Mac builds are generated with xcodegen, with Swift Package Manager versions pinned in Package.resolved. Android builds use the Gradle wrapper with pinned plugin versions.

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