v0.5.2-pre.007
This commit is contained in:
185
docs/validation/V0_5_2_WALLET_VALIDATION_REPORT.md
Normal file
185
docs/validation/V0_5_2_WALLET_VALIDATION_REPORT.md
Normal 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`.**
|
||||
Reference in New Issue
Block a user