[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC 09/10] cryptodev-builtin: add stateless cipher support
From: |
Longpeng(Mike) |
Subject: |
[Qemu-devel] [RFC 09/10] cryptodev-builtin: add stateless cipher support |
Date: |
Mon, 6 Nov 2017 14:57:01 +0800 |
Adds stateless cipher support for builtin-backend
Signed-off-by: Gonglei <address@hidden>
[simplify the code & correct the return value]
Signed-off-by: Longpeng(Mike) <address@hidden>
---
backends/cryptodev-builtin.c | 86 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 86 insertions(+)
diff --git a/backends/cryptodev-builtin.c b/backends/cryptodev-builtin.c
index ba6d15c..e0737e0 100644
--- a/backends/cryptodev-builtin.c
+++ b/backends/cryptodev-builtin.c
@@ -335,6 +335,13 @@ static int cryptodev_builtin_sym_operation(
return -VIRTIO_CRYPTO_NOTSUPP;
}
+ if (op_info->op_code != VIRTIO_CRYPTO_CIPHER_ENCRYPT &&
+ op_info->op_code != VIRTIO_CRYPTO_CIPHER_DECRYPT) {
+ error_setg(errp,
+ "Unsupported op code: %u", op_info->op_code);
+ return -VIRTIO_CRYPTO_NOTSUPP;
+ }
+
sess = builtin->sessions[op_info->session_id];
if (op_info->iv_len > 0) {
@@ -389,6 +396,84 @@ static void cryptodev_builtin_cleanup(
cryptodev_backend_set_ready(backend, false);
}
+static int
+cryptodev_builtin_sym_stateless_operation(
+ CryptoDevBackend *backend,
+ CryptoDevBackendSymStatelessInfo *op_info,
+ uint32_t queue_index, Error **errp)
+{
+ CryptoDevBackendSymSessionInfo *sess_info;
+ CryptoDevBackendSymOpInfo *sym_op_info;
+ int algo, mode;
+ int ret;
+ QCryptoCipher *cipher = NULL;
+
+ sess_info = &op_info->session_info;
+ sym_op_info = &op_info->op_info;
+
+ if (sess_info->op_type != VIRTIO_CRYPTO_SYM_OP_CIPHER) {
+ error_setg(errp, "Unsupported op_type: %u", sess_info->op_type);
+ return -VIRTIO_CRYPTO_NOTSUPP;
+ }
+
+ switch (sym_op_info->op_code) {
+ case VIRTIO_CRYPTO_CIPHER_ENCRYPT:
+ case VIRTIO_CRYPTO_CIPHER_DECRYPT:
+ ret = cryptodev_builtin_get_cipher_alg_mode(sess_info,
+ &algo, &mode, errp);
+ if (ret < 0) {
+ return -VIRTIO_CRYPTO_NOTSUPP;
+ }
+
+ cipher = qcrypto_cipher_new(algo, mode,
+ sess_info->cipher_key,
+ sess_info->key_len,
+ errp);
+ if (!cipher) {
+ return -VIRTIO_CRYPTO_ERR;
+ }
+
+ if (sym_op_info->iv_len > 0) {
+ ret = qcrypto_cipher_setiv(cipher, sym_op_info->iv,
+ sym_op_info->iv_len, errp);
+ if (ret < 0) {
+ ret = -VIRTIO_CRYPTO_ERR;
+ goto out;
+ }
+ }
+
+ if (sess_info->direction == VIRTIO_CRYPTO_OP_ENCRYPT) {
+ ret = qcrypto_cipher_encrypt(cipher, sym_op_info->src,
+ sym_op_info->dst,
+ sym_op_info->src_len, errp);
+ if (ret < 0) {
+ ret = -VIRTIO_CRYPTO_ERR;
+ goto out;
+ }
+ } else {
+ ret = qcrypto_cipher_decrypt(cipher, sym_op_info->src,
+ sym_op_info->dst,
+ sym_op_info->src_len, errp);
+ if (ret < 0) {
+ ret = -VIRTIO_CRYPTO_ERR;
+ goto out;
+ }
+ }
+ break;
+
+ default:
+ error_setg(errp, "Unsupported op_code: %" PRIu32 "",
+ sym_op_info->op_code);
+ return -VIRTIO_CRYPTO_NOTSUPP;
+ }
+
+ ret = VIRTIO_CRYPTO_OK;
+
+out:
+ qcrypto_cipher_free(cipher);
+ return ret;
+}
+
static void
cryptodev_builtin_class_init(ObjectClass *oc, void *data)
{
@@ -399,6 +484,7 @@ cryptodev_builtin_class_init(ObjectClass *oc, void *data)
bc->create_session = cryptodev_builtin_sym_create_session;
bc->close_session = cryptodev_builtin_sym_close_session;
bc->do_sym_op = cryptodev_builtin_sym_operation;
+ bc->do_sym_stateless_op = cryptodev_builtin_sym_stateless_operation;
}
static const TypeInfo cryptodev_builtin_info = {
--
1.8.3.1
- [Qemu-devel] [RFC 00/10] virtio-crypto: add multiplexing mode support, Longpeng(Mike), 2017/11/06
- [Qemu-devel] [RFC 03/10] virtio-crypto: remove queue_id field in ctrl header, Longpeng(Mike), 2017/11/06
- [Qemu-devel] [RFC 01/10] virtio-crypto: remove virtio_crypto_op_ctrl_req structure, Longpeng(Mike), 2017/11/06
- [Qemu-devel] [RFC 06/10] cryptodev: add stateless mode cipher support, Longpeng(Mike), 2017/11/06
- [Qemu-devel] [RFC 08/10] cryptodev: extract one util function, Longpeng(Mike), 2017/11/06
- [Qemu-devel] [RFC 07/10] virtio-crypto: add stateless crypto request handler, Longpeng(Mike), 2017/11/06
- [Qemu-devel] [RFC 10/10] virtio-crypto: add host feature bits support, Longpeng(Mike), 2017/11/06
- [Qemu-devel] [RFC 04/10] virtio-crypto: remove virtio_crypto_op_data_req structure, Longpeng(Mike), 2017/11/06
- [Qemu-devel] [RFC 09/10] cryptodev-builtin: add stateless cipher support,
Longpeng(Mike) <=
- [Qemu-devel] [RFC 02/10] virtio-crypto: add session creation logic for mux mode, Longpeng(Mike), 2017/11/06
- [Qemu-devel] [RFC 05/10] virtio-crypto: add dataq operation logic for mux mode, Longpeng(Mike), 2017/11/06
- Re: [Qemu-devel] [RFC 00/10] virtio-crypto: add multiplexing mode support, no-reply, 2017/11/06