Résumé
Ocureo est une application desktop pour orthoptistes qui synchronise les dossiers patients entre postes de travail sur un réseau local, sans faire transiter aucune donnée clinique par un serveur externe. Ce document décrit l’architecture cryptographique qui sécurise cette synchronisation. La conception combine trois composants établis dans une configuration originale : (1) le Noise Protocol Framework [1], pattern KK, pour le chiffrement de session authentifié ; (2) une Autorité de Certification (CA) intégrée hébergée sur le backend SaaS pour la certification d’identité des postes ; (3) un protocole d’appairage (pairing) par Short Authentication String (SAS), inspiré de ZRTP [27] et du Bluetooth Secure Simple Pairing, pour la vérification hors bande. L’architecture adopte un environnement LAN zero trust conformément à NIST SP 800-207 [7] et vise la conformité avec l’article 32 du RGPD et les contrôles de l’Annexe A de l’ISO/IEC 27001:2022. Au-delà de la couche cryptographique, le système repose sur un modèle CRDT custom (HLC + LWW) pour la convergence des données, un protocole de transfert de fichiers avec vérification SHA-256, et un mécanisme de verrouillage distribué pour la coordination des accès concurrents. La conformité de l’implémentation est validée contre les vecteurs de test de référence cacophony. Les propriétés de sécurité du pattern Noise KK ont été formellement vérifiées par des travaux académiques indépendants [11][12][13][14].
Table des matières
- Modèle de menace
- Vue d’ensemble de l’architecture
- Identité des postes et gestion des clés
- Autorité de Certification intégrée
- Protocole d’appairage
- Chiffrement de session : Noise KK
- Révocation et cycle de vie des certificats
- Synchronisation des données
- Synchronisation des fichiers
- Verrouillage distribué
- Isolation sauvegarde/restauration
- Périmètre des données : ce que voit le serveur
- Conformité réglementaire
- Validation
- Limites connues
- État de l’art
- Références
1. Modèle de menace
1.1 Actifs protégés
| Actif | Classification | Base réglementaire |
|---|---|---|
| Dossiers patients (bilans, examens) | RGPD Art. 9 — catégorie spéciale (données de santé) | RGPD Art. 32, Art. 5.1.f |
| Intégrité des échanges (absence de falsification) | Intégrité | RGPD Art. 5.1.f |
| Disponibilité de la synchronisation | Disponibilité | Continuité d’activité |
1.2 Modèle d’attaquant
Nous adoptons un modèle Dolev-Yao restreint au segment LAN. L’attaquant :
- Peut observer, intercepter, modifier, supprimer, rejouer et injecter tout message sur le réseau local (ex. : WiFi compromis, ARP spoofing, équipement tiers sur réseau partagé).
- Peut énumérer les postes annoncés via la découverte multicast (NSD/Bonjour).
- Ne peut pas compromettre le serveur backend (considéré comme de confiance pour les opérations CA — voir §4.3 pour la discussion de cette hypothèse).
- Ne peut pas obtenir un accès physique aux postes enregistrés.
- Ne peut pas casser les primitives cryptographiques sous-jacentes (hypothèse standard).
Ce modèle reflète la surface d’attaque réaliste d’un cabinet médical : le WiFi de la salle d’attente est partagé, des prestataires de maintenance peuvent connecter des équipements, et le matériel réseau grand public n’offre aucune garantie d’isolation.
1.3 Hypothèses de confiance
| Entité | Niveau de confiance | Justification |
|---|---|---|
| Backend Dokitek | Confiance pour les opérations d’identité (CA) | Comparable à une CA TLS ; n’accède pas aux données cliniques |
| Stockage sécurisé OS (Keychain/DPAPI) | Confiance pour le matériel cryptographique | Fourni par la plateforme, avec support matériel si disponible |
| Administrateur du cabinet | Confiance pour les décisions d’enrôlement | Vérification visuelle du SAS lors de l’appairage |
| Infrastructure LAN | Non fiable | Zero trust per NIST SP 800-207 [7] |
1.4 Objectifs de sécurité
| Propriété | Mécanisme | Base formelle |
|---|---|---|
| Confidentialité | Chiffrement de session Noise KK (AEAD ChaCha20-Poly1305) | Prouvé dans [11][12][13] |
| Authentification mutuelle | Authentification par clé statique dans le pattern KK + certificats signés par la CA | Propriété Noise KK [1] |
| Forward secrecy | Clés DH éphémères par session | Propriété Noise KK, prouvé dans [14] |
| Intégrité | Tag d’authentification AEAD sur chaque message | RFC 8439 [4] |
| Anti-replay | Compteurs de nonce séquentiels dans le transport Noise | Noise spec §5 [1] |
| Résistance au MITM (appairage) | SAS dérivé des hachés de clés publiques | Channel binding, cf. ZRTP [27] |
2. Vue d’ensemble de l’architecture
2.1 Pile protocolaire
┌─────────────────────────────────────────┐
│ Couche applicative │
│ ├── Sync données (CRDT, Knowledge │
│ │ Vector — §8) │
│ ├── Sync fichiers (SHA-256, │
│ │ transfert par chunks — §9) │
│ ├── Protocole de verrouillage │
│ │ (pessimiste, HLC — §10) │
├─────────────────────────────────────────┤
│ Session Noise KK │
│ (chiffrement authentifié, PFS) │
├─────────────────────────────────────────┤
│ Transport WebSocket │
│ (encadrement, bidirectionnel) │
├─────────────────────────────────────────┤
│ TCP │
│ (livraison fiable) │
├─────────────────────────────────────────┤
│ Découverte NSD / Bonjour │
│ (DNS-SD, mDNS, zero-conf) │
└─────────────────────────────────────────┘
2.2 Séparation fonctionnelle
L’architecture impose une séparation stricte entre trois plans fonctionnels :
| Plan | Où il s’exécute | Accès Internet requis |
|---|---|---|
| Plan de contrôle — appairage, signature de certificats, émission de CRL | Backend (Dokitek) | Oui (enrôlement uniquement) |
| Plan de données — synchronisation des dossiers patients et des fichiers | LAN (pair-à-pair) | Non |
| Plan de coordination — verrouillage distribué des ressources, réconciliation par heartbeat | LAN (pair-à-pair) | Non |
Après l’appairage initial, les postes communiquent exclusivement sur le réseau local. Le backend n’est ni impliqué ni informé des échanges de données ou de coordination. Une coupure Internet n’interrompt pas la synchronisation entre les postes déjà enrôlés.
3. Identité des postes et gestion des clés
3.1 Génération des clés
Au premier démarrage, chaque poste génère deux paires de clés indépendantes :
| Paire de clés | Algorithme | Usage | Standard |
|---|---|---|---|
| Clé de signature | Ed25519 | Preuve d’identité, demandes de certificat | RFC 8032 [3] |
| Clé de session | X25519 | Diffie-Hellman Noise KK | RFC 7748 [2] |
Les clés sont générées via le générateur de nombres aléatoires cryptographiques de l’OS, par l’intermédiaire de libsodium.
3.2 Stockage des clés
Les clés privées sont stockées exclusivement dans le mécanisme de stockage sécurisé du système d’exploitation :
| Plateforme | Stockage | Protection |
|---|---|---|
| macOS | Keychain Services | Support matériel (Secure Enclave sur Apple Silicon) |
| Windows | DPAPI (Data Protection API) | Limité à l’utilisateur, lié à la machine |
Politique fail-hard : si le stockage sécurisé est indisponible, le sous-système de synchronisation refuse de démarrer. Aucun repli sur un stockage non chiffré, aucun mode dégradé, aucune rétrogradation silencieuse. Ce choix est délibéré, conformément aux recommandations ANSSI-PA-079 §3.1 [15].
3.3 Cycle de vie des clés
| Phase | Mécanisme | Référence |
|---|---|---|
| Génération | Au premier démarrage, automatique | NIST SP 800-57 Part 1 §5.2 [8] |
| Distribution | Via le protocole d’appairage (§5) | — |
| Utilisation | Sessions Noise KK | — |
| Rotation (V1) | Manuelle : ré-appairage requis | NIST SP 800-57 Part 1 §5.3.6 [8] |
| Rotation (V2, prévue) | Automatique : nouvelle clé signée par la clé précédente (chaîne de confiance) | — |
| Révocation | CRL signée par la CA (§7) | — |
| Destruction | Suppression du stockage sécurisé OS lors de la révocation du poste | — |
4. Autorité de Certification intégrée
Cette section décrit la contribution architecturale centrale : l’utilisation du backend SaaS comme Autorité de Certification (CA) intégrée pour la certification d’identité des postes.
4.1 Justification du choix de conception
Dans un petit cabinet médical (2 à 5 postes), le défi fondamental est d’établir une confiance mutuelle entre des postes sur un LAN non fiable. Trois approches ont été étudiées :
| Approche | Avantages | Inconvénients | Décision |
|---|---|---|---|
| PKI / KMS externe (ex. : AWS KMS, HashiCorp Vault) | Standard industrie, support HSM | Coût prohibitif pour un petit cabinet (plusieurs centaines d’EUR/mois) ; complexité opérationnelle | Rejeté |
| Poste maître local (un poste fait office de CA) | Aucune dépendance serveur | Poste maître = point de défaillance unique ; clés sur un laptop potentiellement volé | Rejeté |
| CA intégrée au backend (le serveur SaaS signe les certificats) | Clé CA jamais sur aucun poste ; simple ; économique | Nécessite Internet pour l’appairage ; confiance dans l’opérateur backend | Retenu |
L’approche CA intégrée est un compromis pragmatique documenté dans la littérature. NIST SP 800-57 Part 2 [9] définit le concept de « Key Management Organization » — une entité centralisée qui gère les clés cryptographiques pour des participants distribués. Le backend Dokitek remplit exactement ce rôle : il génère, stocke et opère la paire de clés CA pour le compte de chaque cabinet, sans jamais accéder aux données cliniques protégées par les clés de session dérivées.
4.2 Hiérarchie des clés CA
Clé maître AES-256 (KMS cloud, chiffrement par enveloppe)
└── Paire de clés CA par cabinet (Ed25519)
├── Clé privée : chiffrée avec la clé maître, stockée côté serveur
├── Clé publique : distribuée à tous les postes enrôlés
└── Signe : certificats postes, mises à jour CRL
└── Certificat par poste
├── Clé publique Ed25519 du poste
├── Clé publique X25519 du poste
├── Périmètre cabinet (structurellement lié)
└── Signature CA (Ed25519)
4.3 Propriétés de sécurité
Isolation de la clé CA : la clé privée CA est chiffrée au repos (AES-256) et ne quitte jamais le backend. Aucun poste — y compris celui de l’administrateur — ne possède la clé privée CA. Un poste compromis ne peut pas forger de certificats.
Périmètre par cabinet : chaque cabinet dispose de sa propre paire de clés CA. Un certificat émis pour le cabinet A est structurellement invalide pour le cabinet B. Il n’existe aucune relation de confiance inter-cabinets.
Vérification hors ligne : après l’appairage, les postes vérifient mutuellement leurs certificats en local, contre la clé publique CA mise en cache. Aucun contact avec le backend n’est requis pour l’authentification courante.
Scénario de compromission du backend — analyse de la chaîne d’exploitation complète : par souci de transparence, nous décrivons le scénario le plus défavorable et sa chaîne d’exploitation complète.
Si un attaquant parvenait à compromettre le backend (RCE, accès à l’infrastructure AWS, fuite de variables d’environnement), il pourrait extraire la clé maître CA et forger un certificat pour un cabinet ciblé. Cette hypothèse de confiance dans le backend est inhérente à toute architecture basée sur une CA — le même risque s’applique aux CA publics tels que Let’s Encrypt ou DigiCert. La clé maître est stockée dans AWS SSM (SecureString, chiffrée par KMS) et injectée au démarrage du backend ; les protections à ce niveau sont celles de l’infrastructure standard (IAM, journalisation CloudTrail), pas un HSM dédié.
Cependant, la possession d’un certificat forgé est nécessaire mais pas suffisante pour accéder aux données. La chaîne d’exploitation complète requiert l’ensemble des étapes suivantes, chacune devant aboutir :
- Compromission du backend — l’attaquant obtient la clé maître et le matériel cryptographique CA stocké en base de données (clé privée chiffrée, IV, auth tag), ce qui lui permet de déchiffrer la clé privée CA du cabinet ciblé et de forger un certificat pour un poste fictif.
- Implémentation du protocole — l’attaquant implémente un client compatible avec le protocole de pairing complet (échange de clés, génération SAS, handshake Noise KK), documenté dans le présent whitepaper.
- Présence physique sur le LAN du cabinet — le protocole opère exclusivement en réseau local. L’attaquant doit être physiquement dans le cabinet ou avoir compromis un équipement sur le réseau local.
- Initiation du pairing par l’administrateur — l’appairage n’est pas initié par le nouveau poste : c’est l’administrateur du cabinet qui déclenche la procédure depuis son poste. L’attaquant doit convaincre l’administrateur d’appairer un poste inconnu.
- Vérification visuelle du SAS — l’administrateur lit le code SAS affiché sur son écran et le confirme avec la personne physiquement présente devant lui. L’attaquant doit compléter cette vérification humaine sans éveiller de soupçon.
Les étapes 1 et 2, bien que non triviales, sont des attaques logicielles classiques. Ce sont les étapes 3 à 5 qui rendent l’exploitation pratiquement irréalisable : elles exigent une présence physique dans un cabinet médical de quelques personnes, une ingénierie sociale sur l’administrateur pour lui faire appairer un poste qu’il ne reconnaît pas, et une interaction face-à-face pour la vérification SAS — le tout pour accéder aux données d’un unique cabinet d’orthoptie. Ce profil d’attaque n’a aucun précédent connu dans le secteur des petites structures de santé.
La forward secrecy garantit par ailleurs que les sessions passées restent protégées indépendamment de toute compromission future de la clé CA.
4.4 Comparaison avec des précédents industriels
| Système | Modèle CA | Emplacement de la clé | Fonctionnement hors ligne |
|---|---|---|---|
| Matter/Thread [18] | Le Commissioner (poste local) signe les certificats NOC | Sur le poste de commissioning | Oui, après commissioning |
| Tailscale [—] | Le serveur de coordination distribue les clés WireGuard | Serveur (ne signe pas de certificats) | Partiel (repli DERP) |
| Signal [21] | Serveur stocke les pre-keys ; pas de PKI | Serveur + poste | Oui, après échange de clés |
| Ocureo | CA backend signe les certificats postes | Serveur uniquement (chiffré) | Oui, après appairage |
Le modèle Ocureo est le plus proche de l’architecture Matter Commissioner [18], à la différence clé que la clé CA réside sur le serveur backend plutôt que sur un poste local, ce qui offre une meilleure isolation contre le vol physique.
5. Protocole d’appairage
L’appairage (pairing) est le processus par lequel un nouveau poste est enrôlé dans le domaine de confiance d’un cabinet. C’est un événement supervisé et peu fréquent (à l’installation ou au remplacement d’une machine), réalisé sous le contrôle visuel de l’administrateur.
5.1 Séquence protocolaire
Pré-condition : les deux postes se sont déjà découverts via NSD/Bonjour sur le LAN et ont établi une connexion WebSocket (en clair à ce stade — aucune session Noise KK n’existe encore).
Nouveau poste (C) Backend (Dokitek) Poste admin (A)
│ │ │
│ [WebSocket LAN déjà établi via NSD] │
│ │ │
┌────┤ │ │
│Gén.│ Paires de clés Ed25519 + X25519 │
└────┤ │ │
│ │ │
│── prepare-pairing ────────>│ │
│ (token auth, clés pub) │ │
│ │ │
│<── pairingRequestId ───────│ │
│ + nonce │ │
│ │ │
│══ pairingRequest (WS/LAN) ════════════════════════════>│
│ (requestId, nonce, │ │
│ clés pub de C) │ ┌────────────┤
│ │ │ Calcule │
│ │ │ le code SAS│
┌────┤ │ │ depuis les │
│Calcule le code SAS │ │ deux clés │
│depuis les deux clés pub │ │ + nonce │
│+ nonce │ └────────────┤
└────┤ │ │
│ Affiche : [83927461] │ ┌───────────┤
│ │ │ Affiche │
│ │ │ [83927461]│
│ │ │ Admin │
│ │ │ confirme │
│ │ └──────────>│
│ │ │
│ │<── confirm-pairing ───────│
│ │ (requestId, │
│ │ clés pub de A) │
│ │ │
│ │── certificats ───────────>│
│ │ (cert C + cert A) │
│ │ │
│<════════ Livraison du certificat (WS/LAN) ═════════════│
│ │ │
┌────┤ │ │
│Stocke certificat + clé pub CA │ │
│Démarre les sessions Noise KK │ │
└────┤ │ │
5.2 Dérivation du SAS (Short Authentication String)
Le code de vérification est dérivé par hachage cryptographique déterministe des clés publiques des deux parties et d’un nonce fourni par le serveur, suivant l’approche de channel binding établie par ZRTP [27] (RFC 6189) et le Bluetooth Secure Simple Pairing (mode Numeric Comparison). Les deux postes calculent indépendamment le même code ; toute substitution de clé publique par un intermédiaire provoque une divergence visible que l’administrateur détecte.
Résistance au brute-force : l’espace de codes offre 10^8 combinaisons. Le rate limiting et l’expiration des jetons contraignent la fenêtre d’attaque pratique.
5.3 Gossip de certificats
Après l’appairage, les postes enrôlés propagent automatiquement les certificats et les listes de révocation :
- À chaque handshake Noise KK, les pairs échangent l’ensemble des certificats connus et la CRL courante.
- Chaque certificat reçu est vérifié contre la clé publique CA avant acceptation.
- Un certificat forgé (non signé par la CA du cabinet) est rejeté.
Ce mécanisme gossip garantit qu’un nouveau poste enrôlé par l’administrateur est automatiquement reconnu par tous les autres postes sans nécessiter de ré-appairage individuel. Un seul appairage par poste ; propagation à l’ensemble du réseau.
6. Chiffrement de session : Noise KK
6.1 Choix du pattern
Le Noise Protocol Framework [1] définit 12 patterns de handshake interactifs fondamentaux. Nous avons retenu le pattern KK (les deux clés statiques sont connues — Known — de chaque partie) :
KK:
-> s
<- s
...
-> e, es, ss
<- e, ee, se
| Pattern | Auth. mutuelle | Forward secrecy | Messages | Prérequis |
|---|---|---|---|---|
| KK | Oui | Oui | 2 | Les deux clés statiques pré-partagées |
| IK | Oui | Oui | 2 | Seule la clé de l’initiateur est connue |
| XX | Oui | Oui | 3 | Aucune clé pré-partagée |
KK est le choix optimal pour notre cas d’usage : après l’appairage (§5), les deux postes possèdent les clés statiques certifiées de l’autre. Le pattern KK exploite cette connaissance pour atteindre l’authentification mutuelle et la forward secrecy en un minimum de messages (2), tout en rejetant les pairs inconnus dès le premier message.
6.2 Suite cryptographique
| Fonction | Algorithme | Taille de clé | Standard | Recommandation ANSSI |
|---|---|---|---|---|
| Échange de clés (DH) | X25519 | 256 bits | RFC 7748 [2] | Recommandé [15] |
| Signature | Ed25519 | 256 bits | RFC 8032 [3] | Recommandé [15] |
| Chiffrement authentifié | ChaCha20-Poly1305 | Clé 256 bits, nonce 96 bits | RFC 8439 [4] | Recommandé [15] |
| Dérivation de clés | HKDF-SHA256 | — | RFC 5869 [5] | Recommandé [15] |
| Protocole de session | Noise KK | — | Noise spec rev. 34 [1] | — |
Tous les algorithmes retenus sont recommandés par l’ANSSI dans le Guide de sélection d’algorithmes cryptographiques (ANSSI-PA-079) [15] et listés dans NIST SP 800-57 Part 1 [8] comme approuvés pour la protection des données sensibles.
6.3 Vérification formelle
Les propriétés de sécurité du pattern Noise KK ont été vérifiées indépendamment par plusieurs travaux académiques :
| Travail | Méthode | Périmètre | Résultat |
|---|---|---|---|
| Noise Explorer (Kobeissi et al., 2018) [12] | ProVerif | 57 patterns Noise dont KK | KK satisfait l’authentification mutuelle, la forward secrecy, l’anti-replay |
| Noise* (Inria, IEEE S&P 2022) [11] | Assistant de preuve F* | Implémentations vérifiées haute performance | Implémentation KK prouvée correcte et sécurisée |
| fACCE (Dowling, 2019) [13] | Preuves calculatoires | 8 des 15 patterns de base dont KK | KK sécurisé sous hypothèses standard |
| Spectral Analysis of Noise (Girol et al., USENIX Security 2020) [14] | Analyse systématique | Tous les patterns Noise | Modèle de menace maximal sous lequel KK est sécurisé |
Ce sont des preuves académiques tierces portant sur la sécurité du protocole lui-même. Notre implémentation est validée contre les vecteurs de test de référence cacophony (§14), qui vérifient la conformité bit à bit avec la spécification — indépendamment de la bibliothèque cryptographique sous-jacente.
6.4 Propriétés de sécurité
Confidentialité : chaque message applicatif est chiffré avec ChaCha20-Poly1305 (AEAD). Un observateur sur le réseau ne voit que du texte chiffré.
Authentification mutuelle : les deux pairs prouvent la possession de leur clé statique attendue lors du handshake. Un imposteur ne peut pas compléter le handshake.
Forward secrecy : chaque session génère de nouvelles paires de clés X25519 éphémères. Les messages de transport bénéficient d’une forward secrecy forte — si une clé privée statique est compromise ultérieurement, les données de transport passées restent indéchiffrables. Les messages de handshake ont une forward secrecy partielle telle que spécifiée par le pattern Noise KK (voir l’analyse Noise Explorer [12]).
Intégrité : chaque message porte un tag d’authentification Poly1305. Toute modification en transit entraîne un rejet.
Anti-replay : le transport Noise utilise des compteurs de nonce séquentiels. Un message capturé et rejoué est détecté et rejeté.
7. Révocation et cycle de vie des certificats
7.1 Certificate Revocation List (CRL)
Lorsqu’un poste est retiré (remplacement de machine, vol, départ d’un collaborateur), l’administrateur le révoque. La CA backend émet une mise à jour de CRL signée :
| Propriété | Valeur |
|---|---|
| Signé par | CA du cabinet (Ed25519) |
| Versionnement | Numéro de séquence monotone |
| Propagation | Gossip à chaque handshake entre pairs |
| Vérification | Avant chaque session Noise KK |
| Périmètre | Par cabinet (aucun impact inter-cabinets) |
7.2 Politique fail-close
Si un poste est isolé au-delà d’un seuil configurable sans mise à jour de CRL et sans contact avec aucun pair connu, il entre en mode fail-close : il refuse les connexions provenant de postes non déjà authentifiés dans la session courante. Cela empêche un attaquant d’exploiter l’isolation réseau pour présenter un certificat forgé.
7.3 Protection du rôle administrateur
Il n’existe pas de « poste maître » unique — tout poste opéré par un utilisateur avec le rôle administrateur peut effectuer les opérations d’enrôlement et de révocation. La protection est appliquée côté serveur : les endpoints de confirmation d’appairage et de révocation sont restreints aux utilisateurs authentifiés disposant du rôle administrateur. Un poste compromis n’ayant pas le rôle admin ne peut ni enrôler ni révoquer de pairs. Si un compte administrateur est compromis, la remédiation passe par le backend (récupération du compte, réaffectation des rôles), et non par un mécanisme au niveau du poste.
7.4 Rotation des clés
| Version | Mécanisme | Perturbation |
|---|---|---|
| V1 (actuelle) | Manuelle : l’administrateur déclenche un ré-appairage | Nécessite le ré-enrôlement du poste concerné |
| V2 (prévue) | Automatique : nouvelle paire de clés signée par la clé précédente (chaîne de confiance), cycle de 90 jours | Transparente pour les utilisateurs |
8. Synchronisation des données
8.1 Modèle CRDT
La synchronisation des données cliniques repose sur un modèle CRDT (Conflict-free Replicated Data Types) implémenté en interne, sans bibliothèque tierce. Ce choix garantit un contrôle total sur la couche de persistance et sa compatibilité avec le schéma de base de données existant.
L’implémentation combine deux primitives académiques :
| Primitive | Référence | Rôle |
|---|---|---|
| Hybrid Logical Clocks (HLC) | Kulkarni, Demirbas et al. (2014) [28] | Ordre causal des événements distribués |
| Last-Writer-Wins Register (LWW) | Shapiro, Preguiça et al. (2011) [29] | Résolution déterministe des conflits par ligne |
Chaque enregistrement du domaine métier (patients, bilans, prescripteurs, modèles, formulations) porte une horloge logique hybride, l’identifiant du poste auteur de la dernière écriture, et un marqueur de suppression logique (tombstone). Ces métadonnées permettent à chaque poste de déterminer, de manière autonome et sans coordination centralisée, quelle version d’un enregistrement prévaut.
8.2 Protocole de synchronisation
La synchronisation entre pairs suit une séquence notification-requête-transfert, transmise exclusivement par le canal chiffré Noise KK (fail-closed) :
- Notification : un poste ayant accumulé des écritures locales notifie ses pairs.
- Requête : le pair récepteur répond par une demande de synchronisation, incluant son vecteur de connaissance (§8.3) comme contexte causal.
- Transfert : le poste notifiant calcule le delta minimal et le transmet de manière paginée. Le récepteur pilote la pagination jusqu’à épuisement du changeset. La pagination est tolérante aux pannes : si une interruption survient mid-transfert, la reprise au reconnect ne perd aucune donnée.
- Acquittement : un signal de complétion bidirectionnel garantit que les opérations post-synchronisation (propagation de certificats, réconciliation des verrous) ne démarrent qu’après convergence complète des deux pairs.
Le merge respecte l’ordre topologique (parents avant enfants) pour satisfaire les contraintes d’intégrité référentielle.
8.3 Vecteur de connaissance (Knowledge Vector)
Lorsqu’un nouveau poste rejoint le réseau, les pairs existants n’ont pas d’historique commun, ce qui forcerait un transfert complet redondant. Avec N postes, le coût serait O(N²) en volume transféré.
Le Knowledge Vector résout ce problème en implémentant un modèle delta-state formel (Almeida, Shoker et Baquero, 2018 [30]). Chaque pair maintient une carte d’état représentant, pour chaque poste d’écriture connu, l’horloge la plus récente observée. Lors d’une demande de synchronisation, le pair envoie cette carte ; le répondant calcule le delta minimal — seules les données que le demandeur n’a pas encore vues sont transmises.
Le vecteur est maintenu avec une sémantique de mise à jour monotone. En cas de défaillance — y compris une restauration de sauvegarde — la cohérence est préservée par reconstruction du vecteur à partir du jeu de données réel.
8.4 Résolution de conflits
Arbitrage LWW : lorsque deux pairs modifient le même enregistrement, l’écriture avec l’horloge la plus récente l’emporte. Les propriétés CvRDT (commutativité, associativité, idempotence) garantissent la convergence indépendamment de l’ordre de réception des messages.
Suppressions logiques (tombstones) : les suppressions sont représentées par un marqueur plutôt que par une suppression physique. Ce mécanisme est requis pour la convergence CRDT : une suppression physique serait invisible lors du merge et provoquerait la résurrection de l’enregistrement par un pair n’ayant pas encore reçu la suppression.
Déduplication par clé métier : lorsqu’un merge produit un doublon (par exemple, un même patient créé indépendamment sur deux postes), une stratégie de résolution déterministe fondée sur l’ordre des horloges garantit que les deux postes convergent vers le même résultat sans coordination.
8.5 Persistance de l’état de synchronisation
Les curseurs de synchronisation sont persistés localement par pair et avancent de manière monotone. Lors d’une restauration de sauvegarde, les curseurs sont réinitialisés pour forcer une resynchronisation complète — préservant l’intégrité des données à travers les frontières de restauration.
9. Synchronisation des fichiers
9.1 Architecture
Les fichiers associés aux bilans (exports PDF/Word, aperçus, pièces jointes) sont synchronisés via un registre CRDT dédié. Chaque entrée de fichier porte des métadonnées CRDT et un checksum d’intégrité SHA-256.
La synchronisation des fichiers progresse indépendamment de la synchronisation des données, via un espace de curseurs séparé.
9.2 Protocole de transfert
Le protocole opère en deux phases, toutes deux chiffrées via Noise KK :
Phase d’index : les pairs échangent des notifications de changement de fichiers et identifient les fichiers à transférer à partir des curseurs CRDT.
Phase de transfert : les fichiers sont transférés séquentiellement avec une vérification d’intégrité SHA-256 par fichier avant écriture sur disque.
9.3 Intégrité cross-platform
Tous les chemins relatifs stockés et échangés suivent une convention canonique unique, indépendamment de la plateforme (macOS, Windows). La normalisation est appliquée aux frontières du système de fichiers pour prévenir toute divergence cross-platform.
10. Verrouillage distribué
10.1 Modèle
Le système implémente un verrouillage pessimiste par ressource (patient, bilan, prescripteur, modèle, formulation) pour prévenir les conflits d’édition concurrente. Le premier rédacteur obtient le verrou (first-writer-wins via comparaison d’horloge logique).
Trois types de messages assurent la coordination, tous exclusivement chiffrés (fail-closed) : demande de verrouillage, libération, et état complet (envoyé à la connexion et enrichi dans les heartbeats).
10.2 Propriétés
| Propriété | Valeur |
|---|---|
| Timeout de connexion | Configurable — libération automatique des verrous du pair déconnecté |
| Filet de sécurité verrous périmés | Durée maximale de maintien imposée |
| Surfaces de mutation gardées | Toutes les opérations d’écriture dans l’interface (suppression, édition, finalisation) |
| Réconciliation par heartbeat | Périodique — détecte et corrige l’état de verrouillage asymétrique |
La réconciliation par heartbeat est un mécanisme de défense en profondeur : les pairs échangent périodiquement un résumé de l’état de verrouillage et corrigent toute divergence causée par des messages de coordination perdus lors de déconnexions transitoires.
11. Isolation sauvegarde/restauration
La sauvegarde et la restauration sont des opérations exclusives qui remplacent le jeu de données local. La couche de synchronisation complète (découverte, connexions, données, fichiers, verrous) est arrêtée pendant toute la durée de l’opération pour prévenir la propagation d’état intermédiaire ou les effets de bord en cascade. Les pairs observent une déconnexion propre. La synchronisation est redémarrée systématiquement à la fin de l’opération, et les pairs se reconnectent pour une resynchronisation propre.
12. Périmètre des données : ce que voit le serveur
| Donnée | Transite par le serveur ? | Finalité |
|---|---|---|
| Dossiers patients, bilans, fichiers | Non — pair-à-pair, chiffré | — |
| Clés de session (éphémères) | Non — ne quittent jamais la RAM | — |
| Clés publiques des postes | Oui — à l’appairage uniquement | Signature de certificat |
| Clé privée CA | Oui — chiffrée au repos | Opérations CA |
| CRL | Oui — signée, publique par nature | Propagation des révocations |
| Curseurs de synchronisation | Non — LAN uniquement, chiffré | Suivi de progression sync (SQLite local) |
| Vecteurs de connaissance | Non — LAN uniquement, chiffré | Delta-state sync (SQLite local) |
| État des verrous | Non — LAN uniquement, chiffré | Coordination des accès (mémoire, non persisté) |
| Index des fichiers (chemins + HLC) | Non — LAN uniquement, chiffré | Registre de fichiers sync (SQLite local) |
| Noms des postes | Partiellement — NSD sur LAN + backend (enregistrement device) | Identification visuelle des postes |
Le serveur est un tiers de confiance pour l’identité — il certifie quels postes appartiennent à quel cabinet. Il n’est pas un intermédiaire de données. Il ne voit, ne traite ni ne stocke aucune donnée clinique. Cette séparation est imposée architecturalement : le plan de données opère exclusivement sur le LAN, et le backend ne dispose d’aucun endpoint API qui accepte ou retourne des données cliniques.
13. Conformité réglementaire
13.1 Correspondance RGPD
| Article | Exigence | Implémentation |
|---|---|---|
| Art. 5.1.f | Intégrité et confidentialité | AEAD Noise KK, forward secrecy, anti-replay |
| Art. 25 | Protection des données dès la conception et par défaut | Sécurité conçue avant l’implémentation (4 audits de conception) ; aucun mode dégradé |
| Art. 32.1.a | Chiffrement des données personnelles | Chiffrement de bout en bout sur tous les canaux de synchronisation |
| Art. 32.1.b | Confidentialité, intégrité, disponibilité continues | Révocation CRL, fail-close, propagation par gossip |
| Art. 32.1.d | Tests et évaluations réguliers | Vecteurs de test cacophony, audits de sécurité |
| Art. 9 | Catégories spéciales (données de santé) | Données ne quittant jamais le réseau local ; aucun traitement côté serveur |
13.2 Correspondance avec les contrôles de l’Annexe A ISO/IEC 27001:2022
| Contrôle | Titre | Implémentation |
|---|---|---|
| A.5.15 | Contrôle d’accès | Séparation des rôles : administrateur (appairage, révocation) vs. membre (sync). Appliqué côté serveur sur chaque appel API |
| A.5.28 | Collecte de preuves | Journalisation des événements de sécurité : tentatives d’appairage, échecs de handshake, révocations, détections de replay |
| A.8.9 | Gestion de configuration | Matériel cryptographique géré centralement (CA backend) ; configuration des postes via stockage sécurisé |
| A.8.10 | Suppression des informations | La révocation d’un poste déclenche une mise à jour CRL ; matériel cryptographique détruit à la révocation |
| A.8.24 | Utilisation de la cryptographie | Sélection des algorithmes per ANSSI-PA-079 [15] et NIST SP 800-57 [8] ; pas de cryptographie personnalisée ; framework Noise KK |
| A.8.25 | Cycle de vie de développement sécurisé | 4 audits de sécurité en phase de conception ; vérification formelle citée ; validation par vecteurs de test |
| A.8.26 | Exigences de sécurité applicative | Fail-hard en cas d’indisponibilité du stockage sécurisé ; aucun repli en clair ; rate limiting sur l’appairage |
Note : Ocureo n’est pas certifié ISO 27001. Cette correspondance documente l’alignement de l’architecture cryptographique avec les contrôles pertinents de l’Annexe A. La certification ISO 27001 est un processus organisationnel qui dépasse les seules mesures techniques.
13.3 Conformité ANSSI
Tous les algorithmes cryptographiques individuels utilisés sont recommandés par l’ANSSI dans le Guide de sélection d’algorithmes cryptographiques (ANSSI-PA-079, 2021) [15] :
- Ed25519 : recommandé pour les signatures numériques
- X25519 : recommandé pour l’accord de clés
- ChaCha20-Poly1305 : recommandé pour le chiffrement authentifié
- SHA-256 / HKDF : recommandé pour le hachage et la dérivation de clés
Le Noise Protocol Framework en tant que tel n’a pas été évalué par l’ANSSI ; ses propriétés de sécurité reposent sur des preuves académiques indépendantes [11][12][13][14].
13.4 HDS (Hébergement de Données de Santé)
La certification HDS (réglementation française sur l’hébergement de données de santé, Décret n° 2018-137) s’applique aux organisations qui hébergent des données de santé pour le compte d’un professionnel de santé. Dans l’architecture Ocureo, les données cliniques ne quittent jamais le réseau local et ne sont jamais hébergées sur les serveurs Dokitek. La certification HDS n’est donc pas requise pour la fonctionnalité de synchronisation. Néanmoins, les fondations architecturales (gestion des clés, contrôle d’accès, piste d’audit) sont conçues pour soutenir une trajectoire de certification HDS si le périmètre du produit venait à évoluer.
14. Validation
14.1 Conformité de l’implémentation
L’implémentation Noise KK est validée contre les vecteurs de test de référence cacophony — la suite de tests standard pour les implémentations du Noise Protocol. Chaque test injecte des clés connues, exécute le handshake et 4 messages de transport, et vérifie que chaque octet en sortie correspond aux valeurs attendues, bit à bit. C’est le test de conformité le plus strict disponible pour les implémentations du Noise Protocol.
Les vecteurs de test sont maintenus par la communauté Noise Protocol et utilisés par les implémentations de référence en Haskell, Rust et Go. Passer ces vecteurs confirme que notre implémentation suit correctement la spécification Noise KK [1].
14.2 Audits de sécurité
Quatre audits de sécurité ont été conduits pendant les phases de conception et d’implémentation :
| Audit | Phase | Périmètre | Résultats | Résolution |
|---|---|---|---|---|
| V1 — Revue de la pile cryptographique | Pré-implémentation | Sélection des algorithmes, modèle de menace | 2 Haute, 4 Moyenne, 3 Faible, 2 Info | Toutes les Haute/Moyenne résolues. Recommandation d’adopter Noise KK appliquée. |
| V2 — Revue de la chaîne de confiance | Pré-implémentation | Architecture CA, protocole d’appairage, séquencement des phases | 2 Haute, 6 Moyenne, 3 Faible, 3 Info | Toutes les Haute résolues. Phase sécurité réordonnée avant la phase données. |
| V3 — Revue post-implémentation | Après développement | Conformité à la conception, problèmes au niveau du code | Findings de sévérité critique | Tous résolus en moins de 24 heures. |
| V4 — Migration cryptographique | Post-implémentation | Migration vers une bibliothèque cryptographique auditée et largement déployée (libsodium) | 1 Haute (dépendance mono-auteur) | Résolue. Couche d’abstraction découplant le code protocolaire de l’implémentation cryptographique. Conformité revalidée via les vecteurs cacophony. |
14.3 Protections contre les CVE
| Classe de vulnérabilité | Protection |
|---|---|
Incrément du nonce en cas d’échec de déchiffrement (cf. CVE-2024-58265 dans la bibliothèque Rust snow) | Le compteur n’avance pas en cas d’échec de déchiffrement ; cette classe de vulnérabilité est traitée par conception |
| Attaque par point neutre (X25519) | Clés publiques nulles rejetées au handshake |
| Attaque par rétrogradation (repli en clair) | Aucun mode dégradé — chiffrement ou absence de connexion |
| Épuisement du nonce | Plafond vérifié avant chaque opération de chiffrement |
15. Limites connues
Transparence sur les limites actuelles de l’architecture :
| Limite | Impact | Atténuation | Résolution prévue |
|---|---|---|---|
| Pas de rotation automatique des clés (V1) | Clés statiques à longue durée de vie : fenêtre d’exposition élargie en cas de compromission | La forward secrecy limite l’impact aux métadonnées ; ré-appairage disponible | V2 : rotation automatique avec chaîne de confiance |
| Pas de HSM pour la clé maître | Clé maître dans AWS SSM (protégée par KMS), pas dans un HSM dédié | KMS fournit un chiffrement par enveloppe et une journalisation des accès ; acceptable pour le profil de risque des petits cabinets | Coût prohibitif ; à réévaluer si le produit évolue vers le segment hospitalier |
| Bindings mono-auteur vers la bibliothèque cryptographique | Les bindings vers la bibliothèque cryptographique sont maintenus par un auteur unique | Risque atténué : (1) le cœur cryptographique (libsodium) est un projet multi-contributeurs, audité, utilisé par Signal, 1Password, Cloudflare ; (2) les bindings sont mécaniquement simples et forkables ; (3) une couche d’abstraction découple le code protocolaire de l’implémentation | Le point de défaillance unique porte sur la couche de bindings, non sur l’implémentation cryptographique |
| Internet requis pour l’appairage | Enrôlement d’un nouveau poste impossible lors d’une indisponibilité backend | Les sessions existantes continuent sur le LAN ; l’indisponibilité n’affecte que l’enrôlement | Contrainte architecturale du modèle CA-backend |
| Identifiant de poste visible sur le LAN | Les identifiants de postes sont visibles lors de la découverte réseau locale. Aucun accès aux données n’est possible à partir de cette information seule | Mitigation prévue : identifiants dérivés remplaçant les valeurs directes dans les enregistrements de découverte | Post-v1 |
| Pas de garbage collection des tombstones CRDT | Les enregistrements soft-deleted (is_deleted = 1) s’accumulent indéfiniment | Impact marginal sur les volumes actuels (quelques milliers de lignes) | Compaction prévue en post-v1 |
| Orphelin de session file sync | Si un pair déconnecte mid-transfert, les sessions dépendantes peuvent se bloquer jusqu’à la reconnexion | Récupération automatique à la reconnexion : l’état de synchronisation n’a pas avancé, le transfert reprend proprement | Timeout de session à évaluer en post-v1 |
16. État de l’art
| Système | Chiffrement | Modèle d’identité | Coût | Différence clé avec Ocureo |
|---|---|---|---|---|
| Doctolib (via acquisition Tanker) | E2E partiel (échange de documents) | PKI (Tanker SDK) | 135-149 EUR/mois | Capacité acquise (~25-30 M EUR). Couvre l’échange de documents, pas la synchronisation complète. |
| Matter/Thread [18] | Sessions AES-128-CCM | Le Commissioner signe les certificats NOC | — (standard IoT) | Le Commissioner est un poste local ; clé CA sur un équipement (isolation plus faible). |
| Tailscale | WireGuard (Noise IK) | Serveur de coordination distribue les clés | 5-18 $/utilisateur/mois | Pas de signature de certificats ; clés distribuées, non certifiées. |
| Syncthing | TLS 1.3 | Identifiants de postes (auto-signés), Introducer pour la propagation de confiance | Gratuit (open source) | Pas de CA centralisée ; modèle TOFU ; l’Introducer est consultatif, pas autoritatif. |
| Signal | X3DH + Double Ratchet (basé sur Noise) | Serveur de pre-keys + safety numbers | Gratuit | Pas de PKI ; TOFU + vérification par QR code. Modèle de menace différent (global, asynchrone). |
| Ocureo | Noise KK (E2E complet) | CA backend signe les certificats des postes | ~20 EUR/mois | Clé CA côté serveur (isolation maximale) ; vérification hors ligne ; inclus dans l’abonnement de base. |
Ocureo utilise le même framework cryptographique que Signal et WireGuard (Noise Protocol), mais dans un pattern différent (KK vs. IK/XX) optimisé pour un réseau fermé et pré-authentifié où les clés statiques de tous les participants sont certifiées par une autorité commune. L’architecture n’est pas comparable à celle de Signal, qui résout un problème fondamentalement différent (messagerie asynchrone entre inconnus) nécessitant des propriétés supplémentaires (post-compromise security, deniability cryptographique) hors du périmètre de Noise KK.
17. References
Specifications and Standards
| # | Document | Reference |
|---|---|---|
| [1] | Noise Protocol Framework, Revision 34 | noiseprotocol.org/noise.html |
| [2] | RFC 7748 — Elliptic Curves for Security (X25519) | rfc-editor.org/rfc/rfc7748 |
| [3] | RFC 8032 — Edwards-Curve Digital Signature Algorithm (Ed25519) | rfc-editor.org/rfc/rfc8032 |
| [4] | RFC 8439 — ChaCha20 and Poly1305 for IETF Protocols | rfc-editor.org/rfc/rfc8439 |
| [5] | RFC 5869 — HMAC-based Extract-and-Expand KDF (HKDF) | rfc-editor.org/rfc/rfc5869 |
| [6] | RFC 5280 — Internet X.509 PKI Certificate and CRL Profile | rfc-editor.org/rfc/rfc5280 |
| [27] | RFC 6189 — ZRTP: Media Path Key Agreement for Unicast Secure RTP | rfc-editor.org/rfc/rfc6189 |
NIST Publications
| # | Document | Reference |
|---|---|---|
| [7] | NIST SP 800-207 — Zero Trust Architecture | csrc.nist.gov/pubs/sp/800/207/final |
| [8] | NIST SP 800-57 Part 1 Rev. 5 — Recommendation for Key Management | csrc.nist.gov/publications/detail/sp/800-57-part-1/rev-5/final |
| [9] | NIST SP 800-57 Part 2 Rev. 1 — Best Practices for Key Management Organizations | csrc.nist.gov/publications/detail/sp/800-57-part-2/rev-1/final |
Academic Publications (Formal Verification of Noise Protocol)
| # | Document | Reference |
|---|---|---|
| [11] | Noise* — A Library of Verified High-Performance Secure Channel Protocol Implementations (IEEE S&P 2022, Inria) | eprint.iacr.org/2022/607 |
| [12] | Noise Explorer — Fully Automated Modeling and Verification for Arbitrary Noise Protocols (Kobeissi et al., 2018) | eprint.iacr.org/2018/766 |
| [13] | Flexible Authenticated and Confidential Channel Establishment (fACCE): Analyzing the Noise Protocol Framework (Dowling, 2019) | eprint.iacr.org/2019/436 |
| [14] | A Spectral Analysis of Noise: A Comprehensive, Automated, Formal Analysis of Diffie-Hellman Protocols (Girol et al., USENIX Security 2020) | usenix.org/system/files/sec20-girol_0.pdf |
CRDT and Distributed Systems
| # | Document | Reference |
|---|---|---|
| [28] | Kulkarni, S., Demirbas, M., Madappa, D., Avva, B., Leone, M. “Logical Physical Clocks and Consistent Snapshots in Globally Distributed Databases.” 2014. | cse.buffalo.edu/tech-reports/2014-04.pdf |
| [29] | Shapiro, M., Preguiça, N., Baquero, C., Zawirski, M. “A comprehensive study of Convergent and Commutative Replicated Data Types.” INRIA Research Report RR-7506, 2011. | inria.hal.science/inria-00555588 |
| [30] | Almeida, P.S., Shoker, A., Baquero, C. “Delta State Replicated Data Types.” Journal of Parallel and Distributed Computing, 111, 2018. | doi.org/10.1016/j.jpdc.2017.08.003 |
ANSSI / Réglementation française
| # | Document | Reference |
|---|---|---|
| [15] | ANSSI-PA-079 — Guide de sélection d’algorithmes cryptographiques (2021) | cyber.gouv.fr/publications/mecanismes-cryptographiques |
| [16] | RGS v2.0 — Référentiel Général de Sécurité | cyber.gouv.fr/le-referentiel-general-de-securite-version-20-les-documents |
Industry References
| # | Document | Reference |
|---|---|---|
| [18] | Matter Security & Privacy Fundamentals (CSA, 2022) | csa-iot.org |
| [21] | Signal X3DH Specification | signal.org/docs/specifications/x3dh/ |
Regulatory
| # | Document | Reference |
|---|---|---|
| [22] | ISO/IEC 27001:2022 — Information Security Management Systems | iso.org/standard/27001 |
| [23] | ISO/IEC 27002:2022 — Information Security Controls | iso.org/standard/75652.html |
| [26] | RGPD — Règlement (UE) 2016/679 | eur-lex.europa.eu |