
* Update to QEMU v9.0.0 --------- Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Fabiano Rosas <farosas@suse.de> Signed-off-by: Peter Xu <peterx@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Cédric Le Goater <clg@redhat.com> Signed-off-by: Zheyu Ma <zheyuma97@gmail.com> Signed-off-by: Ido Plat <ido.plat@ibm.com> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Signed-off-by: David Hildenbrand <david@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com> Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> Signed-off-by: Gregory Price <gregory.price@memverge.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Lorenz Brun <lorenz@brun.one> Signed-off-by: Yao Xingtao <yaoxt.fnst@fujitsu.com> Signed-off-by: Arnaud Minier <arnaud.minier@telecom-paris.fr> Signed-off-by: Inès Varhol <ines.varhol@telecom-paris.fr> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> Signed-off-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Sven Schnelle <svens@stackframe.org> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com> Signed-off-by: Jason Wang <jasowang@redhat.com> Signed-off-by: Helge Deller <deller@gmx.de> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Benjamin Gray <bgray@linux.ibm.com> Signed-off-by: Avihai Horon <avihaih@nvidia.com> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru> Signed-off-by: Joonas Kankaala <joonas.a.kankaala@gmail.com> Signed-off-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org> Signed-off-by: Stefan Weil <sw@weilnetz.de> Signed-off-by: Zhao Liu <zhao1.liu@intel.com> Signed-off-by: Glenn Miles <milesg@linux.ibm.com> Signed-off-by: Oleg Sviridov <oleg.sviridov@red-soft.ru> Signed-off-by: Artem Chernyshev <artem.chernyshev@red-soft.ru> Signed-off-by: Yajun Wu <yajunw@nvidia.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Signed-off-by: Pierre-Clément Tosi <ptosi@google.com> Signed-off-by: Lei Wang <lei4.wang@intel.com> Signed-off-by: Wei Wang <wei.w.wang@intel.com> Signed-off-by: Martin Hundebøll <martin@geanix.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org> Signed-off-by: Wafer <wafer@jaguarmicro.com> Signed-off-by: Yuxue Liu <yuxue.liu@jaguarmicro.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Nguyen Dinh Phi <phind.uet@gmail.com> Signed-off-by: Zack Buhman <zack@buhman.org> Signed-off-by: Keith Packard <keithp@keithp.com> Signed-off-by: Yuquan Wang wangyuquan1236@phytium.com.cn Signed-off-by: Matheus Tavares Bernardino <quic_mathbern@quicinc.com> Signed-off-by: Cindy Lu <lulu@redhat.com> Co-authored-by: Peter Maydell <peter.maydell@linaro.org> Co-authored-by: Fabiano Rosas <farosas@suse.de> Co-authored-by: Peter Xu <peterx@redhat.com> Co-authored-by: Thomas Huth <thuth@redhat.com> Co-authored-by: Cédric Le Goater <clg@redhat.com> Co-authored-by: Zheyu Ma <zheyuma97@gmail.com> Co-authored-by: Ido Plat <ido.plat@ibm.com> Co-authored-by: Ilya Leoshkevich <iii@linux.ibm.com> Co-authored-by: Markus Armbruster <armbru@redhat.com> Co-authored-by: Marc-André Lureau <marcandre.lureau@redhat.com> Co-authored-by: Paolo Bonzini <pbonzini@redhat.com> Co-authored-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Co-authored-by: David Hildenbrand <david@redhat.com> Co-authored-by: Kevin Wolf <kwolf@redhat.com> Co-authored-by: Stefan Reiter <s.reiter@proxmox.com> Co-authored-by: Fiona Ebner <f.ebner@proxmox.com> Co-authored-by: Gregory Price <gregory.price@memverge.com> Co-authored-by: Lorenz Brun <lorenz@brun.one> Co-authored-by: Yao Xingtao <yaoxt.fnst@fujitsu.com> Co-authored-by: Philippe Mathieu-Daudé <philmd@linaro.org> Co-authored-by: Arnaud Minier <arnaud.minier@telecom-paris.fr> Co-authored-by: BALATON Zoltan <balaton@eik.bme.hu> Co-authored-by: Igor Mammedov <imammedo@redhat.com> Co-authored-by: Akihiko Odaki <akihiko.odaki@daynix.com> Co-authored-by: Richard Henderson <richard.henderson@linaro.org> Co-authored-by: Sven Schnelle <svens@stackframe.org> Co-authored-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Co-authored-by: Helge Deller <deller@kernel.org> Co-authored-by: Harsh Prateek Bora <harshpb@linux.ibm.com> Co-authored-by: Benjamin Gray <bgray@linux.ibm.com> Co-authored-by: Nicholas Piggin <npiggin@gmail.com> Co-authored-by: Avihai Horon <avihaih@nvidia.com> Co-authored-by: Michael Tokarev <mjt@tls.msk.ru> Co-authored-by: Joonas Kankaala <joonas.a.kankaala@gmail.com> Co-authored-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org> Co-authored-by: Stefan Weil <sw@weilnetz.de> Co-authored-by: Dayu Liu <liu.dayu@zte.com.cn> Co-authored-by: Zhao Liu <zhao1.liu@intel.com> Co-authored-by: Glenn Miles <milesg@linux.vnet.ibm.com> Co-authored-by: Artem Chernyshev <artem.chernyshev@red-soft.ru> Co-authored-by: Yajun Wu <yajunw@nvidia.com> Co-authored-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Co-authored-by: Pierre-Clément Tosi <ptosi@google.com> Co-authored-by: Wei Wang <wei.w.wang@intel.com> Co-authored-by: Martin Hundebøll <martin@geanix.com> Co-authored-by: Michael S. Tsirkin <mst@redhat.com> Co-authored-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org> Co-authored-by: Wafer <wafer@jaguarmicro.com> Co-authored-by: lyx634449800 <yuxue.liu@jaguarmicro.com> Co-authored-by: Gerd Hoffmann <kraxel@redhat.com> Co-authored-by: Nguyen Dinh Phi <phind.uet@gmail.com> Co-authored-by: Zack Buhman <zack@buhman.org> Co-authored-by: Keith Packard <keithp@keithp.com> Co-authored-by: Yuquan Wang <wangyuquan1236@phytium.com.cn> Co-authored-by: Matheus Tavares Bernardino <quic_mathbern@quicinc.com> Co-authored-by: Cindy Lu <lulu@redhat.com>
159 lines
4.5 KiB
ReStructuredText
159 lines
4.5 KiB
ReStructuredText
.. _canokey:
|
|
|
|
CanoKey QEMU
|
|
------------
|
|
|
|
CanoKey [1]_ is an open-source secure key with supports of
|
|
|
|
* U2F / FIDO2 with Ed25519 and HMAC-secret
|
|
* OpenPGP Card V3.4 with RSA4096, Ed25519 and more [2]_
|
|
* PIV (NIST SP 800-73-4)
|
|
* HOTP / TOTP
|
|
* NDEF
|
|
|
|
All these platform-independent features are in canokey-core [3]_.
|
|
|
|
For different platforms, CanoKey has different implementations,
|
|
including both hardware implementations and virtual cards:
|
|
|
|
* CanoKey STM32 [4]_
|
|
* CanoKey Pigeon [5]_
|
|
* (virt-card) CanoKey USB/IP
|
|
* (virt-card) CanoKey FunctionFS
|
|
|
|
In QEMU, yet another CanoKey virt-card is implemented.
|
|
CanoKey QEMU exposes itself as a USB device to the guest OS.
|
|
|
|
With the same software configuration as a hardware key,
|
|
the guest OS can use all the functionalities of a secure key as if
|
|
there was actually an hardware key plugged in.
|
|
|
|
CanoKey QEMU provides much convenience for debugging:
|
|
|
|
* libcanokey-qemu supports debugging output thus developers can
|
|
inspect what happens inside a secure key
|
|
* CanoKey QEMU supports trace event thus event
|
|
* QEMU USB stack supports pcap thus USB packet between the guest
|
|
and key can be captured and analysed
|
|
|
|
Then for developers:
|
|
|
|
* For developers on software with secure key support (e.g. FIDO2, OpenPGP),
|
|
they can see what happens inside the secure key
|
|
* For secure key developers, USB packets between guest OS and CanoKey
|
|
can be easily captured and analysed
|
|
|
|
Also since this is a virtual card, it can be easily used in CI for testing
|
|
on code coping with secure key.
|
|
|
|
Building
|
|
========
|
|
|
|
libcanokey-qemu is required to use CanoKey QEMU.
|
|
|
|
.. code-block:: shell
|
|
|
|
git clone https://github.com/canokeys/canokey-qemu
|
|
mkdir canokey-qemu/build
|
|
pushd canokey-qemu/build
|
|
|
|
If you want to install libcanokey-qemu in a different place,
|
|
add ``-DCMAKE_INSTALL_PREFIX=/path/to/your/place`` to cmake below.
|
|
|
|
.. code-block:: shell
|
|
|
|
cmake ..
|
|
make
|
|
make install # may need sudo
|
|
popd
|
|
|
|
Then configuring and building:
|
|
|
|
.. code-block:: shell
|
|
|
|
# depending on your env, lib/pkgconfig can be lib64/pkgconfig
|
|
export PKG_CONFIG_PATH=/path/to/your/place/lib/pkgconfig:$PKG_CONFIG_PATH
|
|
./configure --enable-canokey && make
|
|
|
|
Using CanoKey QEMU
|
|
==================
|
|
|
|
CanoKey QEMU stores all its data on a file of the host specified by the argument
|
|
when invoking qemu.
|
|
|
|
.. parsed-literal::
|
|
|
|
|qemu_system| -usb -device canokey,file=$HOME/.canokey-file
|
|
|
|
Note: you should keep this file carefully as it may contain your private key!
|
|
|
|
The first time when the file is used, it is created and initialized by CanoKey,
|
|
afterwards CanoKey QEMU would just read this file.
|
|
|
|
After the guest OS boots, you can check that there is a USB device.
|
|
|
|
For example, If the guest OS is an Linux machine. You may invoke lsusb
|
|
and find CanoKey QEMU there:
|
|
|
|
.. code-block:: shell
|
|
|
|
$ lsusb
|
|
Bus 001 Device 002: ID 20a0:42d4 Clay Logic CanoKey QEMU
|
|
|
|
You may setup the key as guided in [6]_. The console for the key is at [7]_.
|
|
|
|
Debugging
|
|
=========
|
|
|
|
CanoKey QEMU consists of two parts, ``libcanokey-qemu.so`` and ``canokey.c``,
|
|
the latter of which resides in QEMU. The former provides core functionality
|
|
of a secure key while the latter provides platform-dependent functions:
|
|
USB packet handling.
|
|
|
|
If you want to trace what happens inside the secure key, when compiling
|
|
libcanokey-qemu, you should add ``-DQEMU_DEBUG_OUTPUT=ON`` in cmake command
|
|
line:
|
|
|
|
.. code-block:: shell
|
|
|
|
cmake .. -DQEMU_DEBUG_OUTPUT=ON
|
|
|
|
If you want to trace events happened in canokey.c, use
|
|
|
|
.. parsed-literal::
|
|
|
|
|qemu_system| --trace "canokey_*" \\
|
|
-usb -device canokey,file=$HOME/.canokey-file
|
|
|
|
If you want to capture USB packets between the guest and the host, you can:
|
|
|
|
.. parsed-literal::
|
|
|
|
|qemu_system| -usb -device canokey,file=$HOME/.canokey-file,pcap=key.pcap
|
|
|
|
Limitations
|
|
===========
|
|
|
|
Currently libcanokey-qemu.so has dozens of global variables as it was originally
|
|
designed for embedded systems. Thus one qemu instance can not have
|
|
multiple CanoKey QEMU running, namely you can not
|
|
|
|
.. parsed-literal::
|
|
|
|
|qemu_system| -usb -device canokey,file=$HOME/.canokey-file \\
|
|
-device canokey,file=$HOME/.canokey-file2
|
|
|
|
Also, there is no lock on canokey-file, thus two CanoKey QEMU instance
|
|
can not read one canokey-file at the same time.
|
|
|
|
References
|
|
==========
|
|
|
|
.. [1] `<https://canokeys.org>`_
|
|
.. [2] `<https://docs.canokeys.org/userguide/openpgp/#supported-algorithm>`_
|
|
.. [3] `<https://github.com/canokeys/canokey-core>`_
|
|
.. [4] `<https://github.com/canokeys/canokey-stm32>`_
|
|
.. [5] `<https://github.com/canokeys/canokey-pigeon>`_
|
|
.. [6] `<https://docs.canokeys.org/>`_
|
|
.. [7] `<https://console.canokeys.org/>`_
|