1. Jumelage : la confiance commence à l'écran du Mac
- Chaque appareil possède sa propre paire de clés P-256. La clé privée de l'iPhone est générée dans la Secure Enclave et ne peut pas être exportée ; sur les appareils qui n'en ont pas, elle est stockée dans le trousseau, limitée à cet appareil. La clé privée du Mac est stockée dans un fichier que seul votre compte utilisateur peut lire.
- L'identifiant du Mac est dérivé de sa clé publique (les 16 premiers octets du SHA-256 de la clé). Le service de mise en relation oblige le Mac à prouver qu'il en est le propriétaire au moyen d'une signature : personne ne peut donc revendiquer cet identifiant ni l'usurper.
- Le code QR de jumelage n'apparaît jamais ailleurs que sur l'écran du Mac. Il contient l'identifiant du Mac, l'empreinte de sa clé publique et une clé de jumelage de 32 octets, valable 5 minutes et utilisable une seule fois.
- Après le scan, l'iPhone calcule un HMAC-SHA256 de l'empreinte de sa propre clé avec la clé de jumelage. Cela prouve qu'il a vu le code et lie la preuve à sa clé publique : aucun intermédiaire ne peut donc substituer une autre clé. Le Mac vérifie la preuve et enregistre la clé publique du téléphone.
- Dès lors, chaque côté n'accepte que la clé publique de l'autre. Il n'y a ni mot de passe ni compte à dérober par hameçonnage ou par bourrage d'identifiants ; pour ajouter un autre téléphone, il faut que quelqu'un, devant le Mac, scanne le code.
2. Ce qui se passe à chaque connexion
- D'abord Face ID. Avant chaque connexion, l'iPhone demande Face ID ou le code de l'appareil, puis à nouveau lorsque vous revenez après plus de 5 minutes en arrière-plan.
- Une requête signée. L'iPhone signe une requête avec sa clé de la Secure Enclave : un horodatage, un nonce aléatoire, des informations d'authentification de connexion à usage unique et ses adresses réseau. Le service de mise en relation la transmet au Mac. Les adresses sont couvertes par la signature : le service ne peut donc pas diriger le Mac ailleurs.
- Le Mac décide. Il n'accepte qu'une clé jumelée, un horodatage exact à 2 minutes près et un nonce qu'il n'a encore jamais vu : les anciennes requêtes ne peuvent donc pas être rejouées. C'est seulement alors qu'il ouvre un port UDP, qu'il referme si aucune session ne démarre dans les 30 secondes.
- Trouver un chemin. Les deux côtés essaient en même temps le réseau local, un chemin direct à travers les routeurs par perçage de NAT via STUN, et un relais Cloudflare TURN. Si un chemin direct fonctionne dans les 0,6 seconde, il l'emporte ; sinon, le premier chemin qui fonctionne est utilisé, et DuoDesk passe à un chemin direct si l'un d'eux se présente dans les 10 secondes suivantes. Les informations d'authentification du relais ne sont délivrées qu'une fois que le Mac a accepté.
- Une session chiffrée. Sur ce chemin, les deux appareils ouvrent une connexion QUIC (TLS 1.3). Chacun présente son certificat et vérifie que la clé publique de l'autre est exactement celle enregistrée lors du jumelage. Sinon, la connexion est abandonnée.
- Rétablissement automatique. Chaque session garde prêt un chemin de secours par relais et y bascule après environ une seconde sans réponse sur le chemin principal. Lorsque le réseau change, l'app se reconnecte toute seule, et vos commandes ne sont pas envoyées entre-temps.
3. Si nos serveurs étaient compromis
DuoDesk est conçu en partant du principe que le service de mise en relation et le relais sont déjà compromis. Le chiffrement et les vérifications d'identité se font uniquement entre votre iPhone et votre Mac ; les serveurs ne détiennent aucune clé qui permettrait de déchiffrer une session ou d'usurper l'identité d'un appareil.
Ce qu'ils ne peuvent pas faire
- Voir votre écran, vos commandes ou votre presse-papiers : les sessions sont chiffrées de bout en bout avec des clés qui n'existent que sur les deux appareils.
- Usurper l'identité de votre Mac ou de votre iPhone : les deux côtés vérifient la clé publique enregistrée lors du jumelage.
- Jumeler un nouveau téléphone avec votre Mac : il faut pour cela la clé à usage unique affichée uniquement sur l'écran du Mac.
- Rejouer une ancienne requête de connexion : chaque requête porte un horodatage et un nonce à usage unique.
Le pire qu'ils puissent faire
- Faire échouer les connexions.
- Savoir quelle adresse IP s'est connectée à quel Mac, et quand.
- Afficher un faux état des tâches sur votre panneau En veille : les push des activités en direct sont envoyés à Apple via le service, qui détient la clé push.
Ce que le service voit et conserve en fonctionnement normal est détaillé dans la politique de confidentialité.
4. Ce que le service de mise en relation a le droit de faire
- Il tourne sur Cloudflare Workers, avec un Durable Object par Mac. Le Mac ne fait que s'y connecter en sortie et s'y enregistre avec une signature ; le service n'a jamais besoin d'une clé de jumelage ni de la clé privée d'un appareil, et n'en reçoit jamais.
- Les requêtes de connexion sont transmises au Mac telles quelles ; le seul champ que lit le service est le jeton push.
- Les informations d'authentification du relais (TURN) ne sont délivrées qu'une fois que le Mac a accepté une connexion, et expirent au bout de 12 heures.
- Le relais push ne laisse passer que les push des activités en direct, uniquement vers les téléphones qui se sont connectés à ce Mac (le service ne conserve qu'un hachage de chaque jeton), et uniquement sur les canaux créés par ce Mac. La clé push reste dans le service au lieu d'être intégrée à l'app Mac.
- Limites anti-abus : au plus 30 requêtes de connexion par minute d'une même adresse IP vers un même Mac, au plus 8 connexions en attente par Mac, et des messages de 8 Ko au maximum.
5. Protections sur le Mac
- Aucun port ouvert sur Internet. Normalement, le Mac n'a qu'une seule connexion sortante, vers le service de mise en relation. L'écouteur QUIC de la session est lié à l'adresse de bouclage, et le port UDP exposé vers l'extérieur ne s'ouvre que pour une requête vérifiée.
- Écran de confidentialité. Pendant la connexion, DuoDesk règle sur le noir les tables gamma des écrans physiques. Le gamma s'applique après la composition de l'image : ce qui arrive sur votre téléphone n'est donc pas affecté. Et si DuoDesk Host quitte ou plante, macOS rétablit lui-même le gamma, de sorte que l'écran ne peut pas rester noir.
- Verrouillage à la déconnexion, délai d'inactivité. À la déconnexion, DuoDesk peut verrouiller le Mac immédiatement, avec le même mécanisme que la commande système « Verrouiller l'écran ». Après 15 minutes sans aucune commande, la session se termine d'elle-même.
- Connexions visibles. L'icône de la barre des menus change pendant qu'une personne est connectée, et chaque connexion, chaque déconnexion et son motif sont consignés dans le journal des connexions local du Mac.
- Signé et notarisé. DuoDesk Host est signé avec un Developer ID, notarisé par Apple et s'exécute avec le Hardened Runtime. Il a besoin de l'autorisation Accessibilité pour exécuter vos commandes, ce qu'aucune app en sandbox ne peut obtenir : il n'est donc pas sur le Mac App Store, et vous le téléchargez plutôt depuis ce site.
6. Écran, commandes et mesures
- L'écran est capturé avec ScreenCaptureKit à 60 images par seconde au maximum, sans aucune image envoyée tant que rien ne change, puis encodé matériellement par VideoToolbox en H.264 ou HEVC, avec un contrôle de débit à faible latence, sans images B et avec un débit qui s'adapte au réseau.
- Le Mac peut ajouter un écran virtuel correspondant à la résolution de votre téléphone, affiché en 1:1 sans mise à l'échelle.
- Le pointeur est dessiné immédiatement sur le téléphone puis réconcilié avec le Mac, si bien qu'il n'attend jamais le réseau ; le téléphone affiche à 120 Hz.
Mesures
| Configuration | Chemin | Aller-retour (médiane) | Débit |
|---|---|---|---|
| Mac sur le Wi-Fi d'un espace de coworking, iPhone en 5G | Direct par perçage de NAT, établi en 0,1 s environ | 30 ms | 58 Mbit/s |
| Les deux sur le même Wi-Fi de coworking (les appareils ne peuvent pas se joindre) | Relais Cloudflare, au bout d'environ 1 s | 18 ms | 69 Mbit/s |
Mesuré à Singapour en octobre 2026 sur la couche de transport de DuoDesk (QUIC sur perçage de NAT ou sur le relais). Le flux de l'écran est de 12 Mbit/s par défaut. Vos résultats dépendent de votre réseau.
7. Limites connues
- Le Mac a besoin d'un utilisateur connecté ; un écran verrouillé ne pose pas de problème. Après un redémarrage, un Mac protégé par FileVault s'arrête à l'écran de déverrouillage, avant que le réseau ne soit disponible, là où aucun outil à distance ne peut l'atteindre.
- DuoDesk se connecte en UDP : les réseaux qui bloquent entièrement l'UDP ne fonctionneront pas.
- Tous les 30 jours environ, macOS demande de confirmer à nouveau l'enregistrement de l'écran ; si cela bloque l'image, quelqu'un doit cliquer sur « Autoriser » sur le Mac.
- Le service de mise en relation peut voir les métadonnées de connexion (voir la section 3).