Aller au contenu

PD-82 — Spécification canonique contractuelle

1. Objectif

La User Story PD-82 définit le mécanisme contractuel de contrôle 2 validations requises sur 2 possibles (2-of-2) pour autoriser l'activation d'une délégation cryptographique PRE sur un coffre mineur.

Le système DOIT garantir qu'aucune activation PRE ne peut être réalisée de manière unilatérale, implicite ou rétroactive, et DOIT produire une trace probatoire vérifiable indépendamment.

2. Périmètre / Hors périmètre

Périmètre

  • Activation PRE impliquant un coffre mineur.
  • Cas de réquisition judiciaire.
  • Cas d'obstruction parentale (initiation possible par l'autorité compétente).
  • Contexte B2C mineurs sous supervision encadrée.
  • Portail autorité Phase 1 (2026-2027) avec autorité pré-enregistrée et authentification forte.
  • Application d'un TTL strict de 7 jours calendaires pour la complétion de la seconde validation.
  • Révocation possible avant activation complète par le validateur d'origine uniquement.

Hors périmètre

  • Partages standards entre adultes.
  • Délégations internes B2B.
  • Opérations purement informatives sans impact sur les clés.
  • Intégration API machine-to-machine judiciaire (Phase 2 future).
  • Définition interne de l'algorithme cryptographique PRE (couvert par PD-41).
  • Implémentation technique des mécanismes HSM/certificats (couvert par PD-37).

3. Définitions

Terme Définition contractuelle
PRE Proxy Re-Encryption. Mécanisme existant activé uniquement après validation 2-of-2 (PD-41).
Activation PRE Appel effectif de l'interface activatePRE(delegationId) après validation complète.
Parent Représentant légal habilité à valider/révoquer sa propre validation.
Autorité compétente Autorité habilitée, pré-enregistrée par ProbatioVault, authentifiée fortement.
Validation Acte explicite, horodaté, authentifié cryptographiquement, émis par une des deux entités requises.
Révocation Acte explicite annulant la validation de son auteur tant que l'état n'est pas ACTIVATED.
TTL Durée de validité de la validation initiale: 7 jours. Au-delà, processus expiré.
Append-only Journal probatoire où tout événement est ajouté sans modification/suppression d'un événement antérieur.
Identité non contestable Identité liée à un certificat qualifié, eIDAS, ou mécanisme de signature juridiquement opposable.
États PD-82 PENDING_BOTH, PENDING_AUTHORITY, PENDING_PARENT, ACTIVATED, REJECTED, EXPIRED.

4. Invariants (non négociables)

ID Règle Justification
INV-82-01 Une seule validation ne déclenche jamais activatePRE(delegationId). Empêche toute activation partielle/unilatérale.
INV-82-02 Aucune validation implicite n'est autorisée (aucun auto-approve au timeout). Interdit l'approbation silencieuse.
INV-82-03 Si le second validateur n'a pas validé dans les 7 jours après la première validation, l'état devient EXPIRED. Respect du TTL contractuel.
INV-82-04 Toute révocation explicite avant activation annule le processus et mène à l'état REJECTED. Empêche l'activation sur consentement retiré.
INV-82-05 La plateforme ne peut pas forcer l'activation sans les deux validations distinctes valides. Neutralité probatoire et séparation des pouvoirs.
INV-82-06 Chaque validation est horodatée avec un timestamp probatoire vérifiable. Reconstitution chronologique obligatoire.
INV-82-07 Chaque validation est rattachée à une identité juridique explicite (parent/autorité). Opposabilité juridique des actes.
INV-82-08 L'ordre des validations (parent puis autorité, ou inversement) est indifférent. Équité de traitement des flux.
INV-82-09 Chaque validation est cryptographiquement authentifiée (signature). Intégrité et non-répudiation.
INV-82-10 L'identité du signataire est non contestable (certificat X.509/eIDAS ou équivalent opposable). Exigence légale de fiabilité identitaire.
INV-82-11 Aucune clé PRE/sensible n'est activée avant état ACTIVATED. Fail-closed cryptographique.
INV-82-12 Chaque événement (création, validation, révocation, expiration, activation) est journalisé append-only. Traçabilité probatoire complète.

5. Flux nominaux

Flux N1 — Validation parent puis autorité

  1. État initial: PENDING_BOTH.
  2. Parent valide explicitement et signe: état PENDING_AUTHORITY.
  3. Autorité compétente valide explicitement et signe avant TTL 7 jours.
  4. Système vérifie les deux validations distinctes, valides, non révoquées, non expirées.
  5. Système déclenche activatePRE(delegationId).
  6. État final: ACTIVATED (terminal).

Flux N2 — Validation autorité puis parent

  1. État initial: PENDING_BOTH.
  2. Autorité valide explicitement et signe: état PENDING_PARENT.
  3. Parent valide explicitement et signe avant TTL 7 jours.
  4. Contrôles identiques au Flux N1.
  5. Activation PRE puis état final ACTIVATED.

Flux N3 — Traçabilité probatoire complète

  1. Chaque transition produit un événement append-only horodaté.
  2. L'événement d'activation référence explicitement les identifiants des deux validations.
  3. Le dossier de preuve est exportable dans un format probatoire (RFC 3161 ou équivalent).
  4. Un audit externe peut reconstruire l'ordre exact des événements.

5bis. Diagrammes

Diagramme d'états — Cycle de vie de la délégation PRE 2-of-2

États terminaux : ACTIVATED, REJECTED, EXPIRED — aucune transition sortante (INV-82-04, INV-82-11, CA-82-10).

stateDiagram-v2
    [*] --> PENDING_BOTH : Création demande PRE

    PENDING_BOTH --> PENDING_AUTHORITY : Parent valide + signe [INV-82-09]
    PENDING_BOTH --> PENDING_PARENT : Autorité valide + signe [INV-82-09]
    PENDING_BOTH --> REJECTED : Révocation par initiateur [INV-82-04]
    PENDING_BOTH --> EXPIRED : TTL 7j dépassé [INV-82-03]

    PENDING_AUTHORITY --> ACTIVATED : Autorité valide avant TTL [INV-82-01, INV-82-08]
    PENDING_AUTHORITY --> REJECTED : Révocation par auteur validation [INV-82-04]
    PENDING_AUTHORITY --> EXPIRED : TTL 7j dépassé [INV-82-03]

    PENDING_PARENT --> ACTIVATED : Parent valide avant TTL [INV-82-01, INV-82-08]
    PENDING_PARENT --> REJECTED : Révocation par auteur validation [INV-82-04]
    PENDING_PARENT --> EXPIRED : TTL 7j dépassé [INV-82-03]

    ACTIVATED --> [*]
    REJECTED --> [*]
    EXPIRED --> [*]

    note right of ACTIVATED
        État terminal — activatePRE(delegationId)
        déclenché une seule fois [INV-82-11]
    end note

    note right of REJECTED
        État terminal — consentement
        retiré, aucune activation possible
    end note

    note right of EXPIRED
        État terminal — nouveau
        processus requis [INV-82-02]
    end note

Diagramme de séquence — Flux N1 (Parent puis Autorité)

Illustre le flux nominal avec vérification cryptographique et journal append-only (INV-82-06, INV-82-07, INV-82-09, INV-82-10, INV-82-12).

sequenceDiagram
    autonumber
    participant P as Parent
    participant API as PD-82 Service
    participant SIG as Vérification Signatures<br/>(X.509/eIDAS)
    participant PRE as PD-41 PRE Module
    participant LOG as PD-31 Journal<br/>Append-only

    P->>API: Initier demande PRE (coffre mineur)
    API->>LOG: Événement CREATED [INV-82-12]
    API-->>P: État PENDING_BOTH

    P->>API: Validation parent (signature + certificat)
    API->>SIG: Vérifier signature + identité [INV-82-09, INV-82-10]
    SIG-->>API: Signature valide, identité opposable
    API->>LOG: Événement VALIDATION_PARENT (timestamp probatoire) [INV-82-06, INV-82-07]
    API-->>P: État PENDING_AUTHORITY

    participant A as Autorité compétente
    Note over A,API: Autorité résolue via registre interne [INV-82-05]

    A->>API: Validation autorité (signature + certificat)
    API->>SIG: Vérifier signature + identité [INV-82-09, INV-82-10]
    SIG-->>API: Signature valide, identité opposable

    API->>API: Vérifier 2-of-2 : deux validations<br/>distinctes, valides, non révoquées,<br/>TTL < 7j [INV-82-01, INV-82-03]
    API->>PRE: activatePRE(delegationId) [INV-82-11]
    PRE-->>API: Activation confirmée
    API->>LOG: Événement ACTIVATED (réf. 2 validations) [INV-82-12]
    API-->>A: État ACTIVATED (terminal)

Diagramme de séquence — Révocation avant activation

Illustre le flux de révocation par l'auteur de la validation (INV-82-04, ERR-82-03).

sequenceDiagram
    autonumber
    participant P as Parent
    participant API as PD-82 Service
    participant LOG as PD-31 Journal<br/>Append-only

    Note over API: État PENDING_AUTHORITY<br/>(validation parent existante)

    P->>API: Révoquer ma validation
    API->>API: Vérifier auteur = signataire<br/>de la validation [INV-82-04]
    API->>LOG: Événement REVOKED (timestamp) [INV-82-12]
    API-->>P: État REJECTED (terminal)

    Note over API: Toute tentative ultérieure<br/>d'activation est refusée [CA-82-10]

6. Cas d'erreur

ID Condition d'erreur Réponse attendue
ERR-82-01 Tentative d'activation avec une seule validation Refus explicite, état inchangé, événement append-only de refus.
ERR-82-02 Seconde validation reçue après TTL > 7 jours Refus, transition vers EXPIRED si non déjà terminal, nécessité de relancer un nouveau processus.
ERR-82-03 Révocation par acteur différent de l'auteur de la validation Refus explicite, état inchangé, journalisation de la tentative invalide.
ERR-82-04 Révocation demandée après ACTIVATED Refus explicite (état terminal irréversible), journalisation.
ERR-82-05 Signature invalide ou non vérifiable Validation rejetée, état inchangé, journalisation de l'échec cryptographique.
ERR-82-06 Identité non juridiquement qualifiable (absence certificat/opposabilité) Validation rejetée, état inchangé, motif explicite.
ERR-82-07 Parent tente de choisir l'autorité Refus métier: autorité issue du registre interne uniquement; journalisation.
ERR-82-08 Tentative de modification/suppression d'événement append-only Opération interdite, aucune mutation historique, alerte et journalisation sécurité.

7. Critères d'acceptation (testables)

ID Critère Observable
CA-82-01 PRE ne peut pas être activé sans deux validations distinctes (INV-82-01, INV-82-05, INV-82-11). Aucun appel activatePRE(delegationId) n'est émis tant que les deux validations valides ne sont pas présentes.
CA-82-02 Une révocation avant activation annule le processus (INV-82-04). État final REJECTED; activation impossible après révocation.
CA-82-03 Le TTL de 7 jours est strictement appliqué (INV-82-03, INV-82-02). Passage à EXPIRED au-delà de 7 jours sans seconde validation; aucune activation implicite.
CA-82-04 Les validations sont horodatées et juridiquement identifiables (INV-82-06, INV-82-07, INV-82-10). Chaque validation contient timestamp probatoire + identité opposable vérifiable.
CA-82-05 Les validations sont cryptographiquement authentifiées (INV-82-09). Toute validation invalide cryptographiquement est rejetée avec motif.
CA-82-06 L'ordre des validations n'impacte pas le résultat (INV-82-08). Scénarios parent→autorité et autorité→parent mènent tous deux à ACTIVATED sous mêmes prérequis.
CA-82-07 Le parent ne peut pas sélectionner l'autorité compétente (INV-82-05, INV-82-07). L'autorité est déterminée par registre interne; tentative de sélection parentale rejetée.
CA-82-08 Le journal probatoire est append-only et complet (INV-82-12). Toute transition/tentative invalide est tracée; aucune suppression/modification historique possible.
CA-82-09 L'activation PRE référence les deux validations source (INV-82-01, INV-82-12). Événement d'activation contient identifiants des deux validations corrélées.
CA-82-10 Les états terminaux sont irréversibles (INV-82-04, INV-82-11, INV-82-12). Aucune transition autorisée depuis ACTIVATED, REJECTED, EXPIRED.

8. Scénarios de test (Given / When / Then)

ST-82-01 — Blocage avec une seule validation

Given une demande PRE en état PENDING_BOTH
When le parent valide correctement
Then l'état devient PENDING_AUTHORITY
And aucun appel activatePRE(delegationId) n'est effectué

ST-82-02 — Activation après double validation parent→autorité

Given une demande PRE en état PENDING_AUTHORITY avec validation parent valide
When l'autorité valide dans le délai de 7 jours avec signature valide
Then l'état devient ACTIVATED
And activatePRE(delegationId) est appelé une seule fois

ST-82-03 — Activation après double validation autorité→parent

Given une demande PRE en état PENDING_PARENT avec validation autorité valide
When le parent valide dans le délai de 7 jours avec signature valide
Then l'état devient ACTIVATED
And activatePRE(delegationId) est appelé une seule fois

ST-82-04 — Expiration TTL

Given une demande PRE avec une première validation horodatée T0
When la seconde validation arrive après T0 + 7 jours
Then l'état est EXPIRED
And activatePRE(delegationId) n'est jamais appelé

ST-82-05 — Révocation valide avant activation

Given une demande PRE en état PENDING_AUTHORITY avec validation parent
When le parent révoque explicitement sa validation avant la seconde validation
Then l'état devient REJECTED
And toute activation ultérieure sur ce processus est refusée

ST-82-06 — Révocation invalide par tiers

Given une demande PRE avec validation parent existante
When l'autorité tente de révoquer la validation du parent
Then la révocation est rejetée
And l'état métier reste inchangé

ST-82-07 — Signature invalide

Given une demande PRE en attente d'une validation
When une validation est soumise avec signature non vérifiable
Then la validation est rejetée
And un événement de rejet cryptographique est journalisé

ST-82-08 — Autorité imposée par registre interne

Given une demande PRE initiée côté parent
When le parent fournit un identifiant d'autorité arbitraire
Then la sélection est refusée
And l'autorité est uniquement résolue via le registre interne habilité

ST-82-09 — Intégrité append-only

Given une chronologie d'événements de validation déjà enregistrée
When une opération tente de modifier ou supprimer un événement passé
Then l'opération est refusée
And un événement de tentative d'altération est ajouté au journal

ST-82-10 — Irréversibilité des états terminaux

Given une demande PRE en état ACTIVATED
When une requête de retour en état PENDING est soumise
Then la requête est rejetée
And l'état reste ACTIVATED

9. Hypothèses explicites

ID Hypothèse Impact si faux
HYP-82-01 Le module PRE (PD-41) expose bien activatePRE(delegationId) idempotent ou contrôlé contre double appel. Risque de double activation ou comportement indéterminé.
HYP-82-02 Le registre interne des autorités compétentes existe et est à jour. Impossible de garantir "parent ne choisit jamais l'autorité".
HYP-82-03 Le mécanisme d'horodatage probatoire est disponible et fiable (source de temps de référence). Perte de valeur probatoire sur chronologie/TTL.
HYP-82-04 Les services de vérification de certificats/signatures sont disponibles au moment des validations. Rejet massif ou blocage des validations légitimes.
HYP-82-05 Le journal append-only de PD-31 garantit non-altération et export probatoire. Non-conformité probatoire et impossibilité d'audit externe fiable.
HYP-82-06 Les règles RGPD mineurs applicables à la conservation des preuves sont couvertes par PD-240. Risque juridique sur durée de conservation/anonymisation des traces.

10. Points à clarifier

ID Point à clarifier Donnée manquante / décision requise
Q-82-01 Définition normative exacte de "7 jours" Jour calendaire vs 168 heures UTC strictes; impact direct sur tests TTL.
Q-82-02 Révocation après EXPIRED Doit-elle être rejetée silencieusement ou explicitement tracée comme tentative invalide.
Q-82-03 Niveau minimal de preuve exportable "RFC 3161 ou équivalent" doit être précisé (formats admis, champs obligatoires).
Q-82-04 Exigences légales françaises cibles Liste normative précise attendue pour vérification de conformité juridique exhaustive.
Q-82-05 Règles de gestion en cas d'indisponibilité temporaire du registre d'autorité Politique contractuelle attendue: blocage strict, reprise, ou fenêtre de grâce.

Références finales

  • Epic : PD-189 — CRYPTO
  • JIRA : PD-82
  • Repos concernés : ProbatioVault-backend
  • Documents associés : PD-41, PD-31, PD-240, PD-37