The following information is about the firmware of the Nitrokey Pro. For information about the hardware please have a look at the Nitrokey Pro hardware repo.
Nitrokey Pro, Start and HSM use the same hardware but different firmwares and different smart cards. The microprocessor being used is a STM32F103R8T6. The firmware is written in C, the desktop software Nitrokey App is written in C/C++.
To develop the firmware of the Nitrokey Pro/Start/HSM you would need:
make [VID=0x20a0] [PID=0x4108] firmware
Parameters:
Note |
---|
Any user data present on the device will be erased when flashing it. A backup is essential to prevent data loss. |
The microcontroller can be flashed in one of the following ways, depending on your hardware version:
The following picture shows the pin pads of the Nitrokey. The red rectangle is only available in newer versions and easier to use as the pads are much bigger. The blue rectangle is present in older and newer devices.
The SWD pins are as follows:
For SWD programming, connect the SWDIO, SWDCLK and GND pads to the respective pins of your ST-Link programmer. The device should be powered externally through USB or a 5V power supply during programming.
See the Development Guide for the current use.
Modern OpenOCD works quite well, if not better than the official tools (especially for the debugging).
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg
Make sure the MCU is not memory protected, otherwise this operation will fail.
$ cat <<END >stm32read.cfg
source [find interface/stlink.cfg]
source [find target/stm32f1x.cfg]
init
flash read_bank 0 firmware.bin 0 0x20000
exit
END
$ openocd -f stm32read.cfg
Official tool is available at stm32cubeprog.
STM32_Programmer_CLI -c port=SWD -halt --readunprotect
STM32_Programmer_CLI -c port=swd -e all -w firmware.hex 0x8000000 -v -rst
st-util
Please note, that this approach only works for older Nitrokey Pro device, not Nitrokey Pro 2 (all devices purchased before 04/04/2018).
Your adapter should consist of a USB socket which four pins are connected to your serial/TTL connector. The pinout is as follows.
Nitrokey USB Plug <-> Serial/TTL adapter
Pin 1, VCC <-> VCC
Pin 2, D- <-> TX
Pin 3, D+ <-> RX
Pin 4, GND <-> GND
This diagram represents the pinout of the USB socket which you are going to solder:
###################
# #
# ############### #
# #
# #
###################
# # # #
# # # #
1 2 3 4
The following picture shows the adapter/USB-to-TTL connection.
To flash the firmware you need to bridge the two contact holes and only then connect (and power) the PCB to your adapter. The bridge triggers the hardware to boot into DFU mode. You can use a jumper with 2.0 mm pitch or just prepare/solder a wire. The following picture shows a bridge for the Nitrokey.
While the jumper is plugged in, connect the Nitrokey to the USB-serial adapter on your computer. The jumper is only required during the first moment of connection and can be removed afterwards.
You can check if the Nitrokey got successfully into DFU mode by typing in the following into a terminal:
$ sudo stm32flash /dev/ttyUSB0
stm32flash 0.5
http://stm32flash.sourceforge.net/
Error probing interface "serial_posix"
Cannot handle device "/dev/ttyUSB0"
Failed to open port: /dev/ttyUSB0
Now we have to disable the read protection first by typing
sudo stm32flash -k /dev/ttyUSB0 # read unprotecting
You may need to reconnect the device, before you can proceed. Do not forget to bridge the holes again. Now we do the actual flashing:
sudo stm32flash -w nitrokey-pro-firmware.hex /dev/ttyUSB0
Enabling the read/write protection again:
sudo stm32flash -j /dev/ttyUSB0 # read protection