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)

nitrokey-start-update-firmware-via-dfu-occorente

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.

nitrokey-start-open

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:

gpg card status

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.