montana/Android/Внешний-аудит/13-Falcon-Migration.md
2026-05-21 03:44:38 +03:00

182 lines
7.6 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.

# 13. Falcon-512 Migration Plan (M-VPN-3)
## Цель
Замена Ed25519 на FN-DSA-512 (Falcon) в Android приложении для соответствия [I-1] PQ-secure.
---
## Текущее состояние (v6.8.0)
| Слой | Алгоритм | PQ-safe? | Где |
|------|----------|----------|-----|
| Heartbeat sign client-side | Ed25519 (curve25519) | **нет** (Shor) | `MontanaVpnService.buildSignedHeartbeatBody` |
| Heartbeat verify server-side | Ed25519 (curve25519) | **нет** | `mt-vpn-balance::verify_ed25519` |
| Address derivation | SHA-256 | условно ✅ (Grover 128-bit) | `app.html::deriveAddr` |
| Seed encryption at rest | PBKDF2-HMAC-SHA256 + AES-GCM-256 | условно ✅ | `app.html::encryptSeed` |
| VPN tunnel (Reality) | X25519 | **нет** | xray-core upstream |
**Только** heartbeat signature critical для **internal** Montana economy. Reality tunnel — отдельный stack (xray upstream).
---
## Целевое состояние (M-VPN-3)
| Слой | Алгоритм | Размер | Свойства |
|------|----------|--------|----------|
| Heartbeat sign client-side | **FN-DSA-512** (Falcon round 3 → FIPS 206) | sk 1281B, pk 897B, sig 666B | PQ ✅ NIST level 1 |
| Heartbeat verify server-side | **FN-DSA-512** через `pqcrypto-falcon` Rust | same | already в `mt-crypto` |
---
## Технический путь
### Опция A: pqcrypto-falcon Rust → Android via NDK + JNI
**Стек:**
1. Берём `pqcrypto-falcon = 0.4` (Rust crate, exists в `mt-crypto`)
2. Кросс-компиляция Rust под Android targets: `aarch64-linux-android`, `armv7-linux-androideabi`, `i686-linux-android`, `x86_64-linux-android`
3. cargo-ndk wrapper для упрощения
4. JNI wrapper crate (`mt-crypto-jni`) экспортирующий `keypair_from_seed`, `sign`, `verify`
5. Kotlin вызывает через `System.loadLibrary` + `external fun`
**Сложности:**
- pqcrypto-falcon в reference implementation использует SHAKE256 internally — должно работать кросс-платформенно
- Android NDK r25+ требует Rust 1.68+ — OK
- Размер `.so` библиотек: ~500KB × 4 ABI = ~2 MB добавка к APK
**Estimated cost:** 2-3 недели для прохождения CI build + on-device verification matrix.
### Опция B: liboqs Android port
**Стек:**
1. liboqs (Open Quantum Safe) — C library с Falcon реализацией
2. CMake build для Android через NDK CMake toolchain
3. JNI wrapper
**Сложности:**
- liboqs больше surface (включает все PQ algorithms), нужна минимальная build с только Falcon
- Hand-written Falcon implementation — менее audit-friendly чем pqcrypto-falcon (Rust-side audited через mt-crypto)
**Estimated cost:** 2 недели.
### Опция C: SLH-DSA (SPHINCS+) fallback
**Если** Falcon Android intractable — SPHINCS+ (FIPS 205, hash-only, no lattice). Преимущества:
- Только SHA-256 примитив → не требует SHAKE / NTT
- Подпись в pure Java/Kotlin реализуема (если есть SHA-256 — есть SLH-DSA)
- BouncyCastle уже имеет `org.bouncycastle.crypto.signers.SLHDSASignerFactory`
**Trade-off:**
- SLH-DSA-128f: pk 32B, sk 64B, sig **17088B** (vs Falcon 666B)
- Heartbeat body растёт с 730B до ~17KB → больше bandwidth
- Sign time ~50ms vs Falcon ~5ms
Для VPN сцены с heartbeat раз в 5 секунд — 17KB acceptable, signing overhead irrelevant.
**Estimated cost:** 1 неделя (BouncyCastle уже даёт SLH-DSA).
---
## Рекомендация
**Опция C (SLH-DSA через BouncyCastle)** как первый шаг — самая короткая дорога к PQ-secure. Bandwidth penalty приемлем для heartbeat.
После accumulating production experience с SLH-DSA — postponed migration к Falcon если bandwidth optimization станет приоритетом.
---
## Detailed plan для Опции C
### Phase 3a: SLH-DSA backend (1 day)
```rust
// crates/mt-vpn-balance/Cargo.toml
[dependencies]
sphincsplus = "0.x" // или fips205-rs
// crates/mt-vpn-balance/src/main.rs
fn verify_slh_dsa_128f(pubkey_hex: &str, signature_hex: &str, message: &[u8]) -> bool {
// SLH-DSA-128f: pk 32B, sig 17088B
}
```
Backend принимает **обе** Ed25519 (legacy) и SLH-DSA (post-quantum) heartbeats. Type byte в начале body указывает.
### Phase 3b: Android SLH-DSA через BouncyCastle (3 days)
```kotlin
// MontanaVpnService.kt
import org.bouncycastle.pqc.crypto.slhdsa.SLHDSAKeyGenerationParameters
import org.bouncycastle.pqc.crypto.slhdsa.SLHDSAParameters
import org.bouncycastle.pqc.crypto.slhdsa.SLHDSASigner
fun signHeartbeatSLHDSA(seed: ByteArray, message: ByteArray): Pair<ByteArray, ByteArray> {
// Deterministic keygen from BIP39 seed
val sphincsSeed = SHA256("montana-slhdsa-v1:" + seed) // 32B
val params = SLHDSAParameters.sha2_128f
val priv = SLHDSAPrivateKeyParameters(params, sphincsSeed)
val pub = priv.getPublicKey()
val signer = SLHDSASigner()
signer.init(true, priv)
val sig = signer.generateSignature(message)
return Pair(pub.encoded, sig)
}
```
### Phase 3c: Migration cutover (1 day)
- Backend: feature flag `MT_VPN_REQUIRE_PQ_SIGN=true` → отвергает Ed25519
- Android: bump versionCode, force-migrate существующие кошельки на SLH-DSA при первом запуске v7.0.0
- Координатор Moscow: при первом SLH-DSA heartbeat → pin SLH-DSA pubkey, легация Ed25519 pubkey deprecated
### Phase 3d: Тестирование (2 days)
- Unit tests Rust verify SLH-DSA
- Unit tests Kotlin sign + roundtrip
- Integration: Pixel → SLH-DSA heartbeat → backend verify → balance updated
- Load test: 100 concurrent SLH-DSA heartbeats (17KB body) → verify atomic state
**Total: ~7 рабочих дней.**
---
## Что blocking сейчас
1. **Решение архитектора Montana:** Falcon vs SLH-DSA — это spec-level decision (см. `Spec-Patch-VpnHeartbeat.md` §10). Не выбор реализатора Android.
2. **Подтверждение из роли критика:** Pass 21 (Primitive parameter selection analysis) для SLH-DSA-128f vs SLH-DSA-128s vs Falcon-512. Trade-off matrix с justification per NIST level.
3. **Spec bump:** Montana Protocol v35.25.0 → v35.26.0 с opcode `0x06` (см. `Spec-Patch-VpnHeartbeat.md`).
4. **Android JNI prerequisite:** Если выбран Falcon — `cargo-ndk` setup + matrix testing.
---
## Не блокирует Play Store submission
Phase 3 — это **migration к PQ-secure**, не блокер publishing. v6.8.0 уже:
- Подписан Genesis-keystore (production)
- Privacy Policy опубликован
- Data Safety готов
- Production R8 build
- F-6 encrypted seed (PBKDF2 + AES-GCM)
- F-7 backup confirmation
- F-8 cross-wallet warning
- Unit tests passing
Falcon migration безопасно сделать **после** publishing — это in-app update minor version bump.
---
## Decision required
| Решение | Кто принимает | Срок |
|---------|---------------|------|
| Falcon vs SLH-DSA для Phase 3 | Архитектор Montana Protocol | до начала M-VPN-3 |
| Spec bump v35.26.0 | Архитектор | после приёма патча |
| Android JNI vs BouncyCastle | Архитектор реализации Android | при старте Phase 3 |
Текущая v6.8.0 на production safe без этого decision.