xref: /dpdk/drivers/crypto/mlx5/mlx5_crypto_dek.c (revision 98fb4bb03bd56fe256a7b31b3eb7c6b66da5c14d)
1586add6eSShiri Kuzin /* SPDX-License-Identifier: BSD-3-Clause
2586add6eSShiri Kuzin  * Copyright (c) 2021 NVIDIA Corporation & Affiliates
3586add6eSShiri Kuzin  */
4586add6eSShiri Kuzin 
5586add6eSShiri Kuzin #include <rte_ip.h>
6586add6eSShiri Kuzin #include <rte_common.h>
7586add6eSShiri Kuzin #include <rte_errno.h>
8586add6eSShiri Kuzin #include <rte_log.h>
9586add6eSShiri Kuzin 
10586add6eSShiri Kuzin #include <mlx5_prm.h>
11586add6eSShiri Kuzin #include <mlx5_devx_cmds.h>
12586add6eSShiri Kuzin 
13586add6eSShiri Kuzin #include "mlx5_crypto_utils.h"
14586add6eSShiri Kuzin #include "mlx5_crypto.h"
15586add6eSShiri Kuzin 
16*98fb4bb0SSuanming Mou static int
mlx5_crypto_dek_get_key(struct rte_crypto_sym_xform * xform,const uint8_t ** key,uint16_t * key_len)17*98fb4bb0SSuanming Mou mlx5_crypto_dek_get_key(struct rte_crypto_sym_xform *xform,
18*98fb4bb0SSuanming Mou 			const uint8_t **key,
19*98fb4bb0SSuanming Mou 			uint16_t *key_len)
20*98fb4bb0SSuanming Mou {
21*98fb4bb0SSuanming Mou 	if (xform->type == RTE_CRYPTO_SYM_XFORM_CIPHER) {
22*98fb4bb0SSuanming Mou 		*key = xform->cipher.key.data;
23*98fb4bb0SSuanming Mou 		*key_len = xform->cipher.key.length;
24*98fb4bb0SSuanming Mou 	} else if (xform->type == RTE_CRYPTO_SYM_XFORM_AEAD) {
25*98fb4bb0SSuanming Mou 		*key = xform->aead.key.data;
26*98fb4bb0SSuanming Mou 		*key_len = xform->aead.key.length;
27*98fb4bb0SSuanming Mou 	} else {
28*98fb4bb0SSuanming Mou 		*key = NULL;
29*98fb4bb0SSuanming Mou 		*key_len = 0;
30*98fb4bb0SSuanming Mou 		DRV_LOG(ERR, "Xform dek type not supported.");
31*98fb4bb0SSuanming Mou 		rte_errno = -EINVAL;
32*98fb4bb0SSuanming Mou 		return -1;
33*98fb4bb0SSuanming Mou 	}
34*98fb4bb0SSuanming Mou 	return 0;
35*98fb4bb0SSuanming Mou }
36586add6eSShiri Kuzin 
37586add6eSShiri Kuzin int
mlx5_crypto_dek_destroy(struct mlx5_crypto_priv * priv,struct mlx5_crypto_dek * dek)38586add6eSShiri Kuzin mlx5_crypto_dek_destroy(struct mlx5_crypto_priv *priv,
39586add6eSShiri Kuzin 			struct mlx5_crypto_dek *dek)
40586add6eSShiri Kuzin {
41586add6eSShiri Kuzin 	return mlx5_hlist_unregister(priv->dek_hlist, &dek->entry);
42586add6eSShiri Kuzin }
43586add6eSShiri Kuzin 
44586add6eSShiri Kuzin struct mlx5_crypto_dek *
mlx5_crypto_dek_prepare(struct mlx5_crypto_priv * priv,struct rte_crypto_sym_xform * xform)45586add6eSShiri Kuzin mlx5_crypto_dek_prepare(struct mlx5_crypto_priv *priv,
46*98fb4bb0SSuanming Mou 			struct rte_crypto_sym_xform *xform)
47586add6eSShiri Kuzin {
48*98fb4bb0SSuanming Mou 	const uint8_t *key;
49*98fb4bb0SSuanming Mou 	uint16_t key_len;
50586add6eSShiri Kuzin 	struct mlx5_hlist *dek_hlist = priv->dek_hlist;
51586add6eSShiri Kuzin 	struct mlx5_crypto_dek_ctx dek_ctx = {
52*98fb4bb0SSuanming Mou 		.xform = xform,
53586add6eSShiri Kuzin 		.priv = priv,
54586add6eSShiri Kuzin 	};
55*98fb4bb0SSuanming Mou 	uint64_t key64;
56*98fb4bb0SSuanming Mou 	struct mlx5_list_entry *entry;
57586add6eSShiri Kuzin 
58*98fb4bb0SSuanming Mou 	if (mlx5_crypto_dek_get_key(xform, &key, &key_len))
59*98fb4bb0SSuanming Mou 		return NULL;
60*98fb4bb0SSuanming Mou 	key64 = __rte_raw_cksum(key, key_len, 0);
61*98fb4bb0SSuanming Mou 	entry = mlx5_hlist_register(dek_hlist, key64, &dek_ctx);
62586add6eSShiri Kuzin 	return entry == NULL ? NULL :
63586add6eSShiri Kuzin 			     container_of(entry, struct mlx5_crypto_dek, entry);
64586add6eSShiri Kuzin }
65586add6eSShiri Kuzin 
66586add6eSShiri Kuzin static struct mlx5_list_entry *
mlx5_crypto_dek_clone_cb(void * tool_ctx __rte_unused,struct mlx5_list_entry * oentry,void * cb_ctx __rte_unused)67586add6eSShiri Kuzin mlx5_crypto_dek_clone_cb(void *tool_ctx __rte_unused,
68586add6eSShiri Kuzin 			 struct mlx5_list_entry *oentry,
69586add6eSShiri Kuzin 			 void *cb_ctx __rte_unused)
70586add6eSShiri Kuzin {
71586add6eSShiri Kuzin 	struct mlx5_crypto_dek *entry = rte_zmalloc(__func__, sizeof(*entry),
72586add6eSShiri Kuzin 						    RTE_CACHE_LINE_SIZE);
73586add6eSShiri Kuzin 
74586add6eSShiri Kuzin 	if (!entry) {
75586add6eSShiri Kuzin 		DRV_LOG(ERR, "Cannot allocate dek resource memory.");
76586add6eSShiri Kuzin 		rte_errno = ENOMEM;
77586add6eSShiri Kuzin 		return NULL;
78586add6eSShiri Kuzin 	}
79586add6eSShiri Kuzin 	memcpy(entry, oentry, sizeof(*entry));
80586add6eSShiri Kuzin 	return &entry->entry;
81586add6eSShiri Kuzin }
82586add6eSShiri Kuzin 
83586add6eSShiri Kuzin static void
mlx5_crypto_dek_clone_free_cb(void * tool_ctx __rte_unused,struct mlx5_list_entry * entry)84586add6eSShiri Kuzin mlx5_crypto_dek_clone_free_cb(void *tool_ctx __rte_unused,
85586add6eSShiri Kuzin 			      struct mlx5_list_entry *entry)
86586add6eSShiri Kuzin {
87586add6eSShiri Kuzin 	struct mlx5_crypto_dek *dek = container_of(entry,
88586add6eSShiri Kuzin 						struct mlx5_crypto_dek, entry);
89586add6eSShiri Kuzin 
90586add6eSShiri Kuzin 	rte_free(dek);
91586add6eSShiri Kuzin }
92586add6eSShiri Kuzin 
93586add6eSShiri Kuzin static int
mlx5_crypto_dek_match_cb(void * tool_ctx __rte_unused,struct mlx5_list_entry * entry,void * cb_ctx)94586add6eSShiri Kuzin mlx5_crypto_dek_match_cb(void *tool_ctx __rte_unused,
95586add6eSShiri Kuzin 			 struct mlx5_list_entry *entry, void *cb_ctx)
96586add6eSShiri Kuzin {
97586add6eSShiri Kuzin 	struct mlx5_crypto_dek_ctx *ctx = cb_ctx;
98*98fb4bb0SSuanming Mou 	struct rte_crypto_sym_xform *xform = ctx->xform;
99586add6eSShiri Kuzin 	struct mlx5_crypto_dek *dek =
100586add6eSShiri Kuzin 			container_of(entry, typeof(*dek), entry);
101f12c41bfSRaja Zidane 	uint32_t key_len = dek->size;
102*98fb4bb0SSuanming Mou 	uint16_t xkey_len;
103*98fb4bb0SSuanming Mou 	const uint8_t *key;
104586add6eSShiri Kuzin 
105*98fb4bb0SSuanming Mou 	if (mlx5_crypto_dek_get_key(xform, &key, &xkey_len))
106586add6eSShiri Kuzin 		return -1;
107*98fb4bb0SSuanming Mou 	if (key_len != xkey_len)
108*98fb4bb0SSuanming Mou 		return -1;
109*98fb4bb0SSuanming Mou 	return memcmp(key, dek->data, xkey_len);
110586add6eSShiri Kuzin }
111586add6eSShiri Kuzin 
112586add6eSShiri Kuzin static struct mlx5_list_entry *
mlx5_crypto_dek_create_cb(void * tool_ctx __rte_unused,void * cb_ctx)113586add6eSShiri Kuzin mlx5_crypto_dek_create_cb(void *tool_ctx __rte_unused, void *cb_ctx)
114586add6eSShiri Kuzin {
115586add6eSShiri Kuzin 	struct mlx5_crypto_dek_ctx *ctx = cb_ctx;
116*98fb4bb0SSuanming Mou 	struct rte_crypto_sym_xform *xform = ctx->xform;
117586add6eSShiri Kuzin 	struct mlx5_crypto_dek *dek = rte_zmalloc(__func__, sizeof(*dek),
118586add6eSShiri Kuzin 						  RTE_CACHE_LINE_SIZE);
119586add6eSShiri Kuzin 	struct mlx5_devx_dek_attr dek_attr = {
120e35ccf24SMichael Baum 		.pd = ctx->priv->cdev->pdn,
121586add6eSShiri Kuzin 	};
122*98fb4bb0SSuanming Mou 	int ret = -1;
123586add6eSShiri Kuzin 
124586add6eSShiri Kuzin 	if (dek == NULL) {
125586add6eSShiri Kuzin 		DRV_LOG(ERR, "Failed to allocate dek memory.");
126586add6eSShiri Kuzin 		return NULL;
127586add6eSShiri Kuzin 	}
128*98fb4bb0SSuanming Mou 	if (xform->type == RTE_CRYPTO_SYM_XFORM_CIPHER)
129*98fb4bb0SSuanming Mou 		ret = mlx5_crypto_dek_fill_xts_attr(dek, &dek_attr, cb_ctx);
130*98fb4bb0SSuanming Mou 	else if (xform->type == RTE_CRYPTO_SYM_XFORM_AEAD)
131*98fb4bb0SSuanming Mou 		ret = mlx5_crypto_dek_fill_gcm_attr(dek, &dek_attr, cb_ctx);
132*98fb4bb0SSuanming Mou 	if (ret)
133*98fb4bb0SSuanming Mou 		goto fail;
134ca1418ceSMichael Baum 	dek->obj = mlx5_devx_cmd_create_dek_obj(ctx->priv->cdev->ctx,
135ca1418ceSMichael Baum 						&dek_attr);
136586add6eSShiri Kuzin 	if (dek->obj == NULL) {
137*98fb4bb0SSuanming Mou 		DRV_LOG(ERR, "Failed to create dek obj.");
138*98fb4bb0SSuanming Mou 		goto fail;
139*98fb4bb0SSuanming Mou 	}
140*98fb4bb0SSuanming Mou 	return &dek->entry;
141*98fb4bb0SSuanming Mou fail:
142586add6eSShiri Kuzin 	rte_free(dek);
143586add6eSShiri Kuzin 	return NULL;
144586add6eSShiri Kuzin }
145*98fb4bb0SSuanming Mou 
146586add6eSShiri Kuzin 
147586add6eSShiri Kuzin static void
mlx5_crypto_dek_remove_cb(void * tool_ctx __rte_unused,struct mlx5_list_entry * entry)148586add6eSShiri Kuzin mlx5_crypto_dek_remove_cb(void *tool_ctx __rte_unused,
149586add6eSShiri Kuzin 			  struct mlx5_list_entry *entry)
150586add6eSShiri Kuzin {
151586add6eSShiri Kuzin 	struct mlx5_crypto_dek *dek =
152586add6eSShiri Kuzin 		container_of(entry, typeof(*dek), entry);
153586add6eSShiri Kuzin 
154586add6eSShiri Kuzin 	claim_zero(mlx5_devx_cmd_destroy(dek->obj));
155586add6eSShiri Kuzin 	rte_free(dek);
156586add6eSShiri Kuzin }
157586add6eSShiri Kuzin 
158586add6eSShiri Kuzin int
mlx5_crypto_dek_setup(struct mlx5_crypto_priv * priv)159586add6eSShiri Kuzin mlx5_crypto_dek_setup(struct mlx5_crypto_priv *priv)
160586add6eSShiri Kuzin {
161586add6eSShiri Kuzin 	priv->dek_hlist = mlx5_hlist_create("dek_hlist",
162586add6eSShiri Kuzin 				 MLX5_CRYPTO_DEK_HTABLE_SZ,
163586add6eSShiri Kuzin 				 0, 1, NULL, mlx5_crypto_dek_create_cb,
164586add6eSShiri Kuzin 				 mlx5_crypto_dek_match_cb,
165586add6eSShiri Kuzin 				 mlx5_crypto_dek_remove_cb,
166586add6eSShiri Kuzin 				 mlx5_crypto_dek_clone_cb,
167586add6eSShiri Kuzin 				 mlx5_crypto_dek_clone_free_cb);
168586add6eSShiri Kuzin 	if (priv->dek_hlist == NULL)
169586add6eSShiri Kuzin 		return -1;
170586add6eSShiri Kuzin 	return 0;
171586add6eSShiri Kuzin }
172586add6eSShiri Kuzin 
173586add6eSShiri Kuzin void
mlx5_crypto_dek_unset(struct mlx5_crypto_priv * priv)174586add6eSShiri Kuzin mlx5_crypto_dek_unset(struct mlx5_crypto_priv *priv)
175586add6eSShiri Kuzin {
17656faca3bSRaja Zidane 	if (priv->dek_hlist) {
177586add6eSShiri Kuzin 		mlx5_hlist_destroy(priv->dek_hlist);
178586add6eSShiri Kuzin 		priv->dek_hlist = NULL;
179586add6eSShiri Kuzin 	}
18056faca3bSRaja Zidane }
181