1 points par GN⁺ 2024-07-28 | 1 commentaires | Partager sur WhatsApp
  • 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.c avant de recompiler movement
  • 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 Hi au-delà de 500/min et Lo en 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 movement de 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_keys de 1
    • Ajouter les octets hexadécimaux convertis à la fin du tableau keys[]
      • chaque octet doit être préfixé par 0x et séparé par une virgule
      • il faut aussi ajouter une virgule après l’octet qui était jusque-là le dernier
    • À 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ée 30
    • Ajouter un libellé dans le tableau labels[][2]
      • pour un compte Google, on peut utiliser un libellé comme { 'g', 'o' }

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
  • movement fournit la fonction utilitaire watch_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 RA dans la zone d’affichage du jour
    • 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 ra est 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

 
GN⁺ 2024-07-28
Avis de Hacker News
  • Saisir un secret TOTP sur une page web quelconque, c’est gênant.
    Sous Linux, les outils base32 et od sont peut-être déjà installés ; sur Ubuntu, ils font partie du paquet coreutils.
    À part ça, le projet est excellent, mais le design de la montre est un peu moche.

    • S’il faut absolument utiliser une application web, mieux vaut au moins passer par CyberChef, qui s’exécute uniquement côté client et est largement utilisé dans les tests de sécurité.
      https://gchq.github.io/CyberChef/
    • C’est pour ça que je garde encore uMatrix sous la main.
      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.
    • Cette carte est aussi compatible avec les A158W et A171W, qui sont nettement plus jolies.
    • Je me demande pourquoi faire confiance à un tiers, et qui plus est à un site web, pour une tâche aussi simple que décoder du base-32 ou générer un TOTP.
  • 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.

    • oddly specific objects fabrique des LCD de remplacement haut de gamme.
  • 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/

    • Malheureusement, ce n’est pas compatible.
      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.

    • J’imagine que ça fonctionne avec une pile de montre classique, et je me demande quelle est son autonomie.
      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.

  • 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.

  • 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 ?

    • Tant que le propriétaire ne raconte pas partout que « c’est mon deuxième facteur d’authentification », un passant pensera simplement que c’est une montre cassée.
    • J’utilise des codes TOTP sur ma Pebble, et je trouve ça acceptable.
      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.
    • Cela reste quand même moins voyant qu’une YubiKey, non ?