# 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.
