v0.2.5-pre.008
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/IDEAS.md -->
|
||||
<!-- version: 18 -->
|
||||
<!-- version: 19 -->
|
||||
|
||||
# Idées à explorer
|
||||
|
||||
@@ -188,8 +188,8 @@ Le format natif KSP est `.kspwallet`. L'architecture d'import/export doit rester
|
||||
|
||||
Formats/cibles à inventorier et prioriser selon usage réel :
|
||||
|
||||
- Solana CLI keypair JSON ;
|
||||
- keypair Base58 complet lorsque pertinent ;
|
||||
- Solana CLI keypair JSON — **acquis dans `0.2.5-pre.008`** ;
|
||||
- keypair Base58 complet — **acquis dans `0.2.5-pre.008`** ;
|
||||
- Phantom, en privilégiant le wire Solana générique réellement documenté plutôt qu'un codec de marque inutile ;
|
||||
- Solflare, y compris réévaluation du keystore protégé seulement si son format public devient suffisamment stable pour un round-trip testé ;
|
||||
- Backpack : caractériser le wire Solana exact de l'import `Private key` avant tout codec/alias dédié ;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/formats/KSPWALLET_V1.md -->
|
||||
<!-- version: 5 -->
|
||||
<!-- version: 6 -->
|
||||
|
||||
# `.kspwallet` V1 — spécification du format natif Wallet KSP
|
||||
|
||||
@@ -20,7 +20,7 @@ AAD des compartiments owner-control / metadata / secret
|
||||
règles unknown-field / unknown-version
|
||||
```
|
||||
|
||||
`0.2.5-pre.004` ajoute les primitives KDF/AEAD normatives et un premier vecteur cryptographique public. `0.2.5-pre.005` fixe les payloads plaintext V1, l'autorité Ed25519 OWNER, les procédures de création et d'ouverture VIEW/OWNER, le profil de création KSP issu du benchmark opérateur et un vecteur `.kspwallet` complet généré indépendamment du code Rust. `0.2.5-pre.006` matérialise la persistence filesystem bornée et la création no-clobber. `0.2.5-pre.007` matérialise la signature Solana OWNER, l'administration des metadata, les rotations OWNER/VIEW, la révocation forte VIEW et leur remplacement filesystem capability-bound. Les adapters import/export restent dans les tranches suivantes. Toute évolution qui modifie un élément déjà déclaré **figé** par cette spécification exige une évolution explicitement tracée avant la release stable ; après publication de V1, une incompatibilité de wire exige un nouveau `format_version`.
|
||||
`0.2.5-pre.004` ajoute les primitives KDF/AEAD normatives et un premier vecteur cryptographique public. `0.2.5-pre.005` fixe les payloads plaintext V1, l'autorité Ed25519 OWNER, les procédures de création et d'ouverture VIEW/OWNER, le profil de création KSP issu du benchmark opérateur et un vecteur `.kspwallet` complet généré indépendamment du code Rust. `0.2.5-pre.006` matérialise la persistence filesystem bornée et la création no-clobber. `0.2.5-pre.007` matérialise la signature Solana OWNER, l'administration des metadata, les rotations OWNER/VIEW, la révocation forte VIEW et leur remplacement filesystem capability-bound. `0.2.5-pre.008` matérialise les adapters Solana CLI JSON et Base58 complet, leur inspection sûre, l'import no-clobber vers un nouveau `.kspwallet` et l'export secret OWNER explicite. Toute évolution qui modifie un élément déjà déclaré **figé** par cette spécification exige une évolution explicitement tracée avant la release stable ; après publication de V1, une incompatibilité de wire exige un nouveau `format_version`.
|
||||
|
||||
Le but final est qu'une implémentation indépendante en Rust, Python, Go, C/C++, Java ou autre puisse créer, parser, vérifier et ouvrir un `.kspwallet` sans lire le code source de `ksp-wallet-lib`.
|
||||
|
||||
@@ -665,13 +665,13 @@ Le premier vecteur cryptographique public KDF+wrapping est ajouté par `pre.004`
|
||||
|
||||
## 19. Invariants encore à compléter sans modifier le wire figé
|
||||
|
||||
Après `pre.005`, les tranches restantes portent sur les opérations autour du format déjà défini :
|
||||
Les opérations autour du wire V1 sont désormais matérialisées jusqu'aux adapters de transfert :
|
||||
|
||||
```text
|
||||
pre.006 : persistence async/atomique/no-clobber
|
||||
pre.007 : signature Solana, metadata admin, rotations OWNER/VIEW et révocation forte VIEW
|
||||
pre.008 : import/export
|
||||
pre.009+ : audit adversarial, compliance et documentation de clôture
|
||||
pre.006 : persistence async/atomique/no-clobber acquis
|
||||
pre.007 : signature Solana, metadata admin, rotations et révocation acquis
|
||||
pre.008 : import/export Solana CLI JSON + Base58 complet acquis
|
||||
pre.009+ : audit adversarial, compliance et documentation de clôture restant
|
||||
```
|
||||
|
||||
Toute découverte imposant de modifier la grammaire, les payloads plaintext, les tags, l'ordre transcript ou les domain separators définis dans ce document doit être traitée explicitement avant la publication stable, jamais masquée par une tolérance du parseur.
|
||||
@@ -930,3 +930,61 @@ caller path explicite
|
||||
La couche filesystem est async-first, mais les appels OS bloquants sont regroupés derrière `tokio::task::spawn_blocking`. KSP ne lit ni Config ni environnement pour choisir le chemin et ne journalise pas les chemins par défaut. Les mutations `pre.007` réutilisent la même stratégie temp/sync pour un remplacement **capability-bound** avec contrôle d'état attendu décrit en section 21.9 ; ce remplacement n'est jamais exposé comme primitive publique générique et ne modifie pas la règle create/import = no-clobber.
|
||||
|
||||
La durabilité est décrite sans surpromesse : `persist_noclobber` ne garantit pas une atomicité universelle sur tous les filesystems et un crash brutal peut laisser un artefact ou hard-link temporaire complet. KSP garantit le no-clobber et l'absence de publication partielle dans le flux normal et dans les fault tests avant publication ; il ne garantit pas la suppression des temporaires après kill/power-loss ni une durabilité identique de l'entrée de répertoire sur tous les OS. Ces limites concernent la persistence et ne changent pas les garanties cryptographiques du format.
|
||||
|
||||
## 24. Adapters de transfert matérialisés par `pre.008`
|
||||
|
||||
Les formats de transfert ne modifient pas le wire `.kspwallet` V1. Ils servent uniquement à importer/exporter la keypair Solana immuable de 64 octets. Deux formats sont retenus immédiatement :
|
||||
|
||||
```text
|
||||
solana_cli_json JSON array de exactement 64 entiers u8
|
||||
solana_keypair_base58 Base58 canonique de la keypair complète 64 octets
|
||||
```
|
||||
|
||||
### 24.1 Solana CLI JSON
|
||||
|
||||
Le format correspond au codec `solana-keypair` actuel : un tableau JSON contenant exactement les 64 octets de la keypair. KSP accepte les espaces JSON usuels mais exige exactement 64 valeurs `0..255`, puis reconstruit la keypair avec validation de cohérence secret/public. La taille du source est bornée à **1024 octets** avant parsing.
|
||||
|
||||
### 24.2 Base58 de keypair complète
|
||||
|
||||
Le format Base58 encode les **64 octets complets** de la keypair, et non seulement le secret seed de 32 octets. KSP utilise le codec maintenu par `solana-keypair`, refuse le whitespace périphérique et impose `decode -> re-encode == input` afin de n'accepter que la représentation canonique. La taille du source est bornée à **128 octets** avant décodage. Aucun `bs58` direct n'est ajouté à Wallet.
|
||||
|
||||
### 24.3 Inspection sûre
|
||||
|
||||
`inspect_wallet_transfer` et `inspect_wallet_transfer_file` exigent que le caller choisisse explicitement le format. KSP ne fait pas d'auto-détection heuristique. Après validation complète de la keypair, l'inspection expose seulement :
|
||||
|
||||
```text
|
||||
Pubkey Solana via ksp_core_lib::Pubkey
|
||||
WalletTransferFormat
|
||||
```
|
||||
|
||||
Aucun secret, seed, keypair brute, alias ou note n'est projeté.
|
||||
|
||||
### 24.4 Import vers `.kspwallet`
|
||||
|
||||
Un import valide :
|
||||
|
||||
```text
|
||||
source transfer validée
|
||||
-> même keypair Solana 64 octets
|
||||
-> nouvelles clés OWNER/admin/content KSP
|
||||
-> nouveaux slots OWNER/VIEW selon passwords fournis
|
||||
-> nouvelles metadata KSP fournies par le caller
|
||||
-> nouveau document .kspwallet V1
|
||||
-> publication no-clobber
|
||||
```
|
||||
|
||||
La source n'est jamais modifiée. Une destination `.kspwallet` existante retourne `wallet.destination_exists`. L'import n'est donc jamais une mutation ou un remplacement de keypair d'un wallet V1 existant.
|
||||
|
||||
### 24.5 Export OWNER
|
||||
|
||||
Seul `WalletOwner` expose l'export. `WalletView` ne possède aucune API correspondante. Deux formes existent :
|
||||
|
||||
```text
|
||||
export_transfer(format)
|
||||
export_transfer_file(destination, format)
|
||||
```
|
||||
|
||||
La première retourne au caller des octets contenant volontairement le secret et exige donc que le caller en limite la durée de vie et les zeroize lorsque pertinent. La seconde publie un nouveau fichier en no-clobber ; sur Unix, KSP tente `0600` comme hygiène filesystem, sans transformer cette permission en garantie cryptographique du format. Aucun chemin n'est découvert via Config ou environnement.
|
||||
|
||||
Les exports Base58 et Solana CLI JSON doivent reconstruire exactement la même keypair et la même Pubkey que le wallet OWNER source.
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/000-README.md -->
|
||||
<!-- version: 43 -->
|
||||
<!-- version: 44 -->
|
||||
|
||||
# Plans KSP
|
||||
|
||||
@@ -20,7 +20,7 @@ Un plan décrit le périmètre, les décisions déjà acquises, les questions ou
|
||||
- [`009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md`](009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md) — plan clôturé de la release stable `0.2.2`, établi par `pre.001`, corrigé après réaudit Agave v4.2.1 puis exécuté jusqu'à `pre.007-fix.002`; il couvre les 22 wrappers Accounts/Tokens/Cluster, le smoke Transport opt-in et la préparation de `0.2.3`.
|
||||
- [`010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md`](010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md) — plan historique clôturé de la release stable `0.2.3 — HTTP Transactions`, ouvert par `pre.001`, exécuté jusqu'à `pre.009` puis publié par `rel.001`; il couvre les 11 méthodes, la classification `8 Read / 2 WriteSubmission / 1 Simulation`, `KSP-TRANSPORT-007`, le no-resend et la préparation de `0.2.4`.
|
||||
- [`011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md`](011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md) — plan historique clôturé de la release stable `0.2.4`, ouvert par `pre.001`, exécuté jusqu’à `pre.009`, complété par le fix documentaire Wallet `pre.009-fix.001` puis publié par `rel.001`; il couvre les 10 Blocks + 5 Economics et la compliance finale `52/52 + 14/14` sous `KSP-TRANSPORT-007`.
|
||||
- [`012-V0_2_5_WALLET_FOUNDATION_PLAN.md`](012-V0_2_5_WALLET_FOUNDATION_PLAN.md) — plan actif de `0.2.5 — Wallet foundation`, ouvert par `pre.001`; `pre.002` matérialise la crate, `pre.003` fige le wire JSON V1/transcript/AAD, `pre.004` ajoute Argon2id/XChaCha20-Poly1305/CSPRNG et `pre.005` fixe les payloads, le profil de création benchmarké, l’autorité Ed25519 séparée et les flux in-memory create/open VIEW/OWNER avec vecteur complet interopérable. `pre.006` porte la persistence atomique/no-clobber.
|
||||
- [`012-V0_2_5_WALLET_FOUNDATION_PLAN.md`](012-V0_2_5_WALLET_FOUNDATION_PLAN.md) — plan actif de `0.2.5 — Wallet foundation`, ouvert par `pre.001`; wire/crypto/capabilities sont acquis jusqu’à `pre.005`, persistence no-clobber en `pre.006`, administration/signature/rotations en `pre.007`, puis import/export Solana CLI JSON + Base58 complet et inspection sûre en `pre.008`. `pre.009` porte le gate security/compliance avant la clôture documentaire `pre.010`.
|
||||
|
||||
Le `pre.001` de chaque release fonctionnelle peut introduire son propre plan détaillé lorsque la release s'ouvre.
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md -->
|
||||
<!-- version: 52 -->
|
||||
<!-- version: 53 -->
|
||||
|
||||
# Séquence des releases fonctionnelles KSP
|
||||
|
||||
@@ -418,7 +418,7 @@ La release doit fournir `docs/formats/KSPWALLET_V1.md` comme spécification sép
|
||||
|
||||
`0.2.5-pre.006` ajoute la persistence native sans Config : `create_wallet_file_v1` reçoit un chemin explicite du caller et publie uniquement en no-clobber via un fichier temporaire créé dans le même répertoire, écrit puis `sync_all` avant `persist_noclobber`; `open_wallet_view_file_v1`, `open_wallet_owner_file_v1` et `inspect_locked_wallet_file_v1` effectuent une lecture bornée à la limite V1 avant de déléguer au parser/crypto acquis. Les opérations filesystem bloquantes sont isolées par `spawn_blocking`. Les tests couvrent destination existante, concurrence avec un seul gagnant, fault injection avant publication, cleanup ordinaire des temporaires et rejet d'un fichier surdimensionné. La synchronisation du répertoire parent est best-effort sur Unix et n'est pas transformée en garantie portable de crash-durability. Les ACL/permissions OS restent hors du modèle Wallet.
|
||||
|
||||
`0.2.5-pre.007` complète l'administration native capability-bound : OWNER signe des messages Solana sans getter secret, modifie alias/notes, change son password ou celui de VIEW et peut disable/recreate VIEW avec rekey metadata fort ; VIEW ne peut que tourner son propre credential en rewrappant le même `K_metadata`. Les mutations sont staged puis remplacent le fichier uniquement si la destination courante correspond encore à l'enveloppe authentifiée attendue ; un handle stale ou une mauvaise cible reçoit `wallet.state_conflict`. Ce garde-fou ne prétend pas fournir un CAS filesystem portable ni un anti-rollback externe. La keypair reste encapsulée dans Wallet et aucune nouvelle dépendance tierce n'est ajoutée. `pre.008` reprend les adapters import/export Solana CLI JSON et Base58 générique.
|
||||
`0.2.5-pre.007` complète l'administration native capability-bound : OWNER signe des messages Solana sans getter secret, modifie alias/notes, change son password ou celui de VIEW et peut disable/recreate VIEW avec rekey metadata fort ; VIEW ne peut que tourner son propre credential en rewrappant le même `K_metadata`. Les mutations sont staged puis remplacent le fichier uniquement si la destination courante correspond encore à l'enveloppe authentifiée attendue ; un handle stale ou une mauvaise cible reçoit `wallet.state_conflict`. Ce garde-fou ne prétend pas fournir un CAS filesystem portable ni un anti-rollback externe. La keypair reste encapsulée dans Wallet et aucune nouvelle dépendance tierce n'est ajoutée. `pre.008` ajoute ensuite les adapters `solana_cli_json` et `solana_keypair_base58`, l’inspection sûre limitée à Pubkey+format, l’import no-clobber vers un nouveau `.kspwallet` et l’export OWNER en mémoire/fichier. La source d’import reste inchangée, VIEW n’exporte jamais, aucun `bs58` direct n’est ajouté puisque `solana-keypair 3.1.2` possède déjà le codec Base58 complet. `pre.009` devient le prochain gate security/compliance.
|
||||
|
||||
## `0.2.6` — Wallet Desk
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md -->
|
||||
<!-- version: 10 -->
|
||||
<!-- version: 11 -->
|
||||
|
||||
# Plan `0.2.5` — Wallet foundation
|
||||
|
||||
@@ -1255,4 +1255,4 @@ Une future `format_version >= 2` pourra réétudier des facteurs/ancrages extern
|
||||
|
||||
## 26. Suite immédiate
|
||||
|
||||
`0.2.5-pre.003` fige le codec JSON strict, les limites structurelles, `slot_id` 16 octets, le descripteur VIEW, les DTOs d’enveloppe/key slots, les TLV transcript/AAD et la première spécification `docs/formats/KSPWALLET_V1.md`. `pre.004` ajoute Argon2id/XChaCha20-Poly1305/CSPRNG OS et le wrapping de content keys. Le benchmark opérateur permet à `pre.005` de retenir le profil initial `64 MiB / 3 / 1`, de figer les payloads `owner_control`/metadata/secret, d'introduire l'autorité Ed25519 OWNER distincte de la keypair Solana et de publier un vecteur complet. `pre.006` ajoute la persistence no-clobber et les ouvertures fichier. `pre.007` ajoute maintenant signature Solana, administration metadata, rotations OWNER/VIEW, révocation forte VIEW et remplacement administratif contrôlé. **La suite immédiate est `pre.008` : adapters import/export, Solana CLI JSON, keypair Base58 générique et inspect des formats de transfert**, sans déplacer les secrets ni la logique Wallet dans Config.
|
||||
`0.2.5-pre.003` fige le codec JSON strict, les limites structurelles, `slot_id` 16 octets, le descripteur VIEW, les DTOs d’enveloppe/key slots, les TLV transcript/AAD et la première spécification `docs/formats/KSPWALLET_V1.md`. `pre.004` ajoute Argon2id/XChaCha20-Poly1305/CSPRNG OS et le wrapping de content keys. Le benchmark opérateur permet à `pre.005` de retenir le profil initial `64 MiB / 3 / 1`, de figer les payloads `owner_control`/metadata/secret, d'introduire l'autorité Ed25519 OWNER distincte de la keypair Solana et de publier un vecteur complet. `pre.006` ajoute la persistence no-clobber et les ouvertures fichier. `pre.007` ajoute signature Solana, administration metadata, rotations OWNER/VIEW, révocation forte VIEW et remplacement administratif contrôlé. `pre.008` ajoute maintenant les adapters import/export Solana CLI JSON et keypair Base58 complet, l'inspection sûre, l'import vers un nouveau `.kspwallet` no-clobber et l'export OWNER explicite sans `bs58` direct. **La suite immédiate est `pre.009` : audit adversarial/security/compliance et graphes Cargo**, avant la documentation finale `pre.010`.
|
||||
|
||||
Reference in New Issue
Block a user