Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,18 @@ jobs:
- name: cargo clippy
run: cargo clippy --workspace --all-targets -- -D warnings

# Les tests qui exigent SoftHSM2/PostgreSQL réels (feature `postgres`,
# crates/oe-hsm/tests/pkcs11_integration.rs) sont explicitement ignorés
# par défaut ou gardés par une variable d'environnement absente en CI ;
# ce job couvre donc la logique métier, pas l'intégration matérielle —
# celle-ci est revalidée par les jobs de démonstration (kind, compose)
# plus bas, qui tournent en conditions réelles.
# SoftHSM2 pour le test du binaire tsa-server (bin/tsa-server/tests/serve.rs),
# que la matrice de conformité cite comme preuve de mise en service
# (constat D-2) : OE_REQUIRE_SOFTHSM le fait échouer, plutôt que s'ignorer,
# si SoftHSM venait à manquer. Les tests PostgreSQL restent gardés par
# OE_CASTORE_TEST_DSN, absente ici ; l'intégration complète est revalidée
# par les jobs de démonstration (kind, compose) plus bas.
- name: Installe SoftHSM2
run: sudo apt-get update && sudo apt-get install -y softhsm2

- name: cargo test
env:
OE_REQUIRE_SOFTHSM: "1"
run: cargo test --workspace

# Suites PostgreSQL, gardées par OE_CASTORE_TEST_DSN : schéma du registre,
Expand Down
4 changes: 4 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,12 @@ Ce dépôt héberge le prototype **fonctionnel et vérifiable** du premier servi
et réponses OCSP — qui délivre le certificat de l'unité d'horodatage par
enrôlement automatisé ;
- une **matrice de conformité ETSI** générée depuis le code
([docs/CONFORMITE-ETSI.md](docs/CONFORMITE-ETSI.md)) : chaque exigence
applicable est portée par un mécanisme identifié et un test exécutable, ou
déclarée comme écart avec sa cible — la CI échoue si une ligne perd l'un
des deux ;
([docs/CONFORMITE-ETSI.md](docs/CONFORMITE-ETSI.md)), qui cite la version
de chaque norme et ses identifiants d'exigence : une exigence n'y est
« couverte » que si un binaire en service l'applique (test du binaire ou
job de démonstration réelle), sinon elle est déclarée « implémentée, pas en
service » ou « écart » avec sa cible — la CI échoue si une ligne perd sa
preuve ou cite un test introuvable ou ignoré ;
- un **HSM logiciel SoftHSM2** parlant le protocole d'un HSM certifié, pour que
le passage en production soit un changement de configuration, pas de code ;
- une **heure traçable jusqu'à UTC** : le service recoupe deux serveurs de
Expand Down
1 change: 1 addition & 0 deletions bin/ca-server/src/http.rs
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,7 @@ async fn handle_conformance(State(server): State<Arc<Server>>) -> impl IntoRespo
"statut": e.status.label(),
"mecanisme": e.mechanism,
"test": e.test,
"en_service": e.in_service,
"cible": e.target,
})
})
Expand Down
29 changes: 29 additions & 0 deletions bin/ca-server/tests/bootstrap_cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,3 +120,32 @@ fn commands_that_sign_still_require_the_pin_and_the_public_address() {
assert!(err.contains("OPENEIDAS_PKI_PUBLIC_URL"), "{args:?} : {err}");
}
}

/// ETSI TS 119 312 §8.4 (constat D-2 : preuve sur le binaire) : une clé
/// d'autorité de moins de 3072 bits est refusée avant tout, y compris par une
/// commande qui n'ouvre aucun token.
#[test]
fn undersized_ca_keys_are_refused_by_the_binary() {
for (bits, refused) in [("2048", true), ("3072", false)] {
let out = Command::new(env!("CARGO_BIN_EXE_ca-server"))
.args(["ra", "list"])
// Sans DSN : une clé admise échoue ensuite sur la base, ce qui
// prouve que le contrôle de longueur est passé.
.env_remove("OPENEIDAS_DB_DSN")
.env("OPENEIDAS_CA_KEY_BITS", bits)
.output()
.expect("lancement de ca-server");
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(!out.status.success(), "{bits} : {stderr}");
assert_eq!(
stderr.contains("OPENEIDAS_DB_DSN"),
!refused,
"{bits} : {stderr}"
);
assert_eq!(
stderr.contains("ETSI TS 119 312 impose au moins 3072 bits"),
refused,
"{bits} : {stderr}"
);
}
}
6 changes: 6 additions & 0 deletions bin/tsa-server/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,9 @@ time = { version = "0.3", features = ["std"] }
tokio = { version = "1", features = ["rt-multi-thread", "macros", "net", "signal"] }
tracing-subscriber = "0.3"
axum = "0.8"

[dev-dependencies]
oe-ca-core = { path = "../../crates/oe-ca-core" }
oe-castore = { path = "../../crates/oe-castore" }
reqwest = { version = "0.12", default-features = false, features = ["rustls-tls"] }
base64 = "0.22"
Loading
Loading