Des jetons TOTP au poignet avec une montre bête devenue intelligente
(blog.singleton.io)- Un projet de hack qui insère une carte de remplacement Sensor Watch dans une Casio F-91W classique pour consulter au poignet des codes TOTP 2FA pour Google et Github
- En conservant l’écran LCD, les boutons et le buzzer piézo d’origine, seule la carte ARM Cortex M0+ est remplacée, ce qui permet d’exécuter des watchfaces et de petits utilitaires programmables, sans Bluetooth
- La watchface TOTP fonctionne en extrayant le secret Base32 d’un QR code, en le convertissant en octets hexadécimaux, puis en l’ajoutant à
totp_face.cavant de recompilermovement - La watchface ratemeter, créée en parallèle, calcule une cadence par minute à partir de l’intervalle entre deux pressions sur le bouton ALARM, avec
Hiau-delà de 500/min etLoen dessous de 1/min - Avec plusieurs mois d’autonomie, le boîtier Casio d’origine, un émulateur wasm dans le navigateur et un arbre de sources modifiable, la F-91W peut devenir une petite plateforme de hack au poignet
Transformer une Casio F-91W en montre programmable
- Sensor Watch est une carte logique qui remplace le mouvement à quartz d’origine de la Casio F-91W
- La F-91W est une montre à quartz classique dont on estime les ventes à environ 90 millions d’unités
- La nouvelle carte réutilise les composants existants
- l’écran LCD d’origine
- les boutons
- le buzzer piézo
- La carte est programmable et basée sur ARM Cortex M0+
- Le projet Sensor Watch fournit un ensemble de watchfaces faciles à modifier et de petits utilitaires appelés “complications”
- Il n’y a pas de radio Bluetooth, mais la légèreté du boîtier, plusieurs mois d’autonomie et une architecture que l’on peut recompiler soi-même en font les principaux atouts
Des fonctions créées en moins d’une heure
- Le remplacement de la carte, la configuration du secret 2FA et l’écriture d’une nouvelle watchface ont été réalisés en environ 1 heure
- La montre a été configurée pour afficher au poignet les codes OTP des comptes Google et Github
- Une watchface ratemeter a aussi été créée pour servir de stroke meter d’aviron ou de cadence meter
- Un émulateur basé sur wasm facilite les tests sur ordinateur, et permet même d’exécuter directement ses builds personnels sur une page web
Parcours des watchfaces proposées par la montre
- Une pression sur le bouton MODE fait passer à la watchface jetons 2FA
- Sur la watchface 2FA, le bouton ALARM bascule entre les jetons Google et Github
- Une nouvelle pression sur MODE fait passer à la watchface ratemeter créée pour l’occasion
- Dans ratemeter, le bouton ALARM est pressé à intervalles réguliers pour mesurer la cadence par minute de l’élément suivi
- Cette build inclut aussi plusieurs watchfaces par défaut
- horloge mondiale
- calculateur de lever/coucher du soleil
- indicateur de phase lunaire
- sortie en temps réel du capteur de température interne de la montre
- sélecteur du mode 24 heures
- mode de réglage de l’heure et de la date
- L’arbre de sources
movementde Sensor Watch contient aussi d’autres watchfaces comme pulsometer et orrery - Le processus de mise à niveau du module F-91W est documenté sur le blog de John Graham-Cumming
Comment configurer la watchface TOTP
- La watchface TOTP génère des mots de passe à usage unique basés sur le temps en utilisant l’heure actuelle comme source d’unicité
- Elle peut servir à produire des codes de validation en deux étapes pour la connexion à divers sites comme Google ou Github
- Le bouton ALARM permet de basculer entre les sites configurés et leurs secrets TOTP
- Plusieurs sites et secrets sont pris en charge, mais il faut extraire le secret du QR code puis l’insérer directement dans le code source de la watchface
-
Procédure d’ajout d’un secret TOTP
- Récupérer le secret TOTP ou le QR code sur le site pour lequel on veut générer des codes
- Si seul le QR code est disponible, on peut extraire le secret sur le site de Stefan Sundin
- Le résultat extrait est une chaîne alphanumérique d’environ 32 caractères, correspondant au secret TOTP encodé en Base32
- Pour insérer le secret dans le code de la watchface, il faut convertir le Base32 en octets hexadécimaux sur cryptii.com
- Le secret TOTP doit être saisi en majuscules
- Après avoir ajouté les octets hexadécimaux convertis dans le code source de la watchface TOTP, il faut recompiler
movement
-
Emplacements à modifier dans
totp_face.c- Il est possible de supprimer la clé de démonstration, et pour ajouter une nouvelle clé en fin de liste, il faut augmenter
num_keysde 1 - Ajouter les octets hexadécimaux convertis à la fin du tableau
keys[]- chaque octet doit être préfixé par
0xet séparé par une virgule - il faut aussi ajouter une virgule après l’octet qui était jusque-là le dernier
- chaque octet doit être préfixé par
- À la fin du tableau
key_sizes[], ajouter la taille du secret ajouté, c’est-à-dire le nombre d’octets hexadécimaux insérés - À la fin du tableau
timesteps[], ajouter une entrée30 - Ajouter un libellé dans le tableau
labels[][2]- pour un compte Google, on peut utiliser un libellé comme
{ 'g', 'o' }
- pour un compte Google, on peut utiliser un libellé comme
- Il est possible de supprimer la clé de démonstration, et pour ajouter une nouvelle clé en fin de liste, il faut augmenter
Implémentation de la watchface ratemeter
- Le code de la watchface ratemeter figure dans la pull request soumise au projet principal
- L’essentiel de l’implémentation se trouve dans la fonction de boucle principale
ratemeter_face_loop - Cette fonction traite les événements de pression sur les boutons et les événements de tick de la montre
- La watchface peut demander une fréquence de tick pour mesurer les intervalles ou gérer l’animation
movementfournit la fonction utilitairewatch_display_string- elle tente d’afficher une chaîne alphanumérique sur les éléments 7+ segments limités de l’écran Casio
- le problème de projection d’une chaîne arbitraire sur cet écran contraint, ainsi que les exceptions, est documenté ici
-
Comportement selon les événements
EVENT_ACTIVATE- quand la watchface est activée, elle affiche
RAdans la zone d’affichage du jour
- quand la watchface est activée, elle affiche
EVENT_MODE_BUTTON_UP- une pression sur MODE fait passer à la watchface suivante
EVENT_LIGHT_BUTTON_DOWN- une pression sur LIGHT allume l’éclairage LED
EVENT_ALARM_BUTTON_DOWN- une pression sur ALARM calcule une cadence par minute à partir de l’intervalle entre cette pression et la précédente
- le compteur de ticks stocké dans l’état de la watchface est réinitialisé
- une fréquence de tick rapide est demandée via
RATEMETER_FACE_FREQUENCY - cette constante est définie à 1/16 de seconde
EVENT_TICK- la cadence actuelle est affichée à l’écran
- si la cadence est de 0, seule l’indication
raest affichée - au-delà de 500/min, l’affichage devient
ra Hi - en dessous de 1/min, l’affichage devient
ra Lo - sinon, la cadence calculée est affichée au format
ra %-3d pn - enfin, le compteur de ticks est incrémenté
Informations d’achat et affiliation
- Sensor Watch est disponible chez Oddly Specific Objects
- Il n’existe aucun lien d’affiliation avec Oddly Specific Objects
1 commentaires
Avis de Hacker News
Saisir un secret TOTP sur une page web quelconque, c’est gênant.
Sous Linux, les outils
base32etodsont peut-être déjà installés ; sur Ubuntu, ils font partie du paquetcoreutils.À part ça, le projet est excellent, mais le design de la montre est un peu moche.
https://gchq.github.io/CyberChef/
https://i.imgur.com/9MYqLvj.png
Pour pouvoir désactiver rapidement les XHR et vérifier qu’il n’y a pas de comportement serveur inattendu.
Si vous voyez parfois un étrange symbole ⌍ dans la démo, c’est un « petit 7 ».
C’est parce que, sur cette montre, les segments du haut et du bas des premier et troisième chiffres — les segments A et D — sont reliés entre eux.
https://joeycastillo.github.io/Sensor-Watch-Documentation/wi...
C’est vraiment impressionnant de voir à quel point cet afficheur a été optimisé.
En usage normal, ces positions n’ont besoin d’afficher que 0 à 5, et le premier chiffre n’a besoin que de 0, 1 et 2 pour l’heure, même si le chronomètre monte jusqu’à 59:59.99.
Ces chiffres n’ont pas besoin de distinguer les segments A et D ; en théorie, le chronomètre aurait même pu aller jusqu’à 69:59.99 sans problème, mais ils ont dû estimer qu’« une heure » suffisait.
Les 8 et 9 allument aussi les segments du haut et du bas, donc le seul vrai problème, c’est le 7.
Enfin du contenu qui donne envie de venir sur HN.
La F-91W a probablement le même format que l’A158W[1], et l’A158W est une montre incroyablement élégante pour son prix.
Elle va avec tout, elle est stylée sans être voyante, si bien que je la porte souvent à la place de montres plus chères.
Si vous craignez que le bracelet métallique tire les poils du bras, ça ne m’est arrivé qu’environ deux fois en un an, bien moins qu’avec d’autres bracelets métalliques bon marché.
Si vous voulez une alternative plus « smoky », l’A168WGG[2] a un bracelet teinté gris gunmetal, un cadran noirci, et son illuminateur n’éclaire que les caractères.
Cela dit, l’A168 est très légèrement plus grande que l’A158, donc je ne sais pas si le module interne s’y adapte de la même façon ; mais comme elle est plus grande, il y a sans doute davantage de place, donc ça devrait probablement passer.
Pour parler encore de montres, comme montre de travail à bracelet noir, j’utilise une GA-B2100-1AJF[3].
Elle est plutôt stylée pour une G-Shock, et elle a beaucoup de fonctions sans être une smartwatch.
Le modèle Bluetooth a de meilleurs coloris et contrastes de tons sur le cadran que les modèles moins chers, ce qui la rend plus facile à assortir avec ses vêtements.
[1] https://www.amazon.com/Casio-A158WA-1-Water-Resistant-Digita... [2] https://www.amazon.com/dp/B08195YQLQ/ [3] https://www.amazon.com/dp/B09YG8F41Y/
La carte Sensor Watch a besoin de composants donneurs provenant d’un module Casio 593 authentique.
La liste des montres compatibles est disponible ici :
https://www.sensorwatch.net/docs/
Montres qui ne fonctionnent pas malgré la même disposition à 3 boutons, car elles utilisent un autre mouvement : A168W, A700W, LA680W, B650W.
En règle générale, si c’est une Casio numérique à 3 boutons avec un vrai rétroéclairage « illuminator » correct plutôt qu’un éclairage latéral, ce n’est pas un 593, donc ça ne fonctionnera pas.
J’adore vraiment ce projet, et je l’utilise littéralement tous les jours.
Il y a quelque temps, j’ai implémenté une nouvelle interface pour définir les codes TOTP dans le code source, ce qui rend la description de cet article obsolète.
Maintenant, cela fonctionne comme ceci :
static totp_t credentials[] = {CREDENTIAL(2F, "JBSWY3DPEHPK3PXP", SHA1, 30),CREDENTIAL(AC, "JBSWY3DPEHPK3PXP", SHA1, 30),};https://github.com/joeycastillo/Sensor-Watch/blob/main/movem...
J’ai aussi ajouté un étalonnage utilisateur pour que le pulsomètre puisse servir à mesurer la fréquence respiratoire en cas d’asthme, et cela a déjà aidé à sauver des vies.
Il y a aussi des fonctions d’étalonnage et de compensation de température, qui portent la précision de la montre à environ 10 secondes par an.
La communauté grandit, et beaucoup de gens sont venus pour hacker le firmware.
Récemment, quelqu’un a créé un endless runner pour cette montre.
https://github.com/joeycastillo/Sensor-Watch/pull/419
Les mainteneurs sont aussi vraiment très sympas.
Si vous cherchez un excellent projet open source auquel consacrer du temps, c’est celui-ci.
Je ne l’ai pas trouvée dans la documentation.
Si vous devez recompiler et reflasher votre montre, l’usage pour du TOTP me semble assez limité.
Génial.
J’ai toujours espéré que quelqu’un fasse quelque chose comme ça pour les montres-calculatrices Casio.
https://www.casio-intl.com/asia/en/calc/products/SL-760LC-BK...
Ce serait bien que ça fonctionne aussi avec les tokens SecurID.
Vraiment intéressant.
Je travaille chez Nixon, et j’aimerais essayer ce genre de chose sur des montres numériques Nixon ; si l’auteur veut écrire un article similaire, je pourrais probablement lui obtenir quelques montres gratuitement.
Pourquoi ne puis-je pas utiliser ça sur ma smartwatch la plus intelligente ?
Ça me donne envie de revenir à une vieille Casio.
https://github.com/ch1bo/garmin-otp-authenticator
C’est vraiment bien, et j’avais aussi envisagé de faire quelque chose de similaire avec une smartwatch « idiote », mais côté sécurité opérationnelle, je me demande si c’est une bonne idée que le TOTP soit aussi visible et facilement accessible.
Que se passe-t-il si la montre est perdue ou volée ?
Je mets des libellés qui ne révèlent pas directement de quel service il s’agit.
La Pebble n’a pratiquement aucun verrouillage ni sécurité, mais ce n’est de toute façon qu’un deuxième facteur.
Si quelqu’un connaît déjà mon mot de passe généré aléatoirement, a en plus recherché l’information selon laquelle je pourrais avoir des TOTP au poignet, et peut effectivement voler ma montre, alors j’ai déjà perdu ; et à ce niveau-là, j’estime que le compromis avec la commodité en vaut la peine.