End-to-End Encryption
Wire Android supports two end-to-end encryption protocols:MLS (Messaging Layer Security)
The modern group messaging protocol. MLS uses a tree-based key structure that enables efficient key updates and forward secrecy in large groups.
Proteus
Wire’s existing protocol based on the Signal double-ratchet algorithm. All 1:1 and legacy group conversations use Proteus.
MLS Verification
Conversations using MLS show a verification status (NOT_VERIFIED, VERIFIED, or DEGRADED). The status is surfaced throughout the UI — in the conversation top bar, in call screens, and in message details.
MLS Keypackage Management
Keypackages are cryptographic credentials that allow other clients to initiate an MLS conversation with a user. The app periodically checks keypackage availability and uploads new ones when the supply runs low. Thelower_keypackage_limit flag (default: false) can be set to true to reduce the minimum keypackage threshold. This is intended for environments with constrained backend storage.
MLS Reset
Theis_mls_reset_enabled flag (default: true) controls whether users can trigger an MLS state reset to recover from corrupted MLS state.
Certificate Pinning
The production build of Wire Android pins TLS certificates for Wire’s backend infrastructure. The pinning configuration is defined indefault.json:
Configuration Signature Enforcement
Theenforce_configuration_signature flag (default: true in prod, staging, beta, internal, and fdroid; false in dev) requires that the custom configuration file delivered to the app is signed with a known key.
Valid public keys are listed in configuration_signature_keys:
App Lock
App lock requires users to authenticate before accessing the app after it has been in the background for a configurable period.Configuration
| Setting | Default | Description |
|---|---|---|
team_app_lock | false | Whether app lock is enforced by the team admin |
team_app_lock_timeout | 60 (seconds) | Inactivity timeout before the lock is applied |
The
LockCodeTimeManager handles lock state transitions. It correctly accounts for the case where the app is foregrounded after the timeout has already expired in the background.Lock Screen Options
Users set a passcode when enabling app lock. The unlock screen supports two methods:- Passcode
- Biometric Authentication
The user enters the passcode they configured during setup. After too many failed attempts, a lockout is triggered.
BiometricPrompt API. The prompt is configured with setConfirmationRequired(false) so a single biometric gesture is sufficient.
Sensitive Data Policies
Wipe on Cookie Invalid
true, all local app data is wiped if the server reports that the session cookie is no longer valid (e.g., after a forced logout by an admin).
Wipe on Device Removal
true, all local app data is wiped when the current device is removed from the account’s device list by another session.
Wipe on Rooted Device
true, the app detects if the device is rooted and wipes all local data to prevent potential extraction of encryption keys or message content from an untrustworthy environment.
No Sensitive Data in Logs
Wire Android follows a strict logging policy:- Message content is never written to logs.
- Encryption keys are never written to logs.
- Unique user identifiers are obfuscated before being logged.
prod and fdroid builds (logging_enabled: false). In other builds, logs are available for developer analysis but are still subject to the above restrictions.
Users on production builds can voluntarily enable local logging from within the app settings. These logs remain on-device and are not uploaded automatically — users must manually export and share them.
E2EI (End-to-End Identity)
TheOAuthUseCase in com.wire.android.feature.e2ei implements an OAuth flow used during end-to-end identity certificate enrollment. E2EI allows clients to cryptographically bind their MLS identity to an external identity provider (IdP), enabling verifiable user identity within encrypted conversations.