From 465f2fedd262cbdcbfc92c181660cf85e5029515 Mon Sep 17 00:00:00 2001 From: "Longpeng(Mike)" Date: Mon, 5 Dec 2016 19:39:08 +0800 Subject: cryptodev: fix the check of aes algorithm As the key length of xts(aes) is different with other mode of aes, so we should check specially in cryptodev_builtin_get_aes_algo, if it is xts mode. Signed-off-by: Longpeng(Mike) Reviewed-by: Gonglei Signed-off-by: Gonglei --- backends/cryptodev-builtin.c | 47 +++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/backends/cryptodev-builtin.c b/backends/cryptodev-builtin.c index eda954b2a2..57980cbd12 100644 --- a/backends/cryptodev-builtin.c +++ b/backends/cryptodev-builtin.c @@ -111,23 +111,42 @@ cryptodev_builtin_get_unused_session_index( return -1; } +#define AES_KEYSIZE_128 16 +#define AES_KEYSIZE_192 24 +#define AES_KEYSIZE_256 32 +#define AES_KEYSIZE_128_XTS AES_KEYSIZE_256 +#define AES_KEYSIZE_256_XTS 64 + static int -cryptodev_builtin_get_aes_algo(uint32_t key_len, Error **errp) +cryptodev_builtin_get_aes_algo(uint32_t key_len, int mode, Error **errp) { int algo; - if (key_len == 128 / 8) { + if (key_len == AES_KEYSIZE_128) { algo = QCRYPTO_CIPHER_ALG_AES_128; - } else if (key_len == 192 / 8) { + } else if (key_len == AES_KEYSIZE_192) { algo = QCRYPTO_CIPHER_ALG_AES_192; - } else if (key_len == 256 / 8) { - algo = QCRYPTO_CIPHER_ALG_AES_256; + } else if (key_len == AES_KEYSIZE_256) { /* equals AES_KEYSIZE_128_XTS */ + if (mode == QCRYPTO_CIPHER_MODE_XTS) { + algo = QCRYPTO_CIPHER_ALG_AES_128; + } else { + algo = QCRYPTO_CIPHER_ALG_AES_256; + } + } else if (key_len == AES_KEYSIZE_256_XTS) { + if (mode == QCRYPTO_CIPHER_MODE_XTS) { + algo = QCRYPTO_CIPHER_ALG_AES_256; + } else { + goto err; + } } else { - error_setg(errp, "Unsupported key length :%u", key_len); - return -1; + goto err; } return algo; + +err: + error_setg(errp, "Unsupported key length :%u", key_len); + return -1; } static int cryptodev_builtin_create_cipher_session( @@ -155,32 +174,32 @@ static int cryptodev_builtin_create_cipher_session( switch (sess_info->cipher_alg) { case VIRTIO_CRYPTO_CIPHER_AES_ECB: + mode = QCRYPTO_CIPHER_MODE_ECB; algo = cryptodev_builtin_get_aes_algo(sess_info->key_len, - errp); + mode, errp); if (algo < 0) { return -1; } - mode = QCRYPTO_CIPHER_MODE_ECB; break; case VIRTIO_CRYPTO_CIPHER_AES_CBC: + mode = QCRYPTO_CIPHER_MODE_CBC; algo = cryptodev_builtin_get_aes_algo(sess_info->key_len, - errp); + mode, errp); if (algo < 0) { return -1; } - mode = QCRYPTO_CIPHER_MODE_CBC; break; case VIRTIO_CRYPTO_CIPHER_AES_CTR: + mode = QCRYPTO_CIPHER_MODE_CTR; algo = cryptodev_builtin_get_aes_algo(sess_info->key_len, - errp); + mode, errp); if (algo < 0) { return -1; } - mode = QCRYPTO_CIPHER_MODE_CTR; break; case VIRTIO_CRYPTO_CIPHER_DES_ECB: - algo = QCRYPTO_CIPHER_ALG_DES_RFB; mode = QCRYPTO_CIPHER_MODE_ECB; + algo = QCRYPTO_CIPHER_ALG_DES_RFB; break; default: error_setg(errp, "Unsupported cipher alg :%u", -- cgit v1.2.3 From eaa57403044c33e0f3e9c6f7c174b05e6534fec4 Mon Sep 17 00:00:00 2001 From: "Longpeng(Mike)" Date: Mon, 5 Dec 2016 19:39:09 +0800 Subject: cryptodev: add xts(aes) support This patch add xts(aes) support. Signed-off-by: Longpeng(Mike) Reviewed-by: Gonglei Signed-off-by: Gonglei --- backends/cryptodev-builtin.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backends/cryptodev-builtin.c b/backends/cryptodev-builtin.c index 57980cbd12..a4224f4b1e 100644 --- a/backends/cryptodev-builtin.c +++ b/backends/cryptodev-builtin.c @@ -197,6 +197,14 @@ static int cryptodev_builtin_create_cipher_session( return -1; } break; + case VIRTIO_CRYPTO_CIPHER_AES_XTS: + mode = QCRYPTO_CIPHER_MODE_XTS; + algo = cryptodev_builtin_get_aes_algo(sess_info->key_len, + mode, errp); + if (algo < 0) { + return -1; + } + break; case VIRTIO_CRYPTO_CIPHER_DES_ECB: mode = QCRYPTO_CIPHER_MODE_ECB; algo = QCRYPTO_CIPHER_ALG_DES_RFB; -- cgit v1.2.3 From d7a2127a4c5b2d52c94d5c27a5744a055ddc14f7 Mon Sep 17 00:00:00 2001 From: "Longpeng(Mike)" Date: Wed, 7 Dec 2016 09:11:50 +0800 Subject: cryptodev: remove single-DES support in cryptodev Single-DES is obsolete and it's broken/useless for decades, we should remove it in cryptodev, as suggested by Daniel. Guest who wants to use this obsolete cipher alg will use its built-in implementation instead. Signed-off-by: Longpeng(Mike) Reviewed-by: Daniel P. Berrange Signed-off-by: Gonglei --- backends/cryptodev-builtin.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/backends/cryptodev-builtin.c b/backends/cryptodev-builtin.c index a4224f4b1e..5fb2836fde 100644 --- a/backends/cryptodev-builtin.c +++ b/backends/cryptodev-builtin.c @@ -205,10 +205,6 @@ static int cryptodev_builtin_create_cipher_session( return -1; } break; - case VIRTIO_CRYPTO_CIPHER_DES_ECB: - mode = QCRYPTO_CIPHER_MODE_ECB; - algo = QCRYPTO_CIPHER_ALG_DES_RFB; - break; default: error_setg(errp, "Unsupported cipher alg :%u", sess_info->cipher_alg); -- cgit v1.2.3 From 48ae36c0ad16bb757d4f6e243b8e9072fc8e8c8e Mon Sep 17 00:00:00 2001 From: "Longpeng(Mike)" Date: Thu, 8 Dec 2016 10:44:02 +0800 Subject: cryptodev: add 3des-ede support This patch add 3des-ede support for cryptodev. However this is effective only when backend using libgcrypt/nettle, because cipher-builtin doesn't support 3des-ede yet. Signed-off-by: Longpeng(Mike) Signed-off-by: Gonglei --- backends/cryptodev-builtin.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/backends/cryptodev-builtin.c b/backends/cryptodev-builtin.c index 5fb2836fde..486b4a62bc 100644 --- a/backends/cryptodev-builtin.c +++ b/backends/cryptodev-builtin.c @@ -205,6 +205,18 @@ static int cryptodev_builtin_create_cipher_session( return -1; } break; + case VIRTIO_CRYPTO_CIPHER_3DES_ECB: + mode = QCRYPTO_CIPHER_MODE_ECB; + algo = QCRYPTO_CIPHER_ALG_3DES; + break; + case VIRTIO_CRYPTO_CIPHER_3DES_CBC: + mode = QCRYPTO_CIPHER_MODE_CBC; + algo = QCRYPTO_CIPHER_ALG_3DES; + break; + case VIRTIO_CRYPTO_CIPHER_3DES_CTR: + mode = QCRYPTO_CIPHER_MODE_CTR; + algo = QCRYPTO_CIPHER_ALG_3DES; + break; default: error_setg(errp, "Unsupported cipher alg :%u", sess_info->cipher_alg); -- cgit v1.2.3