
Messenger crittografato da terminale con crittografia post-quantistica, protocollo Double Ratchet e anonimato Tor. Include passphrase di emergenza, autenticazione negabile e hardening a livello di sistema operativo tramite seccomp-bpf e mlockall.
op4 — Messenger di terminale sicuro
Op4 è un'applicazione di messaggistica cifrata basata su terminale scritta in Rust. Fornisce messaggi privati cifrati end-to-end con crittografia post-quantistica, instradati interamente attraverso la rete Tor, così che né il contenuto dei tuoi messaggi né il tuo indirizzo IP siano esposti a nessuno — nemmeno alla persona con cui stai parlando.
op4 permette a due persone di scambiarsi messaggi privati senza che nessuna delle due parti riveli il proprio indirizzo IP o la propria identità reale. Ogni messaggio è:
op4 funziona interamente nel terminale. Non ha GUI, nessun componente browser e nessun account cloud. L'unico processo esterno che contatta è il demone Tor in esecuzione sulla tua macchina.
Tutte le opzioni di download — AppImage, tarball dei sorgenti, clone & build e installatore automatico — sono documentate nella guida Download & Install. L'ultima release è disponibile nella pagina delle Release.
Su Debian e Ubuntu, install/setup.sh gestisce tutto con un unico comando:
toolchain Rust, dipendenze di build, Tor, configurazione della porta di controllo, compilazione
del binario, utente di sistema, directory dati e profilo AppArmor.
git clone https://github.com/Opfour/op4.git
cd op4
sudo bash install/setup.sh
Dopo che lo script termina, devi disconnetterti e riconnetterti prima di eseguire op4. L'installatore aggiunge il tuo utente al gruppo
debian-torcosì che possa leggere il file cookie di Tor. Linux non applica le modifiche ai gruppi alle sessioni già aperte — è richiesto un nuovo login.Se salti questo passaggio, op4 fallirà all'avvio con:
Permission denied reading /run/tor/control.authcookie
Poi verifica che l'hash dei sorgenti stampato dallo script corrisponda all'hash della release pubblicata per la tua versione prima di fidarti del binario.
Quando op4 si avvia stampa un hash dei sorgenti che copre tutti i file sorgente Rust,
Cargo.toml, Cargo.lock e build.rs. Confrontalo con il valore
sotto per la versione che hai installato.
Puoi verificarlo anche senza avviare l'app completa:
op4 --print-hash
Se l'hash non corrisponde, non usare il binario — è stato compilato da un commit diverso o è stato manomesso.
Installa prima le dipendenze, poi esegui lo script:
Toolchain Rust (fissata alla 1.89.0 tramite rust-toolchain.toml):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
Tor e dipendenze di build:
# Fedora
sudo dnf install tor gcc pkg-config openssl-devel
# Arch
sudo pacman -S tor base-devel pkg-config openssl
Configura la porta di controllo di Tor — aggiungi a /etc/tor/torrc:
ControlPort 9051
CookieAuthentication 1
sudo systemctl restart tor
Aggiungi il tuo utente al gruppo Tor:
sudo usermod -aG tor $USER # Fedora / Arch
Devi disconnetterti e riconnetterti dopo questo passaggio. Le modifiche all'appartenenza ai gruppi non vengono applicate alle sessioni attive. Finché non lo fai, op4 fallirà con
Permission denied reading /run/tor/control.authcookie.Per applicare la modifica senza un logout completo, esegui:
newgrp tor
Compila e installa:
git clone https://github.com/Opfour/op4.git
cd op4
cargo build --release
sudo bash install/setup.sh
op4
# oppure, senza installazione di sistema:
./target/release/op4
Al primo avvio op4 ti guiderà nella creazione di una passphrase normale
e di una passphrase di emergenza, poi genererà le tue chiavi di identità. Il tuo vault è
archiviato in ~/.local/share/op4/vault.op4.
Kernel minimo: 4.15 (5.4+ consigliato). Architettura: x86-64 (aarch64 dovrebbe funzionare ma non è testata).
Due persone devono ciascuna avere op4 installato, Tor in esecuzione e il proprio vault sbloccato. Lo scambio è asimmetrico: una persona invia per prima il proprio codice contatto, l'altra lo aggiunge, poi invia il suo primo messaggio, che arriva come richiesta in sospeso che la prima persona accetta.
Al primo avvio op4 richiede una passphrase normale e una passphrase
di emergenza, poi genera le tue chiavi di identità. Questo accade una sola volta.
Il tuo vault è archiviato in ~/.local/share/op4/vault.op4.
$ op4
Il tuo codice contatto contiene il tuo bundle completo di chiavi pubbliche e il tuo indirizzo .onion.
L'altra persona ne ha bisogno per raggiungerti.
2 o →)e per esportare il tuo codice contattoop4:Il tuo codice contatto non è segreto. È sicuro condividerlo pubblicamente. Contiene solo le tue chiavi pubbliche e il tuo indirizzo onion — nessun materiale privato.
Una volta che hai il suo codice contatto:
a per aggiungere un contattoop4: e premi Invio↑/↓, poi Invio)3 o →)Questo primo messaggio avvia l'handshake cifrato e viene consegnato
al loro indirizzo .onion tramite Tor. Lo vedranno come una richiesta
contatto in sospeso.
Quando qualcuno ti invia un primo messaggio, appare un badge sulla scheda Contatti che mostra quante richieste sono in attesa.
2)p per esaminare le richieste in sospesoEsc per rifiutare ed eliminare)Una volta accettata, la Double Ratchet viene inizializzata e la conversazione è immediatamente disponibile nella scheda Messaggi.
Prima di fidarti di un contatto, conferma che la sua impronta corrisponda a quella che mostra sul proprio schermo. Questo previene un attacco man-in-the-middle durante lo scambio iniziale di contatti.
A3F2:91BC:…Se ritieni che le tue chiavi di identità possano essere compromesse:
4 o naviga a destra)r per ruotare le chiaviop4 utilizza un protocollo Double Ratchet (simile al Signal Protocol) per la segretezza in avanti. Questo significa:
Il passaggio KEM combina X25519 e ML-KEM-768 come segue:
shared_secret = HKDF(X25519_ss || MLKEM_ss)
Un aggressore deve violare entrambi gli algoritmi per compromettere lo scambio di chiavi. Questo protegge da un avversario quantistico (ML-KEM-768) rimanendo sicuro contro attacchi classici se ML-KEM-768 ha un difetto sconosciuto (fallback X25519).
I messaggi sono autenticati con HMAC-SHA256 usando una chiave derivata dallo stato ratchet condiviso. Poiché entrambe le parti detengono la stessa chiave HMAC, ciascuna delle due parti avrebbe potuto produrre qualsiasi MAC dato. Questa è la stessa proprietà di negabilità usata da OTR e Signal: i messaggi non possono essere attribuiti crittograficamente a un mittente specifico in un procedimento giudiziario.
Il file vault in ~/.local/share/op4/vault.op4 archivia tutti i contatti,
le conversazioni e le chiavi di identità. È protetto con due chiavi indipendenti
derivate da Argon2id:
op4 crea un servizio nascosto Tor v3 per la tua casella di posta. Il tuo indirizzo .onion
è derivato deterministicamente dalla tua chiave di identità (tramite HKDF), quindi è
stabile tra i riavvii senza dover archiviare una chiave separata. I messaggi in uscita
sono inviati attraverso il proxy SOCKS5 di Tor. Il tuo vero indirizzo IP non appare
mai in nessun pacchetto di rete relativo a op4.
Il traffico di copertura (messaggi fittizi a distribuzione di Poisson inviati a se stessi, intervallo medio di 30 secondi) impedisce a un osservatore di rete di capire se stai scambiando messaggi attivamente con qualcuno osservando il volume del traffico.
apparmor/op4.profile) — limita l'accesso al filesystem
alla sola directory del vault, ai dispositivi terminale e a Tor.┌─────────────────────────────────────────────────────────────┐
│ op4 process │
│ │
│ ┌──────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ TUI │ │ Double Ratchet │ │ Tor Transport │ │
│ │ (ratatui)│──▶│ + Hybrid PQ │──▶│ nym_client.rs │ │
│ │ │ │ Crypto │ │ │ │
│ └──────────┘ └──────────────────┘ └───────┬────────┘ │
│ │ │
│ ┌──────────────────────────────┐ │ │
│ │ Encrypted Vault │ SOCKS5 / control port │
│ │ ~/.local/share/op4/vault.op4│ │ │
│ └──────────────────────────────┘ │ │
└────────────────────────────────────────────────┼───────────┘
│
┌────────────▼────────────┐
│ Tor daemon │
│ 127.0.0.1:9050 (SOCKS) │
│ 127.0.0.1:9051 (ctrl) │
└────────────┬────────────┘
│
Tor network
│
┌────────────▼────────────┐
│ Peer's .onion address │
│ (their hidden service) │
└─────────────────────────┘
op4/
├── src/
│ ├── main.rs Entry point, startup sequence
│ ├── error.rs Unified error types
│ ├── crypto/
│ │ ├── keys.rs Hybrid KEM + signature keypairs
│ │ ├── primitives.rs AEAD, HKDF, HMAC, Argon2id
│ │ ├── ratchet.rs Double Ratchet implementation
│ │ ├── hmac_auth.rs Deniable authentication tags
│ │ └── handshake.rs Initial key agreement (X3DH-style)
│ ├── network/
│ │ ├── nym_client.rs Tor hidden-service transport
│ │ └── message.rs Wire message format + padding
│ ├── storage/
│ │ └── vault.rs Encrypted vault (Argon2id + AEAD)
│ ├── identity/
│ │ ├── profile.rs Contact codes, stored contacts
│ │ └── revocation.rs Key revocation records
│ ├── hardening/
│ │ ├── memory.rs mlockall, RLIMIT_CORE, dumpable
│ │ └── seccomp.rs seccomp-bpf syscall filter
│ └── ui/
│ ├── app.rs TUI event loop and state machine
│ ├── contacts.rs Contacts tab rendering
│ ├── conversation.rs Messages tab rendering
│ ├── settings.rs Settings tab rendering
│ ├── duress.rs Duress inbox rendering
│ ├── input.rs Input sanitization (CSI/OSC strip)
│ └── passphrase.rs Secure passphrase prompts
├── apparmor/
│ └── op4.profile AppArmor MAC profile
├── install/
│ └── setup.sh System installation script
├── build.rs Embeds source hash at compile time
├── deny.toml cargo-deny licence + advisory rules
├── rust-toolchain.toml Pins Rust 1.89.0
└── docs/ This documentation
Versione: 0.2.0-dev (pre-release)
op4 è in sviluppo attivo. I seguenti livelli sono completi e testati:
Tutti i livelli sono ora collegati end-to-end:
PublicKeyBundle codificato in Base58
(il tuo set completo di chiavi pubbliche + indirizzo onion).Tutte le limitazioni note sono state risolte. L'applicazione è ora in stato feature-complete per 0.2.0-dev:
L'autenticazione negabile HMAC è completamente collegata. Ogni messaggio di dati in uscita
trasporta un tag HMAC-SHA256 calcolato dalla chiave ratchet per messaggio
su (conversation_id || message_counter || ciphertext). I messaggi in entrata
vengono verificati prima di essere accettati; i tag riempiti con zeri da peer più
vecchi sono tollerati per compatibilità all'indietro.
La cronologia dei messaggi persiste tra i riavvii. Il registro completo della conversazione
è cifrato con una chiave derivata da HKDF per conversazione e archiviato nel
campo message_log_ct del vault. I messaggi vengono caricati dal vault quando
si apre una conversazione e riscritti dopo ogni invio o ricezione.
Le richieste di contatto in entrata da parti sconosciute vengono accodate anziché
scartate. La scheda Contatti mostra un badge quando ci sono richieste in attesa.
Premi [p] per esaminarle: vedi l'impronta del mittente e il suo primo
messaggio, digita un nome e premi Invio per accettare (o Esc per rifiutare). All'
accettazione il contatto viene aggiunto, la Double Ratchet viene inizializzata e
il messaggio iniziale viene salvato nel vault.
Il vault di emergenza viene preservato tra i salvataggi. Il formato del file vault (v2) archivia
le lunghezze esatte del ciphertext nell'intestazione, così la decrittazione AEAD opera sui
byte reali anziché su sezioni riempite con zeri. La sezione di emergenza cifrata
viene archiviata integralmente a ogni chiamata save(), mantenendo la passphrase di emergenza
valida a tempo indeterminato.
Chiave bootstrap Double Ratchet dedicata. Una coppia di chiavi X25519 separata
(identity_ratchet_secret) viene generata al primo avvio e inclusa nel
codice contatto come ratchet_pub. Il ratchet di Alice viene inizializzato con il
di Bob anziché con la sua chiave di identità KEM, separando i ruoli delle chiavi.
| Versione | Hash dei sorgenti |
|---|
0.3.0 | 80820cb41a63575d2c139dadd425d13d1e87e62a9d60200ae7b894ae2e9ad8ed |
0.3.1 | 48115efb12747fa78b627ddbf7a56c46169f59e777d7d7508941bf89e4fe7521 |
0.2.0-dev | 35740577f6c4a4f19c5a08fe85b1f78a10347f2ba9dd7642d126552266bfa5a5 |
0.1.0 | e1a94761c7d3fa589ba892b47d5295aa417f95aee126809d51a7e7fb7e78982c |
| Distribuzione | Stato |
|---|
| Ubuntu 22.04 / 24.04 | Supportata |
| Debian 12 | Supportata |
| Fedora 39+ | Supportata |
| Arch Linux (attuale) | Supportata |
| Tails OS | Supportata (guida di configurazione) |
| macOS / Windows / WSL1 | Non supportata |
| Tasto | Azione |
|---|
1 / ← → | Cambia scheda (Contatti / Messaggi / Impostazioni) |
↑ ↓ | Sposta la selezione |
Invio | Apri conversazione / conferma |
Esc | Annulla / torna indietro |
e | Esporta il tuo codice contatto (scheda Contatti) |
a | Aggiungi un contatto (scheda Contatti) |
p | Esamina le richieste in sospeso (scheda Contatti) |
d | Elimina il contatto selezionato (scheda Contatti) |
r | Ruota le tue chiavi (scheda Impostazioni) |
q | Esci |
| Scopo | Algoritmo |
|---|
| Derivazione chiave vault | Argon2id (m=64 MiB, t=3, p=1) |
| Cifratura vault | ChaCha20-Poly1305 (chiave a 256 bit, nonce a 96 bit) |
| Cifratura messaggi | ChaCha20-Poly1305 (chiave per messaggio derivata dal ratchet) |
| Derivazione chiave (ratchet) | HKDF-SHA256 |
| Autenticazione negabile | HMAC-SHA256 |
| Scambio di chiavi classico | X25519 |
| Scambio di chiavi post-quantistico | ML-KEM-768 (FIPS 203) |
| Firme classiche | Ed25519 |
| Firme post-quantistiche | ML-DSA-65 (FIPS 204) |
| Anonimato di trasporto | Servizi nascosti Tor v3 (.onion) |
ratchet_pubLa scheda Impostazioni è completamente funzionale. L'indirizzo SOCKS5 di Tor e la soglia di eliminazione automatica possono essere modificati inline. La rotazione delle chiavi (genera una nuova coppia di chiavi, trasmette un certificato di revoca firmato a tutti i contatti, aggiorna il codice di esportazione) e la revoca per pensionamento delle chiavi sono entrambe collegate e operative.
La revoca delle chiavi è collegata end-to-end. Le struct RevocationCertificate vengono
firmate con la coppia di chiavi ibrida Ed25519+ML-DSA-65 e inviate a tutti i contatti
come messaggi WireMessageType::Revocation tramite Tor.