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

7.6 KiB
Raw Blame History

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)

// 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 сейчас

  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.