montana/Android/Внешний-аудит/13-Falcon-Migration.md

182 lines
7.6 KiB
Markdown
Raw Normal View History

2026-05-21 03:44:38 +03:00
# 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.