7.6 KiB
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
Стек:
- Берём
pqcrypto-falcon = 0.4(Rust crate, exists вmt-crypto) - Кросс-компиляция Rust под Android targets:
aarch64-linux-android,armv7-linux-androideabi,i686-linux-android,x86_64-linux-android - cargo-ndk wrapper для упрощения
- JNI wrapper crate (
mt-crypto-jni) экспортирующийkeypair_from_seed,sign,verify - 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
Стек:
- liboqs (Open Quantum Safe) — C library с Falcon реализацией
- CMake build для Android через NDK CMake toolchain
- 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)
// 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)
// 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 сейчас
-
Решение архитектора Montana: Falcon vs SLH-DSA — это spec-level decision (см.
Spec-Patch-VpnHeartbeat.md§10). Не выбор реализатора Android. -
Подтверждение из роли критика: Pass 21 (Primitive parameter selection analysis) для SLH-DSA-128f vs SLH-DSA-128s vs Falcon-512. Trade-off matrix с justification per NIST level.
-
Spec bump: Montana Protocol v35.25.0 → v35.26.0 с opcode
0x06(см.Spec-Patch-VpnHeartbeat.md). -
Android JNI prerequisite: Если выбран Falcon —
cargo-ndksetup + 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.