v0.2.5-pre.003
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md -->
|
||||
<!-- version: 5 -->
|
||||
<!-- version: 6 -->
|
||||
|
||||
# Plan `0.2.5` — Wallet foundation
|
||||
|
||||
@@ -308,7 +308,7 @@ exactement 1 slot OWNER
|
||||
0 ou 1 slot VIEW
|
||||
```
|
||||
|
||||
Le slot OWNER et l'état de contrôle sont OWNER-signed. Pour VIEW, l'état OWNER-signed contient un **descripteur stable** (`enabled`, rôle et identifiant de slot ou équivalent wire à figer en `pre.003`). Lorsque VIEW est activé, le fichier doit contenir exactement un slot VIEW correspondant à ce descripteur. Ses paramètres Argon2id autorisés, son salt et son nonce/ciphertext de wrapping restent rotatables sans OWNER, mais les algorithmes V1, son rôle, son identité et son activation ne le sont pas. Le wrapping VIEW utilise un AAD qui lie au minimum format/version, autorité wallet, rôle VIEW et identifiant signé du slot.
|
||||
Le slot OWNER et l'état de contrôle sont OWNER-signed. Pour VIEW, l'état OWNER-signed contient un **descripteur stable** (`enabled` et `slot_id`), figé par le wire V1 de `pre.003`. Lorsque VIEW est activé, le fichier doit contenir exactement un slot VIEW correspondant à ce descripteur. Ses paramètres Argon2id autorisés, son salt et son nonce/ciphertext de wrapping restent rotatables sans OWNER, mais les algorithmes V1, son rôle, son identité et son activation ne le sont pas. Le wrapping VIEW utilise un AAD qui lie au minimum format/version, autorité wallet, rôle VIEW et identifiant signé du slot.
|
||||
|
||||
Le wire utilise néanmoins un tableau générique `key_slots` afin qu'un futur `format_version` puisse introduire d'autres rôles sans remodeler toute l'enveloppe.
|
||||
|
||||
@@ -461,7 +461,7 @@ Le fichier JSON n'est **jamais** signé comme octets JSON bruts et aucune canoni
|
||||
|
||||
### 9.2 Enveloppe conceptuelle
|
||||
|
||||
Structure de travail à figer par le codec `pre.003` :
|
||||
Structure V1 figée par le codec `pre.003` (les longueurs/encodages exacts sont normatifs dans `docs/formats/KSPWALLET_V1.md`) :
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -474,6 +474,7 @@ Structure de travail à figer par le codec `pre.003` :
|
||||
},
|
||||
"key_slots": [
|
||||
{
|
||||
"slot_id": "<base64url 16 octets>",
|
||||
"role": "owner|view",
|
||||
"kdf": {
|
||||
"algorithm": "argon2id",
|
||||
@@ -491,16 +492,19 @@ Structure de travail à figer par le codec `pre.003` :
|
||||
}
|
||||
],
|
||||
"owner_control": {
|
||||
"control_version": 1,
|
||||
"algorithm": "xchacha20-poly1305",
|
||||
"nonce": "<base64url>",
|
||||
"ciphertext": "<base64url>"
|
||||
},
|
||||
"metadata": {
|
||||
"metadata_version": 1,
|
||||
"algorithm": "xchacha20-poly1305",
|
||||
"nonce": "<base64url>",
|
||||
"ciphertext": "<base64url>"
|
||||
},
|
||||
"secret": {
|
||||
"secret_version": 1,
|
||||
"algorithm": "xchacha20-poly1305",
|
||||
"nonce": "<base64url>",
|
||||
"ciphertext": "<base64url>"
|
||||
@@ -544,7 +548,7 @@ content keys
|
||||
password-derived keys
|
||||
```
|
||||
|
||||
La clé publique d'administration révèle un fingerprint aléatoire du **format wallet**, pas l'identité blockchain Solana. Elle constitue la racine de vérification **embarquée** de l'état sous la même autorité OWNER ; sa présence ne crée aucune dépendance à un facteur externe. Le placement et l'encodage exacts de `view_descriptor` restent à figer en `pre.003` ; son invariant est qu'il est OWNER-signed alors que seuls les champs de protection du slot VIEW correspondant sont self-rotatables.
|
||||
La clé publique d'administration révèle un fingerprint aléatoire du **format wallet**, pas l'identité blockchain Solana. Elle constitue la racine de vérification **embarquée** de l'état sous la même autorité OWNER ; sa présence ne crée aucune dépendance à un facteur externe. `pre.003` fige `view_descriptor` avec `enabled` + `slot_id`: `slot_id` vaut exactement 16 octets Base64url lorsque VIEW est activé et `null` lorsqu'il est désactivé ; le descripteur est OWNER-signed alors que seuls les champs de protection du slot VIEW correspondant sont self-rotatables.
|
||||
|
||||
### 9.4 Pubkey et secret payload
|
||||
|
||||
@@ -577,7 +581,7 @@ id = 16 octets aléatoires, Base64url sans padding
|
||||
data = texte UTF-8 protégé
|
||||
```
|
||||
|
||||
L'ID facilite update/delete sans rendre le texte lui-même identifiant. Les bornes restent vérifiables pendant `pre.003`; toute modification avant freeze wire doit être tracée.
|
||||
L'ID facilite update/delete sans rendre le texte lui-même identifiant. `pre.003` fige ces bornes structurelles V1 ; les payloads plaintext exacts restent implémentés dans les tranches suivantes sans modifier ces plafonds.
|
||||
|
||||
### 9.6 Password text contract
|
||||
|
||||
@@ -659,7 +663,7 @@ identifiants algo/version pertinents
|
||||
paramètres publics nécessaires à lier le ciphertext à son contexte
|
||||
```
|
||||
|
||||
Le layout exact du transcript et de chaque AAD devient normatif dans `docs/formats/KSPWALLET_V1.md` et dans les vecteurs déterministes.
|
||||
`pre.003` fige le layout exact dans `docs/formats/KSPWALLET_V1.md` : domain separator ASCII terminé par `0x00`, puis champs TLV `tag u16 BE || length u64 BE || value`; les `u32` sont encodés sur 4 octets big-endian. Le transcript OWNER inclut le slot OWNER complet et le descripteur VIEW stable mais exclut KDF/salt/wrap VIEW self-service. Les AAD OWNER/VIEW et owner-control/metadata/secret utilisent des domain separators distincts. Les vecteurs déterministes de la tranche verrouillent les octets produits.
|
||||
|
||||
## 11. Secret en mémoire
|
||||
|
||||
@@ -1193,4 +1197,4 @@ Une future `format_version >= 2` pourra réétudier des facteurs/ancrages extern
|
||||
|
||||
## 26. Suite immédiate
|
||||
|
||||
`0.2.5-pre.003` est la suite immédiate : codec JSON strict, limites, DTOs d’enveloppe/key slots, transcript/AAD et première spécification `docs/formats/KSPWALLET_V1.md`. La cryptographie effective KDF/AEAD reste à `pre.004+`.
|
||||
`0.2.5-pre.003` fige désormais 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`. La fixture `kspwallet_v1_wire_only.json` est volontairement structurelle et non cryptographiquement valide. La suite immédiate devient `pre.004` : benchmark des defaults Argon2 puis KDF/AEAD/wrapping/CSPRNG effectifs et premiers vecteurs cryptographiques publics.
|
||||
|
||||
Reference in New Issue
Block a user