Compilare GNUK

Pubblicato il lun 04 giugno 2018 in crittografia • 3 min read

Il motivo principale per voler compilare gnuk è quello di poter usare chiavi rsa4096 o ed25519/cv25519. Fino a poco tempo fa sia sul FST-01 che sul NITROKEY START era precaricata una versione di Gnuk che limitava il tipo di chiavi da usare a rsa2048. Per rendervi conto delle performances fate riferimento a questo link.

Un altro motivo potrebbe essere quello di usare una versione più aggiornata di gnuk che corregge i bug individuati. A tal proposito è bene che vi teniate informati leggendo la newsletter ufficiale del progetto.

Avviso

Questa procedura potrebbe rendere inservibile il vostro token. Inoltre le chiavi presenti sul token verranno cancellate!

Gnuk supporta l'upgrade del firmware. Ma se, durante la procedura di installazione del nuovo firmware, capitassero degli imprevisti allora vi servirà un Debugger SWD come il ST-Link V2. Cos'è il ST-Link V2? E' un circuito per il debugging e la programmazione dei microchip della famiglia STM8 e STM32; sia il Nitrokey Start che il FST-01 sono basati appunto sul microchip STM32F103TB. E' prodotto dalla STMicroelectronics

st-link v2,

ma ne esistono anche dei cloni.

st-link v2 clone

Preparazione

Io utilizzo Arch Linux, quindi la procedura di seguito descritta è specifica per questa distribuzione; ma dovrebbe funzionare senza problemi anche sulle altre.

Per prima cosa occorre installare alcuni pacchetti necessari:

pacman -S base-dev git arm-none-eabi-gcc arm-none-eabi-newlib arm-none-eabi-binutils python2-pyusb

Nota 1: base-dev è un metapacchetto che comprende

autoconf automake binutils bison fakeroot file findutils flex gawk gcc gettext grep groff 
gzip libtool m4 make pacman patch pkgconf sed sudo systemd texinfo util-linux which

Nota 2: saranno necessari i permessi di root per effettuare l'update del firmware. Altrimenti sarà necessario creare il file /etc/udev/rules.d/61-gnuk.rules con il seguente contenuto

#Questa nel caso usiate il FST-01
SUBSYSTEMS=="usb", ACTION=="add", ATTRS{idVendor}=="234b", ATTRS{idProduct}=="0000", ENV{ID_SMARTCARD_READER}="1", ENV{ID_SMARTCARD_READER_DRIVER}="gnupg"

#Questa nel caso usiate NITROKEY-START
SUBSYSTEMS=="usb", ACTION=="add", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="4211", ENV{ID_SMARTCARD_READER}="2", ENV{ID_SMARTCARD_READER_DRIVER}="gnupg"

Fatto ciò bisogna riavviare il demone udevd

~ $ sudo udevadmin control --reload-rules
~ $ sudo systemctl restart systemd-udevd.service

o semplicemente riavviare il pc.

Compilare Gnuk

Clonate il repository:

~ $ git clone https://salsa.debian.org/gnuk-team/gnuk/gnuk.git
~ $ git submodule update --init --recursive

spostatevi nella directory gnuk/src

~ $ cd gnuk/src

ed eseguite

~/gnuk/src $ ./configure --help

per vedere le opzioni disponibili; l'output sarà del tipo

Usage: ./configure [OPTION]...
Defaults for the options are specified in brackets. 
Configuration:
  -h, --help        display this help and exit  [no]
  --vidpid=VID:PID  specify vendor/product ID   [<NONE>]
  --target=TARGET   specify target          [FST_01]
            supported targets are:
               FST_01
               FST_01G
               OLIMEX_STM32_H103
               MAPLE_MINI
               ST_DONGLE
               ST_NUCLEO_F103
               NITROKEY_START
               BLUE_PILL
               STM8S_DISCOVERY
               CQ_STARM
               STM32_PRIMER2
               STBEE
               STBEE_MINI
               FST_01_00 (unreleased version with 8MHz XTAL)
  --enable-factory-reset
            support life cycle management   [no]
  --enable-debug    debug with virtual COM port [no]
  --enable-pinpad=cir
            PIN entry support       [no]
  --enable-certdo   support CERT.3 data object  [no]
  --enable-sys1-compat  enable SYS 1.0 compatibility    [yes]
               executable is target dependent
  --disable-sys1-compat disable SYS 1.0 compatibility   [no]
               executable is target independent
               but requires SYS 2.0 or newer
  --with-dfu        build image for DFU         [<target specific>]

per NITROKEY-START eseguite

~/gnuk/src $ ./configure --vidpid=20a0:4211 --target=NITROKEY_START --enable-factory-reset

oppure se avete FST-01 eseguite

~/gnuk/src $ ./configure --vidpid=234b:0000 --target=FST_01 --enable-factory-reset

e procedete alla compilazione con:

~/gnuk/src $ make

dopo un certo tempo dovrebbe terminare con un output simile al seguente

[...]
arm-none-eabi-objcopy -O ihex build/gnuk.elf build/gnuk.hex
arm-none-eabi-objcopy -O binary build/gnuk.elf build/gnuk.bin
arm-none-eabi-objcopy -O binary build/gnuk.elf build/gnuk.bin
arm-none-eabi-objcopy -O ihex build/gnuk.elf build/gnuk.hex

poi spostatevi nella directory ~/gnuk/regnual ed eseguite

~/gnuk/regnual $ make

le cui ultime righe di output dovrebbero essere

arm-none-eabi-objcopy -Obinary regnual.elf regnual.bin
arm-none-eabi-objcopy -Oihex regnual.elf regnual.hex

La compilazione è teminata. Adesso non resta che flashare il firmware.

Flashing del firmware

Il Flashing del firmware cancellerà le eventuali chiavi di crittografia presenti sul token. Non eseguitelo se non avete un backup!

Spostatevi nella directory ~/gnuk/tool ed eseguite

~/gnuk/tool $ sudo ./upgrade_by_passwd.py ../regnual/regnual.bin ../src/build/gnuk.bin

vi sarà chiesto il PIN di Admin del token. A meno che non lo abbiate cambiato quello di default è 12345678. Se non ricordate il PIN o avete bloccato il token allora dovrete ricorrere a questo metodo o al Debugger SWD per caricare il firmware.

Nota 3: nel caso in cui già steste utilizzando il token con GnuPG allora prima di fare l'upload sarà necessario teminare il processo gpg-connect-agent con il comando

~/gnuk/tool $ gpg-connect-agent -v "SCD KILLSCD" "SCD BYE" /bye

Ecco uno screencap di tutta la procedura

compilazione di gnuk Alla fine per assicurarvi che tutto funzioni vi basterà dare il comando:

~ $ gpg --card-status

e vedrete qualcosa del genere

gpg card status