Secure Boot TF-A
Post-Quantique
Première chaîne hybride Ed25519 + ML-DSA-87 end-to-end BL1 → BL33 sur un fork ARM Trusted Firmware-A, publiée sous forme de patches reproductibles à partir de la base LTS v2.10.9.
BL1 vérifie le certificat de BL2 en Ed25519 (HACL* formellement vérifié F*/Vale). BL2 charge les images et exécute 6 vérifications ML-DSA-87 (liboqs FIPS 204, niveau NIST 5) avant transfert à BL31. Un adversaire disposant d’un ordinateur quantique cryptographiquement pertinent ne peut produire un firmware accepté par la chaîne complète : la résistance post-quantique tient au niveau de la chaîne, pas au niveau d’un cert isolé.
15
Patches versionnés
Replay vanilla OK
12
Vérifs crypto OK
6 Ed25519 + 6 ML-DSA-87
BL33
Atteint end-to-end
4 jalons NOTICE
0
Data Abort
0 panic · 0 mismatch
~57 %
Marge BL2
~223 KB libres
12,5 KB
Empreinte ML-DSA-87
liboqs freestanding
Pourquoi cette page, distincte du Secure Boot natif
Le module Secure Boot CORTEX NK™ (S1-S10) est le module natif propre à CORTEX NK, vérifié multi-outils (Frama-C, Isabelle/HOL, CBMC), avec 211 tests E2E PASS et boot composé à 0,55 ms. Cette page-ci documente une seconde réalisation, complémentaire : l’intégration de cette logique cryptographique dans la chaîne ARM Trusted Firmware-A upstream, avec ajout d’une couche post-quantique end-to-end.
Secure Boot CORTEX NK™ S1-S10
Module Secure Boot propre à CORTEX NK, indépendant de toute base upstream. 10 sprints livrés, signatures hybrides Ed25519 + ML-DSA-87, anti-rollback TPM 2.0, recovery Option A STRICT, vérification formelle multi-outils, 211 tests E2E PASS. Boot composé 0,55 ms · boot orchestré 1,51 ms.
Page dédiée Secure Boot
Secure Boot TF-A · Post-Quantique (cette page)
Portage de la logique CORTEX NK dans la chaîne ARM Trusted Firmware-A upstream (LTS v2.10.9). 15 patches versionnés, chaîne TBBR hybride Ed25519 (HACL*) + ML-DSA-87 (liboqs FIPS 204) end-to-end BL1 → BL33, boot QEMU validé, replay vanilla sans conflit, reproductibilité documentée.
Sprint S73c-f · Juin 2026
F-1 à F-6.H · Chaque palier indépendamment vérifiable
Le sprint S73c-f a été conduit en onze paliers F-1 → F-6.H, chacun avec son périmètre isolé, ses tests, et son commit Git correspondant. La numérotation reflète l’ordre logique de construction : préliminaires plateforme, intégration des clés, ajout du backend HACL*, ajout du backend ML-DSA-87, intégration ATF/BL2, fixes runtime, et durcissement sécurité F-6.H final.
| Palier | Description | Statut | Patch |
|---|---|---|---|
| F-1 → F-3 bis | Préliminaires plateforme cortexnk · stub BL2 · platform.mk | ✓ Validé | 0001 |
| F-4 | BL2 wiring · plateforme cortexnk active | ✓ Validé | 0001 |
| F-5.A | manifest_hash via SHA-256 BL2 | ✓ Validé | 0002 |
| F-5.B | nk_key_provider · embed clés Ed25519 + ML-DSA pour dev | ✓ Validé | 0003-0006 |
| F-6.A | cert_create — support KEY_ALG=ed25519 pure Ed25519 | ✓ Validé | 0007 |
| F-6.B.1 | libmldsa_host (x86_64) · binaire signataire ML-DSA-87 | ✓ Validé | 0008 |
| F-6.B.2 | cert_create — signatures ML-DSA-87 sidecar via liboqs | ✓ Validé | 0008 |
| F-6.C | Backend HACL* TBBR Ed25519 + plat cortexnk | ✓ Validé | 0009 |
| F-6.C fix | BL1_SOURCES TBBR auth stack BL1 | ✓ Validé | 0010-0011 |
| F-6.D | ML-DSA-87 verify BL2 batch · chaîne PQ end-to-end | ✓ Validé | 0012 |
| F-6.E.1 | Parseur DigestInfo DER propre dans verify_hash() | ✓ Validé | 0013 |
| F-6.F | AUTH_BACKEND=hacl explicite dans platform.mk | ✓ Validé | 0014 |
| F-6.H | Symétrie save/restore SCTLR/CPTR autour des appels HACL* (audit-grade post-CESTI) | ✓ Validé | 0015 |
feat/cortexnk-s73f4 sur
le fork cortexaitm/trusted-firmware-a, 15 commits depuis la base
LTS v2.10.9 (7e6321360). Replay des 15 patches sur vanilla testé,
arbre identique (tree-hash 77f918b1f8d57b8b196d29b2507c9095301e5a7a),
0 conflit. Tous les commits signés Signed-off-by: David Salomon, aucun trailer
tiers, aligned pour soumission upstream future.
De la racine de confiance au monde normal
La chaîne TF-A définit quatre étapes successives (BL1, BL2, BL31, BL33), chacune vérifiant la suivante cryptographiquement avant de lui céder le contrôle. Le sprint S73c-f ajoute une couche post-quantique ML-DSA-87 en BL2, vérifiée en batch avant le saut vers BL31. Politique fail-closed absolue : toute vérification échouée arrête le boot.
bl31_arch_setup, l’état architectural (CPTR_EL3, SCTLR_EL3)
est réinitialisé à ses valeurs par défaut TF-A — ce qui referme implicitement les
fenêtres ouvertes par F-6.H en BL1/BL2.
nk_mldsa87_verify_all_certs() en fin de chaîne BL2,
avant tout transfert BL31. Voir la section « Modèle de menace » pour le détail
audit-grade.
Inventaire complet · replay vanilla validé
Les 15 patches du sprint S73c-f sont publiés dans patches/cortexnk_tfa_s73c-f/
du dépôt cortex_nk_pqc. Application séquentielle (git am) sur un clone vanilla
de TF-A LTS v2.10.9 produit un arbre Git strictement identique au fork interne
(tree-hash vérifié). Chaque patch porte un en-tête From: David Salomon
et un Signed-off-by: conforme DCO, sans aucun trailer tiers.
| N° | Sujet | Date | Lignes | Fichiers |
|---|---|---|---|---|
| 0001 | feat(cortexnk) — BL2 platform + PQC crypto handoff S73c-f | 31 mai | 1 475 | 6 |
| 0002 | feat(cortexnk) — F-5.A manifest_hash réel via SHA-256 BL2 | 01 juin | 137 | 1 |
| 0003 | feat(cortexnk) — F-5.B.0 régénération dev_keys_embedded | 01 juin | 100 | 1 |
| 0004 | fix(cortexnk) — F-5.B.0.bis dev_keys_embedded.h régénéré | 01 juin | 1 027 | 1 |
| 0005 | fix(cortexnk) — F-5.B.0.ter resync dev_keys_embedded.h | 01 juin | 1 020 | 1 |
| 0006 | feat(cortexnk) — F-5.B.5/6/7 nk_key_provider integration | 01 juin | 216 | 3 |
| 0007 | feat(cert_create) — F-6.A ajout KEY_ALG_ED25519 pure Ed25519 | 01 juin | 237 | 4 |
| 0008 | feat(cert_create) — F-6.B.2 ML-DSA-87 dual-signature support | 01 juin | 502 | 4 |
| 0009 | feat(auth) — F-6.C backend auth/hacl + plat TBBR Ed25519 | 01 juin | 698 | 6 |
| 0010 | feat(auth) — F-6.C fix BL1_SOURCES TBBR auth stack BL1 | 01 juin | 128 | 1 |
| 0011 | fix(auth) — F-6.C TBBR boot chain complet BL1→BL2→BL31 | 01 juin | 278 | 2 |
| 0012 | feat(auth) — F-6.D ML-DSA-87 dual-signature TBBR end-to-end | 01 juin | 322 | 4 |
| 0013 | fix(auth) — F-6.E.1 parseur DigestInfo DER propre verify_hash | 01 juin | 196 | 1 |
| 0014 | feat(plat) — F-6.F AUTH_BACKEND=hacl explicite platform.mk | 01 juin | 135 | 1 |
| 0015 | feat(auth) — F-6.H symmetric save/restore SCTLR/CPTR around HACL* calls | 02 juin | 308 | 1 |
| TOTAL — 15 patches | 31 mai → 02 juin | 6 779 | 21 uniq. | |
git filter-branch pour aligner author + committer
sur David Salomon <davidsalomon@cortexorigin.com>, ajouter Signed-off-by
conforme DCO, et retirer tout trailer parasite éventuel. Vérification finale automatisée :
0 mismatch · 0 trailer parasite sur la fenêtre lts-v2.10.9..HEAD.
Symétrie SCTLR/CPTR autour des appels HACL*
Le palier F-6.H est le dernier de la séquence S73c-f. Il transforme une baisse de garde architecturale globale (établie en F-6.C/D pour permettre les stores SIMD non alignés de HACL*) en une fenêtre minimale strictement bornée à chaque appel cryptographique. C’est le palier qui permet à la chaîne d’être présentée à un évaluateur CESTI : la propriété architecturale n’est plus relâchée que pendant la durée d’exécution d’un verify, avec restauration symétrique stricte.
AUDIT-NOTE F-6.H · extrait du fichier hacl_crypto.c
Compromis différencié EL3 (BL1) vs S-EL1 (BL2)
En EL3 (BL1), le wrapping per-call strict suffit : le code C entre deux appels
HACL* exécute peu d’instructions, GCC ne génère pas de stockages SIMD non alignés
observables. En S-EL1 (BL2), le code TF-A entre deux appels HACL* est plus volumineux
(load image I/O, INFO printf, fip_find, handoff build) et GCC génère régulièrement
des str q sur la pile à des offsets non alignés 16B. Restaurer SCTLR_EL1.A=1
entre deux calls provoquerait un Data Abort silencieux.
Décision F-6.H : clear SCTLR_EL1.A une fois en S-EL1 à l’init du
backend, restauration déférée au handoff BL31 (qui réinitialise CPTR_EL3 et SCTLR_EL3
via bl31_entrypoint.S / el3_common_macros). La fenêtre EL3 reste
strictement bornée per-call ; la fenêtre S-EL1 est bornée à la durée de BL2 (~quelques
millisecondes), ce qui reste compatible avec l’objectif d’audit CESTI dès lors que
TBBR est mono-thread, IRQs masquées, sans canal d’entrée externe pendant la fenêtre.
init() et ne les
restaurait jamais — la garde architecturale restait baissée sur l’intégralité de
l’exécution BL1+BL2. Un évaluateur CESTI aurait immédiatement pointé cette asymétrie.
F-6.H ramène la fenêtre cumulée à ~quelques millisecondes, documente la propriété
formellement, et confirme l’absence de canal d’entrée pendant cette fenêtre.
57 événements du Booting Trusted Firmware à BL33
Le boot QEMU sur la plateforme qemu-system-aarch64 -machine virt,secure=on
-cpu cortex-a57 -m 1G a été exécuté avec capture complète du log. 57 événements
sont observés du premier NOTICE: Booting Trusted Firmware jusqu’à l’entrée
BL33. Les quatre jalons NOTICE (BL1 → BL2 → BL31 → BL33) sont tous présents, et les 12
vérifications cryptographiques attendues (6 Ed25519 + 6 ML-DSA-87) sortent toutes en
succès, sans aucun Data Abort ni panic ni mismatch.
Compteurs finaux observés
| Indicateur | Attendu | Observé | Verdict |
|---|---|---|---|
| Vérifications Ed25519 result=1 (succès) | 6 | 6 | ✓ OK |
| Vérifications Ed25519 KO | 0 | 0 | ✓ OK |
| Vérifications ML-DSA-87 result=0 (succès) | 6 | 6 | ✓ OK |
| Vérifications ML-DSA-87 KO | 0 | 0 | ✓ OK |
| Vérifications SHA-256 result=1 (succès) | ≥5 | 5 | ✓ OK |
| Jalons NOTICE (BL1 → BL2 → BL31 → BL33) | 4 | 4 | ✓ OK |
| Data Abort / Synchronous Exception | 0 | 0 | ✓ OK |
| panic / ERROR: | 0 | 0 | ✓ OK |
| arch_state EL mismatch (instrumentation F-6.H) | 0 | 0 | ✓ OK |
| DigestInfo parse FAIL | 0 | 0 | ✓ OK |
Entry point address = 0x60000000. Pour un déploiement réel, BL33 contient
un OS hôte (Linux, hyperviseur, UEFI) qui prend le relais.
12 vérifications · 1 par cert × 2 algorithmes
Chaque certificat TBBR de la chaîne est vérifié à deux reprises :
une fois en Ed25519 (signature classique, vérifiée par HACL* qui est formellement
prouvé F*/Vale), une fois en ML-DSA-87 (signature post-quantique, vérifiée par
liboqs niveau FIPS 204 L5). La vérification ML-DSA-87 utilise un format propriétaire
.mldsa87.sig de 4 639 octets stocké en sidecar dans le FIP TOC, référencé
par UUID5 dédié.
| Idx | Image ID | Certificat TBBR | Ed25519 (HACL*) | ML-DSA-87 (liboqs) |
|---|---|---|---|---|
| 0 | 6 | TRUSTED_BOOT_FW_CERT · cert de BL2 | ✓ result=1 | ✓ result=0 |
| 1 | 7 | TRUSTED_KEY_CERT · clé Trusted World | ✓ result=1 | ✓ result=0 |
| 2 | 9 | SOC_FW_KEY_CERT · clé SoC FW (BL31 key) | ✓ result=1 | ✓ result=0 |
| 3 | 13 | SOC_FW_CONTENT_CERT · contenu SoC FW (BL31) | ✓ result=1 | ✓ result=0 |
| 4 | 11 | NON_TRUSTED_FW_KEY_CERT · clé Non-Trusted (BL33 key) | ✓ result=1 | ✓ result=0 |
| 5 | 15 | NON_TRUSTED_FW_CONTENT_CERT · contenu Non-Trusted (BL33) | ✓ result=1 | ✓ result=0 |
Ed25519 · HACL* freestanding
Vérification cert par cert via backend drivers/auth/hacl/hacl_crypto.c.
HACL* est la lib formellement vérifiée F*/Vale développée par INRIA et Microsoft
Research, utilisée notamment par Firefox NSS et le kernel Linux. Vérification
binaire prouvée Constant-Time au niveau ARM64 + x86-64 via Binsec/Rel.
Algorithme rapide, robustesse 128 bits classique.
F*/Vale · INRIA Prosecco
ML-DSA-87 · liboqs FIPS 204 L5
Vérification batch via bl2/nk_mldsa87_verify.c. ML-DSA-87 est le
niveau le plus élevé du standard NIST FIPS 204 finalisé en août 2024 (résistance
équivalente AES-256). Implémenté via liboqs en mode freestanding aarch64 :
empreinte ~12,5 KB, signature 4 627 octets, clé publique 2 592 octets.
Robustesse contre les futurs ordinateurs quantiques cryptographiquement pertinents.
FIPS 204 · NIST L5 · OQS Project
<cert>.mldsa87.sig de 4 639 octets (12 octets header MLD1 +
4 627 octets signature brute). Chacun est référencé par un UUID5 généré
déterministiquement. Cette approche par sidecar évite de devoir étendre le format
X.509 ASN.1, et préserve l’applicabilité upstream des patches.
Où vit la ROTPK · provisioning · révocation · stockage
Une chaîne cryptographique n’est jamais plus forte que la gestion de sa clé racine. Pour un évaluateur EAL5/6+, la question n’est plus « quel algorithme ? » mais « où vit la Root of Trust Public Key ? comment est-elle provisionnée en usine ? comment révoquée en cas de compromission ? comment scellée matériellement contre le clonage ? ». Cette section documente l’état actuel et la trajectoire S77/S78.
| Élément Root of Trust | Mécanisme actuel · S73c-f | Statut |
|---|---|---|
| ROTPK Ed25519 | Compilée en dur dans le binaire BL1 via plat/cortexnk/cortexnk_rotpk.S.
Empreinte SHA-256 ancrée comme constante de référence. 32 octets clé publique Ed25519. |
✓ Actif (QEMU) |
| ROTPK ML-DSA-87 | Fournie par nk_key_provider via dev_keys_embedded.h
en BL2. 2 592 octets clé publique. Chargée une fois par batch, zéroïsée après usage. |
✓ Actif (QEMU) |
| Provisioning fab | Clés signées en interne CORTEX AI™ SAS via cert_create + binaire mldsa_host. Clés privées Ed25519 et ML-DSA-87 jamais sorties de l’environnement de signature air-gapped (process interne NDA). | ~ Process dev |
| Ancrage hardware cible | TPM 2.0 EAL4+ (Infineon SLB 9670, ST33TPHF20I2C, Nuvoton NPCT75x) pour mesures + scellement. Secure element optionnel (NXP A71CH, Optiga TPM) pour stockage clés privées sensibles. | → S77 hardware |
| Mesure boot dans TPM | Extension PCR cryptographique (SHA-256) à chaque étape : PCR[0] = BL1+SoC, PCR[2] = BL2+config, PCR[4] = BL31, PCR[7] = state. Accumulation irréversible attestable. Pattern mature S4+S8 du module Secure Boot natif. | → Intégration S77 |
| Anti-clonage matériel | Scellement clé via TPM PCR extension boot. Empreinte plate-forme unique dérivée du PCR cumulé. Toute modification de la chaîne BL invalide le scellement. Détection clone immédiate à attestation. | → Intégration S77 |
| Révocation certificat | Mécanisme TBBR upstream supporté : compteur version dans cert + anti-rollback monotone via TPM NV (équivalent S9 v1 du module natif). Un cert révoqué ne peut être rejoué même avec accès flash. | → Intégration S77 |
| Rotation ROTPK | Protocole multi-pass de transition d’une ROTPK ancienne vers une nouvelle : (1) inclusion nouvelle dans cert chain signé par ancienne, (2) validation par BL1 en boot suivant, (3) verrouillage ancienne via NV TPM. Documenté roadmap. | → Roadmap S78 |
ROTPK compilée en dur
Sur la plateforme de validation QEMU virt + Cortex-A57, la ROTPK Ed25519
est embarquée directement dans le binaire BL1 au format ASM via
cortexnk_rotpk.S. La ROTPK ML-DSA-87 est fournie par
nk_key_provider dans BL2. Modèle de menace correspondant :
attaquant logiciel uniquement (pas d’accès physique au binaire signé).
État S73c-f juin 2026
TPM 2.0 + secure element
Sur board hardware physique (S77), la ROTPK sera ancrée dans le TPM 2.0 EAL4+ ou un secure element type Optiga / NXP A71CH. Mesure boot par extension PCR. Attestation distante via TPM Quote signé. Scellement clés critiques via TPM Seal sur état PCR. Modèle de menace : attaquant physique local, accès flash possible, mais pas accès au TPM tamper-resistant.
Cible S77 · Q2 2027
PUF + attestation distante
Pour EAL6+ (horizon 2029-2030), évaluation de l’ancrage ROTPK dans une PUF (Physically Unclonable Function) silicium directement intégrée au SoC. Pas de clé stockée — clé reconstruite à chaque boot depuis les micro-variations physiques du die. Anti-clonage absolu, pas de surface d’attaque flash. Standard montant SAFEcrypto, GMV-SGI, Intrinsic-ID.
Roadmap EAL6/7
L’hybridité tient au niveau de la chaîne, pas du cert isolé
Cette section documente explicitement et honnêtement la propriété de résistance post-quantique de la chaîne S73c-f. La distinction entre « hybride par chaîne » et « hybride par cert » est subtile mais essentielle pour toute communication audit-grade. Un évaluateur CESTI rigoureux pointera cette nuance — autant qu’elle soit documentée formellement par nos soins.
Propriété formelle garantie
Un adversaire disposant d’un ordinateur quantique cryptographiquement pertinent (CRQC) capable de casser Ed25519 via l’algorithme de Shor ne peut pas produire un firmware accepté par la chaîne complète BL1 → BL33. Cette propriété repose sur l’exigence cumulative de deux signatures séparées :
- Ed25519 (signature classique, héritée TBBR upstream) — vérifiée par BL1 sur le cert de BL2, puis par BL2 sur tous les certs des images chargées.
- ML-DSA-87 (signature post-quantique, ajoutée par CORTEX NK) — vérifiée par BL2 en batch sur les 6 certs TBBR après chargement complet, avant tout transfert à BL31.
Précision auditable honnête
L’hybridité tient au niveau de la chaîne complète, pas au niveau d’un
certificat isolé. Les certificats X.509 du TBBR portent une signature Ed25519
unique au format upstream standard. La signature ML-DSA-87 est attachée séparément
par sidecar FIP et vérifiée en batch par nk_mldsa87_verify_all_certs()
en fin de chaîne BL2. La propriété PQ-résistante est donc garantie post-vérification
BL2 complète, pas dès le premier byte vérifié en BL1.
Un adversaire CRQC capable de falsifier un cert Ed25519 isolé peut donc en
théorie faire passer un cert modifié à BL1 (qui le vérifiera Ed25519-OK), mais BL2
détectera l’incohérence en fin de chaîne via la vérification ML-DSA-87 compagne.
Le boot s’arrête par panic() avant tout saut BL31.
Caveat de portée documenté
Pendant la fenêtre intra-BL2 entre le chargement d’une image et sa vérification ML-DSA, un adversaire CRQC ayant compromis Ed25519 pourrait théoriquement faire accepter une image falsifiée par BL1. En pratique cette fenêtre n’est pas exploitable :
- BL2 s’exécute en S-EL1 single-thread, single-core boot
- IRQs masquées (DAIF.I = 1) jusqu’à l’exit de bl2_main
- Aucun canal d’entrée externe (pas de réseau, pas d’USB, pas d’I/O console)
- Aucun secret cryptographique manipulé pendant cette fenêtre — rien à exfiltrer
- Aucune exécution d’image utilisateur (BL33 pas encore atteint)
La vulnérabilité formelle existe (différence avec un schéma dual-sig par cert). La vulnérabilité exploitable n’existe pas dans le modèle de menace réel. Cette distinction est exactement ce que le vocabulaire audit-grade sert à exprimer.
cert_create
upstream, adaptation de auth_mod.c upstream, alignement sur le draft IETF
lamps-pq-composite-sigs, retrait des sidecars. Bénéfice attendu : propriété
formelle PQ stricte dès BL1, alignement EAL6+ formel. À la date de publication S73c-f,
la propriété hybride par chaîne est jugée suffisante pour le palier CSPN ANSSI visé
Q3 2027 et la trajectoire EAL4+/5.
Rebuild complet par un tiers
L’ensemble du sprint S73c-f est conçu pour être rejoué par un tiers à partir des
sources publiques upstream TF-A + des 15 patches livrés. Aucune dépendance privée,
aucun composant propriétaire, aucun secret intégré (les clés de développement
embarquées dans dev_keys_embedded.h sont marquées dev only · DO NOT USE
IN PRODUCTION).
Hashes de référence (NDA · DGA / CESTI)
Les hashes SHA-256 des artefacts du build de référence ne sont pas publiés en clair sur cette page (sécurité opérationnelle). Ils sont disponibles sous NDA pour les évaluateurs DGA/ANSSI, les CESTI agréés, et les partenaires institutionnels du programme Cortex Origin. La structure de référence est donnée à titre indicatif :
| Artefact | Taille (octets) | SHA-256 (sous NDA) |
|---|---|---|
| bl1.bin | 128 681 | 270c6c1548b950bb49fd2972815eb8f363717490ab7790029877e47a38452b23 |
| bl2.bin | 172 969 | ac638a51ef0904da5777a022ef0f54f81cc5abf90a04263f1897abccf53c4466 |
| cortexnk_fw.bios | 528 305 | fa8460854b2489d97d8d1c95ccb3b0bc80cf466aada86cc5484a4a46ca2d1833 |
| fip.bin | ~260 000 | 5b8301c23fb1d97ddf56594b670eff40fb1eb5aa854d40b89ee6c94c04d9a9ff |
Built : HH:MM:SS, MMM D YYYY issue des macros
standard TF-A __DATE__ / __TIME__, modifiée à chaque
compilation. La reproductibilité fonctionnelle est en revanche assurée : code
exécutable et certificats embarqués sont identiques aux décalages correspondants.
Pour passer en reproductibilité stricte bit-à-bit, neutraliser ces macros via un
patch upstream complémentaire (roadmap S74 indépendante).
Supply-chain security SBOM · SLSA · provenance
Au-delà de la reproductibilité du build, la chaîne S73c-f s’inscrit dans la discipline supply-chain security devenue standard (US Executive Order 14028, EU Cyber Resilience Act, NIST SSDF). Trois mécanismes complémentaires sont mis en œuvre pour rendre auditable l’intégralité de la chaîne de dépendances.
| Mécanisme | Description · périmètre S73c-f | Statut |
|---|---|---|
| SBOM SPDX 2.3 | Software Bill of Materials au format SPDX 2.3 généré automatiquement à chaque build via Syft. Couvre TF-A LTS v2.10.9 (base upstream), HACL* freestanding, liboqs ML-DSA-87, mbedTLS 3.6.4, OpenSSL 3.0.20, toolchain aarch64-linux-gnu-gcc 12.2.0. Hashes SHA-256 des dépendances inclus. | ✓ Généré build |
| Attestation SLSA L2 | Provenance signée niveau SLSA 2 (Supply-chain Levels for Software Artifacts).
Build attesté reproducible via image Docker scellée
(cortex-nk-tfa-tools:debian-bookworm, id d99054aaecb1). Attestation
signée via Cosign + sigstore en sortie de build. |
~ En cours |
| Provenance Git signée | Tous les commits des 15 patches signés GPG par David Salomon
(davidsalomon@cortexorigin.com). Author = committer aligné via
filter-branch. Signed-off-by conforme DCO. Aucun trailer parasite.
Replay vanilla LTS v2.10.9 produit tree-hash identique. |
✓ Validé |
| Hash chain dépendances | HACL* freestanding compilée avec hash de référence vérifié (build INRIA reproductible). liboqs ML-DSA-87 buildée depuis tag git signé OQS-Project. MbedTLS 3.6.4 stable tag upstream. Tous les hashes SHA-256 ancrés dans le SBOM SPDX. | ✓ Validé |
| Vulnerability scanning | Scan CVE des dépendances via Grype + OSV-Scanner sur le SBOM SPDX généré. Aucune CVE critique non patchée à la date de publication (juin 2026). Rapport disponible sous NDA. | ✓ 0 CVE critique |
12,5 KB ML-DSA-87 · marge BL2 ~57 %
L’ajout de la couche post-quantique ML-DSA-87 dans BL2 a un coût mémoire mesuré. La librairie liboqs en mode freestanding aarch64 occupe 12 536 octets de code (text), sans data ni bss. BL2 dans son ensemble pèse 172 969 octets, dans une allocation de 393 216 octets — soit une marge libre de ~57 % pour des extensions futures (sidecars additionnels, autres primitives PQC, télémétrie boot).
| Composant | .text | .rodata | .data + .bss | Total |
|---|---|---|---|---|
| libmldsa87_aarch64.a · 10 objets | 11 512 | 1 024 | 0 | 12 536 |
| libhacl_aarch64.a · sous-ensemble TBBR | 53 360 | 15 568 | 11 | ~68 939 |
| bl2.bin actuel · TBBR PQ end-to-end | 172 032 | — | ~189 K bss | 172 969 |
| BL2 allocation · platform_def.h | — | — | — | 393 216 |
| Marge libre BL2 | — | — | — | ~220 247 (~57 %) |
Aucune implémentation publique équivalente connue à ce jour
L’état de l’art a été investigué activement via recherches web ciblées au moment de la publication (juin 2026), sur les acteurs susceptibles d’avoir produit un travail comparable : Google AVB (Android), TianoCore EDK II (UEFI), PQShield (commercial), MbedTLS upstream, Trusted Firmware-A upstream, Linux kernel, travaux académiques arXiv/eprint. Aucun ne couvre exactement le périmètre de S73c-f.
| Acteur / projet | Cible | PQ end-to-end | TBBR / TF-A | Open source | Statut |
|---|---|---|---|---|---|
| CORTEX NK S73c-f 🇫🇷 | TBBR ARM TF-A | ✓ Hybride par chaîne | ✓ LTS v2.10.9 | ✓ Patches publiés | Juin 2026 |
| Google AVB · Android 🇺🇸 | Post-bootloader | ~ ML-DSA tests beta | ✗ Android only | ~ AOSP | Mars 2026 |
| TianoCore EDK II · UEFI | UEFI | ✗ Issue ouverte | ✗ Non TBBR | ✓ Open | Pas implémenté |
| PQShield 🇬🇧 | Commercial | ~ Building blocks | ✗ Non TF-A | ✗ Propriétaire | Conceptuel |
| MbedTLS upstream | TLS / X.509 | ✗ Pas ML-DSA | ~ Utilisé par TF-A | ✓ Open | Roadmap discutée |
| TF-A upstream 🇬🇧 | ARM firmware | ✗ Aucun patch | ✓ Référence | ✓ Open | Pas de PQ |
| Linux kernel module signing | Post-OS | ✓ ML-DSA 6.19 | ✗ Orthogonal | ✓ GPL | Hors scope boot |
Ce que nous ne prétendons pas
La transparence sur les limites est ce qui distingue un dossier audit-grade d’un slide marketing. CORTEX NK documente explicitement quatre frontières du sprint S73c-f, vérifiables dans le code et dans le rapport de validation. C’est cette honnêteté qui fait la crédibilité devant ANSSI / CESTI / DGA.
QEMU · pas hardware physique
La validation end-to-end a été effectuée sur QEMU qemu-system-aarch64
virt + cortex-a57. Le portage sur un board ARM Cortex-A physique
(Raspberry Pi 5, RK3588, NXP i.MX9, ou cibles défense type Cortex-A76 industriel)
n’est pas encore fait. Étape obligatoire pour CSPN ANSSI / EAL.
Roadmap S77 · hardware
Hybride par chaîne · dual-sig par cert en cours
La résistance PQ tient au niveau de la chaîne complète (vérif ML-DSA-87 batch en BL2 post-load), pas au niveau d’un certificat isolé. Caveat de fenêtre intra-BL2 documenté et démontré non-exploitable. Le passage à un schéma dual-sig par cert (propriété PQ stricte dès BL1) est en cours d’intégration via les sprints S75/S76 actifs.
S75/S76 · dual-sig en cours
Reproductibilité fonctionnelle, pas stricte
Les binaires diffèrent entre deux builds successifs sur quelques octets
(timestamps __DATE__ / __TIME__ embarqués). Le code exécutable
et les certificats sont identiques. Passer en reproductibilité stricte bit-à-bit
demande un patch upstream complémentaire (neutraliser ces macros TF-A).
Roadmap S74 · bit-à-bit
Symétrie F-6.H différenciée EL3 vs S-EL1
En BL1 (EL3), le wrap per-call strict est appliqué. En BL2 (S-EL1), une fenêtre module-level est ouverte à l’init du backend et fermée implicitement par la réinit BL31. Compromis documenté formellement, justifié par la quantité de code C inter-call de GCC qui émet des stockages SIMD non alignés.
F-6.H AUDIT-NOTE · documenté
Menaces explicitement hors périmètre S73c-f
Le sprint S73c-f couvre la chaîne logicielle de vérification cryptographique BL1 → BL33. Les classes d’attaques suivantes sont explicitement hors périmètre du logiciel CORTEX NK et nécessitent des contre-mesures matérielles ou architecturales distinctes (TPM 2.0, secure element, mesures physiques de protection, mécanismes anti-glitch silicium). Elles sont mentionnées ici pour transparence audit.
| Classe d’attaque | Description | Contre-mesure attendue |
|---|---|---|
| Fault injection | Injection de faute (clock glitching, voltage glitching) pour court-circuiter un branchement conditionnel de vérification cryptographique. | Silicium anti-glitch · double vérif |
| Voltage glitching | Variation brutale de l’alimentation CPU pour provoquer une instruction défaillante au moment exact du compare/branch d’une vérif crypto. | Detector hardware · regulator stable |
| EMFI | Electromagnetic Fault Injection — impulsion EM ciblée pour induire un bit-flip en RAM ou cache pendant une opération crypto sensible. | Shielding · capteurs EM intégrés |
| Laser fault attack | Laser focalisé sur le die du SoC pour modifier un transistor pendant un calcul cryptographique. Attaque haut de gamme labo physique. | Package opaque · mesh anti-tamper |
| Rowhammer | Accès répété à des lignes mémoire DRAM voisines pour induire des bit-flips dans des lignes adjacentes contenant des clés ou des résultats de vérif. | DRAM ECC · refresh agressif |
| DMA attacks | Périphérique malveillant (Thunderbolt, PCIe) accédant directement à la mémoire via DMA pour modifier l’image en cours de vérification. | IOMMU · SMMU configuré · TrustZone |
| Side-channel timing | Mesure des temps d’exécution pour extraire des informations sur clés ou données traitées. HACL* est prouvé Constant-Time en partie binaire. | Constant-time · HACL* Binsec/Rel |
Du sprint S73c-f au dossier CSPN 2027
Le sprint S73c-f est un livrable autonome cohérent à juin 2026. Pour atteindre la trajectoire institutionnelle complète (CSPN ANSSI 2027 → EAL4+ 2028 → EAL5/6 2029 → EAL7 cible 2030), quatre sprints additionnels sont identifiés. Chacun est atomique, indépendamment livrable, et résout une frontière documentée.
__DATE__ / __TIME__ dans TF-A pour
atteindre une reproductibilité stricte bit-à-bit (sha256sum strictement
identique entre builds successifs). Effort : ~1 semaine. Compatible
SOURCE_DATE_EPOCH si finalement adopté upstream.
cert_create et
auth_mod.c upstream pour porter deux signatures cohabitantes
(Ed25519 + ML-DSA-87) dans chaque X.509 hybride conforme au draft IETF
lamps-pq-composite-sigs. Retrait des sidecars. Bénéfice :
propriété PQ stricte dès BL1, alignement EAL6+ formel.
Trois preuves indépendantes
Le sprint S73c-f s’inscrit dans la discipline méthodologique CORTEX NK : chaque livrable est vérifié par trois outils complémentaires qui se contrôlent mutuellement. La page dédiée Secure Boot natif (S1-S10) détaille ces résultats pour le module propriétaire ; cette page-ci en restitue l’application à la chaîne TF-A intégrée.
🔒 Frama-C / WP
Vérification déductive des contrats ACSL des fonctions critiques de la chaîne (parseurs DER, helpers HACL*, batch ML-DSA). Solveurs SMT Alt-Ergo 2.6 et Z3 4.13. Couverture WP cumulative sur TCB strict CORTEX NK ≥ 96 % (audit S82 parallèle).
CEA · Alt-Ergo · Z3
📐 Isabelle / HOL
Preuves mathématiques formelles des invariants de Secure Boot. 10 théorèmes attestation + 0 sorry sur le module quote. Standard académique mondial, utilisé pour seL4, Genode, CompCert. La logique d’attestation hybride est formellement prouvée.
Cambridge · TU Munich
🔬 CBMC
Model checking borné du code C. 533 propriétés vérifiées sur le module quote (overflow, underflow, accès mémoire invalide, division par zéro, dépassements de tableaux). 0 failure détectée. Outil officiel Université d’Oxford, utilisé chez Amazon (S3) et Diffblue.
Oxford · Amazon · Diffblue
Pré-audit indépendant CESTI agréé ANSSI
Au-delà des trois outils de vérification interne, une démarche de pré-audit indépendant a été démarrée auprès d’un centre d’évaluation agréé ANSSI (CESTI). L’objectif est une revue méthodologique externe couvrant l’architecture cryptographique S73c-f, la chaîne TBBR PQ end-to-end, les contrats ACSL Frama-C/WP et les preuves Isabelle/HOL. Ce type de revue indépendante est la dernière étape avant le dépôt formel de dossier CSPN visé Q3 2027.
Trois outils internes. Une revue externe en cours. Zéro angle mort.
Parlons souveraineté.
Rapports complets disponibles sur demande : CFVL-SECBOOT-TFA-001 v1.2, validation factuelle S73f, dossier reproductibilité, priorart, mémo datation publique. Pré-audit CESTI en cours · dual-sig par cert en intégration. Démonstrations sur scénarios CNES / DGA / OIV disponibles sur board ARM physique après portage S77.
Confidentiel · CORTEX AI™ SAS · SIREN 991 880 428 · 58 rue de Monceau, 75008 Paris