Aller au contenu

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 (KdocK_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

6.1 Sequence de derivation HKDF multi-plateforme

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 (KdocK_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 KDOCK_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:

  • Tous les invariants INV-243-01 a INV-243-07 sont satisfaits
  • Tous les tests TA-243-01 a TA-243-10 sont passes
  • Les anomalies de labels HKDF (Kdoc -> K_doc) sont corrigees sans regression
  • L'usage de constantes centralisees est verifie
  • Pipeline CI/CD vert
  • Code review approuvee

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