v0.5.2-pre.007

This commit is contained in:
2026-08-11 15:15:03 +02:00
parent 56572cec40
commit 279fd67cc0
27 changed files with 1151 additions and 143 deletions

View File

@@ -0,0 +1,185 @@
<!-- file: docs/validation/V0_5_2_WALLET_VALIDATION_REPORT.md -->
<!-- version: 2 -->
# Validation `ks-wallet` — clôture 0.5.2
## 1. Périmètre
`0.5.2` transforme `ks-wallet` en frontière Solana réutilisable pour :
- wallets temporaires en mémoire ;
- plusieurs wallets persistants accessibles par alias ;
- conteneur natif `.kswallet` binaire, versionné et protégé par mot de passe ;
- capacité de signature sans exposition des bytes privés ;
- migration/inspection legacy ;
- import/export Solana CLI JSON et Base58 ;
- sélection non sensible depuis `ks-config` ;
- validation intégrée indépendante de Tauri via `ks-wallet-demo-scenarios` ;
- intégration opérateur desktop via DTO applicatifs sûrs.
La version ne transforme pas `ks-wallet` en client RPC et ne migre pas en masse les keypairs de fixtures sous `wallets/temporary/**`.
## 2. Organisation des données
La séparation validée est :
```text
wallets/
<alias>.kswallet
temporary/<profil>/...
data/wallets/
<exports JSON/Base58 explicites>
```
- `wallets/` : store natif persistant ;
- `wallets/temporary/**` : fixtures/keypairs historiques ou jetables ;
- `data/wallets/` : exports secrets explicites destinés à des outils externes.
Le desktop n'utilise pas `data/wallets/` comme store natif automatique.
## 3. Format natif et sécurité
Le format v1 validé utilise :
| Contrat | Valeur |
|-------------------|------------------------------------|
| Extension | `.kswallet` |
| Magic | `KSWALLET` |
| KDF | Argon2id v19 |
| Profil par défaut | 64 MiB / 3 passes / 4 lanes |
| AEAD | XChaCha20-Poly1305 |
| Sel | 16 octets |
| Nonce | 24 octets |
| Plaintext | keypair Solana exacte de 64 octets |
| Ciphertext + tag | 80 octets |
| AAD | header + alias + sel + nonce |
| Répertoire Unix | `0700` |
| Fichier Unix | `0600` |
Le codec rejette versions/algorithmes inconnus, réserves non nulles, troncatures, suffixes, longueurs incorrectes et paramètres KDF hors bornes. La pubkey du header n'est considérée authentifiée qu'après déchiffrement et comparaison avec la pubkey réellement dérivée du keypair.
La prerelease de clôture retire également les chemins locaux inutiles du `Debug`, des logs et des erreurs du `TemporaryWalletStore` legacy et ajoute un canari externe de non-divulgation.
## 4. Cycle de vie du mot de passe
Les surfaces validées comprennent :
- création native ;
- unlock par alias ;
- unlock d'un fichier externe inspecté explicitement ;
- signature avec `UnlockedWallet` ;
- `lock()` par consommation ;
- changement de mot de passe avec conservation exacte de l'alias/pubkey ;
- refus de l'ancien mot de passe ;
- altération des données authentifiées refusée avant capacité de signature ;
- refus d'écrasement natif ;
- test concurrent de création d'un même alias avec un seul gagnant et une destination valide.
`ks-wallet-demo-scenarios` valide le cycle ordonné suivant dans un seul test indépendant de Tauri :
```text
A -> B
A doit échouer
B ouvre et signe
B -> A
A restauré ouvre et signe
```
La fixture est synthétique et temporaire ; aucun wallet réel de l'opérateur n'est modifié.
## 5. Migration et transferts
Les tests externes valident :
- migration legacy `<alias>.json` non destructive ;
- conservation exacte de la pubkey ;
- inspection d'un fichier de transfert sans import ;
- import/export `SolanaCliJson` ;
- import/export `SolanaPrivateKeyBase58` ;
- refus des sources invalides ;
- collision de pubkey ;
- export impossible avec un mauvais mot de passe ;
- permissions privées ;
- absence d'écrasement silencieux.
Aucune recovery phrase n'est synthétisée depuis une keypair arbitraire.
La validation opérateur a confirmé les exports :
```text
data/wallets/local-devnet-operator2.json
data/wallets/local-devnet-operator2.txt
```
## 6. Configuration et signer Devnet
`wallet.config.json` sépare `wallets_directory` de `profile.directory` :
```text
wallet_dir = wallets
temporary_wallet_dir = wallets/temporary/<profil>
```
Un profil peut définir `wallet_alias`, sans mot de passe. Le desktop peut aussi définir un override session-only par profil Devnet. La résolution effective est runtime override -> alias configuré -> temporaire seulement lorsqu'aucun alias persistant n'est sélectionné.
La validation opérateur a confirmé que les démos Devnet utilisent bien le `.kswallet` sélectionné avec une trace `persistence="persistent"`, au lieu du JSON temporaire.
## 7. Desktop Wallets
La fenêtre Wallets couvre : inventaire, création, inspection externe, inspection/import de keypairs, export borné sous `data/wallets/`, sélection de profil RPC, balance SOL, comptes SPL Token/Token-2022, signatures récentes, détail de transaction et sélection session-only du wallet d'exécution.
Les secrets restent backend-only via `KB_SECRET_DEMO_WALLET_PASSWORD`; aucun password n'entre dans HTML, TypeScript ou les DTO Tauri.
## 8. Validation workspace — base `0.5.2-pre.006 + fix-010`
L'opérateur a validé :
```bash
cargo fmt --all
cargo check --workspace
cargo clippy --all-targets
python3 scripts/audit_rust_workspace_rules.py
cargo test --workspace
```
Résultats :
- `cargo check --workspace` : succès ;
- `cargo clippy --all-targets` : succès sans warning ;
- audit Rust général : clean ;
- export completeness : `0 candidate(s)` ;
- audit Khadhroony workspace : clean ;
- `cargo test --workspace` : succès sur toutes les crates et doc-tests ;
- `kb-app-demo-desktop` : 185 tests ;
- `ks-config` : 35 tests ;
- `ks-lib` : 606 tests ;
- `ks-logging` : 25 tests ;
- `ks-onchain-transport` : 124 tests ;
- `ks-pipeline` : 109 tests ;
- `ks-pipeline-demo-scenarios` : 109 tests + 2 tests CLI ;
- `ks-program-ids` : 6 tests ;
- `ks-store` : 84 tests ;
- `ks-wallet` : 22 unitaires + 7 legacy + 3 password natif + 2 API publique + 6 transfert ;
- `ks-wallet-demo-scenarios` : 1 test d'intégration password ;
- doc-tests : succès.
La `pre.007` ajoute seulement les canaris de non-divulgation legacy, le test concurrent natif et la clôture documentaire ; elle doit donc être rejouée avec la campagne standard avant le passage à `0.5.2` final.
## 9. Reports explicites
### `0.5.4`
- diagnostiquer/réparer la régression `unable to read configured Token-2022 fixture` observée après la séparation des racines wallet/fixtures ;
- scanner/inventorier bornément `wallets/temporary/**` ;
- extraire format/validité/pubkey sans inventer de rôle métier ;
- migrer sélectivement les signers devant devenir persistants ;
- laisser toute classification on-chain au consommateur, sans dépendance `ks-wallet -> ks-onchain-transport`.
### Version ultérieure non déterminée
- nouveaux formats Backpack, Trust Wallet, Solflare Keystore ou autres uniquement lorsqu'un wire suffisamment spécifié peut être validé et testé.
## 10. Statut
**Base fonctionnelle `0.5.2-pre.006 + fix-010` validée. `0.5.2-pre.007` est la prerelease de clôture à valider avant la release finale `0.5.2`.**