Commit 0db4d79d authored by Jacek Kalwas's avatar Jacek Kalwas Committed by Tomasz Zawadzki
Browse files

accel: introduce function to check cipher support



Signed-off-by: default avatarJacek Kalwas <jacek.kalwas@intel.com>
Change-Id: I99cb720d4b5780b5147a9ef91ab23dba9ff89d41
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/18196


Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 72d7595d
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -175,6 +175,11 @@ struct spdk_accel_module_if {
	 */
	bool (*crypto_supports_tweak_mode)(enum spdk_accel_crypto_tweak_mode tweak_mode);

	/**
	 * Returns true if given cipher is supported.
	 */
	bool (*crypto_supports_cipher)(enum spdk_accel_cipher cipher);

	/**
	 * Returns memory domains supported by the module.  If NULL, the module does not support
	 * memory domains.  The `domains` array can be NULL, in which case this function only
+8 −1
Original line number Diff line number Diff line
@@ -2068,7 +2068,8 @@ spdk_accel_crypto_key_create(const struct spdk_accel_crypto_key_create_param *pa
		SPDK_ERRLOG("No accel module found assigned for crypto operation\n");
		return -ENOENT;
	}
	if (!module->crypto_key_init) {

	if (!module->crypto_key_init || !module->crypto_supports_cipher) {
		SPDK_ERRLOG("Accel module \"%s\" doesn't support crypto operations\n", module->name);
		return -ENOTSUP;
	}
@@ -2197,6 +2198,12 @@ spdk_accel_crypto_key_create(const struct spdk_accel_crypto_key_create_param *pa
		goto error;
	}

	if (!module->crypto_supports_cipher(key->cipher)) {
		SPDK_ERRLOG("Module %s doesn't support %s cipher\n", module->name, g_ciphers[key->cipher]);
		rc = -EINVAL;
		goto error;
	}

	if (key->cipher == SPDK_ACCEL_CIPHER_AES_XTS) {
		if (!key->key2) {
			SPDK_ERRLOG("%s key2 is missing\n", g_ciphers[key->cipher]);
+8 −5
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ static struct spdk_accel_module_if g_sw_module;
static void sw_accel_crypto_key_deinit(struct spdk_accel_crypto_key *_key);
static int sw_accel_crypto_key_init(struct spdk_accel_crypto_key *key);
static bool sw_accel_crypto_supports_tweak_mode(enum spdk_accel_crypto_tweak_mode tweak_mode);
static bool sw_accel_crypto_supports_cipher(enum spdk_accel_cipher cipher);

/* Post SW completions to a list and complete in a poller as we don't want to
 * complete them on the caller's stack as they'll likely submit another. */
@@ -525,6 +526,7 @@ static struct spdk_accel_module_if g_sw_module = {
	.crypto_key_init	= sw_accel_crypto_key_init,
	.crypto_key_deinit	= sw_accel_crypto_key_deinit,
	.crypto_supports_tweak_mode	= sw_accel_crypto_supports_tweak_mode,
	.crypto_supports_cipher	= sw_accel_crypto_supports_cipher,
};

static int
@@ -652,11 +654,6 @@ sw_accel_create_aes_xts(struct spdk_accel_crypto_key *key)
static int
sw_accel_crypto_key_init(struct spdk_accel_crypto_key *key)
{
	if (key->cipher != SPDK_ACCEL_CIPHER_AES_XTS) {
		SPDK_ERRLOG("Only %s cipher is supported\n", ACCEL_AES_XTS);
		return -EINVAL;
	}

	return sw_accel_create_aes_xts(key);
}

@@ -676,4 +673,10 @@ sw_accel_crypto_supports_tweak_mode(enum spdk_accel_crypto_tweak_mode tweak_mode
	return tweak_mode == SPDK_ACCEL_CRYPTO_TWEAK_MODE_SIMPLE_LBA;
}

static bool
sw_accel_crypto_supports_cipher(enum spdk_accel_cipher cipher)
{
	return cipher == SPDK_ACCEL_CIPHER_AES_XTS;
}

SPDK_ACCEL_MODULE_REGISTER(sw, &g_sw_module)
+15 −15
Original line number Diff line number Diff line
@@ -1397,12 +1397,6 @@ accel_dpdk_cryptodev_validate_parameters(enum accel_dpdk_cryptodev_driver_type d
	/* Check driver/cipher combinations and key lengths */
	switch (key->cipher) {
	case SPDK_ACCEL_CIPHER_AES_CBC:
		if (driver == ACCEL_DPDK_CRYPTODEV_DRIVER_MLX5_PCI) {
			SPDK_ERRLOG("Driver %s only supports cipher %s\n",
				    g_driver_names[ACCEL_DPDK_CRYPTODEV_DRIVER_MLX5_PCI],
				    g_cipher_names[SPDK_ACCEL_CIPHER_AES_XTS]);
			return -1;
		}
		if (key->key_size != ACCEL_DPDK_CRYPTODEV_AES_CBC_KEY_LENGTH) {
			SPDK_ERRLOG("Invalid key size %zu for cipher %s, should be %d\n", key->key_size,
				    g_cipher_names[SPDK_ACCEL_CIPHER_AES_CBC], ACCEL_DPDK_CRYPTODEV_AES_CBC_KEY_LENGTH);
@@ -1465,6 +1459,20 @@ accel_dpdk_cryptodev_key_deinit(struct spdk_accel_crypto_key *key)
	free(priv);
}

static bool
accel_dpdk_cryptodev_supports_cipher(enum spdk_accel_cipher cipher)
{
	switch (g_dpdk_cryptodev_driver) {
	case ACCEL_DPDK_CRYPTODEV_DRIVER_QAT:
	case ACCEL_DPDK_CRYPTODEV_DRIVER_AESNI_MB:
		return cipher == SPDK_ACCEL_CIPHER_AES_XTS || cipher == SPDK_ACCEL_CIPHER_AES_CBC;
	case ACCEL_DPDK_CRYPTODEV_DRIVER_MLX5_PCI:
		return cipher == SPDK_ACCEL_CIPHER_AES_XTS;
	default:
		return false;
	}
}

static int
accel_dpdk_cryptodev_key_init(struct spdk_accel_crypto_key *key)
{
@@ -1474,15 +1482,6 @@ accel_dpdk_cryptodev_key_init(struct spdk_accel_crypto_key *key)
	enum accel_dpdk_cryptodev_driver_type driver;
	int rc;

	switch (key->cipher) {
	case SPDK_ACCEL_CIPHER_AES_CBC:
	case SPDK_ACCEL_CIPHER_AES_XTS:
		break;
	default:
		SPDK_ERRLOG("Unsupported cipher name %s.\n", key->param.cipher);
		return -EINVAL;
	}

	driver = g_dpdk_cryptodev_driver;

	if (accel_dpdk_cryptodev_validate_parameters(driver, key)) {
@@ -1573,4 +1572,5 @@ static struct spdk_accel_module_if g_accel_dpdk_cryptodev_module = {
	.submit_tasks		= accel_dpdk_cryptodev_submit_tasks,
	.crypto_key_init	= accel_dpdk_cryptodev_key_init,
	.crypto_key_deinit	= accel_dpdk_cryptodev_key_deinit,
	.crypto_supports_cipher	= accel_dpdk_cryptodev_supports_cipher,
};
+7 −0
Original line number Diff line number Diff line
@@ -1164,6 +1164,12 @@ accel_mlx5_crypto_key_deinit(struct spdk_accel_crypto_key *key)
	spdk_mlx5_crypto_keytag_destroy(key->priv);
}

static bool
accel_mlx5_crypto_supports_cipher(enum spdk_accel_cipher cipher)
{
	return cipher == SPDK_ACCEL_CIPHER_AES_XTS;
}

static struct accel_mlx5_module g_accel_mlx5 = {
	.module = {
		.module_init		= accel_mlx5_init,
@@ -1176,6 +1182,7 @@ static struct accel_mlx5_module g_accel_mlx5 = {
		.submit_tasks		= accel_mlx5_submit_tasks,
		.crypto_key_init	= accel_mlx5_crypto_key_init,
		.crypto_key_deinit	= accel_mlx5_crypto_key_deinit,
		.crypto_supports_cipher	= accel_mlx5_crypto_supports_cipher,
	}
};