1 Punkte von GN⁺ 2024-07-28 | 1 Kommentare | Auf WhatsApp teilen
  • Ein Hacking-Projekt, bei dem ein gewöhnlicher Casio F-91W mit einem Sensor Watch-Ersatzboard ausgestattet wird, um 2FA-TOTP-Codes für Google und Github am Handgelenk anzuzeigen
  • Das vorhandene LCD, die Tasten und der Piezo-Summer bleiben erhalten; nur das ARM Cortex M0+-Board wird ausgetauscht, sodass ohne Bluetooth programmierbare Watchfaces und Utility-Apps ausgeführt werden können
  • Das TOTP-Watchface funktioniert, indem es aus einem QR-Code ein Base32-Secret extrahiert, dieses in Hex-Bytes umwandelt, in totp_face.c einfügt und movement neu baut
  • Das ebenfalls entwickelte ratemeter-Watchface berechnet anhand der Abstände zwischen ALARM-Tastendrücken eine Rate pro Minute; über 500/min wird Hi, unter 1/min Lo angezeigt
  • Mehrmonatige Batterielaufzeit, das originale Casio-Gehäuse, ein webbasierter wasm-Emulator und ein anpassbarer Source Tree machen aus der F-91W eine kleine Hacking-Plattform fürs Handgelenk

Eine Casio F-91W in eine programmierbare Uhr verwandeln

  • Sensor Watch ist ein Logic Board, das das vorhandene Quarzwerk der Casio F-91W ersetzt
  • Die F-91W ist eine klassische Quarzuhr, von der Berichten zufolge rund 90 Millionen Stück verkauft wurden
  • Das neue Board nutzt die vorhandenen Komponenten weiter
    • das originale LCD-Display
    • Tasten
    • Piezo-Summer
  • Das Board basiert auf ARM Cortex M0+ und ist programmierbar
  • Das Sensor-Watch-Projekt bietet leicht anpassbare Watchfaces und ein Bündel kleiner Utility-Apps, die als „complications“ bezeichnet werden
  • Es gibt kein Bluetooth-Funkmodul, aber die Vorteile sind das leichte Uhrengehäuse, eine Batterielaufzeit von mehreren Monaten und eine Architektur, die sich selbst neu bauen lässt

Funktionen, die in einer Stunde entstanden sind

  • Board-Tausch, Einrichtung der 2FA-Secrets und Schreiben eines neuen Watchfaces wurden in etwa 1 Stunde erledigt
  • Die Einrichtung ermöglicht es, OTP-Codes für Google- und Github-Konten am Handgelenk zu sehen
  • Neu geschrieben wurde ein ratemeter-Watchface, das sich als Ruderschlagzähler oder Kadenzmesser nutzen lässt
  • Ein wasm-basierter Emulator erleichtert das Testen am Computer, und eigene Builds können direkt auf einer Webseite ausgeführt werden

Ablauf der Watchfaces auf der Uhr

  • Ein Druck auf die MODE-Taste wechselt zum 2FA-Token-Watchface
  • Im 2FA-Watchface schaltet die ALARM-Taste zwischen Google- und Github-Token um
  • Ein weiterer Druck auf MODE wechselt zum neu erstellten ratemeter-Watchface
  • Im ratemeter drückt man die ALARM-Taste regelmäßig, um die Rate pro Minute des beobachteten Vorgangs zu messen
  • Dieser Build enthält außerdem mehrere Standard-Watchfaces
    • Weltuhr
    • Rechner für Sonnenaufgang und Sonnenuntergang
    • Mondphasenanzeige
    • Live-Ausgabe des Temperatursensors im Inneren der Uhr
    • Auswahl für 24-Stunden-Einstellung
    • Modus zum Einstellen von Uhrzeit/Datum
  • Im movement-Source-Tree der Sensor Watch gibt es weitere Watchfaces wie pulsometer und orrery
  • Der Upgrade-Prozess des F-91W-Moduls ist im Blog von John Graham-Cumming dokumentiert

TOTP-Watchface einrichten

  • Das TOTP-Watchface erzeugt zeitbasierte Einmalpasswörter, die die aktuelle Zeit als Quelle der Eindeutigkeit verwenden
  • Es kann zur Generierung von Zwei-Faktor-Authentifizierungscodes für Logins bei verschiedenen Websites wie Google oder Github genutzt werden
  • Mit der ALARM-Taste wechselt man zwischen den eingerichteten Websites und TOTP-Secrets
  • Mehrere Websites und Secrets werden unterstützt, allerdings muss das Secret aus dem QR-Code extrahiert und direkt in den Source Code des Watchfaces eingetragen werden
  • Vorgehen zum Hinzufügen eines TOTP-Secrets

    • Von der Website, für die Codes erzeugt werden sollen, ein TOTP-Secret oder einen QR-Code beziehen
    • Wenn nur ein QR-Code vorliegt, kann das Secret auf der Website von Stefan Sundin extrahiert werden
    • Das Ergebnis ist eine etwa 32 Zeichen lange alphanumerische Zeichenfolge und entspricht dem Base32-codierten TOTP-Secret
    • Um das Secret in den Watchface-Code einzufügen, muss Base32 auf cryptii.com in Hex-Bytes umgewandelt werden
    • Das TOTP-Secret muss in Großbuchstaben eingegeben werden
    • Nach dem Hinzufügen der umgewandelten Hex-Bytes zum Source Code des TOTP-Watchfaces wird movement neu kompiliert
  • Änderungsstellen in totp_face.c

    • Die Demo-Keys können entfernt werden; um am Ende der Liste einen neuen Key hinzuzufügen, wird der Wert von num_keys um 1 erhöht
    • Die umgewandelten Hex-Bytes werden am Ende des Arrays keys[] hinzugefügt
      • Jedem Byte wird 0x vorangestellt, getrennt wird mit Kommas
      • Auch nach dem bisherigen letzten Byte muss ein Komma ergänzt werden
    • Am Ende des Arrays key_sizes[] wird die Größe des hinzugefügten Secrets ergänzt, also die Anzahl der gerade eingefügten Hex-Bytes
    • Am Ende des Arrays timesteps[] wird ein Eintrag 30 hinzugefügt
    • Im Array labels[][2] wird ein Anzeigelabel ergänzt
      • Für ein Google-Konto kann etwa ein Label wie { 'g', 'o' } verwendet werden

Implementierung des ratemeter-Watchfaces

  • Der Code des ratemeter-Watchfaces befindet sich in einem Pull Request, der beim Hauptprojekt eingereicht wurde
  • Der größte Teil der Implementierung steckt in der Main-Loop-Funktion ratemeter_face_loop
  • Diese Funktion verarbeitet Tasteneingabe-Events und Tick-Events der Uhr
  • Ein Watchface kann Tick-Intervalle anfordern, um Intervalle zu messen oder Animationen zu verarbeiten
  • movement stellt die Utility-Funktion watch_display_string bereit
    • Sie versucht, alphanumerische Zeichenfolgen auf den begrenzten 7+-Segment-Elementen des Casio-Displays darzustellen
    • Das Problem, beliebige Zeichenfolgen auf das eingeschränkte Display abzubilden, sowie Sonderfälle sind in der Dokumentation beschrieben
  • Verhalten je Event

    • EVENT_ACTIVATE
      • Wenn das Watchface aktiviert wird, erscheint im Bereich der Wochentagsanzeige RA
    • EVENT_MODE_BUTTON_UP
      • Durch Drücken der MODE-Taste wird zum nächsten Watchface gewechselt
    • EVENT_LIGHT_BUTTON_DOWN
      • Durch Drücken der LIGHT-Taste wird die LED-Beleuchtung eingeschaltet
    • EVENT_ALARM_BUTTON_DOWN
      • Durch Drücken der ALARM-Taste wird aus dem Abstand zwischen dieser und der vorherigen Eingabe die Rate pro Minute berechnet
      • Der im Watchface-Zustand gespeicherte Tick-Zähler wird zurückgesetzt
      • Ein schneller Tick-Intervall mit RATEMETER_FACE_FREQUENCY wird angefordert
      • Diese Konstante ist als 1/16 Sekunde definiert
    • EVENT_TICK
      • Die aktuelle Rate wird auf dem Display angezeigt
      • Wenn die Rate 0 ist, wird nur ra angezeigt
      • Ist die Rate schneller als 500/min, wird ra Hi angezeigt
      • Ist sie langsamer als 1/min, wird ra Lo angezeigt
      • Andernfalls wird die berechnete Rate im Format ra %-3d pn angezeigt
      • Am Ende wird der Tick-Zähler erhöht

Kaufinformationen und Zugehörigkeit

  • Sensor Watch ist bei Oddly Specific Objects erhältlich
  • Es besteht keine Zugehörigkeit zu Oddly Specific Objects

1 Kommentare

 
GN⁺ 2024-07-28
Hacker-News-Kommentare
  • TOTP-Secrets in eine beliebige Webseite einzugeben, ist unangenehm
    Unter Linux sind base32 und od möglicherweise bereits installiert; unter Ubuntu stecken sie im Paket coreutils
    Ansonsten ist das Projekt großartig, aber das Uhrendesign ist ziemlich hässlich

    • Wenn es unbedingt eine Web-App sein muss, wäre zumindest CyberChef besser, das nur clientseitig läuft und in Sicherheitstests breit genutzt wird
      https://gchq.github.io/CyberChef/
    • Deshalb halte ich uMatrix immer noch am Leben
      https://i.imgur.com/9MYqLvj.png
      Damit kann man XHR schnell abschalten, um zu prüfen, ob es unerwartetes serverseitiges Verhalten gibt
    • Dieses Board ist auch mit der A158W und A171W kompatibel, und die sehen deutlich besser aus
    • Ich frage mich, warum man für einfache Aufgaben wie Base32-Decoding oder TOTP-Erzeugung einem Dritten vertrauen sollte, noch dazu einer Website
  • Falls in der Demo gelegentlich ein seltsames ⌍-Symbol zu sehen ist: Das ist eine „kleine 7“
    Das liegt daran, dass bei dieser Uhr die oberen und unteren Segmente der ersten und dritten Ziffer, also die Segmente A und D, miteinander gekoppelt sind
    https://joeycastillo.github.io/Sensor-Watch-Documentation/wi...
    Es ist wirklich erstaunlich, wie viel Effizienz in dieses Display hineingequetscht wurde
    Im normalen Gebrauch müssen diese Stellen nur 0 bis 5 anzeigen, und die erste Ziffer braucht bei einer Uhr nur 0, 1 und 2, aber der Chronometer geht bis 59:59.99
    Diese Ziffern müssen nicht zwischen A- und D-Segment unterscheiden; theoretisch hätte der Chronometer wohl auch bis 69:59.99 gehen können, aber offenbar hielt man „eine Stunde“ für ausreichend
    Auch 8 und 9 schalten sowohl das obere als auch das untere Segment ein, daher ist tatsächlich nur die 7 problematisch

    • oddly specific objects entwickelt hochwertige Ersatz-LCDs
  • Endlich Inhalte, wegen derer man wieder zu HN kommt
    Die F-91W scheint vermutlich denselben Formfaktor wie die A158W[1] zu haben, und die A158W ist für ihren Preis eine absurd gut aussehende Uhr
    Sie passt zu allem, ist stilvoll, ohne aufzufallen, und ich trage sie oft statt teurerer Uhren
    Falls man befürchtet, dass das Metallarmband Armhaare ausreißt: Das ist in einem Jahr vielleicht zweimal passiert und deutlich seltener als bei anderen günstigen Metallarmbändern
    Wer eine „smoky“ Alternative möchte: Die A168WGG[2] hat am Armband eine gunmetal-graue Tönung, ein schwarzes Zifferblatt, und der Illuminator beleuchtet nur die Zeichen
    Allerdings ist die A168 minimal größer als die A158, daher weiß ich nicht, ob das interne Modul genauso passt; wenn sie größer ist, gibt es aber wohl auch mehr Platz, also dürfte es wahrscheinlich gehen
    Um noch weiter über Uhren zu reden: Als schwarze Armbanduhr für die Arbeit nutze ich die GA-B2100-1AJF[3]
    Für eine G-Shock ist sie ziemlich stylisch und hat viele Funktionen, obwohl sie keine Smartwatch ist
    Das Bluetooth-Modell hat im Vergleich zu den günstigeren Modellen bessere Zifferblattfarben und Tonkontraste, wodurch es leichter zu Kleidung passt
    [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/

    • Leider ist sie nicht kompatibel
      Das Sensor-Watch-Board braucht Bauteile, die aus einem originalen Casio-593-Modul entnommen werden
      Eine Liste kompatibler Uhren gibt es hier
      https://www.sensorwatch.net/docs/
      Uhren, die trotz gleicher 3-Tasten-Anordnung nicht funktionieren, weil sie ein anderes Uhrwerk verwenden: A168W, A700W, LA680W, B650W
      Allgemein gilt: Wenn es eine digitale Casio mit drei Tasten ist und statt seitlicher Beleuchtung eine brauchbare „Illuminator“-Hintergrundbeleuchtung hat, ist es keine 593 und funktioniert nicht
  • Ich mag dieses Projekt wirklich sehr und nutze es buchstäblich jeden Tag
    Vor Kurzem habe ich eine neue Schnittstelle implementiert, um TOTP-Codes im Quellcode zu definieren; dadurch ist die Beschreibung in diesem Artikel nicht mehr korrekt
    Jetzt funktioniert es so
    static totp_t credentials[] = {
    CREDENTIAL(2F, "JBSWY3DPEHPK3PXP", SHA1, 30),
    CREDENTIAL(AC, "JBSWY3DPEHPK3PXP", SHA1, 30),
    };
    https://github.com/joeycastillo/Sensor-Watch/blob/main/movem...
    Ich habe außerdem eine Benutzerkalibrierung hinzugefügt, damit man den Pulsmesser auch als Atemfrequenzmesser für Asthma verwenden kann, und das hat bereits geholfen, Leben zu retten
    Kalibrierung und Temperaturkompensation gibt es ebenfalls; sie erhöhen die Genauigkeit der Uhr auf etwa 10 Sekunden pro Jahr
    Die Community wächst ebenfalls, und viele Leute sind dazugekommen, um an der Firmware zu hacken
    Kürzlich hat jemand ein Endless-Runner-Spiel für diese Uhr gebaut
    https://github.com/joeycastillo/Sensor-Watch/pull/419
    Auch die Maintainer sind wirklich gute Leute
    Wenn ihr ein großartiges Open-Source-Projekt sucht, in das sich Zeit zu investieren lohnt, ist es genau dieses

    • Ich nehme an, sie läuft mit einer normalen Uhrenbatterie; ich frage mich, wie gut die Akkulaufzeit bzw. Batterielaufzeit ist
      In der Dokumentation habe ich dazu nichts gefunden
  • Wenn man seine Armbanduhr neu kompilieren und neu flashen muss, dürfte der Nutzen für TOTP ziemlich begrenzt sein

  • Cool
    Ich habe mir immer gewünscht, dass jemand so etwas auch für Casio-Rechneruhren baut

  • Es wäre schön, wenn das auch mit SecurID-Tokens funktionieren würde

  • Wirklich interessant
    Ich arbeite bei Nixon und würde so etwas gern auch mit digitalen Nixon-Uhren ausprobieren; wenn der Autor einen ähnlichen Artikel schreiben möchte, könnte ich vielleicht ein paar kostenlose Uhren besorgen

  • Warum kann ich das nicht auf meiner klügsten Smartwatch nutzen
    Da bekommt man Lust, zur alten Casio zurückzukehren

  • Das ist wirklich gut, und ich habe auch schon darüber nachgedacht, mit einer dummen Smartwatch etwas Ähnliches zu machen, frage mich aber aus Sicht der operativen Sicherheit, ob es in Ordnung ist, dass TOTP so sichtbar und leicht zugänglich ist
    Was passiert, wenn man die Uhr verliert oder sie gestohlen wird?

    • Solange der Besitzer nicht herumposaunt: „Das ist mein zweiter Authentifizierungsfaktor“, hält ein Passant sie einfach für eine kaputte Uhr
    • Ich habe TOTP-Codes auf meiner Pebble und finde das in Ordnung
      Ich versehe sie mit Labels, damit nicht sofort ersichtlich ist, um welchen Dienst es geht
      Die Pebble hat praktisch keine Sperre oder Sicherheit, aber letztlich ist es eben nur der zweite Authentifizierungsfaktor
      Wenn jemand bereits mein zufällig generiertes Passwort kennt, recherchiert hat, dass sich TOTP an meinem Handgelenk befinden könnte, und dann tatsächlich meine Uhr stehlen kann, habe ich ohnehin verloren; diesen Trade-off für mehr Komfort finde ich akzeptabel
    • Trotzdem ist es weniger auffällig als ein YubiKey, oder?