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é
- État initial:
PENDING_BOTH. - Parent valide explicitement et signe: état
PENDING_AUTHORITY. - Autorité compétente valide explicitement et signe avant TTL 7 jours.
- Système vérifie les deux validations distinctes, valides, non révoquées, non expirées.
- Système déclenche
activatePRE(delegationId). - État final:
ACTIVATED (terminal).
Flux N2 — Validation autorité puis parent
- État initial:
PENDING_BOTH. - Autorité valide explicitement et signe: état
PENDING_PARENT. - Parent valide explicitement et signe avant TTL 7 jours.
- Contrôles identiques au Flux N1.
- Activation PRE puis état final
ACTIVATED.
Flux N3 — Traçabilité probatoire complète
- Chaque transition produit un événement append-only horodaté.
- L'événement d'activation référence explicitement les identifiants des deux validations.
- Le dossier de preuve est exportable dans un format probatoire (RFC 3161 ou équivalent).
- 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