The virtio crypto is a virtual crypto device as well as a kind of virtual hardware accelerator for virtual machines. The encryption and decryption requests are placed in the data queue and handled by the real crypto accelerators finally. The second queue is the control queue used to create or destroy sessions for symmetric algorithms and control some advanced features in the future. The virtio crypto device provides the following crypto services: CIPHER, MAC, HASH, AEAD etc.
TODO: - add vhost-user as a high performance cryptodev backend. - more crypto services support. - mirgration support. Changes since v4: (Thanks to Stefan) - drop scatter-gather I/O identification in virtio crypto spec and corresponding code [Stefan] - remove qcrypto perfix for cryptdov stuff [Stefan] - use virtio_error() in virtio-crypto device's functions. [Stefan] - fix endianness handling. [Stefan] - use VMSTATE_VIRTIO_DEVICE() instead of calling register_savevm(). [Stefan] - redefine DPRINTF in virtio-crypto.h [Stefan] - fix some typos [Stefan] - fix other farraginous problems suggested by Stefan. Changes since v3: - rename cryptodev-gcrypt to cryptodev-buitlin. [Daniel] - move cryptodev stuff from crypto/ directory to backends/ directory in order to keep the crypto subsystem influence by syetem emulators. [Daniel] - emulate virtio-crypto device as a legacy device by default in patch 11 - introduce virtio-crypto qtest case in patch 12 - add myself as cryptdoev backends mainatainer and vitio-crypto co-maintainer in patch 13 - add CRT support for cryptodev-builtin, it based on my previous crypto patch serial queued by Daniel. https://lists.gnu.org/archive/html/qemu-devel/2016-09/msg06607.html - add queue_index for qcrypto_cryptodev_backend_sym_close_session() Changes since v2: According to Daniel's comments: - drop cryptodev kernel module as a cryptodev backend - rename crypto stuff to cryptodev stuff - change some files' license to GPLv2+ - remove cryptodev command line instead of QOM to define the cryptodev backend - rename all functions and structures in crypto sub-directory. - add full inline documentation for cryptodev.h And: - drop crypto-queue.c [Paolo] - merge some patches Great thanks to Daniel and Paolo. Please review again, thanks! Changes since v1: - rmmove mixed endian-ness handler for virtio-crypto device, just use little-endian. [mst] - add sg list support according virtio-crypto spec v10 (will be posted soon). - fix a memory leak in session handler. - add a feature page link in qemu.org (http://qemu-project.org/Features/VirtioCrypto) - fix some trivial problems, sush as 's/Since 2.7/Since 2.8/g' in qapi-schema.json - rebase the latest qemu master tree. This patch series realize the framework and emulation of a new virtio crypto device, which is similar with virtio net device. - I introduce the cryptodev backend as the client of virtio crypto device which can be realized by different methods, such as cryptodev-backend-gcrypt in my series, vhost-crypto kernel module, vhost-user etc. - The patch set abides by the virtio crypto speccification. - The virtio crypto support symmetric algorithms (including CIPHER and algorithm chainning) at present, except HASH, MAC and AEAD services. - unsupport hot plug/unplug cryptodev backend at this moment. Firstly build QEMU with libgcrypt cryptography support. QEMU can then be started using the following parameters: qemu-system-x86_64 \ [...] \ -object cryptodev-backend-builtin,id=cryptodev0 \ -device virtio-crypto-pci,id=crypto0,cryptodev=cryptodev0 \ [...] The front-end linux kernel driver (Experimental at present) is publicly accessible from: https://github.com/gongleiarei/virtio-crypto-linux-driver.git After insmod virtio-crypto.ko, you can use cryptodev-linux test the crypto function in the guest. For example: linux-guest:/home/gonglei/cryptodev-linux/tests # ./cipher - requested cipher CRYPTO_AES_CBC, got cbc(aes) with driver virtio_crypto_aes_cbc AES Test passed requested cipher CRYPTO_AES_CBC, got cbc(aes) with driver virtio_crypto_aes_cbc requested cipher CRYPTO_AES_CBC, got cbc(aes) with driver virtio_crypto_aes_cbc Test passed QEMU code also can be accessible from: https://github.com/gongleiarei/qemu.git branch virtio-crypto For more information, please see: http://qemu-project.org/Features/VirtioCrypto Gonglei (14): cryptodev: introduce cryptodev backend interface cryptodev: add symmetric algorithm operation stuff virtio-crypto: introduce virtio_crypto.h cryptodev: introduce a new cryptodev backend virtio-crypto: add virtio crypto device emulation virtio-crypto-pci: add virtio crypto pci support virtio-crypto: set capacity of algorithms supported virtio-crypto: add control queue handler virtio-crypto: add data queue processing handler cryptodev: introduce an unified wrapper for crypto operation virtio-crypto: emulate virtio crypto as a legacy device by default virtio-crypto-test: add qtest case for virtio-crypto virtio-crypto: add myself as virtio-crypto and cryptodev backends maintainer cryptodev: rename cryptodev stuff MAINTAINERS | 14 + backends/Makefile.objs | 3 + backends/cryptodev-builtin.c | 345 +++++++++++ backends/cryptodev.c | 245 ++++++++ docs/specs/pci-ids.txt | 2 + hw/virtio/Makefile.objs | 2 + hw/virtio/virtio-crypto-pci.c | 79 +++ hw/virtio/virtio-crypto.c | 803 +++++++++++++++++++++++++ hw/virtio/virtio-pci.h | 15 + include/hw/pci/pci.h | 2 + include/hw/virtio/virtio-crypto.h | 96 +++ include/standard-headers/linux/virtio_crypto.h | 381 ++++++++++++ include/standard-headers/linux/virtio_ids.h | 2 +- include/sysemu/cryptodev.h | 284 +++++++++ qemu-options.hx | 18 + tests/Makefile.include | 3 + tests/virtio-crypto-test.c | 427 +++++++++++++ 17 files changed, 2720 insertions(+), 1 deletion(-) create mode 100644 backends/cryptodev-builtin.c create mode 100644 backends/cryptodev.c create mode 100644 hw/virtio/virtio-crypto-pci.c create mode 100644 hw/virtio/virtio-crypto.c create mode 100644 include/hw/virtio/virtio-crypto.h create mode 100644 include/standard-headers/linux/virtio_crypto.h create mode 100644 include/sysemu/cryptodev.h create mode 100644 tests/virtio-crypto-test.c -- 1.7.12.4