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