Réinitialiser un CanoKey aux paramètres d’usine avec un script Python

Contrairement à la plupart de mes articles sur la technologie, que je rédige moi-même avant de les retravailler avec un LLM, cet article a été rédigé en grande partie par un LLM. J’ai utilisé un LLM pour trouver une solution, vérifié qu’elle fonctionnait, puis organisé sa réponse sous la forme de cet article.

La procédure a été testée sur mon CanoKey Canary équipé du firmware 3.0.3-0-g30917b92.

1. Préparer les outils nécessaires

Sous Debian ou Ubuntu :

$ sudo apt install python3-usb libusb-1.0-0

Utilisez ensuite ce script pour envoyer des commandes :

#!/usr/bin/env python3

import time
import usb.core
import usb.util

VID = 0x20A0
PID = 0x42D4
INTERFACE = 1


def apdu(device: usb.core.Device, command: str) -> bytes:
    data = bytes.fromhex(command)

    # Send command APDU.
    device.ctrl_transfer(
        0x41,       # Host-to-device | Vendor | Interface
        0x00,       # CMD
        0x0000,
        INTERFACE,
        data,
    )

    # Wait for execution to finish.
    while True:
        status = device.ctrl_transfer(
            0xC1,       # Device-to-host | Vendor | Interface
            0x02,       # STAT
            0x0000,
            INTERFACE,
            1,
        )

        if bytes(status)[0] == 0x00:
            break

        time.sleep(0.05)

    # Retrieve response APDU.
    response = device.ctrl_transfer(
        0xC1,
        0x01,       # RESP
        0x0000,
        INTERFACE,
        1500,
    )

    return bytes(response)


def main() -> None:
    device = usb.core.find(idVendor=VID, idProduct=PID)

    if device is None:
        raise SystemExit("CanoKey 20A0:42D4 not found")

    print(f"Found {VID:04X}:{PID:04X}")

    while True:
        command = input("> ")
        if command == "":
            break
        response = apdu(device, command)
        print(f"< {response.hex(' ').upper()}")


if __name__ == "__main__":
    main()

2. Sélectionner l’applet Admin

L’identifiant d’application (AID) de l’applet Admin est F000000000. Envoyez :

00 A4 04 00 05 F0 00 00 00 00

Réponse attendue :

90 00

Cela signifie que l’applet Admin a été sélectionnée avec succès.

3. Épuiser le compteur de tentatives du code PIN Admin

Cette étape est requise par la procédure documentée de réinitialisation d’usine lorsque vous ne pouvez pas vous authentifier pour effectuer une réinitialisation normale.

Vérifiez d’abord le compteur avec :

00 20 00 00

La réponse initiale devrait être :

63 C3

Cela indique qu’il reste trois tentatives.

Envoyez trois fois l’APDU suivante avec un code PIN volontairement incorrect :

00 20 00 00 06 30 30 30 30 30 30

Les octets du code PIN correspondent à 000000. Les réponses attendues sont :

  1. 63 C2 (Il reste deux tentatives)
  2. 63 C1 (Il reste une tentative)
  3. 69 83 (Le code PIN est bloqué)

Important : n’épuisez pas les tentatives si vous devez encore utiliser normalement le code PIN actuel. Dans cette procédure, le blocage volontaire du code PIN permet de lancer la réinitialisation d’usine lorsque l’accès est verrouillé.

4. Envoyer la commande de réinitialisation d’usine

Utilisez à nouveau le script WebUSB et sélectionnez l’applet Admin avant d’envoyer l’APDU de réinitialisation :

00 A4 04 00 05 F0 00 00 00 00
00 50 00 00 05 52 45 53 45 54

La deuxième APDU est la commande de réinitialisation d’usine :

00 50 00 00 05 RESET

Ici, RESET est la chaîne ASCII de cinq octets 52 45 53 45 54. CanoKey définit cette instruction comme INS=50 ; le code PIN Admin doit déjà être bloqué.

5. Suivre les indications de la LED

Lorsque vous envoyez la commande, le CanoKey commence à clignoter.

  1. Touchez rapidement la clé lorsqu’elle clignote.
  2. Continuez à la toucher en réponse aux séquences successives de clignotements rapides et lents.
  3. Gardez la clé connectée et laissez votre script Python continuer à interroger le périphérique.
  4. Attendez que le script renvoie la réponse finale :
90 00

La réponse finale 90 00 confirme que l’opération a réussi. Votre appareil la renvoie après la séquence de contacts répétés.

Récapitulatif de la procédure

Sélectionner l’applet Admin

00 A4 04 00 05 F0 00 00 00 00

Bloquer le code PIN Admin

Envoyez trois fois 00 20 00 00 06 30 30 30 30 30 30.

Lancer la réinitialisation d’usine

00 50 00 00 05 52 45 53 45 54

Toucher jusqu’à la fin de la réinitialisation

Répondez à chaque clignotement demandé jusqu’à obtenir 90 00.

Généré avec Hugo
Thème Stack conçu par Jimmy