mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-10-04 18:20:06 +00:00
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) <longpeng2@huawei.com> Reviewed-by: Gonglei <arei.gonglei@huawei.com> Signed-off-by: Gonglei <arei.gonglei@huawei.com>
This commit is contained in:
parent
a470b33259
commit
465f2fedd2
|
@ -111,23 +111,42 @@ cryptodev_builtin_get_unused_session_index(
|
||||||
return -1;
|
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
|
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;
|
int algo;
|
||||||
|
|
||||||
if (key_len == 128 / 8) {
|
if (key_len == AES_KEYSIZE_128) {
|
||||||
algo = QCRYPTO_CIPHER_ALG_AES_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;
|
algo = QCRYPTO_CIPHER_ALG_AES_192;
|
||||||
} else if (key_len == 256 / 8) {
|
} else if (key_len == AES_KEYSIZE_256) { /* equals AES_KEYSIZE_128_XTS */
|
||||||
algo = QCRYPTO_CIPHER_ALG_AES_256;
|
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 {
|
} else {
|
||||||
error_setg(errp, "Unsupported key length :%u", key_len);
|
goto err;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return algo;
|
return algo;
|
||||||
|
|
||||||
|
err:
|
||||||
|
error_setg(errp, "Unsupported key length :%u", key_len);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cryptodev_builtin_create_cipher_session(
|
static int cryptodev_builtin_create_cipher_session(
|
||||||
|
@ -155,32 +174,32 @@ static int cryptodev_builtin_create_cipher_session(
|
||||||
|
|
||||||
switch (sess_info->cipher_alg) {
|
switch (sess_info->cipher_alg) {
|
||||||
case VIRTIO_CRYPTO_CIPHER_AES_ECB:
|
case VIRTIO_CRYPTO_CIPHER_AES_ECB:
|
||||||
|
mode = QCRYPTO_CIPHER_MODE_ECB;
|
||||||
algo = cryptodev_builtin_get_aes_algo(sess_info->key_len,
|
algo = cryptodev_builtin_get_aes_algo(sess_info->key_len,
|
||||||
errp);
|
mode, errp);
|
||||||
if (algo < 0) {
|
if (algo < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
mode = QCRYPTO_CIPHER_MODE_ECB;
|
|
||||||
break;
|
break;
|
||||||
case VIRTIO_CRYPTO_CIPHER_AES_CBC:
|
case VIRTIO_CRYPTO_CIPHER_AES_CBC:
|
||||||
|
mode = QCRYPTO_CIPHER_MODE_CBC;
|
||||||
algo = cryptodev_builtin_get_aes_algo(sess_info->key_len,
|
algo = cryptodev_builtin_get_aes_algo(sess_info->key_len,
|
||||||
errp);
|
mode, errp);
|
||||||
if (algo < 0) {
|
if (algo < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
mode = QCRYPTO_CIPHER_MODE_CBC;
|
|
||||||
break;
|
break;
|
||||||
case VIRTIO_CRYPTO_CIPHER_AES_CTR:
|
case VIRTIO_CRYPTO_CIPHER_AES_CTR:
|
||||||
|
mode = QCRYPTO_CIPHER_MODE_CTR;
|
||||||
algo = cryptodev_builtin_get_aes_algo(sess_info->key_len,
|
algo = cryptodev_builtin_get_aes_algo(sess_info->key_len,
|
||||||
errp);
|
mode, errp);
|
||||||
if (algo < 0) {
|
if (algo < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
mode = QCRYPTO_CIPHER_MODE_CTR;
|
|
||||||
break;
|
break;
|
||||||
case VIRTIO_CRYPTO_CIPHER_DES_ECB:
|
case VIRTIO_CRYPTO_CIPHER_DES_ECB:
|
||||||
algo = QCRYPTO_CIPHER_ALG_DES_RFB;
|
|
||||||
mode = QCRYPTO_CIPHER_MODE_ECB;
|
mode = QCRYPTO_CIPHER_MODE_ECB;
|
||||||
|
algo = QCRYPTO_CIPHER_ALG_DES_RFB;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error_setg(errp, "Unsupported cipher alg :%u",
|
error_setg(errp, "Unsupported cipher alg :%u",
|
||||||
|
|
Loading…
Reference in a new issue