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