solokeys / solo1-cli

Solo 1 library and CLI in Python
https://pypi.org/project/solo-python
Apache License 2.0
182 stars 69 forks source link

Solo v2 - how to update or reset? #140

Closed bornf closed 2 years ago

bornf commented 2 years ago

on arch-linux: after tweaking the udev rules (70-solokeys-access.rules and 71-solokeys-symlinks.rules) according to dmesg output:

[98499.846462] usb 1-3: new full-speed USB device number 20 using xhci_hcd
[98500.030467] usb 1-3: New USB device found, idVendor=1209, idProduct=beee, bcdDevice= 1.00
.
.
.

replaced every 0483 by 1209 and a2ca by 1209 ... then user access to the device seems to work:

cat /dev/solo  ---> OK
echo "hello, Solo" > /dev/solo  ---> OK

udev created a symlink /dev/solo -> /dev/hidraw2

# solo key ping
ping returned: b'pong'
took 7 ms
# solo ls
:: Solos

...lists no device?

# solo key wink ... no blinking

# solo key update
Please switch key to bootloader mode:
Unplug, hold button, plug in, wait for flashing yellow light.

...the hold button-method does'nt seem to work on solo V2!?

# solo program aux enter-bootloader
Traceback (most recent call last):
  File "/home/peter/.local/bin/solo", line 8, in <module>
    sys.exit(solo_cli())
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1128, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1053, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1395, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3.9/site-packages/click/core.py", line 754, in invoke
    return __callback(*args, **kwargs)
  File "/home/peter/.local/lib/python3.9/site-packages/solo/cli/program.py", line 219, in enter_bootloader
    return _enter_bootloader(serial)
  File "/home/peter/.local/lib/python3.9/site-packages/solo/cli/program.py", line 202, in _enter_bootloader
    p.enter_bootloader_or_die()
  File "/home/peter/.local/lib/python3.9/site-packages/solo/devices/solo_v1.py", line 214, in enter_bootloader_or_die
    raise (e)
  File "/home/peter/.local/lib/python3.9/site-packages/solo/devices/solo_v1.py", line 204, in enter_bootloader_or_die
    self.enter_solo_bootloader()
  File "/home/peter/.local/lib/python3.9/site-packages/solo/devices/solo_v1.py", line 200, in enter_solo_bootloader
    self.send_data_hid(SoloBootloader.CommandEnterBoot, "")
  File "/home/peter/.local/lib/python3.9/site-packages/solo/devices/base.py", line 53, in send_data_hid
    return self.get_current_hid_device().call(cmd, data, event)
  File "/home/peter/.local/lib/python3.9/site-packages/fido2/hid/__init__.py", line 210, in call
    raise CtapError(struct.unpack_from(">B", recv)[0])
fido2.ctap.CtapError: CTAP error: 0x03 - INVALID_LENGTH
# solo key reset
Warning: Your credentials will be lost!!! Do you wish to continue? [y/N]: y
Press the button to confirm -- again, your credentials will be lost!!!
Traceback (most recent call last):
  File "/home/peter/.local/bin/solo", line 8, in <module>
    sys.exit(solo_cli())
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1128, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1053, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1395, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3.9/site-packages/click/core.py", line 754, in invoke
    return __callback(*args, **kwargs)
  File "/home/peter/.local/lib/python3.9/site-packages/solo/cli/key.py", line 302, in reset
    solo.client.find(serial).reset()
  File "/home/peter/.local/lib/python3.9/site-packages/solo/devices/base.py", line 79, in reset
    CTAP2(self.get_current_hid_device()).reset()
  File "/home/peter/.local/lib/python3.9/site-packages/fido2/ctap2/base.py", line 753, in reset
    self.send_cbor(Ctap2.CMD.RESET, event=event, on_keepalive=on_keepalive)
  File "/home/peter/.local/lib/python3.9/site-packages/fido2/ctap2/base.py", line 675, in send_cbor
    raise CtapError(status)
fido2.ctap.CtapError: CTAP error: 0x30 - NOT_ALLOWED

How to update or reset a Solo V2 Stick?

nickray commented 2 years ago

There is no (admin functionality) support for Solo 2 with the "old" Python CLI. The WIP new tool is github.com/solokeys/solo2-cli. For Arch, it's packaged on AUR with requisite new udev rules (https://aur.archlinux.org/packages/solo2-cli). NOTE that this needs pcscd running, will release an improved version soon.

nickray commented 2 years ago

Solo 2 CLI works over CTAP too now.