PD-243 — Specification canonique contractuelle
Navigation User Story
| Document | | | ---------- | -- | | [Expression de besoin](PD-243-besoin.md) | | | **Specification** | *(ce document)* | | [Plan d'implementation](PD-243-plan.md) | | | [Criteres d'acceptation](PD-243-acceptability.md) | | | [Retour d'experience](PD-243-rex.md) | | [← Retour a crypto](../PD-189-epic.md)
1. References
- Story: PD-243
- JIRA: PD-243
- Epic: PD-189 — CRYPTO
- Composant cible: derivation de cles applicative (ProbatioVault-app)
- Documents relies:
- Architecture cryptographique v4.1 (doc 42)
- Anomalie PD-34 (labels HKDF)
- Learnings: PD-34, PD-97, PD-242, PD-33
2. Objectif
Aligner contractuellement la derivation de K_auth avec la hierarchie de cles issue de K_master, et corriger l'anomalie de label HKDF Kdoc -> K_doc, sans regression sur les derivations existantes.
3. Description fonctionnelle
3.1 Exigences fonctionnelles normatives
| ID | Exigence | Testable |
| REQ-243-01 | Le systeme DOIT exposer une capacite de derivation K_auth a partir de K_master | Oui |
| REQ-243-02 | K_auth DOIT etre derivee via HKDF avec hash SHA3-256 | Oui |
| REQ-243-03 | L'IKM de la derivation K_auth DOIT etre K_master | Oui |
| REQ-243-04 | La taille de sortie de K_auth DOIT etre exactement 32 bytes (256 bits) | Oui |
| REQ-243-05 | Le label HKDF (info/context) pour K_auth DOIT etre exactement ProbatioVault::K_auth::v1 | Oui |
| REQ-243-06 | Le label HKDF K_doc DOIT etre exactement ProbatioVault::K_doc::v1 (correction anomalie PD-34) | Oui |
| REQ-243-07 | Les labels HKDF DOIVENT provenir d'une source de constantes centralisee unique (pas de redefinition inline) | Oui |
| REQ-243-08 | Pour un meme K_master, les cles K_auth, K_encryption, K_doc DOIVENT etre deterministes et mutuellement distinctes | Oui |
| REQ-243-09 | L'interoperabilite iOS/backend DOIT etre verifiee avec un jeu commun de vecteurs de test HKDF | Oui |
| REQ-243-10 | Les derivations existantes (K_encryption, K_doc, K_share) DOIVENT conserver leur comportement contractuel | Oui |
| REQ-243-11 | Les documents existants derives avec l'ancien label Kdoc DOIVENT etre re-derives avec le label corrige ProbatioVault::K_doc::v1 (breaking change accepte par PO) | Oui |
3.2 Points a clarifier
| ID | Description | Impact |
| CLARIF-243-01 | La valeur normative du parametre salt HKDF pour K_auth | Decision : salt vide (coherent avec K_encryption) |
| CLARIF-243-02 | La doc d'architecture cite ProbatioVaultAuthv1 alors que le besoin impose ProbatioVault::K_auth::v1 | Decision PO : format :: retenu |
4. Perimetre
4.1 Inclus
- Derivation contractuelle de
K_auth depuis K_master via HKDF-SHA3-256 - Normalisation/correction des labels HKDF (
Kdoc → K_doc) — breaking change - Migration des documents existants vers le nouveau label
K_doc (decision PO Gate 3 v1) - Verification de non-regression des derivations existantes (hors K_doc qui change)
- Verification de determinisme, isolation cryptographique, et usage strict des constantes
- Centralisation des labels HKDF dans
constants.ts
4.2 Exclu (hors perimetre)
- Modification du protocole SRP-6a backend
- Implementation backend complete de la derivation
K_auth (story separee) - Toute regle de gestion de rotation de cles non specifiee dans le besoin
- Zeroization totale en memoire des strings JavaScript (best-effort uniquement, cf. PD-97)
5. Parametres cryptographiques normatifs
| Parametre | Valeur | Reference | Testable |
| KDF | HKDF | RFC 5869 | Oui |
| Hash HKDF | SHA3-256 | FIPS 202 | Oui |
| IKM | K_master (32 bytes) | Architecture v4.1 | Oui |
| Salt | Vide (new Uint8Array(0)) | Coherence K_encryption | Oui |
| Longueur sortie | 32 bytes (256 bits) | AES-256 compatible | Oui |
Label K_auth | ProbatioVault::K_auth::v1 | Decision PO | Oui |
Label K_doc | ProbatioVault::K_doc::v1 | Correction PD-34 | Oui |
Label K_encryption | ProbatioVault::K_encryption::v1 | Existant (inchange) | Oui |
| Encodage labels | UTF-8 exact byte-a-byte | RFC 5869 | Oui |
6. Diagrammes
Ce diagramme illustre le flux de derivation des cles depuis K_master et la verification d'interoperabilite iOS/backend (INV-243-06, REQ-243-09).
sequenceDiagram
participant App as ProbatioVault-app (iOS)
participant Constants as constants.ts
participant HKDF as HKDF-SHA3-256
participant Backend as ProbatioVault-backend
Note over App,Backend: Derivation K_auth (REQ-243-01..05, INV-243-01)
App->>Constants: get HKDF_CONTEXT_AUTH
Constants-->>App: "ProbatioVault::K_auth::v1" (INV-243-02)
App->>HKDF: derive(K_master, salt=∅, info="ProbatioVault::K_auth::v1", len=32)
HKDF-->>App: K_auth (32 bytes)
Note over App,Backend: Derivation K_doc corrigee (REQ-243-06, INV-243-07)
App->>Constants: get HKDF_CONTEXT_DOC
Constants-->>App: "ProbatioVault::K_doc::v1" (correction Kdoc)
App->>HKDF: derive(K_master, salt=∅, info="ProbatioVault::K_doc::v1", len=32)
HKDF-->>App: K_doc (32 bytes)
Note over App,Backend: Verification interop (INV-243-06, PROP-243-04)
Backend->>HKDF: derive(K_master_test, salt=∅, info="ProbatioVault::K_auth::v1", len=32)
HKDF-->>Backend: K_auth_backend (32 bytes)
App->>HKDF: derive(K_master_test, salt=∅, info="ProbatioVault::K_auth::v1", len=32)
HKDF-->>App: K_auth_ios (32 bytes)
App-->>Backend: assert K_auth_ios == K_auth_backend (byte-a-byte)
6.2 Hierarchie de derivation des cles
Ce diagramme montre l'isolation cryptographique entre cles derivees d'un meme K_master (INV-243-03, PROP-243-02).
flowchart TD
KM["K_master (32 bytes)<br/>IKM unique"]
KM -->|"HKDF-SHA3-256<br/>info=ProbatioVault::K_auth::v1<br/>(REQ-243-05)"| KA["K_auth (32 bytes)"]
KM -->|"HKDF-SHA3-256<br/>info=ProbatioVault::K_encryption::v1"| KE["K_encryption (32 bytes)"]
KM -->|"HKDF-SHA3-256<br/>info=ProbatioVault::K_doc::v1<br/>(INV-243-07, correction PD-34)"| KD["K_doc (32 bytes)"]
KM -->|"HKDF-SHA3-256<br/>info=ProbatioVault::K_share::v1"| KS["K_share (32 bytes)"]
style KA fill:#4CAF50,color:#fff
style KD fill:#FF9800,color:#fff
style KE fill:#2196F3,color:#fff
style KS fill:#9C27B0,color:#fff
KA -.-|"INV-243-03: ≠"| KE
KA -.-|"INV-243-03: ≠"| KD
KE -.-|"INV-243-03: ≠"| KD
6.3 Migration du label K_doc (breaking change)
Ce diagramme illustre le processus de migration des documents existants suite a la correction du label Kdoc vers K_doc (REQ-243-11, INV-243-07).
sequenceDiagram
participant Migration as Migration Service
participant Constants as constants.ts
participant HKDF as HKDF-SHA3-256
participant DB as Documents existants
Note over Migration,DB: Breaking change : Kdoc → K_doc (REQ-243-11)
Migration->>DB: lister documents chiffres avec ancien label
DB-->>Migration: documents[...]
loop Pour chaque document
Migration->>HKDF: derive(K_master, salt=∅, info="Kdoc", len=32)
HKDF-->>Migration: K_doc_ancien
Migration->>Migration: dechiffrer(document, K_doc_ancien)
Migration->>Constants: get HKDF_CONTEXT_DOC
Constants-->>Migration: "ProbatioVault::K_doc::v1"
Migration->>HKDF: derive(K_master, salt=∅, info="ProbatioVault::K_doc::v1", len=32)
HKDF-->>Migration: K_doc_nouveau
Migration->>Migration: rechiffrer(document, K_doc_nouveau)
Migration->>DB: update document
end
Migration->>Migration: nettoyage best-effort cles temporaires (INV-243-04)
7. Proprietes attendues
7.1 Securite
- PROP-243-01 (determinisme): meme IKM + memes parametres => meme sortie
- PROP-243-02 (domain separation): labels differents => sorties distinctes pour un meme IKM
- PROP-243-03 (coherence hierarchie):
K_auth derive de K_master, pas du mot de passe
7.2 Interoperabilite
- PROP-243-04: iOS et backend doivent obtenir les memes sorties sur vecteurs communs
7.3 Hygiene memoire
- PROP-243-05: les donnees sensibles temporaires doivent etre effacees en best-effort en fin d'usage (y compris en erreur)
8. Contraintes
| ID | Contrainte |
| CON-243-01 | Aucun contournement WASM requis; compatibilite Hermes requise (pure JS) |
| CON-243-02 | Les constantes de contexte HKDF sont la source normative unique |
| CON-243-03 | Aucun changement de comportement observable des derivees hors K_auth et correction K_doc |
| CON-243-04 | Toute divergence de label entre plateformes est non conforme |
| CON-243-05 | Le design doit rester compatible avec le principe zero-knowledge |
9. Hypotheses
| ID | Hypothese |
| HYP-243-01 | K_master est disponible au format binaire compatible HKDF (Uint8Array 32 bytes) |
| HYP-243-02 | Les consumers iOS/backend acceptent un label K_auth au format ProbatioVault::... |
| HYP-243-03 | Les vecteurs de test communs seront produits avant validation finale d'interoperabilite |
10. Invariants de securite
| ID | Invariant | Type | Testable |
| INV-243-01 | K_auth DOIT etre derivee uniquement depuis K_master | CRYPTO | Oui |
| INV-243-02 | Les labels HKDF DOIVENT etre exacts, stables et centralises (pas de litteraux inline) | ARCH | Oui |
| INV-243-03 | Pour un meme K_master, K_auth != K_encryption, K_auth != K_doc, K_encryption != K_doc | CRYPTO | Oui |
| INV-243-04 | Les donnees sensibles temporaires DOIVENT faire l'objet d'un nettoyage best-effort en fin de traitement | SEC | Partiel |
| INV-243-05 | Aucun comportement regressif ne DOIT etre introduit sur K_encryption, K_doc, K_share | ARCH | Oui |
| INV-243-06 | Les sorties sur vecteurs communs iOS/backend DOIVENT etre identiques byte-a-byte | INTEROP | Oui |
| INV-243-07 | Le label K_doc DOIT utiliser underscore (K_doc) et non la version sans (Kdoc). Breaking change : les documents historiques doivent etre migres. | CRYPTO | Oui |
11. Tests d'acceptation
| ID | Description | Critere source | Mesurable |
| TA-243-01 | Verifier que deriveAuthKey() retourne exactement 32 bytes | CA-01, REQ-243-04 | Jest assertion |
| TA-243-02 | Verifier que le label effectif utilise est exactement ProbatioVault::K_auth::v1 | CA-02, REQ-243-05 | Code review + test |
| TA-243-03 | Verifier le determinisme (meme K_master => meme K_auth) | CA-03, PROP-243-01 | Vecteurs de test |
| TA-243-04 | Verifier l'isolation de domaine (K_auth, K_encryption, K_doc distinctes) | CA-04, INV-243-03 | Jest assertion |
| TA-243-05 | Verifier l'absence du label Kdoc et la presence de K_doc | CA-05, INV-243-07 | Grep + tests |
| TA-243-06 | Executer tests de non-regression pour K_encryption, K_doc, K_share | CA-06, INV-243-05 | Tests existants |
| TA-243-07 | Verifier que les labels sont references depuis constantes centralisees | CA-07, INV-243-02 | Code review |
| TA-243-08 | Verifier l'egalite byte-a-byte iOS/backend sur vecteurs communs | INV-243-06 | Tests d'integration |
| TA-243-09 | Verifier le nettoyage best-effort en sortie nominale et en erreur | INV-243-04 | Revue structurelle |
| TA-243-10 | Verifier que la migration des documents existants (Kdoc → K_doc) est documentee et planifiee | REQ-243-11 | Plan migration |
12. Livrables
- Module
deriveAuthKey() dans src/services/hkdf.ts - Mise a jour de
src/crypto/constants.ts avec HKDF_CONTEXT_AUTH - Correction label
KDOC → K_DOC dans hkdf.ts - Re-export dans
src/crypto/keys.ts - Tests unitaires avec vecteurs HKDF
- Tests de non-regression K_encryption, K_doc, K_share
- Documentation mise a jour
13. Definition of Done
La story PD-243 est DONE si et seulement si:
Matrice de tracabilite
| Besoin | Exigences | Invariants | Tests |
| deriveAuthKey HKDF | REQ-243-01..05 | INV-243-01 | TA-243-01..03 |
| Correction PD-34 labels | REQ-243-06..07, REQ-243-11 | INV-243-02, INV-243-07 | TA-243-05, TA-243-07, TA-243-10 |
| Interop iOS/backend | REQ-243-09 | INV-243-06 | TA-243-08 |
| Non-regression | REQ-243-10 | INV-243-05 | TA-243-06 |
| Isolation cryptographique | REQ-243-08 | INV-243-03 | TA-243-04 |