After some retries I got it working. I reran the command and after I pressed Ctrl-C it started flashing:
275 INFO pynitrokey.cli Timestamp: 2025-08-26 06:00:38.997907
275 INFO pynitrokey.cli OS: uname_result(system='FreeBSD', node='bedna', release='14.2-RELEASE', version='FreeBSD 14.2-RELEASE releng/14.2-n269506-c8918d6c7412 GENERIC', machine='amd64')
275 INFO pynitrokey.cli Python version: 3.11.13
275 INFO pynitrokey.cli Cli arguments: ['nk3', 'update', './firmware-nk3-v1.8.1.zip']
277 INFO pynitrokey.cli pynitrokey version: 0.10.0
277 INFO pynitrokey.cli cryptography version: 45.0.6
278 INFO pynitrokey.cli fido2 version: 2.0.0
278 INFO pynitrokey.cli pyusb version: 1.3.1
313 INFO nitrokey.trussed.updates Firmware version before update: v1.0.3
316 INFO nitrokey.trussed.updates Current firmware version: v1.0.3
316 INFO nitrokey.trussed.updates Updated firmware version: v1.8.1
316 DEBUG root print: Current firmware version: v1.0.3
316 DEBUG root print: Updated firmware version: v1.8.1
317 DEBUG root print: Please do not remove the Nitrokey 3 or insert any other Nitrokey 3 devices during the update. Doing so may damage the Nitrokey 3.
2953 DEBUG root print: Please press the touch button to reboot the device into bootloader mode ...
42704 DEBUG fido2.hid Keyboard interrupt, cancelling...
42704 DEBUG nitrokey.trussed._device./dev/uhid1 ignoring OSError after reboot
Traceback (most recent call last):
File "/home/tejul/.local/share/uv/tools/pynitrokey/lib/python3.11/site-packages/fido2/hid/__init__.py", line 208, in _do_call
recv = self._connection.read_packet()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/tejul/.local/share/uv/tools/pynitrokey/lib/python3.11/site-packages/fido2/hid/base.py", line 79, in read_packet
return os.read(self.handle, self.descriptor.report_size_in)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyboardInterrupt
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/tejul/.local/share/uv/tools/pynitrokey/lib/python3.11/site-packages/nitrokey/trussed/admin_app.py", line 237, in reboot
self._call(AdminCommand.UPDATE)
File "/home/tejul/.local/share/uv/tools/pynitrokey/lib/python3.11/site-packages/nitrokey/trussed/admin_app.py", line 208, in _call
return self.device._call(
^^^^^^^^^^^^^^^^^^
File "/home/tejul/.local/share/uv/tools/pynitrokey/lib/python3.11/site-packages/nitrokey/trussed/_device.py", line 76, in _call
response = self.device.call(command, data=data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/tejul/.local/share/uv/tools/pynitrokey/lib/python3.11/site-packages/fido2/hid/__init__.py", line 174, in call
return self._do_call(cmd, data, event, on_keepalive)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/tejul/.local/share/uv/tools/pynitrokey/lib/python3.11/site-packages/fido2/hid/__init__.py", line 249, in _do_call
self._send_cancel()
File "/home/tejul/.local/share/uv/tools/pynitrokey/lib/python3.11/site-packages/fido2/hid/__init__.py", line 161, in _send_cancel
self._connection.write_packet(packet)
File "/home/tejul/.local/share/uv/tools/pynitrokey/lib/python3.11/site-packages/fido2/hid/base.py", line 75, in write_packet
if os.write(self.handle, packet) != len(packet):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: [Errno 6] Device not configured
43705 DEBUG nitrokey.trussed.updates Trying to connect to bootloader (try 1 of 3)
43706 DEBUG pynitrokey.cli.trussed Searching NK3 bootloader device (try 1 of 30)
43712 INFO nitrokey.trussed._bootloader.lpc55_upload.mboot.mcuboot Connect: identifier='usb', device= (0x20A0, 0x42DD)path=b'1-8:1.0'
43712 DEBUG nitrokey.trussed._bootloader.lpc55_upload.utils.interfaces.device.usb_device Opening the Interface: (0x20A0, 0x42DD)path=b'1-8:1.0'
44526 DEBUG nitrokey.trussed.updates Starting firmware update
44526 INFO nitrokey.trussed._bootloader.lpc55_upload.mboot.mcuboot CMD: ReceiveSBfile(data_length=544896)
44526 INFO nitrokey.trussed._bootloader.lpc55_upload.mboot.mcuboot CMD: GetProperty(MaxPacketSize, index=0)
44526 DEBUG nitrokey.trussed._bootloader.lpc55_upload.mboot.mcuboot TX-PACKET: Tag=GetProperty, Flags=0x00, P[0]=0x0000000B, P[1]=0x00000000
44526 DEBUG nitrokey.trussed._bootloader.lpc55_upload.mboot.protocol.bulk_protocol OUT[16]: 01, 00, 0C, 00, 07, 00, 00, 02, 0B, 00, 00, 00, 00, 00, 00, 00
44530 DEBUG nitrokey.trussed._bootloader.lpc55_upload.mboot.protocol.bulk_protocol IN [60]: 03, 00, 0C, 00, A7, 00, 00, 02, 00, 00, 00, 00, 38, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
...
However, in nk3 list I have now only
:: ‘NK3’ keys
whereas before the update I had this:
:: ‘Nitrokey FIDO2’ keys
:: ‘Nitrokey Start’ keys:
:: ‘NK3’ keys
:: ‘NKPK’ keys
I also then ran nitropy nk3 test --pin and it looks good:
Found 1 NK3 device(s):
- Nitrokey 3 at /dev/uhid1
Running tests for Nitrokey 3 at /dev/uhid1
[1/5] uuid UUID query SUCCESS F0D084B6A5FE7C51BF3A90BEDC662A68
[2/5] version Firmware version query SUCCESS v1.8.1
[3/5] status Device status SUCCESS Status(init_status=<InitStatus: 0>, ifs_blocks=56, efs_blocks=478, variant=<Variant.LPC55: 1>)
Running SE050 test: |
[4/5] se050 SE050 SUCCESS SE050 firmware version: 3.1.1 - 1.11, (persistent: (29848,), transient_deselect: (607,), transient_reset: (592,))
Please press the touch button on the device ...
Please press the touch button on the device ...
[5/5] fido2 FIDO2 SUCCESS
5 tests, 5 successful, 0 skipped, 0 failed
Summary: 1 device(s) tested, 1 successful, 0 failed
So, I think I am good again. Sadly I struggle to test the use of it because of another issue I have, but that’s for another topic. So, do you think my device was successfully updated? Why does it show less items in the device listing now?