[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 12/53] cryptodev-vhost-user: add asymmetric crypto support
From: |
Michael S. Tsirkin |
Subject: |
[PULL 12/53] cryptodev-vhost-user: add asymmetric crypto support |
Date: |
Mon, 26 Jun 2023 08:28:25 -0400 |
From: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
Add asymmetric crypto support in vhost_user backend.
Signed-off-by: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
Message-Id: <20230516083139.2349744-1-gmuthukrishn@marvell.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
backends/cryptodev-vhost-user.c | 9 ++--
hw/virtio/vhost-user.c | 75 +++++++++++++++++++++++++++------
2 files changed, 66 insertions(+), 18 deletions(-)
diff --git a/backends/cryptodev-vhost-user.c b/backends/cryptodev-vhost-user.c
index b1d9eb735f..c3283ba84a 100644
--- a/backends/cryptodev-vhost-user.c
+++ b/backends/cryptodev-vhost-user.c
@@ -232,9 +232,9 @@ static void cryptodev_vhost_user_init(
backend->conf.max_auth_key_len = VHOST_USER_MAX_AUTH_KEY_LEN;
}
-static int64_t cryptodev_vhost_user_sym_create_session(
+static int64_t cryptodev_vhost_user_crypto_create_session(
CryptoDevBackend *backend,
- CryptoDevBackendSymSessionInfo *sess_info,
+ CryptoDevBackendSessionInfo *sess_info,
uint32_t queue_index, Error **errp)
{
CryptoDevBackendClient *cc =
@@ -266,18 +266,17 @@ static int cryptodev_vhost_user_create_session(
void *opaque)
{
uint32_t op_code = sess_info->op_code;
- CryptoDevBackendSymSessionInfo *sym_sess_info;
int64_t ret;
Error *local_error = NULL;
int status;
switch (op_code) {
case VIRTIO_CRYPTO_CIPHER_CREATE_SESSION:
+ case VIRTIO_CRYPTO_AKCIPHER_CREATE_SESSION:
case VIRTIO_CRYPTO_HASH_CREATE_SESSION:
case VIRTIO_CRYPTO_MAC_CREATE_SESSION:
case VIRTIO_CRYPTO_AEAD_CREATE_SESSION:
- sym_sess_info = &sess_info->u.sym_sess_info;
- ret = cryptodev_vhost_user_sym_create_session(backend, sym_sess_info,
+ ret = cryptodev_vhost_user_crypto_create_session(backend, sess_info,
queue_index, &local_error);
break;
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
index 74a2a28663..2ad75a7964 100644
--- a/hw/virtio/vhost-user.c
+++ b/hw/virtio/vhost-user.c
@@ -11,6 +11,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
#include "hw/virtio/vhost.h"
+#include "hw/virtio/virtio-crypto.h"
#include "hw/virtio/vhost-user.h"
#include "hw/virtio/vhost-backend.h"
#include "hw/virtio/virtio.h"
@@ -163,13 +164,24 @@ typedef struct VhostUserConfig {
#define VHOST_CRYPTO_SYM_HMAC_MAX_KEY_LEN 512
#define VHOST_CRYPTO_SYM_CIPHER_MAX_KEY_LEN 64
+#define VHOST_CRYPTO_ASYM_MAX_KEY_LEN 1024
typedef struct VhostUserCryptoSession {
+ uint64_t op_code;
+ union {
+ struct {
+ CryptoDevBackendSymSessionInfo session_setup_data;
+ uint8_t key[VHOST_CRYPTO_SYM_CIPHER_MAX_KEY_LEN];
+ uint8_t auth_key[VHOST_CRYPTO_SYM_HMAC_MAX_KEY_LEN];
+ } sym;
+ struct {
+ CryptoDevBackendAsymSessionInfo session_setup_data;
+ uint8_t key[VHOST_CRYPTO_ASYM_MAX_KEY_LEN];
+ } asym;
+ } u;
+
/* session id for success, -1 on errors */
int64_t session_id;
- CryptoDevBackendSymSessionInfo session_setup_data;
- uint8_t key[VHOST_CRYPTO_SYM_CIPHER_MAX_KEY_LEN];
- uint8_t auth_key[VHOST_CRYPTO_SYM_HMAC_MAX_KEY_LEN];
} VhostUserCryptoSession;
static VhostUserConfig c __attribute__ ((unused));
@@ -2357,7 +2369,7 @@ static int vhost_user_crypto_create_session(struct
vhost_dev *dev,
int ret;
bool crypto_session = virtio_has_feature(dev->protocol_features,
VHOST_USER_PROTOCOL_F_CRYPTO_SESSION);
- CryptoDevBackendSymSessionInfo *sess_info = session_info;
+ CryptoDevBackendSessionInfo *backend_info = session_info;
VhostUserMsg msg = {
.hdr.request = VHOST_USER_CREATE_CRYPTO_SESSION,
.hdr.flags = VHOST_USER_VERSION,
@@ -2371,16 +2383,53 @@ static int vhost_user_crypto_create_session(struct
vhost_dev *dev,
return -ENOTSUP;
}
- memcpy(&msg.payload.session.session_setup_data, sess_info,
- sizeof(CryptoDevBackendSymSessionInfo));
- if (sess_info->key_len) {
- memcpy(&msg.payload.session.key, sess_info->cipher_key,
- sess_info->key_len);
- }
- if (sess_info->auth_key_len > 0) {
- memcpy(&msg.payload.session.auth_key, sess_info->auth_key,
- sess_info->auth_key_len);
+ if (backend_info->op_code == VIRTIO_CRYPTO_AKCIPHER_CREATE_SESSION) {
+ CryptoDevBackendAsymSessionInfo *sess =
&backend_info->u.asym_sess_info;
+ size_t keylen;
+
+ memcpy(&msg.payload.session.u.asym.session_setup_data, sess,
+ sizeof(CryptoDevBackendAsymSessionInfo));
+ if (sess->keylen) {
+ keylen = sizeof(msg.payload.session.u.asym.key);
+ if (sess->keylen > keylen) {
+ error_report("Unsupported asymmetric key size");
+ return -ENOTSUP;
+ }
+
+ memcpy(&msg.payload.session.u.asym.key, sess->key,
+ sess->keylen);
+ }
+ } else {
+ CryptoDevBackendSymSessionInfo *sess = &backend_info->u.sym_sess_info;
+ size_t keylen;
+
+ memcpy(&msg.payload.session.u.sym.session_setup_data, sess,
+ sizeof(CryptoDevBackendSymSessionInfo));
+ if (sess->key_len) {
+ keylen = sizeof(msg.payload.session.u.sym.key);
+ if (sess->key_len > keylen) {
+ error_report("Unsupported cipher key size");
+ return -ENOTSUP;
+ }
+
+ memcpy(&msg.payload.session.u.sym.key, sess->cipher_key,
+ sess->key_len);
+ }
+
+ if (sess->auth_key_len > 0) {
+ keylen = sizeof(msg.payload.session.u.sym.auth_key);
+ if (sess->auth_key_len > keylen) {
+ error_report("Unsupported auth key size");
+ return -ENOTSUP;
+ }
+
+ memcpy(&msg.payload.session.u.sym.auth_key, sess->auth_key,
+ sess->auth_key_len);
+ }
}
+
+ msg.payload.session.op_code = backend_info->op_code;
+ msg.payload.session.session_id = backend_info->session_id;
ret = vhost_user_write(dev, &msg, NULL, 0);
if (ret < 0) {
error_report("vhost_user_write() return %d, create session failed",
--
MST
- [PULL 02/53] hw/cxl: QMP based poison injection support, (continued)
- [PULL 02/53] hw/cxl: QMP based poison injection support, Michael S. Tsirkin, 2023/06/26
- [PULL 03/53] hw/cxl: Add poison injection via the mailbox., Michael S. Tsirkin, 2023/06/26
- [PULL 04/53] hw/cxl: Add clear poison mailbox command support., Michael S. Tsirkin, 2023/06/26
- [PULL 05/53] hw/cxl/events: Add event status register, Michael S. Tsirkin, 2023/06/26
- [PULL 06/53] hw/cxl: Move CXLRetCode definition to cxl_device.h, Michael S. Tsirkin, 2023/06/26
- [PULL 07/53] hw/cxl/events: Wire up get/clear event mailbox commands, Michael S. Tsirkin, 2023/06/26
- [PULL 08/53] hw/cxl/events: Add event interrupt support, Michael S. Tsirkin, 2023/06/26
- [PULL 09/53] hw/cxl/events: Add injection of General Media Events, Michael S. Tsirkin, 2023/06/26
- [PULL 10/53] hw/cxl/events: Add injection of DRAM events, Michael S. Tsirkin, 2023/06/26
- [PULL 11/53] hw/cxl/events: Add injection of Memory Module Events, Michael S. Tsirkin, 2023/06/26
- [PULL 12/53] cryptodev-vhost-user: add asymmetric crypto support,
Michael S. Tsirkin <=
- [PULL 13/53] softmmu: Introduce qemu_target_page_mask() helper, Michael S. Tsirkin, 2023/06/26
- [PULL 15/53] hw/scsi: Rearrange meson.build, Michael S. Tsirkin, 2023/06/26
- [PULL 18/53] hw/virtio/virtio-mem: Use qemu_ram_get_fd() helper, Michael S. Tsirkin, 2023/06/26
- [PULL 14/53] hw/scsi: Introduce VHOST_SCSI_COMMON symbol in Kconfig, Michael S. Tsirkin, 2023/06/26
- [PULL 23/53] vhost: release memory_listener object in error path, Michael S. Tsirkin, 2023/06/26
- [PULL 24/53] vhost: release virtqueue objects in error path, Michael S. Tsirkin, 2023/06/26
- [PULL 25/53] pci: ROM preallocation for incoming migration, Michael S. Tsirkin, 2023/06/26
- [PULL 16/53] hw/scsi: Rename target-specific source set as 'specific_virtio_scsi_ss', Michael S. Tsirkin, 2023/06/26
- [PULL 27/53] vdpa: return errno in vhost_vdpa_get_vring_group error, Michael S. Tsirkin, 2023/06/26
- [PULL 30/53] hw/acpi: Fix PM control register access, Michael S. Tsirkin, 2023/06/26