Cours:ClefUSB

De troyesGEII
Aller à : navigation, rechercher
Retour à la liste des Tps
Éléments de correction (page protégée)

Le but de ce projet est de réaliser ce que les anglo-saxons nomment USB EasyLoggeret que nous traduisons par clé de connexion USB. L'idée est de pouvoir stocker un certain nombre d'identifiants et de mots de passe et de pouvoir les utiliser. En soi le problème est relativement simple, sauf si l'on désire gérer correctement le changement des mots de passe dans la clé.

Présentation du matériel utilisé

Le matériel utilisé sera une platine Leonardo. Ce projet ne peut pas être réalisé avec une UNO.

Nous disposons d'une clé compatible Leonardo qui pourra être utilisée pour les tests finaux.

Platine Leonardo

La platine Leonardo est architecturée autour d'un processeur ATMega32U4, le U signifiant USB. Cette version de processeur permet de gérer deux protocoles USB clients en même temps, nous voulons dire par la même prise USB. Nous verrons dans le projet de cette section (et dans l'exemple keyboardSerial de la rubrique USB) qu'il est possible d'utiliser ensemble la liaison série et un clavier USB par le même fil USB.


Nous allons examiner les performances de la Leonardo par rapport à cette liaison USB. Pour ce faire, nous allons simuler une clé USB destinée à entrer un identifiant et un mot de passe automatiquement.

Clé USB finale

Voici le schéma de principe retenu :

Clé de connexion USB (Jean-Michel Gérard)

Ce schéma réalisé avec Eagle est de qualité suffisante pour pouvoir être téléchargé et consulté à l'aide de zooms importants.

Les trois boutons (nommés plus loin) sont clairement visibles en haut du schéma où l'on découvre clairement qu'ils sont montés à l'aide d'une pull-up externe (pas forcément utile avec la famille AVR).

Trois LEDs sont aussi visibles en bas à droite du schéma.

Cahier des charges

Première version du cahier des charges

Ce que nous cherchons à faire peut être appelé "USB keylogger" en anglais (ou à peu près car le mot keylogger est associé souvent à l'enregistrement pirate de frappes au clavier). Aussi le mot anglais USB EasyLogger semble plus approprié. Nous le traduisons par clé de connexion USB.

Nous allons donc développer la partie logicielle sur une platine Leonardo. La partie matérielle finale devra être compatible Leonardo. Elle est décrite plus loin. Nous voulons être capable de :

  • stoker plusieurs identifiants et mots de passes en EEPROM par la liaison série/USB
  • effacer certains couples identifiants/mots de passes plus utilisés
  • choisir lequel est actif par défaut
  • choisir la séquence par défaut

Le dernier point mérite quelques explications. Les comptes éloignés nécessitent en général un identifiant et un mot de passe. Les deux sont séparés par une tabulation et après le mot de passe on valide par un ENTER. Mais sur votre ordinateur local, le bon utilisateur est parfois choisi par défaut et donc seul le mot de passe est demandé. C'est cela que nous appelons séquence et qui pourra être choisi.

Notre description de cette clé de connexion USB nécessitera une utilisation fréquente des expressions :

  • Mot de Passe que nous résumerons le plus possible par MdP
  • Utilisateur (ou mieux identifiant) que nous appellerons aussi par l'anglicisme login
  • couple "Identifiant/Mot de passe" sera souvent appelé login/MdP

Pour respecter ce cahier des charges, nous envisageons d'utiliser quatre boutons :

  • un bouton appelé ENTER pour envoyer le couple login/MdP,
  • un bouton appelé MODIF qui devra permettre d'entrer dans un mode modification à l'aide d'un hyperterminal,
  • un bouton appelé CHOIX qui devra aussi permettre des modifications en utilisant uniquement les trois LEDs présentes.
  • un reset comme il y a sur le Leonardo

Modifications du cahier des charges

Les jeunes étudiants étant plus à même d'utiliser ce genre de produit, nous avons l'intention d'animer une discussion pour éventuellement améliorer ce cahier des charges. Cette section sera donc le fruit de cette discussion.

Travail à réaliser

Le travail à réaliser va se diviser en deux parties :

  • utilisation d'une liaison série pour gérer une communication avec un PC tournant sous n'importe quel OS pour la saisie et le stockage des logins et mots de passes
  • utilisation de la liaison clavier USB pour les tests finaux.

Travail sur la liaison série

Nous avons décidé d'utiliser la liaison série pour gérer le stockage des "identifiants/mots de passe". Ces valeurs seront destinées à finir en EEPROM pour ne pas les perdre à chaque fois que l'on débranche l'USB. L'EEPROM est cependant une ressource qui a un nombre d'écriture limité. Pour ne pas gaspiller, nous avons décidé de faire la mise au point de cette partie en RAM. Une fois au point, nous passerons en EEPROM.

Mémoriser en mémoire RAM

Un tableau pour le grand gaspillage

Un tableau de caractères sera déclaré en RAM. Il comportera 256 caractères, même si nous n'en utilisons que très peu (d'où le mot gaspillage utilisé dans le titre de la section). Le travail essentiel se fera sur les indices de tableau qui rappelons-le deviendront des adresses mémoire. Ainsi, à partir de maintenant, nous utiliserons indistinctement les mots adresses ou indices pour les désigner.

Comment sont organisées les données en RAM ?

Nous allons utiliser l'abréviation MdP pour désigner les mots de passe dans la suite.

L'organisation mémoire est la suivante :

  • les mots de passe comme les utilisateurs seront des mots de 15 caractères maximum terminés systématiquement par un zéro (de fin de chaîne).
  • Le premier octet du tableau désigne le mot de passe par défaut : 0 est le premier mot de passe, 1 le deuxième etc ...
  • Le deuxième octet du tableau désigne le nombre maximum de mots de passe enregistrés dans le tableau (ce nombre ne devra pas dépasser 7)
  • Le troisième octet désigne le type de séquence utilisée : soit "Login TAB MdP ENTER", soit "MdP ENTER" pour le moment
  • Le premier identifiant se trouve en adresse 0x10, le deuxième en 0x30 ....
  • Le premier mot de passe se trouve en adresse 0x20, le deuxième en 0x40 ....

Travail 1

On vous demande de réaliser un sous-programme capable de mettre à jour la RAM avec des couples "identifiants/mots de passe" qui respecte l'organisation précisée en section précédente.

void init_ram()

On pourra utiliser des tableaux intermédiaires du genre :

char eeprom1[]={'t','w','X','z','o','u','9','1',0};
char eeprom2[]={'X','b','=','7','8','?',0};
char eeprom3[]={'z','t','o','t','r','o','w',0};
char eeprom4[]={'d','E','w','a','Z','d','t','=','M','y',0};

qui sont à adapter avec un de vos "identifiants/mots de passe" pour un test ultérieur.

Travail 2

On vous demande de réaliser un sous-programme capable d'afficher le contenu de la RAM de manière compréhensible par un utilisateur. Nous avons prévu une option brouillage comme le montre le commentaire suivant, mais vous pouvez la laisser tomber pour simplifier.

// option = 0x80 brouille l'affichage des mots de passe
void afficheContenu(char option)

Travail 3

Mettre au point un sous-programme capable de lire un choix utilisateur à travers la liaison série entre un minimum (4 bits de poids faible) et un maximum (4 bits de poids fort).

// lecture du choix de l'opérateur
 char readChoixSerie(char maxmin)

Ce sous-programme rappelle à l'utilisateur ce qu'il est sensé faire.

Travail 4

Vous allez maintenant écrire la mise au point d'un programme utilisant les trois boutons et la liaison série pour ajouter/supprimer un couple "identifiants/mots de passe" tout en donnant aussi la possibilité de changer de séquence.

Faites constater avant de passer à l'écriture en EEPROM.

Mémoriser en mémoire EEPROM

Le travail en EEPROM est assez similaire à celui de la RAM. Son utilisation nécessite l'inclusion :

#include <EEPROM.h>

La lecture d'une donnée en EEPROM se fait avec :

nbDefaut = EEPROM.read(0x00);

tandis qu'une écriture se fait avec :

EEPROM.write(0x01,2);

qui écrit simplement le nombre 2 en adresse 0x01.

Travail 5

MdP est encore l'abréviation de "Mot de Passe".

On vous demande de porter le programme du Travail 4 pour un usage non plus de la RAM mais de l'EEPROM. On gardera l'organisation mémoire EEPROM suivante :

  • les mots de passe comme les identifiants seront des mots de 15 caractères maximum terminés systématiquement par un zéro (de fin de chaîne).
  • Le premier octet de l'EEPROM désigne le mot de passe par défaut : 0 est le premier mot de passe, 1 le deuxième etc ...
  • Le deuxième octet de l'EEPROM désigne le nombre maximum de mots de passe enregistrés dans l'EEPROM (ce nombre ne devra pas dépasser 7)
  • Le troisième octet désigne le type de séquence utilisée : soit "Login TAB MdP ENTER", soit "MdP ENTER" pour le moment
  • Le premier identifiant se trouve en adresse 0x10, le deuxième en 0x30 ....
  • Le premier mot de passe se trouve en adresse 0x20, le deuxième en 0x40 ....

Travail sur le clavier

Mon premier programme

Pour tester le bon fonctionnement du clavier, on vous propose le programme suivant.

void setup() {
  pinMode(2,INPUT);
}
void loop() {
  static char new_button,old_button;
  new_button=digitalRead(2);
  if ((old_button==0)&&(new_button==1)) { //detection front montant
   Keyboard.begin();   Keyboard.println("DEBUT AUTORISE");
   Keyboard.println("abcdefghijklmnopqrstuvwxyz");
   Keyboard.println("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
   Keyboard.println("0123456789");
   Keyboard.println(" !\"$%&'()");
   Keyboard.println("%,;:!?./+=");
   Keyboard.println("FIN AUTORISE");
   Keyboard.println("DEBUT NON AUTORISE");
   Keyboard.println("<>*#{[|`\^@]}");
   Keyboard.println("FIN NON AUTORISE");
   Keyboard.end();
  }
  old_button = new_button;
  delay(100);
}

Essayer ce programme qui vous montrera la limite des caractères utilisables dans vos mots de passe.

Travail 6

Écrire un sous-programme

void fakeKeyboard(); //joue le role de clavier par défaut

Le mot anglais "fake" se traduit par "faire comme si".

Le test de ce sous-programme peut être réalisé très tôt dans ce projet. Seul Travail 1 doit être mené à terme pour tester celui-ci.