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à provato 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

Qui l'immagine ingrandita.

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

Qui l'immagine ingrandita.

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 (a breve publicherò un post in merito):

gnuk-compile

eseguire come root questi comandi:

~/sviluppo/GNU_TOKEN/fst01/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:

 ~/sviluppo/GNU_TOKEN/fst01/gnuk/src $ 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:

~/sviluppo/GNU_TOKEN/fst01/gnuk/src $ 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

si ottiene questo output:

Reader ...........: 20A0:4211:FSIJ-1.2.3-XXXXXXXX:0
Application ID ...: D276000124010200FFFEXXXXXXXX0000
Version ..........: 2.0
Manufacturer .....: unmanaged S/N range
Serial number ....: XXXXXXXX
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 3 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

XXXXXXXX è seriale vostro del token:

Da notare la riga:

PIN retry counter : 3 3 3

Che 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.