Nitrokey Start update firmware via DFU
Pubblicato il gio 23 febbraio 2017 in crittografia • 3 min read
Qualche giorno fa ho ordinato il token USB OpenPGP della Nitrokey. In particolare ho acquistato il modello Nitrokey Start. Oggi finalmente, mi è stato consegnato. Ho cominciato subito a testarlo. Mi stavo accingendo ad aggiornare il firmware tramite la procedura di update tramite USB. E' una procedura che conosco, essendomi documentato e avendola già provata su un altro modello di token USB: il FST-01.
L'upgrade del firmware è relativamente semplice da effettuare con gli script in python presenti nel repo ufficiale di gnuk
. Ma sono riuscito lo stesso a bloccarlo sbagliando per tre volte il PIN di default. Per fortuna avevo a disposizione un adattatore USB-to-RS232/TTL
grazie al quale sono riuscito, usando il software stm32flash, a riprogrammare il token riflashando il firmware via DFU
(Device firmware upgrade).
Cosa serve?
- un header USB (magari recuperato da qualche vecchio pc);
- un pezzo di filo: deve essere molto sottile;
- un adattatore USB-to-RS232/TTL (stavolta ho usato il PL-2303HX);
- il token brickato (ovviamente)
Apertura del case
Per prima cosa bisogna aprire il case, che con molta probabilità si romperà.
Tramite il pezzo di filo cortocircuitare i due pin sul token.
Cablaggio
A questo punto si deve collegare l'adattatore USB-Serial TTL allo header USB secondo questo schema:
Adattatore | USB header |
---|---|
Vcc 5V | Power |
TX | D- |
RX | D+ |
GND | GND |
e collegare l'adattatore USB-Serial TTL ad una porta usb.
Upload del firmware
Dopo aver compilato il firmware eseguite questi comandi:
$ cd gnuk/src
$ sudo stm32flash -k /dev/ttyUSB0
In questo modo si sblocca il token permettendo la lettura della flash interna.
Qui bisogna chiarire una cosa: i token sono bloccati in lettura affinché le chiavi openpgp, una volta caricate, queste non possano essere più estratte dal token.
Ecco l'output:
stm32flash 0.5
http://stm32flash.sourceforge.net/
Interface serial_posix: 57600 8E1
Version : 0x22
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0410 (STM32F10xxx Medium-density)
- RAM : 20KiB (512b reserved by bootloader)
- Flash : 128KiB (size first sector: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Read-UnProtecting flash
Done.
A questo punto si può flashare il firmware precedentemente compilato:
$ sudo stm32flash -w build/gnuk.bin -g 0x0 /dev/ttyUSB0
Ecco l'output:
stm32flash 0.5
http://stm32flash.sourceforge.net/
Using Parser : Raw BINARY
Interface serial_posix: 57600 8E1
Version : 0x22
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0410 (STM32F10xxx Medium-density)
- RAM : 20KiB (512b reserved by bootloader)
- Flash : 128KiB (size first sector: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Write to memory
Erasing memory
Wrote address 0x0801b400 (100.00%) Done.
Starting execution at address 0x08000000... done.
Ed infine bisogna ricordarsi di riattivare la protezione da lettura della flash con il comando:
$ sudo stm32flash -j /dev/ttyUSB0
Ed ecco l'output:
stm32flash 0.5
http://stm32flash.sourceforge.net/
Interface serial_posix: 57600 8E1
Version : 0x22
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0410 (STM32F10xxx Medium-density)
- RAM : 20KiB (512b reserved by bootloader)
- Flash : 128KiB (size first sector: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Read-Protecting flash
Done.
Se tutto è andato bene digitando:
$ gpg --card-status
dovrebbe risultare questo output:
Notate la riga PIN retry counter : 3 3 3
indica i tentativi ancora rimasti per inserire correttamente, rispettivamente, il PIN utente, il PIN di reset e quello di Admin.
Ad esempio a me, dopo aver fatto casino, compariva questo output: PIN retry counter : 3 3 0
.
Maggiori informazioni le potete trovare sul sito del produttore.