12 KiB
Delta 0.2.5-pre.002 — foundation crate/capabilities/passwords/errors/logging
Base requise
release : 0.2.5
prerelease : pre.002
identifiant de commit attendu : v0.2.5-pre.002
workspace.package.version : 0.2.5-pre.2
base : v0.2.5-pre.001-fix.001
Le delta pre.001-fix.001 est appliqué avant cette tranche. Les deltas historiques pre.001.md et pre.001-fix.001.md restent inchangés.
Objectif
Créer la foundation Rust de ksp-wallet-lib sans commencer encore le codec .kspwallet, le KDF/AEAD, la persistence, la keypair Solana ou la signature.
Cette tranche matérialise uniquement :
crate + frontières Cargo
WalletCapability
WalletView / WalletOwner opaques
LockedWalletInfo / WalletInfo / WalletNote
ViewPassword / OwnerPassword
codes d'erreur Wallet
contrat de logging KSP
canaries public API / dependency firewall
Les opérations create/open/rotate/sign/import/export restent volontairement absentes tant que leurs invariants cryptographiques/persistence ne sont pas implémentés dans les tranches prévues.
Version Cargo
Conformément à VER-ID-009 :
0.2.5-pre.1 -> 0.2.5-pre.2
Toutes les crates membres continuent d'hériter version.workspace = true.
Workspace et dépendances
Nouveau membre :
crates/ksp-wallet-lib
Dépendances directes :
ksp-core-lib
ksp-logging-lib
zeroize.workspace = true
zeroize est centralisé dans [workspace.dependencies] :
zeroize = { version = "^1.9" }
La génération courante zeroize 1.9.0 a été réauditée avant insertion. La crate est utilisée immédiatement pour nettoyer au Drop les buffers String possédés par les wrappers de passwords. Aucun secrecy, Argon2, AEAD, CSPRNG, Solana keypair/signer/signature ou codec supplémentaire n'est ajouté par anticipation.
Interdictions confirmées dans le manifest Wallet :
ksp-config-lib
ksp-onchain-transport-lib
ksp-execution-policy-api
ksp-store-api / ksp-store-lib
Tauri
tracing direct
solana-pubkey direct
Ownership de Pubkey
ksp-wallet-lib ne dépend pas directement de solana-pubkey.
Toute surface Wallet utilise :
ksp_core_lib::Pubkey
qui est le re-export possédé par ksp-core-lib. Les futures crates solana-keypair/solana-signer ne seront ajoutées que lorsqu'un chemin de compilation les consommera réellement ; leur compatibilité avec la génération de Pubkey possédée par Core sera alors contrôlée par compilation et cargo tree.
Aucun ownership Config
Wallet n'a aucune configuration runtime propre et ne lit ni document Config, ni .env, ni environnement processus.
Le futur chemin/répertoire de destination d'une création/import sera fourni explicitement par le caller. Une application pourra faire résoudre son propre défaut par Config puis transmettre ce chemin à Wallet sans créer de dépendance inverse Wallet -> Config.
Capabilities publiques
WalletCapability
Deux rôles uniquement :
View
Owner
View signifie metadata autorisées plus future rotation de son propre password VIEW uniquement.
Owner signifie metadata autorisées plus futures capacités de signature/export explicite/administration.
Aucun rôle recovery/hardware/automation n'est ajouté en V1.
WalletView
Handle opaque exposant actuellement uniquement la projection metadata :
capability() -> View
pubkey()
alias()
notes()
info()
Il n'expose aucun constructeur public, aucune signature, aucun export secret, aucune mutation alias/notes et aucune administration OWNER.
La future méthode de rotation de son propre password sera ajoutée lorsque le slot VIEW réel et sa persistence existent ; pre.002 ne simule pas cette opération.
WalletOwner
Handle opaque exposant actuellement la même lecture metadata autorisée :
capability() -> Owner
pubkey()
alias()
notes()
info()
Il n'expose encore ni secret ni signature ni méthode d'administration. Les opérations OWNER réelles sont ajoutées avec les matériaux cryptographiques/persistence correspondants dans les tranches suivantes.
Projections metadata
LockedWalletInfo contient uniquement :
format_version
view_enabled
Il ne contient aucune Pubkey, alias ou note.
WalletInfo contient après autorisation :
format_version
capability
ksp_core_lib::Pubkey
alias optionnel
notes
WalletNote expose un identifiant stable et un texte protégé après autorisation.
Les constructors de ces projections ne sont pas publics : elles sont destinées à être produites par Wallet, pas à fabriquer une capability.
Les Debug de WalletInfo/WalletNote ne rendent pas alias, identifiant de note ou contenu de note. La Pubkey peut apparaître dans WalletInfo::Debug car cette projection n'existe qu'après autorisation et la Pubkey n'est pas un secret blockchain ; Wallet verrouillé ne possède pas cette projection.
Password wrappers
Deux types distincts :
ViewPassword
OwnerPassword
Ils :
- prennent ownership d'un
String; - n'implémentent ni
CloneniCopy; - n'implémentent pas
Display; - exposent un
Debugstrictement redacted ; - implémentent un
Dropappelantzeroize::Zeroizesur le buffer possédé ; - n'exposent aucun getter public du password en clair.
Deux doctests compile_fail canaris interdisent la régression vers Clone.
Cette zeroization reste une hygiène best-effort sur le buffer possédé et ne prétend pas effacer des copies antérieures conservées par le caller, l'allocateur, les registres ou d'autres couches du runtime.
Erreurs
Le domaine stable est :
wallet
Les 13 codes réservés/stabilisés dans cette foundation sont :
format_invalid
format_version_unsupported
crypto_parameters_invalid
authentication_failed
view_unlock_failed
owner_unlock_failed
capability_insufficient
io_failed
destination_exists
atomic_persistence_failed
transfer_format_unsupported
key_material_invalid
signature_failed
Ils utilisent exclusivement ksp_core_lib::ErrorCode. Aucun type d'erreur parallèle n'est créé.
Les codes de déverrouillage restent volontairement orientés rôle/opération afin que l'implémentation crypto future puisse éviter de distinguer publiquement password incorrect, unwrap incorrect et tag AEAD incorrect lorsqu'une telle distinction créerait un oracle inutile.
Logging
Le target Wallet est possédé explicitement par :
crates/ksp-wallet-lib/src/constants.rs
avec :
pub(crate) const TRACING_TARGET: &str = "ksp-wallet-lib";
Les émissions utilisent exclusivement ksp_logging_lib::* et jamais tracing directement ni env!("CARGO_PKG_NAME") comme target.
La foundation instrumente seulement la demande explicite de projection info() au niveau trace, avec :
operation=wallet_info_projection
capability=view|owner
Aucun alias, note, password, secret, payload arbitraire ou path n'est loggé.
Tests ajoutés
La tranche définit 13 tests Rust déterministes plus 2 doctests compile_fail :
- variants
WalletCapability; - redaction
Debugdes deux password wrappers ; - présence d'un
Droppour les wrappers secrets ; - projection metadata autorisée ;
- redaction alias/note dans
Debug; - projection locked sans identité/metadata ;
- canary crate-root pour
WalletView/WalletOwner/WalletCapability; - canary crate-root pour les wrappers de password ;
- signatures de méthodes Pubkey typées en
ksp_core_lib::Pubkey; - disponibilité des 13 codes d'erreur depuis le crate root ;
- manifest firewall Wallet ;
- source ownership canary Core Pubkey / Logging facade / absence env direct.
Les tests d'intégration de firewall restent spécifiques à ksp-wallet-lib; aucun nouveau canary général du workspace n'est déplacé arbitrairement dans cette crate.
Documentation synchronisée
Le plan Wallet est passé en version 5 pour :
- figer
ksp_core_lib::Pubkeycomme seule frontière Pubkey de Wallet ; - corriger le target de logging vers
ksp-wallet-libdanssrc/constants.rsconformément àDEP-LOG-010; - enregistrer
zeroize ^1.9comme seul ajout tiers depre.002; - repousser les crates Solana directes à leur premier usage réel ;
- confirmer qu'aucun répertoire par défaut n'appartient à Wallet et que le path sera fourni par le caller ;
- pointer la suite immédiate sur
pre.003.
ROADMAP.md et docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md enregistrent la matérialisation de la foundation sans recopier le détail des futures prereleases.
Fichiers ajoutés
crates/ksp-wallet-lib/Cargo.toml
crates/ksp-wallet-lib/src/capability.rs
crates/ksp-wallet-lib/src/constants.rs
crates/ksp-wallet-lib/src/error.rs
crates/ksp-wallet-lib/src/lib.rs
crates/ksp-wallet-lib/src/metadata.rs
crates/ksp-wallet-lib/src/owner.rs
crates/ksp-wallet-lib/src/password.rs
crates/ksp-wallet-lib/src/view.rs
crates/ksp-wallet-lib/unit_tests/capability.rs
crates/ksp-wallet-lib/unit_tests/metadata.rs
crates/ksp-wallet-lib/unit_tests/password.rs
crates/ksp-wallet-lib/tests/dependency_boundary.rs
crates/ksp-wallet-lib/tests/public_api.rs
deltas/0.2.5/pre.002.md
Fichiers modifiés
Cargo.toml
ROADMAP.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md
Fichiers supprimés
Aucun.
Validations exécutées dans l'environnement de préparation
Contrôles statiques réellement exécutés :
- parsing TOML du
Cargo.tomlracine et du manifest Wallet ; - comparaison de l'arbre avec la base
pre.001-fix.001; - inventaire exact des fichiers ajoutés/modifiés ;
- scan des sources Wallet : aucun
usestatement ; - scan production : aucun
unwrap,expect,panic, opérateur?ou blocunsafeajouté ; - manifest firewall : absence Config/Transport/ExecutionPolicy/Store/Tauri/tracing/solana-pubkey directs ;
- source ownership :
ksp_core_lib::Pubkey,ksp_logging_lib::trace!, target expliciteksp-wallet-lib, aucunsolana_pubkey::,tracing::oustd::env::; - contrôle des headers
file:/version:des fichiers ajoutés/modifiés ; - contrôle de l'archive d'échange contre
VER-ARCHIVE-004avant livraison.
Validations non exécutées
L'environnement de préparation ne fournit pas la toolchain Rust/Cargo. Les validations suivantes doivent donc être exécutées par l'opérateur après application du delta :
cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-wallet-lib
Un cargo tree complet des primitives Solana/crypto n'est pas encore pertinent : aucune primitive Solana/keypair/KDF/AEAD nouvelle n'est ajoutée en pre.002. zeroize doit néanmoins apparaître sans duplication injustifiée lors du contrôle Cargo opérateur.
Décisions prises
PubkeyWallet est exclusivementksp_core_lib::Pubkey; aucune dépendance directesolana-pubkeydans Wallet.- Logging Wallet utilise exclusivement
ksp-logging-libetTRACING_TARGET = "ksp-wallet-lib"danssrc/constants.rs. - Wallet ne dépend pas de Config et ne choisira pas lui-même un répertoire par défaut ; le caller fournit le path.
zeroize ^1.9est le seul nouveau tiers depre.002.- Les password wrappers sont distincts OWNER/VIEW, owned, redacted, non-Clone et zeroized au drop.
- Les handles VIEW/OWNER restent opaques et ne simulent aucune opération cryptographique non encore implémentée.
- VIEW conserve comme contrat futur la seule mutation de son propre password ; OWNER conserve les futures rotations OWNER/VIEW et l'administration complète.
Questions ouvertes
Aucune question bloquante pour pre.003.
Restent volontairement à décider/figer dans leurs tranches prévues :
- wire exact JSON/key slots/transcript/AAD (
pre.003) ; - paramètres Argon2 benchmarkés et crypto effective (
pre.004) ; - matériaux owner-control/metadata/secret et state signature (
pre.005) ; - persistence async/atomique/no-clobber (
pre.006) ; - keypair/signature et rotations réelles (
pre.007) ; - adapters import/export (
pre.008).