v0.2.5-pre.001
This commit is contained in:
239
deltas/0.2.5/pre.001.md
Normal file
239
deltas/0.2.5/pre.001.md
Normal file
@@ -0,0 +1,239 @@
|
||||
<!-- file: deltas/0.2.5/pre.001.md -->
|
||||
<!-- version: 2 -->
|
||||
|
||||
# Delta `0.2.5-pre.001` — audit Wallet, threat model, format V1 et sizing
|
||||
|
||||
## Base requise
|
||||
|
||||
Release stable attendue :
|
||||
|
||||
```text
|
||||
v0.2.4
|
||||
```
|
||||
|
||||
La base fournie confirme `workspace.package.version = 0.2.4` avant ouverture.
|
||||
|
||||
## Type de livraison
|
||||
|
||||
```text
|
||||
ksp-general-0.2.5-pre.001.zip
|
||||
```
|
||||
|
||||
L'archive d'échange est un **delta** applicable depuis la racine de `v0.2.4` et contient uniquement les fichiers ajoutés/modifiés par cette livraison, conformément à `VER-ARCHIVE-004`.
|
||||
|
||||
## Objet
|
||||
|
||||
Ouvrir `0.2.5 — Wallet foundation` sans commencer par une implémentation cryptographique. Ce delta :
|
||||
|
||||
- réaudite les Wallet historiques bot2/bot3 ;
|
||||
- classe les idées à réutiliser/refondre/abandonner/reporter ;
|
||||
- formalise le threat model offline du `.kspwallet` ;
|
||||
- arrête l'architecture indépendante VIEW/OWNER par content keys + key slots ;
|
||||
- retient le niveau B pour le read-only VIEW via une autorité Ed25519 de format distincte de la keypair Solana et couvrant tout état mutable/de sécurité ;
|
||||
- confirme que `.kspwallet` V1 est entièrement autonome et ne requiert aucun facteur/ancrage externe ;
|
||||
- rend la keypair Solana V1 immuable après création/import ;
|
||||
- exige une spec séparée `docs/formats/KSPWALLET_V1.md` suffisante pour une implémentation indépendante dans un autre langage ;
|
||||
- choisit l'enveloppe JSON V1 stricte et un transcript binaire sémantique plutôt qu'une signature des octets JSON ;
|
||||
- réaudite les crates Solana/crypto/persistence actuelles ;
|
||||
- fixe les candidats V1 sans les ajouter prématurément ;
|
||||
- distingue rotation de password et révocation cryptographique forte de VIEW ;
|
||||
- fixe le minimum import/export à Solana CLI JSON + keypair Base58 générique ;
|
||||
- redimensionne la release de 8 à 10 prereleases avant publication.
|
||||
|
||||
## Décisions principales
|
||||
|
||||
### Héritage
|
||||
|
||||
Réutiliser conceptuellement : strict 64-byte Solana keypair, signature sans getter secret, redaction/zeroize, `spawn_blocking`, CSPRNG OS, parsing borné, AEAD/AAD, no-clobber/atomic persistence, Solana CLI JSON, Base58 et inspection sûre.
|
||||
|
||||
Refondre : password model, format, alias, unlocked representation, persistence API, logging et adapters.
|
||||
|
||||
Abandonner : `.kswallet`, `KSWALLET`, alias/pubkey en clair, alias=filename, single password, chiffrement direct du keypair, JSON legacy/migration, `WalletPolicy`, direct `tracing`.
|
||||
|
||||
Reporter : mnemonic UI, proprietary wallets sans wire normatif prouvé, hardware/remote/recovery.
|
||||
|
||||
### Threat model
|
||||
|
||||
Le fichier volé est attaquable offline sans rate-limit. Les salts sont publics. Aucun pepper KSP n'existe. `.kspwallet` V1 est explicitement auto-contenu : aucun salt externe, pepper, OTP, service distant, keychain ou ancre externe n'est requis. Les altérations partielles et toute mutation sous l'autorité OWNER originale sont authentifiées ; la substitution/rollback total d'un fichier valide reste indétectable par le seul fichier auto-contenu et cette limite est documentée sans introduire de dépendance externe en V1.
|
||||
|
||||
### Key hierarchy
|
||||
|
||||
```text
|
||||
VIEW password -> Argon2id VIEW -> KEK VIEW -> wrap K_metadata
|
||||
OWNER password -> Argon2id OWNER -> KEK OWNER -> wrap K_owner_root
|
||||
|
||||
K_owner_root -> owner-control -> K_metadata + K_secret + admin signing secret
|
||||
K_metadata -> metadata -> Pubkey + alias + notes
|
||||
K_secret -> secret -> Solana keypair
|
||||
```
|
||||
|
||||
OWNER ne dépend jamais de VIEW.
|
||||
|
||||
### VIEW read-only
|
||||
|
||||
Le niveau B est retenu : une clé Ed25519 d'administration du format, distincte de la keypair Solana, signe un transcript déterministe de tout l'état mutable/de sécurité. VIEW peut lire les metadata mais ne peut pas produire sous l'autorité OWNER originale une mutation acceptée de metadata, key slots/passwords, compartments ou keypair. Les modifications physiques d'octets restent possibles pour un attaquant filesystem, mais elles sont rejetées si elles ne portent pas une signature OWNER valide.
|
||||
|
||||
Cette garantie ne couvre pas le remplacement complet du fichier **et** de sa propre clé publique de contrôle par un autre wallet auto-cohérent, ni le rollback intégral vers une ancienne copie valide. V1 n'utilise aucune ancre externe pour masquer cette limite.
|
||||
|
||||
### Rotation / révocation
|
||||
|
||||
`rotate_view_password` peut rewrap la même `K_metadata` et invalide l'ancien password pour le fichier courant. Une vraie révocation VIEW génère une nouvelle `K_metadata`, rechiffre metadata/control et recrée/supprime le slot VIEW.
|
||||
|
||||
`rotate_owner_password` rewrap `K_owner_root` et ne modifie pas la keypair Solana. La keypair Solana V1 est immuable après création/import ; une autre keypair correspond à un autre wallet, pas à une mutation du wallet existant.
|
||||
|
||||
### Format V1
|
||||
|
||||
```text
|
||||
JSON UTF-8 strict
|
||||
magic = KSPWALLET
|
||||
format_version = 1
|
||||
Base64url sans padding pour binary wire
|
||||
key_slots génériques, V1 = OWNER obligatoire + VIEW optionnel
|
||||
owner_control / metadata / secret séparés
|
||||
owner_auth_public_key visible, identité Solana cachée
|
||||
state_signature Ed25519 couvrant tout état mutable/de sécurité
|
||||
unknown fields/version = reject
|
||||
pas de checksum séparé
|
||||
aucune dépendance externe requise pour ouvrir/vérifier V1
|
||||
```
|
||||
|
||||
La signature porte sur un transcript binaire déterministe et domain-separated, pas sur une canonicalisation JSON.
|
||||
|
||||
### Crypto candidate
|
||||
|
||||
```text
|
||||
KDF Argon2id v19
|
||||
AEAD XChaCha20-Poly1305
|
||||
CSPRNG getrandom / OS
|
||||
memory zeroize
|
||||
admin auth Ed25519 standard, dépendance directe à confirmer par cargo tree
|
||||
```
|
||||
|
||||
Les paramètres Argon2 de création ne sont **pas** figés ici. Ils seront benchmarkés avant freeze et sérialisés par slot ; le parseur aura des caps anti-DoS avant KDF.
|
||||
|
||||
### Import/export minimum
|
||||
|
||||
```text
|
||||
solana-cli-json
|
||||
solana-keypair-base58
|
||||
```
|
||||
|
||||
Pas de nom/adapteur Phantom/Solflare/Backpack/Trust sans wire actuel suffisamment normatif.
|
||||
|
||||
## Prévision révisée
|
||||
|
||||
```text
|
||||
pre.001 audit + threat model + design + sizing
|
||||
pre.002 crate/API foundation + errors/logging/canaries
|
||||
pre.003 strict JSON wire + key slots + transcript/AAD + contrat docs/formats + spec initiale
|
||||
pre.004 KDF benchmark + AEAD/wrapping + vectors crypto in-memory
|
||||
pre.005 compartments + create/open VIEW/OWNER + state signature
|
||||
pre.006 persistence atomic/no-clobber + async + filesystem hardening
|
||||
pre.007 signing + metadata admin + rotations + VIEW strong revoke/recreate
|
||||
pre.008 extensible import/export + CLI JSON + Base58 + inspect
|
||||
pre.009 security/interoperability/compliance audit + adversarial tests + cargo trees
|
||||
pre.010 spec/README/USAGE/graphes/prompt Wallet Desk + candidate close
|
||||
rel.001 publication stricte
|
||||
```
|
||||
|
||||
Le plan détaillé est `docs/plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md`.
|
||||
|
||||
## Correction de l'artefact d'échange avant validation
|
||||
|
||||
Une première archive préparatoire avait été produite à tort comme copie complète du dépôt. Elle est **invalidée explicitement et ne doit pas être appliquée** : elle ne respectait pas `VER-ARCHIVE-001`/`VER-ARCHIVE-004`. Comme cette livraison n'a pas été validée ni indiquée comme commitée par l'opérateur, le présent artefact est la livraison `pre.001` correcte, reconstruite comme delta depuis `v0.2.4`; il ne s'agit pas d'un `fix` fonctionnel appliqué après commit.
|
||||
|
||||
La même revue a durci deux points de conception avant implémentation : autonomie absolue du format V1 et authentification OWNER de tout état mutable, avec la limite irréductible du remplacement total clairement séparée.
|
||||
|
||||
## Fichiers ajoutés
|
||||
|
||||
```text
|
||||
docs/plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md
|
||||
deltas/0.2.5/pre.001.md
|
||||
```
|
||||
|
||||
## Fichiers modifiés
|
||||
|
||||
```text
|
||||
Cargo.toml
|
||||
ROADMAP.md
|
||||
docs/000-README.md
|
||||
docs/plans/000-README.md
|
||||
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
|
||||
```
|
||||
|
||||
## Fichiers volontairement inchangés
|
||||
|
||||
```text
|
||||
CHANGELOG.md
|
||||
crates/**
|
||||
config/**
|
||||
docs/validation/**
|
||||
deltas/0.2.4/**
|
||||
```
|
||||
|
||||
Aucune crate Wallet ni dépendance crypto n'est ajoutée par le gate. Le changelog reste synchronisé en fin de session conformément à `VER-SESSION-005`.
|
||||
|
||||
## Audit de dépendances actuel
|
||||
|
||||
Constats externes au 2026-08-18, sans modification Cargo dans ce delta :
|
||||
|
||||
```text
|
||||
solana-pubkey 4.3.0
|
||||
solana-keypair 3.1.2
|
||||
solana-signer 3.0.1
|
||||
argon2 0.5.3
|
||||
scrypt 0.12.0
|
||||
pbkdf2 0.13.0
|
||||
chacha20poly1305 0.11.0
|
||||
aes-gcm-siv 0.12.0
|
||||
getrandom 0.4.3
|
||||
zeroize 1.9.0
|
||||
ed25519-dalek 3.0.0
|
||||
base64 0.23.1
|
||||
tempfile 3.27.0
|
||||
```
|
||||
|
||||
Les versions directes Solana/crypto seront réauditées au moment exact où chaque dépendance est introduite. `solana-signature 3.5.2` est la publication courante auditée ; son ajout direct reste conditionné à la surface publique réellement retenue et au cargo tree de ce moment.
|
||||
|
||||
## Validations exécutées
|
||||
|
||||
- inspection/réaduit de l'archive stable KSP `v0.2.4` fournie ;
|
||||
- relecture de l'index `RULES.md`, de l'ensemble des fichiers `docs/rules/*.md`, des documents architecture/plans/validation Wallet demandés et des conventions de delta/archive ;
|
||||
- confirmation des frontières Wallet déjà documentées et de `VER-ARCHIVE-004` ;
|
||||
- inspection globale de l'archive historique bot3 et lecture détaillée de `ks-wallet`, de ses tests, guides, plan/validation Wallet, format natif et héritage bot2 Wallet ;
|
||||
- inspection de l'ancien `TemporaryWalletStore` bot2 ;
|
||||
- réaudit des primitives/crates publiées actuelles nécessaires au plan ;
|
||||
- confirmation que le gate ne nécessite aucune nouvelle dépendance dans `pre.001` ;
|
||||
- vérification documentaire que le nouveau plan ne réintroduit ni Config, Transport, Store, Tauri ni WalletPolicy dans Wallet ;
|
||||
- contrôle que V1 ne requiert aucun facteur externe et que la spec multi-langages séparée est un critère de clôture ;
|
||||
- contrôle du contenu de l'archive d'échange selon `VER-ARCHIVE-004` : sept chemins seulement, tous ajoutés/modifiés par `pre.001`.
|
||||
|
||||
## Validations non exécutées
|
||||
|
||||
Le sandbox courant ne fournit pas le binaire `cargo`; les validations Cargo doivent être rejouées par l'opérateur avant commit :
|
||||
|
||||
```bash
|
||||
cargo fmt --all
|
||||
cargo check --workspace
|
||||
cargo clippy --workspace --all-targets
|
||||
```
|
||||
|
||||
`cargo test -p ksp-wallet-lib` n'est pas applicable à `pre.001` puisque la crate n'existe volontairement pas encore.
|
||||
|
||||
Aucun `cargo tree` ne peut être pertinent à ce stade puisque les dépendances ne changent pas. Il devient obligatoire dès leur introduction et à la compliance finale.
|
||||
|
||||
L'archive stable fournie ne contient pas `.git`; le commit attendu après application et validations suit :
|
||||
|
||||
```text
|
||||
v0.2.5-pre.001
|
||||
```
|
||||
|
||||
## Questions bloquantes
|
||||
|
||||
Aucune pour `pre.002`.
|
||||
|
||||
Les paramètres Argon2 de production sont volontairement **non décidés** avant benchmark ; ce n'est pas une question d'architecture bloquante.
|
||||
|
||||
## Suite
|
||||
|
||||
`0.2.5-pre.002` : créer `crates/ksp-wallet-lib` avec foundation API/capabilities, erreurs, logging KSP et canaries de frontières, sans encore implémenter le chiffrement `.kspwallet`.
|
||||
Reference in New Issue
Block a user