Yubikey – V – Le MODHEX

Avant de pouvoir boucler les chapitres sur l’accès à la Yubikey en VBA, et surtout la programmation d’une Yubikey en VBA, il y a une notion importante à préciser pour bien comprendre la suite. Il s’agit du MODHEX ou Modified Hexadecimal.

Comme je l’ai indiqué dans la présentation de la Yubikey, ce Token ne nécessite aucun driver. Il suffit de la connecter sur un ordinateur équipé d’un port USB pour qu’elle soit reconnue, et sur que l’on soit sous Windows, Linux, OS-X. Par quel miracle ?
Simplement parce que la Yubikey se déclare auprès du système d’exploitation comme étant un clavier. Pour s’en persuader, voici le gestionnaire de périphérique d’un système Windows 10 sur lequel est branché une Yubikey.

modhex-yubikey-1Si on fait un clic droit sur le périphérique d’entrée USB que j’ai mis en surbrillance et que l’on demande ses propriétés, puis onglet ‘Détails’, la propriété identification du matériel nous donne : VID_1050&PID_0010

modhex-yubikey-2Le VID est le Global Vendor ID qui identifie les constructeurs de matériels qui se connectent sur l’USB, et le 1050 (Hexa)  est celui attribué à Yubico. Nous avons donc sur ce port un matériel fabriqué par Yubico. Le PID est le Product ID qui identifie le matériel connecté. La valeur 10 désigne une Yubikey 1 ou 2. (Je ferais peut-être un article détaillant plus ces aspects de l’USB à l’occasion).
Nous avons donc bien une Yubikey branchée, et elle est identifiée comme un périphérique d’entrée USB (HID – Human Interface Device).

On pourrait donc penser que par cet artifice, le fait que la Yubikey soit déclarée comme un clavier, elle peut dialoguer facilement avec son hôte en simulant des appuis de touches. C’est tout à fait cela. La Yubikey dialogue avec l’ordinateur en simulant des frappes de touches.

Mais c’est justement là qu’il y a un problème.

Les claviers n’ont pas tous la même disposition de touches. Pour nous francophones, nous connaissons nos claviers à disposition ‘AZERTY’, mais il y a aussi ceux à disposition anglo-saxonne : ‘QWERTY’ par exemple. Or lors de la configuration de l’ordinateur, on lui spécifie que le clavier qui est branché est un clavier AZERTY, sinon par défaut il est considéré comme américain et donc à disposition QWERTY. Il est même très facile sur son système de passer d’un clavier QWERTY à un AZERTY et vice-versa, indépendamment de ce qu’il y a gravé sur les touches…….

Tout cela pour dire qu’en fait, physiquement le clavier n’a aucune idée de ce qui est gravé sur ses touches. C’est à l’ordinateur d’interpréter le code qui a été envoyé pour une touche vers la lettre de l’alphabet correspondant selon la configuration.

Lorsque j’appuie sur une touche, le clavier envoie une information sur la touche physique qui a été enfoncée, à partir d’une matrice ligne/colonne.
Ainsi, si j’appuie sur la lettre A de mon clavier français, ce dernier envoie le code hexadécimal 0x10 à l’ordinateur. C’est le Scan Code.
L’ordinateur reçoit cette valeur 0x10, regarde la configuration de la machine, j’ai déclaré un clavier français, donc utilise la table de correspondance du français afin d’associer au scan code 0x10 le code 0x41 qui est celui de la lettre ‘A’ dans la table ASCII.

Maintenant si je change la configuration de mon ordinateur pour lui dire que j’ai un clavier américain (mais j’ai toujours mon clavier français), quand j’appuie sur la lettre ‘A’ du clavier, un ‘Q’ s’affiche. En effet, mon clavier envoie toujours le scan code 0x10, car la touche physique ne change pas, mais l’ordinateur ne va plus utiliser la même table de correspondance. Il va associer maintenant au code 0x10 le code 0x51 qui est celui de la lettre ‘Q’ dans la table ASCII.

Pour fonctionner comme une clavier, la Yubikey doit donc envoyer des scan codes. Jusque là rien que de très logique.

Afin de simplifier la présentation du problème, nous allons supposer que la Yubikey est programmée pour envoyer un mot de passe statique lorsque je pose mon doigt sur la pastille dorée. Le mot de passe est ‘TATA’.
Elle devra donc envoyer 4 scan code comme si j’avais appuyé sur la touche ‘T’, puis ‘A’ puis ‘T’ puis ‘A’, soit  0x10 0x14 0x10 0x14 que l’ordinateur va convertir selon le principe présenté ci-dessus en ASCII 0x41 0x54 0x41 0x54 ce qui représente bien la chaîne de caractères TATA.

Oui mais non.

Ce principe fonctionne bien si tous les claviers avaient la même disposition de touche. Si je branche ma Yubikey sur un ordinateur configuré en Qwerty, le mot de passe envoyé va devenir TQTQ, puisqu’à la place du A un clavier américain a un Q. Or, la Yubikey doit pouvoir envoyer et dialoguer avec l’ordinateur indépendamment du codage du clavier.

Pour régler ce problème Yubico a utilisé une astuce.

Pour que la Yubikey dialogue efficacement avec un programme, il faudrait qu’elle puisse envoyer directement de l’hexadécimal. L’hexadécimal est représenté par 16 symboles, allant de 0 à F. Ils ont ensuite identifiés un ensemble de touches qui ne variaient pas selon les dispositions nationales des différents claviers. Ils en ont pris 16 pour pouvoir les associer aux 16 symboles de l’hexadécimal. Ces 16 touches forment le Modhex, pour Modified Hexadécimal
Ensuite il ne reste plus qu’à faire comme lorsqu’un ordinateur interprète une frappe clavier, c’est à dire mettre en place un table de translation, mais au lieu que ce soit une table scan-code -> ASCII, c’est une table scan-code -> hexadécimal.

Voici cette table de translation :

modhex-yubikey-3Ainsi, si la Yubikey doit envoyer la chaîne ‘TATA’, la représentation hexadécimale de cette valeur est
0x41 0x54 0x41 0x54. elle commence par convertir les valeurs hexadécimales en modhex.

4 -> f
1 -> b
5 -> g
4 -> f
……..

en modhex 0x41 0x54 0x41 0x54 s’écrit fb gf fb gf
La Yubikey va envoyer le scan code de chacune de ces touches : 0x21 0x30 0x22 0x21 0x21 0x30 0x22 0x21

Comme quelque soit la disposition du clavier, ces scan codes représentent toujours les même lettre, l’ordinateur va bien interpréter ces scan-codes comme étant les lettres fb gf fb gf sur un ordinateur français, anglo-saxon ou allemand.

Le programme qui interagit avec la Yubikey devra quand à lui faire la translation modhex -> hexadécimal pour retrouver la chaîne d’origine, à l’aide de la table de translation indiquée ci-dessus.

Lorsque l’on dialogue avec la Yubikey par programmation, on sera donc obligé d’utiliser le modhex, puisqu’il s’agit de l’unique « langage » qu’utilise la Yubikey.  Mais c’est ce qui lui permet aussi d’être aussi simple pour l’utilisateur.

Une dernière illustration du fonctionnement du modhex. Avec l’outil de personnalisation de Yubico. Lorsqu’une Yubikey est branchée, l’outil affiche le numéro de série de la Yubikey en trois formats : décimal, hexadécimal et modhex.

modhex-yubikey-4

Posts relatifs

Laisser un commentaire


NOTE - Vous pouvez utiliser les éléments et attributs HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">