Third-party ProtonMail client for Android

Adam Pioterek d4fb4cda88 assumptions in readme 6 months ago
.idea 0ff067575d serialisers 7 months ago
app 06245a314c protonmail account 7 months ago
gradle 3a8f6faf78 attempt #2 to start 7 months ago
.gitignore 8d1a871fcb authentication (plain) 10 months ago
README.rst d4fb4cda88 assumptions in readme 6 months ago
build.gradle 0ff067575d serialisers 7 months ago 3a8f6faf78 attempt #2 to start 7 months ago
gradlew 8d1a871fcb authentication (plain) 10 months ago
gradlew.bat 8d1a871fcb authentication (plain) 10 months ago
settings.gradle 8d1a871fcb authentication (plain) 10 months ago



Cobalt (:sup:`53`\ Co) is a third-party ProtonMail client for Android. It’s focused on being libre, simple, and secure, and not using Google (GCM) or other shady services (e.g. `trackers `_).

The name ‘Cobalt’ was chosen because cobalt-53 was the first isomer discovered to exhibit proton emission.


Freedom, openness, portability

Cobalt is and always will be Free/Libre software. It will never track You nor will it ever discriminate You. It will always respect Your freedoms.

As much code as possible is platform independent and makes up the core of Cobalt. It resides in package `tk.apiote.cobalt.core` and can only depend on:
- itself,
- Kotlin standard library.


Dealing with Your private matters, Cobalt is based on following security assumptions:

- All data is encryted at rest. That includes emails, folders, labels, and accounts – addresses, keys, settings.
Each item is encrypted with a separate AES-256 key, and those are encrypted with an RSA key.
On Android the RSA key is 2048 bits long and is stored in KeyStore where it’s stored safely and cannot be extracted.
*On desktop the RSA key is encrypted with a passphrase.*
- Local authentication passphrase is not limited to digits and its strength is validated.
*It’s possible to define a second passphrase which, when entered, reveals no private emails and can be put forward when asked by law enforcement.*
- Encrypted contacts
Contacts are encrypted locally and can—but doesn’t have to—be synchronised. ProtonMail requires contacts’ email addresses and names to be stored decrypted on their servers, so the plain text name is random and the plain text address is the random name; Cobalt depends only on the encrypted data. This is incompatible with official clients.
- Key pinning
Contacts’ public keys can be pinned. Messages signed with a key that is not pinned are marked as unverified (with an option to not decrypt those messages).
- Explicit signatures validation
All signed data is explicitly verified and signatures can be shown to be verified offline.
- HTML is dangerous
Only subset of HTML tags is supported when viewing, and it can be converted to plain text, ReStructuredText, or Markdown. Sending HTML messages is impossible or discouraged.
- *Offline private keys*
*PGP private keys can be generated or imported offline (without sending them to ProtonMail servers)*

Mailing etiquette

- Bottom posting
Top posting is discouraged or impossible.
- format=flowed (`RFC 3676 `_)
Until format=flowed can be properly set in headers, all incoming plain text messages are treated as potentially format=flowed. All sent messages are by default format=flowed. When viewing, text is fitted to screen.

Work in progress

The assumptions in italics will be implemented later.