Skip to content

docs(conformance): « couvert » exige une preuve de mise en service (D-2) - #63

Open
PhilippeVienne wants to merge 2 commits into
docs/matrix-versions-idsfrom
docs/matrix-in-service
Open

PhilippeVienne wants to merge 2 commits into
docs/matrix-versions-idsfrom
docs/matrix-in-service

Conversation

@PhilippeVienne

Copy link
Copy Markdown
Contributor

Objet

Constat D-2 de l'audit du 2026-09-25 : la matrice prouvait l'existence d'un test, pas la mise en service du mécanisme — c'est ainsi que §7.11 avait pu rester « couvert » sans qu'aucun binaire ne l'appelle. Tranche c, dernière du découpage D (a : #60 → b : #61 → c : cette PR).

Empilement : base docs/matrix-versions-ids (#61, tête d25ee8c à l'ouverture). La branche contient aussi, en premier commit, le correctif #62 (encodage du failInfo), trouvé par le test du binaire écrit ici et nécessaire à ses assertions. Ordre de merge : #62 (indépendante), #60, #61, puis cette PR ; au rebase sur dev, le commit de #62 déjà mergé disparaît de lui-même.

Changements

  • Statut « implémenté, pas en service » : mécanisme et test présents, aucun binaire ne l'appelle — compte comme non satisfait. §7.11.1/§7.11.2 (oe-crosstsa, oe-replicate) y passe.
  • in_service, obligatoire pour une ligne couverte (choix de l'utilisateur) : un test qui exerce un binaire (bin/…) ou une étape d'un job de démonstration réelle (.github/workflows/ci.yml, kind/compose). validate() refuse une ligne couverte sans elle.
  • crates/oe-conformance/tests/references.rs résout mécaniquement chaque référence test et in_service : fichier présent, fonction définie et non #[ignore], étape de workflow existante. Il a trouvé que la ligne REQ-7.5-01 citait pkcs11_integration.rs, entièrement #[ignore] (jamais exécuté en CI) — elle cite désormais le test du binaire.
  • Tests de câblage écrits plutôt que déclasser (choix de l'utilisateur) :
    • bin/tsa-server/tests/serve.rs — premier test du binaire tsa-server : vrai token SoftHSM (clé générée dedans), certificat émis par une CA de test ; refus au démarrage d'un certificat au profil OCSP (EN 319 422 §6) ; en enforce sans heure traçable, /healthz 503 et refus timeNotAvailable (EN 319 421 TIS-7.7.1-07) ; en monitor, jeton vérifié par openssl ts -verify (EN 319 422 §7) et SHA-1 refusé en badAlg (TS 119 312 §5.1).
    • bin/ca-server/tests/bootstrap_cli.rs::undersized_ca_keys_are_refused_by_the_binary (TS 119 312 §8.4).
  • CI : SoftHSM2 installé dans le job de tests ; OE_REQUIRE_SOFTHSM=1 fait échouer le test du binaire au lieu de l'ignorer — une preuve de mise en service ne peut plus sauter en silence.
  • Matrice : 36 exigences — 17 couvertes, 1 implémentée, 16 écarts, 2 hors périmètre ; le document affiche la preuve « en service » de chaque ligne couverte ; /api/v1/conformance expose en_service. README à jour.

Limites

  • Les deux jobs de démonstration tournent en OPENEIDAS_TIME_POLICY=monitor : la suspension en enforce n'est prouvée que par le test du binaire, pas en démonstration réelle.
  • Les tests PostgreSQL restent gardés par OE_CASTORE_TEST_DSN, absente du job de tests CI (inchangé ici).
  • « Faire relire la matrice par une personne qui n'a pas écrit le code, à chaque version » (recommandation de l'audit) reste organisationnel.

Vérifications

  • cargo fmt --check, cargo clippy --workspace --all-targets -- -D warnings (1.97 et 1.98.1), cargo test --workspace avec PostgreSQL et OE_REQUIRE_SOFTHSM=1, cargo audit --ignore RUSTSEC-2023-0071, cargo deny check licenses : verts. make conformance-doc régénéré.
  • Mutation : le résolveur refuse la citation d'origine (fichier de tests ignorés) ; sans la règle in_service, detects_missing_versions_ids_and_mismatched_clauses échoue.
  • À confirmer par la CI : l'installation de SoftHSM2 sur le runner (le module est fourni par libsofthsm2 à /usr/lib/softhsm/libsofthsm2.so, vérifié sous Ubuntu).

Revue humaine obligatoire

Voir PROVENANCE.md. Chaque case est cochée par le
contributeur humain qui valide la PR, après l'avoir fait lui-même.

  • Revue d'architecture validée par l'humain
  • Code relu et tests unitaires/intégration vérifiés localement
  • Absence de dépendances tierces incompatibles avec la double licence EUPL-1.2 / AGPL-3.0 (make licenses)
  • Validation de l'apport intellectuel et de la paternité humaine sur la modification

Assistance par IA

  • Cette PR a été produite avec l'assistance de Claude Code : les commits concernés portent la remorque Co-authored-by: Claude <noreply@anthropic.com>, auteur et committer restent humains, et scripts/provenance.py archive a été lancé
  • Cette PR a été écrite sans assistance par IA

PhilippeVienne and others added 2 commits September 27, 2026 09:33
error_response construisait à la main l'octet « bits inutilisés » du
PKIFailureInfo, puis le passait à BitString::from_bytes, qui en ajoute un
second. Le bit lu n'était donc pas le bon : timeNotAvailable (bit 14)
arrivait comme les bits 7 et 22, et openssl affichait « Failure info:
unspecified ». Tous les refus étaient concernés (badAlg,
unacceptedPolicy, timeNotAvailable…) : un client ne pouvait pas savoir
pourquoi sa demande était refusée (RFC 3161 §2.4.2).

Trouvé par un test de câblage du binaire tsa-server (constat D-2). Le
corpus historique ne contient que les requêtes, et les tests existants
vérifiaient le type d'erreur Rust, jamais le DER rendu.

- BitString::new(unused, bytes), en DER minimal.
- error_response_encodes_the_rfc3161_failure_bit : DER exact de chaque
  FailureInfo ; openssl_reads_the_failure_reason : openssl nomme la
  raison. Les deux échouent avec l'ancien encodage.

Co-authored-by: Claude <noreply@anthropic.com>
Constat D-2 de l'audit du 2026-09-25 : la matrice prouvait l'existence
d'un test, pas la mise en service du mécanisme. C'est ainsi que §7.11
avait pu rester « couvert » alors qu'aucun binaire ne l'appelait.

- Nouveau statut « implémenté, pas en service » (mécanisme et test
  présents, aucun binaire ne l'appelle) : §7.11 (oe-crosstsa,
  oe-replicate) y passe.
- Entry gagne `in_service` : pour une ligne couverte, un test qui exerce
  un binaire (bin/…) ou une étape d'un job de démonstration réelle
  (.github/workflows/…). validate() refuse une ligne couverte sans elle.
- tests/references.rs résout chaque référence `test` et `in_service` :
  fichier présent, fonction définie et non #[ignore], étape de workflow
  existante. La ligne REQ-7.5-01 citait un test #[ignore] : elle cite
  désormais le test du binaire.
- bin/tsa-server/tests/serve.rs, premier test du binaire tsa-server :
  vrai token SoftHSM, refus d'un certificat hors profil TSU, suspension
  en enforce (/healthz 503, timeNotAvailable), jeton vérifié par
  openssl ts -verify, SHA-1 refusé (badAlg). C'est ce test qui a révélé
  l'encodage fautif du failInfo (commit précédent, PR #62).
- ca-server : undersized_ca_keys_are_refused_by_the_binary.
- CI : SoftHSM2 installé dans le job de tests ; OE_REQUIRE_SOFTHSM fait
  échouer le test du binaire au lieu de l'ignorer.
- 36 exigences : 17 couvertes, 1 implémentée, 16 écarts, 2 hors
  périmètre. `/api/v1/conformance` expose `en_service`.

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant