Aller au contenu

PD-243 — Cahier de tests


Navigation User Story | Document | | | ---------- | -- | | [Expression de besoin](PD-243-besoin.md) | | | [Specification](PD-243-specification.md) | | | **Tests** | *(ce document)* | | [Plan d'implementation](PD-243-plan.md) | | | [Retour d'experience](PD-243-rex.md) | | [← Retour a crypto](../PD-189-epic.md)

References

  • EPIC : PD-189 — CRYPTO
  • JIRA : PD-243
  • Composant : Client-side crypto (mobile iOS)
  • Specification : PD-243-specification.md

Matrice de couverture

Invariants de securite

Invariant Tests couvrant Type
INV-243-01 TC-CRYPTO-01, TC-CRYPTO-02 CRYPTO
INV-243-02 TC-ARCH-01, TC-ARCH-02 ARCH
INV-243-03 TC-ISO-01, TC-ISO-02 CRYPTO
INV-243-04 TC-SEC-01 SEC
INV-243-05 TC-REG-01, TC-REG-02, TC-REG-03 ARCH
INV-243-06 TC-INTEROP-01 INTEROP
INV-243-07 TC-LABEL-01, TC-LABEL-02 CRYPTO

Tests d'acceptation

Test acceptation Tests couvrant
TA-243-01 TC-CRYPTO-01, TC-CRYPTO-03
TA-243-02 TC-LABEL-03
TA-243-03 TC-DET-01, TC-DET-02
TA-243-04 TC-ISO-01, TC-ISO-02
TA-243-05 TC-LABEL-01, TC-LABEL-02
TA-243-06 TC-REG-01, TC-REG-02, TC-REG-03
TA-243-07 TC-ARCH-01, TC-ARCH-02
TA-243-08 TC-INTEROP-01
TA-243-09 TC-SEC-01

Scenarios de test

Tests cryptographiques K_auth

TC-CRYPTO-01 — Derivation K_auth retourne 32 bytes

Objectif : Verifier que deriveAuthKey() retourne exactement 32 bytes Type : Unitaire Priorite : P0 Couvre : INV-243-01, TA-243-01

Prerequis : - K_master valide (32 bytes) - Module HKDF initialise

Donnees de test :

K_master (hex): 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f

Etapes : 1. Appeler deriveAuthKey(kMaster) 2. Verifier la longueur du resultat

Resultat attendu : - Retour de type Uint8Array - Longueur exactement 32 bytes

Automatisable : Oui


TC-CRYPTO-02 — K_auth derivee depuis K_master (pas password)

Objectif : Verifier que K_auth utilise K_master comme IKM Type : Unitaire Priorite : P0 Couvre : INV-243-01

Prerequis : - K_master valide - Password disponible (pour comparaison)

Donnees de test :

K_master (hex): 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Password: "TestPassword123!"
Salt: aa11bb22cc33dd44ee55ff660011223344556677

Etapes : 1. Deriver K_auth depuis K_master via deriveAuthKey() 2. Deriver K_auth via Argon2id depuis password (ancienne methode) 3. Comparer les deux cles

Resultat attendu : - K_auth_hkdf !== K_auth_argon2id - K_auth_hkdf depend uniquement de K_master - K_auth_hkdf ne change pas si password change (mais K_master reste identique)

Automatisable : Oui


TC-CRYPTO-03 — HKDF-SHA3-256 utilise

Objectif : Verifier que l'algorithme HKDF-SHA3-256 est utilise Type : Unitaire Priorite : P0 Couvre : TA-243-01

Prerequis : - Vecteur de test precalcule

Donnees de test :

K_master (hex): 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
salt: (vide)
info: "ProbatioVault::K_auth::v1" (UTF-8)

Etapes : 1. Calculer K_auth via deriveAuthKey() 2. Calculer K_auth via implementation de reference HKDF-SHA3-256 3. Comparer les resultats

Resultat attendu : - K_auth_impl === K_auth_reference (bit-a-bit)

Automatisable : Oui


Tests determinisme

TC-DET-01 — Meme K_master produit meme K_auth

Objectif : Verifier le determinisme de la derivation Type : Unitaire Priorite : P0 Couvre : TA-243-03

Prerequis : N/A

Donnees de test :

K_master (hex): 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f

Etapes : 1. Deriver K_auth une premiere fois 2. Deriver K_auth une seconde fois (meme K_master) 3. Comparer les deux cles

Resultat attendu : - K_auth_1 === K_auth_2 (byte-a-byte)

Automatisable : Oui


TC-DET-02 — K_master different produit K_auth different

Objectif : Verifier que des K_master differents produisent des K_auth differents Type : Unitaire Priorite : P0 Couvre : TA-243-03

Prerequis : N/A

Donnees de test :

K_master_1 (hex): 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
K_master_2 (hex): 1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100

Etapes : 1. Deriver K_auth depuis K_master_1 2. Deriver K_auth depuis K_master_2 3. Comparer les deux cles

Resultat attendu : - K_auth_1 !== K_auth_2

Automatisable : Oui


Tests isolation de domaine

TC-ISO-01 — K_auth !== K_encryption pour meme K_master

Objectif : Verifier l'isolation cryptographique entre K_auth et K_encryption Type : Unitaire Priorite : P0 Couvre : INV-243-03, TA-243-04

Prerequis : N/A

Donnees de test :

K_master (hex): 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f

Etapes : 1. Deriver K_auth depuis K_master 2. Deriver K_encryption depuis K_master 3. Comparer les deux cles

Resultat attendu : - K_auth !== K_encryption - Les deux font 32 bytes

Automatisable : Oui


TC-ISO-02 — K_auth !== K_doc pour meme K_master

Objectif : Verifier l'isolation cryptographique entre K_auth et K_doc Type : Unitaire Priorite : P0 Couvre : INV-243-03, TA-243-04

Prerequis : N/A

Donnees de test :

K_master (hex): 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
doc_id: "550e8400-e29b-41d4-a716-446655440000"

Etapes : 1. Deriver K_auth depuis K_master 2. Deriver K_share depuis K_master 3. Deriver K_doc depuis K_share + doc_id 4. Comparer K_auth et K_doc

Resultat attendu : - K_auth !== K_doc

Automatisable : Oui


Tests labels HKDF

TC-LABEL-01 — Absence du label "Kdoc" (anomalie PD-34)

Objectif : Verifier que le label "Kdoc" n'existe plus dans le code Type : Statique (grep) Priorite : P0 Couvre : INV-243-07, TA-243-05

Prerequis : Code source disponible

Donnees de test : N/A

Etapes : 1. Grep "Kdoc" dans src/services/hkdf.ts 2. Grep "Kdoc" dans src/crypto/constants.ts

Resultat attendu : - 0 occurrence de "Kdoc" (sans underscore) - Presence de "K_doc" (avec underscore)

Automatisable : Oui (CI grep)


TC-LABEL-02 — Presence du label "K_doc" correct

Objectif : Verifier que le label corrige "K_doc" est utilise Type : Unitaire Priorite : P0 Couvre : INV-243-07, TA-243-05

Prerequis : N/A

Donnees de test :

K_master (hex): 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
doc_id: "550e8400-e29b-41d4-a716-446655440000"

Etapes : 1. Deriver K_doc avec l'implementation 2. Calculer manuellement K_doc avec label "ProbatioVault::K_doc::v1" 3. Comparer

Resultat attendu : - K_doc_impl === K_doc_manual

Automatisable : Oui


TC-LABEL-03 — Label K_auth exact

Objectif : Verifier que le label K_auth est exactement "ProbatioVault::K_auth::v1" Type : Unitaire Priorite : P0 Couvre : TA-243-02

Prerequis : - Vecteur de test precalcule avec label exact

Donnees de test :

K_master (hex): 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
salt: (vide)
info: "ProbatioVault::K_auth::v1" (UTF-8 bytes: 50726f626174696f5661756c743a3a4b5f617574683a3a7631)
expected K_auth (hex): [a calculer avec implementation de reference]

Etapes : 1. Deriver K_auth avec l'implementation 2. Comparer avec la valeur attendue

Resultat attendu : - K_auth === expected_K_auth

Automatisable : Oui


Tests architecture (constantes centralisees)

TC-ARCH-01 — Labels importes depuis constants.ts

Objectif : Verifier que les labels sont importes depuis constants.ts Type : Statique (code review) Priorite : P1 Couvre : INV-243-02, TA-243-07

Prerequis : Code source disponible

Donnees de test : N/A

Etapes : 1. Verifier que hkdf.ts importe HKDF_CONTEXTS depuis constants.ts 2. Verifier qu'aucun literal inline de label n'existe

Resultat attendu : - Import present : import { HKDF_CONTEXTS } from '../crypto/constants' - 0 literal inline pour les labels HKDF

Automatisable : Partiel (grep patterns)


TC-ARCH-02 — Constants.ts contient HKDF_CONTEXT_AUTH

Objectif : Verifier que constants.ts definit le contexte K_auth Type : Statique (grep) Priorite : P0 Couvre : INV-243-02, TA-243-07

Prerequis : Code source disponible

Donnees de test : N/A

Etapes : 1. Grep "K_AUTH" ou "K_auth" dans src/crypto/constants.ts

Resultat attendu : - Presence de la constante avec valeur "ProbatioVault::K_auth::v1"

Automatisable : Oui


Tests non-regression

TC-REG-01 — K_encryption inchangee

Objectif : Verifier que K_encryption n'a pas de regression Type : Unitaire Priorite : P0 Couvre : INV-243-05, TA-243-06

Prerequis : - Vecteur de test K_encryption precalcule (avant PD-243)

Donnees de test :

K_master (hex): 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
expected K_encryption (hex): [valeur de reference avant PD-243]

Etapes : 1. Deriver K_encryption avec l'implementation post-PD-243 2. Comparer avec la valeur de reference

Resultat attendu : - K_encryption === expected_K_encryption

Automatisable : Oui


TC-REG-02 — K_share inchangee

Objectif : Verifier que K_share n'a pas de regression Type : Unitaire Priorite : P0 Couvre : INV-243-05, TA-243-06

Prerequis : - Vecteur de test K_share precalcule

Donnees de test :

K_master (hex): 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
expected K_share (hex): [valeur de reference]

Etapes : 1. Deriver K_share avec l'implementation post-PD-243 2. Comparer avec la valeur de reference

Resultat attendu : - K_share === expected_K_share

Automatisable : Oui


TC-REG-03 — K_doc utilise le nouveau label (breaking change)

Objectif : Verifier que K_doc utilise le label corrige ProbatioVault::K_doc::v1 Type : Unitaire Priorite : P0 (CRITIQUE) Couvre : INV-243-07, TA-243-05, REQ-243-11

Prerequis : - Decision PO Gate 3 v1 : Breaking change accepte

Donnees de test :

K_master (hex): 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
doc_id: "550e8400-e29b-41d4-a716-446655440000"
expected K_doc_new (hex): [valeur avec nouveau label "ProbatioVault::K_doc::v1"]
expected K_doc_old (hex): [valeur avec ancien label "ProbatioVault::Kdoc::v1"]

Etapes : 1. Deriver K_doc avec l'implementation post-PD-243 2. Verifier que K_doc === expected_K_doc_new (nouveau label) 3. Verifier que K_doc !== expected_K_doc_old (ancien label)

Resultat attendu : - K_doc utilise le nouveau label ProbatioVault::K_doc::v1 - K_doc est differente de la valeur calculee avec l'ancien label Kdoc - Breaking change : les documents existants doivent etre migres

Note : Decision PO du 2026-02-19 : breaking change accepte. La migration des documents existants est incluse dans le perimetre PD-243.

Automatisable : Oui


Tests securite

TC-SEC-01 — Zeroization best-effort en fin de traitement

Objectif : Verifier que les cles intermediaires sont nettoyees Type : Revue structurelle + test Priorite : P1 Couvre : INV-243-04, TA-243-09

Prerequis : Code source disponible

Donnees de test : N/A

Etapes : 1. Verifier la presence de zeroize() ou fill(0) apres usage 2. Verifier la presence de try/finally pour garantir le nettoyage en cas d'erreur 3. Tester qu'une exception ne laisse pas de cle non nettoyee

Resultat attendu : - Pattern try/finally present dans les fonctions sensibles - Appel zeroize() ou equivalent dans le bloc finally

Automatisable : Partiel (revue + test erreur)


Tests interoperabilite

TC-INTEROP-01 — Egalite byte-a-byte iOS/backend

Objectif : Verifier que iOS et backend produisent les memes cles Type : Integration Priorite : P0 Couvre : INV-243-06, TA-243-08

Prerequis : - Implementation iOS disponible - Implementation backend disponible - Vecteurs de test communs

Donnees de test :

K_master (hex): 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f

Vecteur 1:
  K_auth expected (hex): [a calculer]

Vecteur 2:
  K_master (hex): fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0efeeedecebeae9e8e7e6e5e4e3e2e1e0
  K_auth expected (hex): [a calculer]

Etapes : 1. Calculer K_auth sur iOS avec K_master vecteur 1 2. Calculer K_auth sur backend avec K_master vecteur 1 3. Comparer les resultats 4. Repeter pour vecteur 2

Resultat attendu : - K_auth_iOS === K_auth_backend pour chaque vecteur

Automatisable : Oui (tests d'integration CI)


Vecteurs de test HKDF-SHA3-256

Vecteur 1 — K_auth derivation

IKM (K_master):
  hex: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f

salt: (vide)

info ("ProbatioVault::K_auth::v1"):
  hex: 50726f626174696f5661756c743a3a4b5f617574683a3a7631

output_length: 32 bytes

expected_K_auth:
  [A CALCULER avec implementation de reference HKDF-SHA3-256]

Vecteur 2 — K_doc derivation (label corrige)

IKM (K_share):
  [derivee de K_master avec label K_share]

salt (doc_id as bytes):
  "550e8400-e29b-41d4-a716-446655440000" -> hex: 550e8400e29b41d4a716446655440000

info ("ProbatioVault::K_doc::v1"):
  hex: 50726f626174696f5661756c743a3a4b5f646f633a3a7631

output_length: 32 bytes

expected_K_doc:
  [A CALCULER]

Scenarios non testables

Scenario Raison Mitigation
Zeroization complete memoire JS JavaScript strings immutables, GC non controlable Best-effort documente, revue structurelle
Interoperabilite Android Hors scope PD-243 (iOS only) Story future

Definition of Done Tests

  • Tous les TC-* sont implementes
  • Matrice de couverture 100% (chaque INV et TA couverts)
  • Vecteurs de test precalcules
  • Tests de non-regression passent
  • Tests d'interoperabilite iOS/backend passent
  • Pipeline CI vert