Files
Brizzi-HCE/README.md

210 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# BRIZZI HCE (Android NFC Host Card Emulation)
Dokumen ini menjelaskan struktur project, alur eksekusi, dan cara membacanya supaya kamu bisa langsung maintance/debug proyek ini.
## 1) Gambaran Umum
Project ini adalah aplikasi Android HCE (Host Card Emulation) yang memproses APDU dari reader NFC (misalnya terminal).
Komponen utamanya:
- [BrizziHostApduService](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziHostApduService.kt): service utama untuk menerima APDU.
- [BrizziApduRouter](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziApduRouter.kt): pemroses perintah dan state machine transaksi.
- [BrizziSession](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziSession.kt): menjaga kondisi sesi saat ini (AID, auth, transaksi pending).
- [BrizziCard / BrizziCardSnapshot](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziCard.kt): model data kartu virtual.
- [BrizziSecureStorage](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziSecureStorage.kt): persistensi kartu terenkripsi.
- [BrizziSecurityMetrics](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziSecurityMetrics.kt): monitoring keamanan dan incident readiness.
## 2) Bagaimana alur request APDU
1. APDU masuk ke `processCommandApdu(...)` di `BrizziHostApduService`.
2. Service melakukan:
- validasi basic (null/size/rate limit),
- log/track metrik event,
- dispatch ke `BrizziApduRouter.handle()`.
3. Router:
- parse APDU via `ApduParser`,
- cek timeout sesi,
- cek replay untuk command sensitif,
- validasi state session (AID/auth/transaction),
- memetakan hasil ke SW response.
4. Response SW/konten dikirim ke terminal.
## 3) State machine yang penting
`BrizziSession` menyimpan dua level state:
- **SessionPhase**
- `NONE`
- `AID1_SELECTED`
- `AID3_SELECTED`
- `AID3_AUTHENTICATED`
- **TransactionPhase**
- `NONE`
- `DEBIT_PENDING`
- `CREDIT_PENDING`
- `LOG_PENDING`
- `LAST_TXN_PENDING`
`hasPendingTransactionState()` dipakai untuk mencegah abuse:
- command debit/credit tidak boleh overlapping,
- commit/abort (`C7`/`A7`) harus disinkron.
## 4) Security hardening yang sudah diterapkan
- Parsing APDU tidak lagi pakai regex string mentah sepenuhnya; gunakan `ApduParser` untuk parse CLA/INS/P1/P2/Lc/Data/Le.
- Validasi panjang dan malformed handling lebih ketat (`wrongLength`, `unsupportedInstruction`, `rateLimitExceeded`, dll.).
- Replay protection untuk command sensitif dalam window pendek.
- Rate limit:
- max 80 command / 1000ms,
- minimum gap antar command 30ms.
- Session timeout 120 detik.
- `FLAG_SECURE` di UI supaya tidak mudah di-screenshot.
- `usesCleartextTraffic=false` dan `networkSecurityConfig`.
- Logging produksi diarahkan ke metadata minimal (tidak menyimpan raw APDU).
## 5) Penyimpanan data (yang dipilih)
Sebelum ini data ada di RAM. Sekarang:
- `BrizziSecureStorage` menyimpan data kartu ke `EncryptedSharedPreferences`:
- `card_number`, `balance`, `logs`, `lastTransactionDate`, dsb.
- Kunci enkripsi berasal dari Android Keystore (`MasterKey`).
- Data dipersisten saat `commit` transaksi (`C7`) via callback `onCardUpdated`.
- Bila loading gagal, sistem fallback ke nilai default (`BrizziCard()`).
Catatan: ini aman untuk tingkat aplikasi, namun bukan secure element hardware.
## 6) Monitoring & Incident readiness (point 5 yang kamu minta)
`BrizziSecurityMetrics` menyimpan counter event:
- command total/sukses/gagal,
- timeout, rate limit, replay,
- auth denied, parse fail, dan lain-lain.
Mechanism:
- service memanggil `track(event)` untuk setiap event penting,
- bila ambang incident terlampaui (mis. `COMMAND_RATE_LIMIT`, `REPLAY_DETECTED`, `AUTH_DENIED`, dll), service log `security incidents` (throttled per menit),
- snapshot juga diekspor ke file internal:
- `app/files/security_metrics_report.txt`.
### Debug actions dari MainActivity
- Dump metrics (debug only):
- `adb shell am start -n com.korancrew.brizzi/.MainActivity -a com.korancrew.brizzi.ACTION_DUMP_METRICS`
- Reset metrics (debug only):
- `adb shell am start -n com.korancrew.brizzi/.MainActivity -a com.korancrew.brizzi.ACTION_RESET_METRICS`
- Lihat file log:
- `/data/data/com.korancrew.brizzi/files/security_metrics_report.txt`
## 7) Command support (high level)
Di router, mapping didasarkan pada helper:
- AID selector (1/3): `905A...0100...`, `905A...0300...`
- AID 1 info/status
- AID 3 auth & read balance/log/transaction
- debit/credit
- write log + update last transaction + commit/abort
- fallback: `unsupportedInstruction` (6D00)
Untuk daftar lengkap command literal, lihat:
- [BrizziCommandCatalog](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziCommandCatalog.kt)
- implementasi detail di `handleParsed(...)`:
- [BrizziApduRouter.kt](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziApduRouter.kt)
## 8) Cara memahami kode (urutan baca yang disarankan)
1. [BrizziHostApduService.kt](app/src/main/java/com/korancrew/brizzi/hce/BrizziHostApduService.kt) masuknya data APDU, rate limit, metrik.
2. [BrizziApduRouter.kt](app/src/main/java/com/korancrew/brizzi/hce/BrizziApduRouter.kt) policy/routing per command.
3. [BrizziSession.kt](app/src/main/java/com/korancrew/brizzi/hce/BrizziSession.kt) state session/transaction.
4. [ApduParser.kt](app/src/main/java/com/korancrew/brizzi/hce/ApduParser.kt) struktur parser.
5. [BrizziCard.kt](app/src/main/java/com/korancrew/brizzi/hce/BrizziCard.kt) + [BrizziSecureStorage.kt](app/src/main/java/com/korancrew/brizzi/hce/BrizziSecureStorage.kt).
6. [BrizziSecurityMetrics.kt](app/src/main/java/com/korancrew/brizzi/hce/BrizziSecurityMetrics.kt) event/incident.
7. [BrizziResponse.kt](app/src/main/java/com/korancrew/brizzi/hce/BrizziResponse.kt) + [Hex.kt](app/src/main/java/com/korancrew/brizzi/hce/Hex.kt).
## 9) Build & release yang dipakai sekarang
- `debug`: non-minify (mudah debug).
- `release`: minify + shrink + ProGuard:
- [proguard-rules.pro](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/proguard-rules.pro)
- Signing release hanya aktif jika property gradle diisi (via CI keystore properties):
- `RELEASE_STORE_FILE`, `RELEASE_STORE_PASSWORD`, `RELEASE_KEY_ALIAS`, `RELEASE_KEY_PASSWORD`.
## 10) Known caveat (buat pembacaan objektif)
- Banyak SW command belum sepenuhnya di-convert ke parser berbasis field; saat ini tetap berbasis string matching untuk backward compatibility.
- Jika ini akan dipakai di production nyata (bukan simulasi/prototype), perlu hardening tambahan:
- enkripsi/rotasi kunci lebih ketat,
- secure policy distribusi dan integrity update,
- backend attestation/monitoring terpusat.
---
## 11) Ringkas: arsitektur dalam satu kalimat
Ini adalah **stateful HCE emulator**: APDU masuk → rate-limit & parser → aturan fase sesi → update card/metrics → response status dengan persistensi terenkripsi + audit event.
## 12) Cara membaca kode (bisa dijadikan panduan debugging)
### 12.1 Alur end-to-end dalam 1 request
1. Terminal mengirim APDU ke `BrizziHostApduService`.
2. `processCommandApdu(...)` memvalidasi ukuran, null, dan rate-limit di service.
3. `BrizziHostApduService` menyerahkan APDU ke `BrizziApduRouter.handle(...)`.
4. Router memanggil `ApduParser.parse(...)` untuk decode field CLA/INS/P1/P2/Lc/Data/Le.
5. Router memvalidasi:
- sesi timeout (`SESSION_TIMEOUT_MS`),
- replay untuk perintah sensitif (`REPLAY_WINDOW_MS`),
- state/phase yang valid (`BrizziSession`),
- format payload (contoh: debit/credit/write log/last transaction).
6. Jika valid, router memproses rule per command dan memodifikasi `pending*` pada `session` serta `card` jika commit.
7. Response dibentuk dari `BrizziResponse` (`6700`, `6985`, `6FFF`, `9100`, dll).
8. Service mencatat event ke `BrizziSecurityMetrics`, menilai health, dan menulis snapshot ke `security_metrics_report.txt`.
### 12.2 Urutan file untuk dibaca dari atas ke bawah
1. [BrizziHostApduService.kt](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziHostApduService.kt)
- Titik masuk APDU dari HCE.
- Juga memegang rate-limit, incident throttle log, dan ekpor metrik.
2. [BrizziApduRouter.kt](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziApduRouter.kt)
- Aturan stateful command routing.
- Core logic transaksi debit/credit/log/last transaction/commit-abort.
3. [BrizziSession.kt](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziSession.kt)
- Menjaga state sesi, fase autentikasi, fase transaksi, anti-replay, dan pending state.
4. [ApduParser.kt](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/ApduParser.kt)
- Parsing protokol APDU (case-1..case-4).
5. [BrizziCard.kt](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziCard.kt) + [BrizziSecureStorage.kt](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziSecureStorage.kt)
- Struktur data card dan log transaksi; bagaimana data bertahan di penyimpanan terenkripsi.
6. [BrizziSecurityMetrics.kt](/Users/wirabasalamah/Documents/Codex/brizzi-hce/app/src/main/java/com/korancrew/brizzi/hce/BrizziSecurityMetrics.kt)
- Event tracking, incident threshold, snapshot/report.
### 12.3 Kontrak keamanan yang harus dipahami
- **Syarat autentikasi:** akses area saldo/log/last transaction hanya setelah fase `AID3_AUTHENTICATED`.
- **Syarat transaksi:** debit/credit harus dalam state siap transaksi, tidak boleh ada pending transaction lain.
- **Commit/Abort:** `C7`/`A7` adalah pembatas akhir lifecycle transaksi. Tanpa pending state, kedua command itu ditolak.
- **Logika rollback:** pending update hanya masuk ke state final saat `COMMIT`; `ABORT` membersihkan pending.
- **Replay guard:** command sensitif (debit/credit/commit/abort/write log/last tx) tidak boleh diulang dalam window pendek.
### 12.4 Checklist membaca log saat debugging
- Jika terjadi `CONDITIONS_NOT_SATISFIED` berulang: cek urutan select-aid-auth-send command.
- Jika `rateLimitExceeded` sering:
- periksa apakah device reader terlalu cepat kirim command (<30ms antar command).
- pastikan transaksi tidak melebihi 80 command/s.
- Jika `COMMAND_PARSE_FAILED` naik: cek command malformed (Lc/Le mismatch, trailing bytes, payload aneh).
- Ambil snapshot metrik:
- `adb shell am start -n com.korancrew.brizzi/.MainActivity -a com.korancrew.brizzi.ACTION_DUMP_METRICS`
- Hapus metrik jika perlu test ulang:
- `adb shell am start -n com.korancrew.brizzi/.MainActivity -a com.korancrew.brizzi.ACTION_RESET_METRICS`
## 13) Peta ancaman & mitigasi singkat (ringkas)
- **Replay** dibatasi window 800ms di router + deteksi command sensitif.
- **Flood** dibatasi 80 cmd/1000ms + minimum 30ms antar command di service.
- **Session theft/continuity** timeout 120 detik, reset state saat deactivated.
- **Data disclosure** `FLAG_SECURE`, cleartext dimatikan, keystore-backed storage untuk card state.
- **Silent fail di prod** metrik tidak menyimpan APDU mentah, hanya metadata event.
## 14) Paket uji cepat (smoke test) untuk koneksi reader
- Gunakan [HCE_BRIZZI_SMOKE_TEST.md](/Users/wirabasalamah/Documents/Codex/brizzi-hce/HCE_BRIZZI_SMOKE_TEST.md) untuk menjalankan alur verifikasi:
- build/install,
- cek service + logcat,
- validasi interaksi AID/auth/transaksi ke reader.