7.2 KiB
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
.kswalletbinaire, 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 :
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 :
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>.jsonnon 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 :
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 :
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é :
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 fixtureobservé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.