Skip to content

Latest commit

 

History

66 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

   █████╗ ██╗  ████████╗███████╗██████╗
  ██╔══██╗██║  ╚══██╔══╝██╔════╝██╔══██╗
  ███████║██║     ██║   █████╗  ██████╔╝
  ██╔══██║██║     ██║   ██╔══╝  ██╔══██╗
  ██║  ██║███████╗██║   ███████╗██║  ██║

No server. No trace. Just you and who you trust.

Release Rust License Build


ALTER demo

Instalasi

Windows — satu baris, selesai:

irm https://raw.githubusercontent.com/0xAre/alter/main/install.ps1 | iex

Linux / macOS:

curl -fsSL https://raw.githubusercontent.com/0xAre/alter/main/install.sh | bash

Cargo (jika Rust sudah ada):

cargo install --git https://github.com/0xAre/alter

Tidak butuh OpenSSL. Tidak butuh daemon Tor terpisah. Satu binary, langsung jalan.


Apa itu ALTER?

Terminal chat yang bekerja tanpa server.

Dua orang terhubung langsung — via LAN di satu jaringan, atau via Tor di mana saja di dunia. Setiap sesi dienkripsi end-to-end menggunakan Noise Protocol (IK pattern). Saat salah satu keluar dari room, kunci sesi dibuang — tidak ada yang bisa membaca percakapan itu lagi, bahkan pengirimnya sendiri.

Tanpa server

Tidak ada backend yang bisa diretas, disita, atau tumbang. Koneksi langsung peer-to-peer, selalu.
Ephemeral

Pesan hanya ada di RAM. Kunci sesi dibuang saat room ditutup — riwayat tidak bisa dibaca ulang.
Deniable

Passphrase berbeda membuka Password Manager biasa. Tidak ada cara membuktikan ALTER ada di vault yang sama.

Fitur

Noise_IK End-to-End — mutual authentication + forward secrecy dalam satu handshake. Tidak bisa di-MITM tanpa private key peer.

Tor built-in — ALTER menjalankan onion service sendiri. Tidak perlu install atau konfigurasi Tor terpisah.

Tor-first, LAN opt-in — default lewat Tor (tanpa jejak di LAN). Aktifkan --lan untuk koneksi langsung TCP via mDNS di jaringan yang sama (LAN menyiarkan kehadiran, jadi opt-in demi privasi).

Transfer file terenkripsi — kirim file hingga 4 GB langsung lewat sesi. SHA-256 end-to-end. Gambar bisa dilihat inline. Tidak ada relay, tidak ada upload ke cloud.

Password Manager decoy — satu vault, banyak slot (v3). Setiap passphrase — termasuk yang "salah" — membuka Password Manager fungsional; tidak ada sinyal yang membedakan mana yang membuka chat. Plausible deniability tanpa oracle.

Reply & scroll history — balas pesan spesifik dengan kutipan. Scroll riwayat chat dengan PageUp/PageDown.

Panic wipeCtrl+Shift+X dua kali dalam 3 detik: zeroize semua secret di RAM, exit seketika.

Selengkapnya: arsitektur kriptografi
NOISE TRANSPORT
  Noise_IK_25519_ChaChaPoly_BLAKE2s
  ├─ Mutual authentication — kedua static key diverifikasi
  ├─ Forward secrecy — ephemeral X25519 DH per sesi, dibuang setelah handshake
  └─ Identity hiding — static key initiator dienkripsi dalam message pertama

TRANSPORT
  ├─ LAN : TCP direct via mDNS discovery
  └─ Tor : onion service via arti-client (embedded, tanpa daemon)

VAULT v3 multi-slot (~129 KB)
  Argon2id KDF + ChaCha20-Poly1305 · 32 slot independen
  Tanpa oracle: SETIAP passphrase (benar/salah) membuka Password Manager
  fungsional & persisten — tidak ada sinyal "passphrase salah"
  Tanpa header / magic bytes — indistinguishable from random data
  Setiap penulisan me-re-randomize seluruh vault, bukan hanya slot berubah

Properti keamanan:

Property Status
Mutual authentication ✓ Noise_IK — kedua pihak memverifikasi static key lawan
Forward secrecy ✓ Ephemeral X25519 DH per sesi
Identity hiding ✓ Static key initiator dienkripsi di message pertama
Zero memory leak ZeroizeOnDrop semua struct yang menyimpan secret
Plausible deniability ✓ Vault tanpa magic bytes, passphrase decoy membuka PM
Encrypted contact list ✓ Social graph dienkripsi di disk

Sudah lewat audit keamanan internal menyeluruh (Juli 2026, per v0.5.3 — lihat LAPORAN-AUDIT-KEAMANAN.md); rilis setelahnya menjaga temuan tetap tertutup lewat CI (clippy+test+audit). Belum diaudit pihak ketiga independen — gunakan dengan pertimbangan risiko yang sesuai. Model ancaman lengkap: THREAT-MODEL.md.

⚠ Batas model ancaman (baca sebelum mengandalkan deniability):

  • Deniability mensyaratkan volume terenkripsi. Vault memang tampak acak, tetapi ALTER menyisakan artefak lain di disk: state Tor berisi kunci privat onion service, cache Tor, daftar kontak terenkripsi, dan file yang kamu pilih simpan. Artefak-artefak ini membuktikan ALTER dipakai. Agar deniability benar-benar berlaku, simpan seluruh direktori data di volume/partisi terenkripsi (LUKS, VeraCrypt hidden volume, FileVault, BitLocker). Arahkan lokasinya via --data-dir (atau --vault).
  • Snapshot berulang. Musuh yang punya >1 salinan vault dari waktu berbeda (backup, sync cloud, Volume Shadow Copy) dapat menyimpulkan adanya slot tersembunyi — keterbatasan fundamental hidden-volume (setara VeraCrypt). Full-disk encryption memitigasi ini.
  • Anti-forensik ≠ anti-malware. ALTER tidak melindungi dari keylogger, screen capture, atau perangkat yang sudah dikompromikan saat aplikasi berjalan.

Mulai Pakai

1.  alter                       # jalankan — Tor di background (LAN off; +--lan utk LAN)
2.  Tekan [i]                   # tampilkan invite code kamu
3.  Bagikan ke peer             # via Signal, kertas, atau channel aman lainnya
4.  Tekan [a] → paste invite    # tambah kontak peer (+ spasi + nickname opsional)
5.  Pilih kontak → [Enter]      # buka room terenkripsi

Kedua pihak perlu menekan Enter ke kontak yang sama. Role (Initiator/Responder) ditentukan otomatis dari fingerprint — tidak perlu koordinasi manual.

Penanda daftar kontak: sedang sesi denganmu · kontak Tor · kontak LAN-only · · N mnt terakhir sesi dalam run ini · · on N mnt perangkatnya terlihat aktif saat percobaan connect terakhir (dial Tor sukses, belum tentu dia di room). Semua indikator presence bersifat pasif: hanya dari koneksi yang benar-benar kamu coba, tidak ada polling, tidak ada probe berkala — ALTER tidak pernah mengklaim kontak "offline".

Keybinding

Tombol Konteks Aksi
/ Main Pilih kontak
Enter Main Buka sesi ke kontak terpilih
a Main Tambah kontak baru (paste invite code)
r Main Ganti nama kontak
d Main Hapus kontak (minta konfirmasi)
i Mana saja Tampil / tutup invite code
c Mana saja Salin invite code ke clipboard
PageUp / PageDown Room Scroll riwayat chat
End / Home Room Lompat ke pesan terbaru / teratas
Ctrl+R Room Reply — pilih pesan mana pun dengan /, Enter konfirmasi
Ctrl+S Room Cari pesan — ketik query, / lompat antar match
Ctrl+B Room Mode buram — redupkan semua pesan kecuali 3 terbaru ([L] lokal / [B] kedua sisi). Catatan: Ctrl+B adalah prefix tmux — lepas prefix dulu bila di dalam tmux
Tab Room Halaman 2 (ruang tunggu netral) — Tab/Esc kembali ke chat
Ctrl+F Room Kirim file
[S] / [L] / [T] File diterima Simpan / Lihat inline / Tolak
Esc Room Keluar room (riwayat dibuang)
Ctrl+Shift+X × 2 Mana saja Panic wipe — zeroize semua secret, exit
Opsi CLI lengkap
alter                 Jalankan TUI (mode default: online)
alter id              Cetak invite code lalu keluar

  --vault <path>      Lokasi vault (default: ~/.alter/id.key)
  --offline           LAN saja — matikan Tor
  --add <invite>      Pra-muat kontak saat startup
  --name <nickname>   Nickname untuk --add
  --listen <port>     Force responder di port ini (untuk testing)
  --dial <ip:port>    Force dial langsung (untuk testing)
  --process-name <n>  Ubah nama proses terlihat (lihat batasan di bawah)
  --version, -V       Cetak versi lalu keluar
  -h, --help          Tampilkan bantuan

Passphrase via environment (untuk skrip/automasi):

ALTER_PASSPHRASE="passphraseku" alter id

⚠️ Dihapus dari environment proses ini segera setelah dibaca, tapi tetap bisa terbaca proses lain via /proc/<pid>/environ dan terwariskan ke child process selama proses berjalan. Pakai hanya di mesin/skrip tepercaya.

Batasan --process-name: hanya mengubah nama yang terlihat di top/ htop/Activity Monitor (Linux: comm via prctl; macOS: thread name) atau judul jendela konsol (Windows). Tidak menimpa /proc/<pid>/cmdlineps aux/ps -ef tetap menampilkan baris perintah asli termasuk flag ini sendiri — dan tidak mengubah nama image di kolom Task Manager Windows. Jangan mengandalkan fitur ini untuk bersembunyi dari ps/Task Manager pihak lain di mesin yang sama.


Status — v0.7.1

M0  Fondasi: identity, vault, Noise_IK handshake           ✓
M1  LAN MVP: mDNS, TCP, TUI, chat 1-on-1                   ✓
M2  Internet: Tor onion service + LAN fallback              ✓
M3  Hardening: padding, panic-wipe, mlock                   ✓
M4  Polish & audit                                          ✓
M5  Presence privacy: Restricted Discovery (SEC-13)         ✓
M6  Password Manager decoy front (vault v2 dual-slot)       ✓
FT  File transfer terenkripsi — hingga 4 GB (v0.5.1)        ✓
M7  Versioning: --version, versi di TUI (v0.7.0)            ✓
M8  Transparansi koneksi: fase granular + badge jujur       ✓
M9  Presence pasif terbatas (RAM-only, tanpa kanal baru)    ✓
M10 Presence derivat dial-vs-handshake + drain stream basi  ✓
Changelog lengkap

v0.7.1 — M10: Presence Derivat & Drain Stream Basi

  • Daftar kontak menampilkan · on N mnt saat dial Tor ke kontak itu terakhir kali sukses — bukti aplikasinya sedang berjalan, tanpa perlu polling atau probe berkala apa pun. Sinyal ini murni dibaca dari percobaan koneksi yang memang kamu lakukan sendiri saat menekan Enter
  • Bila transport tersambung tapi peer tidak pernah membalas handshake, ALTER sekarang membedakan dua kasus: "perangkatnya online, dia belum membuka room" (kalau dial Tor-nya sukses) vs pesan generik lama (kalau tidak ada bukti). Sebelumnya keduanya tampil sebagai error yang sama
  • Riset eksplisit: arti-client tidak mengekspos API untuk mengecek onion service kontak tanpa benar-benar connect ke sana — jadi fitur "cek kontak ini" on-demand yang sempat dipertimbangkan dibatalkan permanen (akan meninggalkan jejak connect nyata di peer setiap kali dipakai)
  • Hardening: stream Tor masuk yang basi (dari percobaan connect yang batal/menyerah) tidak lagi bisa "meracuni" antrian dan menggagalkan sesi berikutnya — accept loop kini memvalidasi setiap stream hidup sebelum diserahkan ke handshake (padanan mitigasi NET-6 yang sudah ada di jalur LAN)

v0.7.0 — Transparansi Koneksi, Versioning, & Presence Terbatas

  • Koneksi: status "Menghubungkan…" kini granular — fase nyata (mencari via LAN / menghubungi via Tor percobaan ke-N / menunggu peer) + elapsed detik berjalan, plus hint jujur bahwa koneksi pertama via Tor butuh 1-2 menit (publikasi descriptor onion). Pola yang sama dengan fix LINKING Ns di v0.5.7
  • Koneksi: badge Tor kini tiga-fase LINKING → PUBLISHING → ONLINE — ONLINE hanya menyala setelah descriptor onion diyakini ter-publish (status nyata dari arti status_events), bukan begitu service launch. Sebelumnya user melihat ONLINE, menekan Enter, dan dial pertama pasti gagal tanpa penjelasan
  • Koneksi: cap backoff retry dial Tor dirapatkan 30s → 15s — deteksi kesiapan peer lebih cepat setelah descriptor ter-publish. Deadline total 5 menit, timeout handshake, dan seluruh jaminan keamanan TIDAK berubah
  • Versi: flag --version/-V, versi di --help, output alter id, layar splash & onboarding (angka polos tanpa wordmark — penyamaran v0.6.0 terjaga). Sumber tunggal CARGO_PKG_VERSION; versi rilis tidak pernah dikirim ke peer
  • Presence pasif per kontak: sedang sesi dengan kamu, · N mnt terakhir sesi dalam run ini, polos = tidak diketahui (tanpa klaim "offline"). Murni derivat sesi yang terjadi — RAM-only, hilang saat tutup aplikasi, disapu panic-wipe, nol koneksi jaringan baru, nol polling. Presence broadcast dan status "sedang di room lain" ditolak permanen (bocor pola komunikasi) — lihat PRD-alter-v0.7.md Bagian 6 dan THREAT-MODEL.md

v0.6.1 — Optimasi Koneksi & Transfer File

  • Perf: koneksi LAN dan Tor kini di-race paralel (dulu selalu tunggu 3s coba LAN dulu sebelum jatuh ke Tor); dialing Tor pakai exponential backoff
  • Perf: TCP_NODELAY untuk koneksi LAN; hapus flush per-frame di jalur Tor yang sebelumnya memperbesar overhead tulis-kecil (write amplification)
  • Perf: transfer file kini di-batch per chunk dengan yield point supaya UI TUI tidak macet saat transfer besar berjalan
  • Build: opt-level rilis diganti ke "s" — inlining kode kripto lebih cepat
  • UI: modal "add contact" dan "rename" dipoles
  • Fix: dua peringatan clippy (collapsible-if, unused assignment) dibersihkan

v0.6.0 — Perbaikan UX Chat

  • Fix: pesan baru tidak muncul saat layar penuh — perhitungan scroll kini wrap-aware (pesan panjang yang ter-wrap tidak lagi mendorong pesan terbaru keluar area terlihat). Tambahan: indikator ↓ N pesan baru saat scroll ke atas, tombol End/Home untuk lompat ke bawah/atas
  • Reply: binding r polos dihapus (menelan huruf pertama saat mengetik pesan berawalan "r"); Ctrl+R (pilih pesan mana pun) jadi satu-satunya jalur reply
  • Cari pesan: Ctrl+S — ketik query, sorot semua kemunculan, / lompat antar match, Enter/Esc tutup
  • Mode buram: Ctrl+B — redupkan semua pesan kecuali 3 terbaru (anti shoulder-surf); pilihan cakupan [L] lokal atau [B] kedua sisi (sinkron antar-peer via frame protokol baru, backward-compatible dengan versi lama)
  • Ruang tunggu: Tab di dalam room membuka halaman 2 netral (tanpa nama peer / isi pesan) selagi menunggu balasan; indikator kecil menandai pesan masuk
  • Penyamaran tampilan: wordmark "ALTER" dihilangkan dari seluruh layar, diganti ornamen belah ketupat (◆) — nama env var & opsi CLI tidak berubah

v0.5.8 — Dokumentasi Keamanan Publik + Installer Resmi Linux/macOS

  • Fitur baru: Ctrl+R di dalam sesi chat membuka mode "pilih pesan untuk dibalas" — navigasi ↑/↓ menyorot pesan mana pun di riwayat (beda dari r biasa yang hanya mengutip pesan terakhir dari peer), Enter konfirmasi jadi balasan, Esc batal
  • install.sh — installer resmi Linux/macOS. README sudah merujuk skrip ini sejak awal, tapi filenya belum pernah dibuat sampai sekarang; deteksi platform (Linux x86_64 / macOS Apple Silicon, fallback jelas ke cargo build --release untuk platform lain), tidak auto-edit dotfile shell (.bashrc/.zshrc) — hanya cetak instruksi manual, konsisten pola rustup-init
  • Perbaikan command instalasi Linux/macOS di README: | sh| bash — skrip pakai set -o pipefail yang tidak dikenal dash/ash (default /bin/sh di mayoritas distro Linux), sebelumnya akan gagal instan di baris pertama kalau dipipe ke sh
  • SECURITY.md + THREAT-MODEL.md — kebijakan pelaporan kerentanan (kanal utama: GitHub Private Security Advisory, bukan email pribadi) dan dokumen konsolidasi jujur soal apa yang dilindungi ALTER dan apa yang tidak (traffic correlation Tor, presence leak, batasan --process-name, dsb). Section "Security Policy" lama di CONTRIBUTING.md (basi, masih menyebut milestone "M3") sekarang menunjuk balik ke SECURITY.md sebagai satu-satunya sumber acuan
  • Release CI: setiap rilis kini menyertakan SHA256SUMS gabungan untuk verifikasi integritas binary yang diunduh

v0.5.7 — Fix: "LINKING" Tor Terlihat Macet Tanpa Progres

  • Bootstrap TorClient + launch onion service normalnya butuh 30-60 detik (proses jaringan Tor asli, bukan komputasi lokal) — tapi UI cuma tampilkan teks statis "Sedang LINKING…" tanpa indikasi progres, jadi di jaringan lambat/dibatasi terlihat identik dengan aplikasi macet
  • Pill status dan popup invite sekarang tampilkan elapsed time berjalan (LINKING 47s); popup juga munculkan hint setelah 75 detik untuk cek koneksi internet, firewall/antivirus yang mungkin blokir Tor, dan jam sistem (Tor menolak konsensus bila clock skew) — murni transparansi, tidak mengubah cara bootstrap Tor bekerja

v0.5.6 — Fix: Layar "Buat Identitas Baru" Membingungkan (terkesan stuck)

  • Bukan bug hang (KDF sudah non-blocking sejak v0.5.5) — ini masalah kejelasan UI: layar registrasi menampilkan 4 field (ALTER + PM, masing-masing + konfirmasi) sekaligus padahal diisi berurutan, field aktif nyaris tak terlihat, dan field yang sudah selesai kembali kosong tanpa penanda apa pun sehingga user baru mengira input hilang / aplikasi diam
  • Tambah indikator "Langkah N dari 4", status per-field (✓ selesai / ▸ aktif / redup belum) dan instruksi spesifik tiap langkah
  • Field yang sudah selesai tidak lagi menampilkan panjang passphrase (kurangi shoulder-surfing); alur validasi, dua-passphrase, dan zeroize tidak berubah

v0.5.5 — Fix: Registrasi & Migrasi Vault Terasa "Stuck"

  • Bug nyata (bukan cuma hardware lambat): registrasi vault baru dan migrasi vault v1/v2->v3 menjalankan 2x Argon2id (m=64MB) langsung di key handler, menahan render loop TANPA spinner sampai KDF selesai — beda dari jalur unlock yang sudah benar. Di hardware lambat/dibawah beban, ini kelihatan seperti aplikasi freeze total setelah passphrase dimasukkan
  • Fix: kedua jalur (registrasi & migrasi) sekarang pakai spawn_blocking + screen spinner baru (Screen::Creating/Screen::Migrating) — sama pola dengan unlock vault yang sudah benar sejak v0.5.0
  • Migrasi vault lama dijamin tetap pertahankan identitas/fingerprint (bukan generate keypair baru) — dikunci via test eksplisit

v0.5.4 — Verifikasi Acceptance Criteria FT-01 + Fuzzing

  • Verifikasi 14 acceptance criteria PRD FT-01 terhadap kode nyata: 4 bug protokol nyata ditutup (FileHeader kedua diam-diam menimpa transfer aktif, reject file tak memberi tahu pengirim, file nama-sama saling menimpa diam-diam, jalur gagal tak tercatat di riwayat chat)
  • Modal konfirmasi eksplisit [Y/N] untuk file > 100 MB sebelum terkirim (warning, bukan hard block)
  • Room ditutup lokal mid-transfer kini kirim TYPE_CANCEL eksplisit ke peer (bukan cuma sinyal generik disconnect) — perbaikan leave_room() yang sebelumnya abort task sebelum jalur graceful-close sempat jalan
  • Timeout negosiasi Capability 5 detik: peer protokol lama dapat notifikasi eksplisit "file transfer tidak didukung" di chat, bukan diam di default
  • Fuzz targets (fuzz/): decode_invite, deserialize_contacts, padding::unpad, PmStore::from_plaintext — proyek dipecah jadi lib+bin (src/lib.rs) supaya fuzz crate bisa memanggil parser internal langsung

v0.5.3 — Audit Keamanan (LAPORAN-AUDIT-KEAMANAN.md, tuntas Critical→Info)

  • Vault v3 multi-slot: setiap passphrase (dikenal/tak-dikenal) buka PM fungsional & persisten — tidak ada oracle deniability, tiap tulis re-randomize seluruh vault
  • Fix DoS file transfer: validasi total_bytes/chunk_count/idx sisi-terima, clamp timeout, timeout handshake 120s
  • Render gambar preview in-memory (tanpa file temp di disk), clipboard auto-clear + exclude history/cloud
  • mlock diperbaiki ke alamat memori final; fs-mistrust disable dibatasi Windows-only
  • LAN discovery (mDNS) jadi opt-in (--lan), default OFF — identitas tak lagi disiarkan otomatis
  • Restricted discovery Tor: peringatan descriptor publik, accept loop dibatasi (anti-DoS), bind IP LAN spesifik + accept-loop-until-live (anti "koneksi pertama menang")
  • Zeroize & panic-wipe menyeluruh (passphrase, PM key, plaintext sesi, chat/input saat panic)
  • File kontak: migrasi KDF ke HKDF-SHA256 + tulis atomik & permission 0600
  • CI: cargo test + clippy -D warnings + cargo audit otomatis tiap push/PR

v0.5.1 — File Transfer + UX

  • Transfer file terenkripsi (FT-01): SHA-256 end-to-end, chunked streaming, hingga 4 GB
  • Image preview inline via viuer (setelah terima file gambar, pilih [L])
  • Reply dengan kutipan: r di room untuk balas pesan spesifik
  • Scroll riwayat chat: PageUp/PageDown dengan 5-pesan per langkah
  • Warning auto-dismiss (8 detik), input length limit per konteks

v0.5.0 — Password Manager Decoy Front

  • Vault v2 (4096 B): dual-slot independen — slot A (PM decoy) + slot B (ALTER keys)
  • Password Manager TUI: tambah / lihat / hapus / cari entries
  • Backup codes per entry (maks 10, mark-as-used)
  • Async unlock dengan spinner (Argon2id ~500ms di background thread)

v0.4.0 — Presence Privacy

  • Restricted Discovery (SEC-13): onion service hanya accessible ke kontak dengan client auth
  • Tor client auth x25519 terintegrasi ke invite code v2

Kontribusi

  1. Fork → buat branch dari main
  2. Buat perubahan, pastikan cargo test hijau dan cargo clippy bersih
  3. Commit dengan format Conventional Commits
  4. Buka Pull Request

"Privacy is not about having something to hide — it's about having something to protect."

Releases · Issues · GPL-3.0

About

Serverless encrypted P2P terminal chat (Rust, Noise_IK, LAN + Tor onion)

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages