xref: /linux/drivers/nvme/host/auth.c (revision 55ab7e14222e5f0b0fd9f7711ca391d2924b35e3)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2020 Hannes Reinecke, SUSE Linux
4  */
5 
6 #include <linux/crc32.h>
7 #include <linux/base64.h>
8 #include <linux/prandom.h>
9 #include <linux/unaligned.h>
10 #include <crypto/dh.h>
11 #include <crypto/utils.h>
12 #include "nvme.h"
13 #include "fabrics.h"
14 #include <linux/nvme-auth.h>
15 #include <linux/nvme-keyring.h>
16 
17 #define CHAP_BUF_SIZE 4096
18 static struct kmem_cache *nvme_chap_buf_cache;
19 static mempool_t *nvme_chap_buf_pool;
20 
21 struct nvme_dhchap_queue_context {
22 	struct list_head entry;
23 	struct work_struct auth_work;
24 	struct nvme_ctrl *ctrl;
25 	struct crypto_kpp *dh_tfm;
26 	struct nvme_dhchap_key *transformed_key;
27 	void *buf;
28 	int qid;
29 	int error;
30 	u32 s1;
31 	u32 s2;
32 	bool bi_directional;
33 	bool authenticated;
34 	u16 transaction;
35 	u8 status;
36 	u8 dhgroup_id;
37 	u8 hash_id;
38 	u8 sc_c;
39 	size_t hash_len;
40 	u8 c1[NVME_AUTH_MAX_DIGEST_SIZE];
41 	u8 c2[NVME_AUTH_MAX_DIGEST_SIZE];
42 	u8 response[NVME_AUTH_MAX_DIGEST_SIZE];
43 	u8 *ctrl_key;
44 	u8 *host_key;
45 	u8 *sess_key;
46 	int ctrl_key_len;
47 	int host_key_len;
48 	int sess_key_len;
49 };
50 
51 static struct workqueue_struct *nvme_auth_wq;
52 
ctrl_max_dhchaps(struct nvme_ctrl * ctrl)53 static inline int ctrl_max_dhchaps(struct nvme_ctrl *ctrl)
54 {
55 	return ctrl->opts->nr_io_queues + ctrl->opts->nr_write_queues +
56 			ctrl->opts->nr_poll_queues + 1;
57 }
58 
nvme_auth_submit(struct nvme_ctrl * ctrl,int qid,void * data,size_t data_len,bool auth_send)59 static int nvme_auth_submit(struct nvme_ctrl *ctrl, int qid,
60 			    void *data, size_t data_len, bool auth_send)
61 {
62 	struct nvme_command cmd = {};
63 	nvme_submit_flags_t flags = NVME_SUBMIT_RETRY;
64 	struct request_queue *q = ctrl->fabrics_q;
65 	int ret;
66 
67 	if (qid != 0) {
68 		flags |= NVME_SUBMIT_NOWAIT | NVME_SUBMIT_RESERVED;
69 		q = ctrl->connect_q;
70 	}
71 
72 	cmd.auth_common.opcode = nvme_fabrics_command;
73 	cmd.auth_common.secp = NVME_AUTH_DHCHAP_PROTOCOL_IDENTIFIER;
74 	cmd.auth_common.spsp0 = 0x01;
75 	cmd.auth_common.spsp1 = 0x01;
76 	if (auth_send) {
77 		cmd.auth_send.fctype = nvme_fabrics_type_auth_send;
78 		cmd.auth_send.tl = cpu_to_le32(data_len);
79 	} else {
80 		cmd.auth_receive.fctype = nvme_fabrics_type_auth_receive;
81 		cmd.auth_receive.al = cpu_to_le32(data_len);
82 	}
83 
84 	ret = __nvme_submit_sync_cmd(q, &cmd, NULL, data, data_len,
85 				     qid == 0 ? NVME_QID_ANY : qid, flags);
86 	if (ret > 0)
87 		dev_warn(ctrl->device,
88 			"qid %d auth_send failed with status %d\n", qid, ret);
89 	else if (ret < 0)
90 		dev_err(ctrl->device,
91 			"qid %d auth_send failed with error %d\n", qid, ret);
92 	return ret;
93 }
94 
nvme_auth_receive_validate(struct nvme_ctrl * ctrl,int qid,struct nvmf_auth_dhchap_failure_data * data,u16 transaction,u8 expected_msg)95 static int nvme_auth_receive_validate(struct nvme_ctrl *ctrl, int qid,
96 		struct nvmf_auth_dhchap_failure_data *data,
97 		u16 transaction, u8 expected_msg)
98 {
99 	dev_dbg(ctrl->device, "%s: qid %d auth_type %d auth_id %x\n",
100 		__func__, qid, data->auth_type, data->auth_id);
101 
102 	if (data->auth_type == NVME_AUTH_COMMON_MESSAGES &&
103 	    data->auth_id == NVME_AUTH_DHCHAP_MESSAGE_FAILURE1) {
104 		return data->rescode_exp;
105 	}
106 	if (data->auth_type != NVME_AUTH_DHCHAP_MESSAGES ||
107 	    data->auth_id != expected_msg) {
108 		dev_warn(ctrl->device,
109 			 "qid %d invalid message %02x/%02x\n",
110 			 qid, data->auth_type, data->auth_id);
111 		return NVME_AUTH_DHCHAP_FAILURE_INCORRECT_MESSAGE;
112 	}
113 	if (le16_to_cpu(data->t_id) != transaction) {
114 		dev_warn(ctrl->device,
115 			 "qid %d invalid transaction ID %d\n",
116 			 qid, le16_to_cpu(data->t_id));
117 		return NVME_AUTH_DHCHAP_FAILURE_INCORRECT_MESSAGE;
118 	}
119 	return 0;
120 }
121 
nvme_auth_set_dhchap_negotiate_data(struct nvme_ctrl * ctrl,struct nvme_dhchap_queue_context * chap)122 static int nvme_auth_set_dhchap_negotiate_data(struct nvme_ctrl *ctrl,
123 		struct nvme_dhchap_queue_context *chap)
124 {
125 	struct nvmf_auth_dhchap_negotiate_data *data = chap->buf;
126 	size_t size = sizeof(*data) + sizeof(union nvmf_auth_protocol);
127 	u8 dh_list_offset = NVME_AUTH_DHCHAP_MAX_DH_IDS;
128 	u8 *idlist = data->auth_protocol[0].dhchap.idlist;
129 
130 	if (size > CHAP_BUF_SIZE) {
131 		chap->status = NVME_AUTH_DHCHAP_FAILURE_INCORRECT_PAYLOAD;
132 		return -EINVAL;
133 	}
134 	memset((u8 *)chap->buf, 0, size);
135 	data->auth_type = NVME_AUTH_COMMON_MESSAGES;
136 	data->auth_id = NVME_AUTH_DHCHAP_MESSAGE_NEGOTIATE;
137 	data->t_id = cpu_to_le16(chap->transaction);
138 	if (ctrl->opts->concat && chap->qid == 0) {
139 		if (ctrl->opts->tls_key)
140 			data->sc_c = NVME_AUTH_SECP_REPLACETLSPSK;
141 		else
142 			data->sc_c = NVME_AUTH_SECP_NEWTLSPSK;
143 	} else
144 		data->sc_c = NVME_AUTH_SECP_NOSC;
145 	chap->sc_c = data->sc_c;
146 	data->napd = 1;
147 	data->auth_protocol[0].dhchap.authid = NVME_AUTH_DHCHAP_AUTH_ID;
148 	data->auth_protocol[0].dhchap.halen = 3;
149 	idlist[0] = NVME_AUTH_HASH_SHA256;
150 	idlist[1] = NVME_AUTH_HASH_SHA384;
151 	idlist[2] = NVME_AUTH_HASH_SHA512;
152 	if (chap->sc_c == NVME_AUTH_SECP_NOSC)
153 		idlist[dh_list_offset++] = NVME_AUTH_DHGROUP_NULL;
154 	idlist[dh_list_offset++] = NVME_AUTH_DHGROUP_2048;
155 	idlist[dh_list_offset++] = NVME_AUTH_DHGROUP_3072;
156 	idlist[dh_list_offset++] = NVME_AUTH_DHGROUP_4096;
157 	idlist[dh_list_offset++] = NVME_AUTH_DHGROUP_6144;
158 	idlist[dh_list_offset++] = NVME_AUTH_DHGROUP_8192;
159 	data->auth_protocol[0].dhchap.dhlen =
160 		dh_list_offset - NVME_AUTH_DHCHAP_MAX_DH_IDS;
161 
162 	return size;
163 }
164 
nvme_auth_process_dhchap_challenge(struct nvme_ctrl * ctrl,struct nvme_dhchap_queue_context * chap)165 static int nvme_auth_process_dhchap_challenge(struct nvme_ctrl *ctrl,
166 		struct nvme_dhchap_queue_context *chap)
167 {
168 	struct nvmf_auth_dhchap_challenge_data *data = chap->buf;
169 	u16 dhvlen = le16_to_cpu(data->dhvlen);
170 	size_t size = sizeof(*data) + data->hl + dhvlen;
171 	const char *gid_name = nvme_auth_dhgroup_name(data->dhgid);
172 	const char *hmac_name, *kpp_name;
173 
174 	if (size > CHAP_BUF_SIZE) {
175 		chap->status = NVME_AUTH_DHCHAP_FAILURE_INCORRECT_PAYLOAD;
176 		return -EINVAL;
177 	}
178 
179 	hmac_name = nvme_auth_hmac_name(data->hashid);
180 	if (!hmac_name) {
181 		dev_warn(ctrl->device,
182 			 "qid %d: invalid HASH ID %d\n",
183 			 chap->qid, data->hashid);
184 		chap->status = NVME_AUTH_DHCHAP_FAILURE_HASH_UNUSABLE;
185 		return -EPROTO;
186 	}
187 
188 	if (chap->hash_id == data->hashid && chap->hash_len == data->hl) {
189 		dev_dbg(ctrl->device,
190 			"qid %d: reuse existing hash %s\n",
191 			chap->qid, hmac_name);
192 		goto select_kpp;
193 	}
194 
195 	if (nvme_auth_hmac_hash_len(data->hashid) != data->hl) {
196 		dev_warn(ctrl->device,
197 			 "qid %d: invalid hash length %d\n",
198 			 chap->qid, data->hl);
199 		chap->status = NVME_AUTH_DHCHAP_FAILURE_HASH_UNUSABLE;
200 		return -EPROTO;
201 	}
202 
203 	chap->hash_id = data->hashid;
204 	chap->hash_len = data->hl;
205 	dev_dbg(ctrl->device, "qid %d: selected hash %s\n",
206 		chap->qid, hmac_name);
207 
208 select_kpp:
209 	kpp_name = nvme_auth_dhgroup_kpp(data->dhgid);
210 	if (!kpp_name) {
211 		dev_warn(ctrl->device,
212 			 "qid %d: invalid DH group id %d\n",
213 			 chap->qid, data->dhgid);
214 		chap->status = NVME_AUTH_DHCHAP_FAILURE_DHGROUP_UNUSABLE;
215 		/* Leave previous dh_tfm intact */
216 		return -EPROTO;
217 	}
218 
219 	if (chap->dhgroup_id == data->dhgid &&
220 	    (data->dhgid == NVME_AUTH_DHGROUP_NULL || chap->dh_tfm)) {
221 		dev_dbg(ctrl->device,
222 			"qid %d: reuse existing DH group %s\n",
223 			chap->qid, gid_name);
224 		goto skip_kpp;
225 	}
226 
227 	/* Reset dh_tfm if it can't be reused */
228 	if (chap->dh_tfm) {
229 		crypto_free_kpp(chap->dh_tfm);
230 		chap->dh_tfm = NULL;
231 	}
232 
233 	if (data->dhgid != NVME_AUTH_DHGROUP_NULL) {
234 		if (dhvlen == 0) {
235 			dev_warn(ctrl->device,
236 				 "qid %d: empty DH value\n",
237 				 chap->qid);
238 			chap->status = NVME_AUTH_DHCHAP_FAILURE_DHGROUP_UNUSABLE;
239 			return -EPROTO;
240 		}
241 
242 		chap->dh_tfm = crypto_alloc_kpp(kpp_name, 0, 0);
243 		if (IS_ERR(chap->dh_tfm)) {
244 			int ret = PTR_ERR(chap->dh_tfm);
245 
246 			dev_warn(ctrl->device,
247 				 "qid %d: error %d initializing DH group %s\n",
248 				 chap->qid, ret, gid_name);
249 			chap->status = NVME_AUTH_DHCHAP_FAILURE_DHGROUP_UNUSABLE;
250 			chap->dh_tfm = NULL;
251 			return ret;
252 		}
253 		dev_dbg(ctrl->device, "qid %d: selected DH group %s\n",
254 			chap->qid, gid_name);
255 	} else if (dhvlen != 0) {
256 		dev_warn(ctrl->device,
257 			 "qid %d: invalid DH value for NULL DH\n",
258 			 chap->qid);
259 		chap->status = NVME_AUTH_DHCHAP_FAILURE_INCORRECT_PAYLOAD;
260 		return -EPROTO;
261 	}
262 	chap->dhgroup_id = data->dhgid;
263 
264 skip_kpp:
265 	chap->s1 = le32_to_cpu(data->seqnum);
266 	memcpy(chap->c1, data->cval, chap->hash_len);
267 	if (dhvlen) {
268 		chap->ctrl_key = kmalloc(dhvlen, GFP_KERNEL);
269 		if (!chap->ctrl_key) {
270 			chap->status = NVME_AUTH_DHCHAP_FAILURE_FAILED;
271 			return -ENOMEM;
272 		}
273 		chap->ctrl_key_len = dhvlen;
274 		memcpy(chap->ctrl_key, data->cval + chap->hash_len,
275 		       dhvlen);
276 		dev_dbg(ctrl->device, "ctrl public key %*ph\n",
277 			 (int)chap->ctrl_key_len, chap->ctrl_key);
278 	}
279 
280 	return 0;
281 }
282 
nvme_auth_set_dhchap_reply_data(struct nvme_ctrl * ctrl,struct nvme_dhchap_queue_context * chap)283 static int nvme_auth_set_dhchap_reply_data(struct nvme_ctrl *ctrl,
284 		struct nvme_dhchap_queue_context *chap)
285 {
286 	struct nvmf_auth_dhchap_reply_data *data = chap->buf;
287 	size_t size = sizeof(*data);
288 
289 	size += 2 * chap->hash_len;
290 
291 	if (chap->host_key_len)
292 		size += chap->host_key_len;
293 
294 	if (size > CHAP_BUF_SIZE) {
295 		chap->status = NVME_AUTH_DHCHAP_FAILURE_INCORRECT_PAYLOAD;
296 		return -EINVAL;
297 	}
298 
299 	memset(chap->buf, 0, size);
300 	data->auth_type = NVME_AUTH_DHCHAP_MESSAGES;
301 	data->auth_id = NVME_AUTH_DHCHAP_MESSAGE_REPLY;
302 	data->t_id = cpu_to_le16(chap->transaction);
303 	data->hl = chap->hash_len;
304 	data->dhvlen = cpu_to_le16(chap->host_key_len);
305 	memcpy(data->rval, chap->response, chap->hash_len);
306 	if (ctrl->ctrl_key)
307 		chap->bi_directional = true;
308 	if (ctrl->ctrl_key || ctrl->opts->concat) {
309 		get_random_bytes(chap->c2, chap->hash_len);
310 		data->cvalid = 1;
311 		memcpy(data->rval + chap->hash_len, chap->c2,
312 		       chap->hash_len);
313 		dev_dbg(ctrl->device, "%s: qid %d ctrl challenge %*ph\n",
314 			__func__, chap->qid, (int)chap->hash_len, chap->c2);
315 	} else {
316 		memset(chap->c2, 0, chap->hash_len);
317 	}
318 	if (ctrl->opts->concat) {
319 		chap->s2 = 0;
320 		chap->bi_directional = false;
321 	} else
322 		chap->s2 = nvme_auth_get_seqnum();
323 	data->seqnum = cpu_to_le32(chap->s2);
324 	if (chap->host_key_len) {
325 		dev_dbg(ctrl->device, "%s: qid %d host public key %*ph\n",
326 			__func__, chap->qid,
327 			chap->host_key_len, chap->host_key);
328 		memcpy(data->rval + 2 * chap->hash_len, chap->host_key,
329 		       chap->host_key_len);
330 	}
331 
332 	return size;
333 }
334 
nvme_auth_process_dhchap_success1(struct nvme_ctrl * ctrl,struct nvme_dhchap_queue_context * chap)335 static int nvme_auth_process_dhchap_success1(struct nvme_ctrl *ctrl,
336 		struct nvme_dhchap_queue_context *chap)
337 {
338 	struct nvmf_auth_dhchap_success1_data *data = chap->buf;
339 	size_t size = sizeof(*data) + chap->hash_len;
340 
341 	if (size > CHAP_BUF_SIZE) {
342 		chap->status = NVME_AUTH_DHCHAP_FAILURE_INCORRECT_PAYLOAD;
343 		return -EINVAL;
344 	}
345 
346 	if (data->hl != chap->hash_len) {
347 		dev_warn(ctrl->device,
348 			 "qid %d: invalid hash length %u\n",
349 			 chap->qid, data->hl);
350 		chap->status = NVME_AUTH_DHCHAP_FAILURE_HASH_UNUSABLE;
351 		return -EPROTO;
352 	}
353 
354 	/* Just print out information for the admin queue */
355 	if (chap->qid == 0)
356 		dev_info(ctrl->device,
357 			 "qid 0: authenticated with hash %s dhgroup %s\n",
358 			 nvme_auth_hmac_name(chap->hash_id),
359 			 nvme_auth_dhgroup_name(chap->dhgroup_id));
360 
361 	if (!data->rvalid)
362 		return 0;
363 
364 	/* Validate controller response */
365 	if (crypto_memneq(chap->response, data->rval, data->hl)) {
366 		dev_dbg(ctrl->device, "%s: qid %d ctrl response %*ph\n",
367 			__func__, chap->qid, (int)chap->hash_len, data->rval);
368 		dev_dbg(ctrl->device, "%s: qid %d host response %*ph\n",
369 			__func__, chap->qid, (int)chap->hash_len,
370 			chap->response);
371 		dev_warn(ctrl->device,
372 			 "qid %d: controller authentication failed\n",
373 			 chap->qid);
374 		chap->status = NVME_AUTH_DHCHAP_FAILURE_FAILED;
375 		return -ECONNREFUSED;
376 	}
377 
378 	/* Just print out information for the admin queue */
379 	if (chap->qid == 0)
380 		dev_info(ctrl->device,
381 			 "qid 0: controller authenticated\n");
382 	return 0;
383 }
384 
nvme_auth_set_dhchap_success2_data(struct nvme_ctrl * ctrl,struct nvme_dhchap_queue_context * chap)385 static int nvme_auth_set_dhchap_success2_data(struct nvme_ctrl *ctrl,
386 		struct nvme_dhchap_queue_context *chap)
387 {
388 	struct nvmf_auth_dhchap_success2_data *data = chap->buf;
389 	size_t size = sizeof(*data);
390 
391 	memset(chap->buf, 0, size);
392 	data->auth_type = NVME_AUTH_DHCHAP_MESSAGES;
393 	data->auth_id = NVME_AUTH_DHCHAP_MESSAGE_SUCCESS2;
394 	data->t_id = cpu_to_le16(chap->transaction);
395 
396 	return size;
397 }
398 
nvme_auth_set_dhchap_failure2_data(struct nvme_ctrl * ctrl,struct nvme_dhchap_queue_context * chap)399 static int nvme_auth_set_dhchap_failure2_data(struct nvme_ctrl *ctrl,
400 		struct nvme_dhchap_queue_context *chap)
401 {
402 	struct nvmf_auth_dhchap_failure_data *data = chap->buf;
403 	size_t size = sizeof(*data);
404 
405 	memset(chap->buf, 0, size);
406 	data->auth_type = NVME_AUTH_COMMON_MESSAGES;
407 	data->auth_id = NVME_AUTH_DHCHAP_MESSAGE_FAILURE2;
408 	data->t_id = cpu_to_le16(chap->transaction);
409 	data->rescode = NVME_AUTH_DHCHAP_FAILURE_REASON_FAILED;
410 	data->rescode_exp = chap->status;
411 
412 	return size;
413 }
414 
nvme_auth_dhchap_setup_host_response(struct nvme_ctrl * ctrl,struct nvme_dhchap_queue_context * chap)415 static int nvme_auth_dhchap_setup_host_response(struct nvme_ctrl *ctrl,
416 		struct nvme_dhchap_queue_context *chap)
417 {
418 	struct nvme_auth_hmac_ctx hmac;
419 	u8 buf[4], *challenge = chap->c1;
420 	int ret;
421 
422 	dev_dbg(ctrl->device, "%s: qid %d host response seq %u transaction %d\n",
423 		__func__, chap->qid, chap->s1, chap->transaction);
424 
425 	if (!chap->transformed_key) {
426 		chap->transformed_key = nvme_auth_transform_key(ctrl->host_key,
427 						ctrl->opts->host->nqn);
428 		if (IS_ERR(chap->transformed_key)) {
429 			ret = PTR_ERR(chap->transformed_key);
430 			chap->transformed_key = NULL;
431 			return ret;
432 		}
433 	} else {
434 		dev_dbg(ctrl->device, "%s: qid %d re-using host response\n",
435 			__func__, chap->qid);
436 	}
437 
438 	ret = nvme_auth_hmac_init(&hmac, chap->hash_id,
439 				  chap->transformed_key->key,
440 				  chap->transformed_key->len);
441 	if (ret)
442 		goto out;
443 
444 	if (chap->dh_tfm) {
445 		challenge = kmalloc(chap->hash_len, GFP_KERNEL);
446 		if (!challenge) {
447 			ret = -ENOMEM;
448 			goto out;
449 		}
450 		ret = nvme_auth_augmented_challenge(chap->hash_id,
451 						    chap->sess_key,
452 						    chap->sess_key_len,
453 						    chap->c1, challenge,
454 						    chap->hash_len);
455 		if (ret)
456 			goto out;
457 	}
458 
459 	nvme_auth_hmac_update(&hmac, challenge, chap->hash_len);
460 
461 	put_unaligned_le32(chap->s1, buf);
462 	nvme_auth_hmac_update(&hmac, buf, 4);
463 
464 	put_unaligned_le16(chap->transaction, buf);
465 	nvme_auth_hmac_update(&hmac, buf, 2);
466 
467 	*buf = chap->sc_c;
468 	nvme_auth_hmac_update(&hmac, buf, 1);
469 	nvme_auth_hmac_update(&hmac, "HostHost", 8);
470 	nvme_auth_hmac_update(&hmac, ctrl->opts->host->nqn,
471 			      strlen(ctrl->opts->host->nqn));
472 	memset(buf, 0, sizeof(buf));
473 	nvme_auth_hmac_update(&hmac, buf, 1);
474 	nvme_auth_hmac_update(&hmac, ctrl->opts->subsysnqn,
475 			      strlen(ctrl->opts->subsysnqn));
476 	nvme_auth_hmac_final(&hmac, chap->response);
477 	ret = 0;
478 out:
479 	if (challenge != chap->c1)
480 		kfree(challenge);
481 	memzero_explicit(&hmac, sizeof(hmac));
482 	return ret;
483 }
484 
nvme_auth_dhchap_setup_ctrl_response(struct nvme_ctrl * ctrl,struct nvme_dhchap_queue_context * chap)485 static int nvme_auth_dhchap_setup_ctrl_response(struct nvme_ctrl *ctrl,
486 		struct nvme_dhchap_queue_context *chap)
487 {
488 	struct nvme_auth_hmac_ctx hmac;
489 	struct nvme_dhchap_key *transformed_key;
490 	u8 buf[4], *challenge = chap->c2;
491 	int ret;
492 
493 	transformed_key = nvme_auth_transform_key(ctrl->ctrl_key,
494 				ctrl->opts->subsysnqn);
495 	if (IS_ERR(transformed_key)) {
496 		ret = PTR_ERR(transformed_key);
497 		return ret;
498 	}
499 
500 	ret = nvme_auth_hmac_init(&hmac, chap->hash_id, transformed_key->key,
501 				  transformed_key->len);
502 	if (ret) {
503 		dev_warn(ctrl->device, "qid %d: failed to init hmac, error %d\n",
504 			 chap->qid, ret);
505 		goto out;
506 	}
507 
508 	if (chap->dh_tfm) {
509 		challenge = kmalloc(chap->hash_len, GFP_KERNEL);
510 		if (!challenge) {
511 			ret = -ENOMEM;
512 			goto out;
513 		}
514 		ret = nvme_auth_augmented_challenge(chap->hash_id,
515 						    chap->sess_key,
516 						    chap->sess_key_len,
517 						    chap->c2, challenge,
518 						    chap->hash_len);
519 		if (ret)
520 			goto out;
521 	}
522 	dev_dbg(ctrl->device, "%s: qid %d ctrl response seq %u transaction %d\n",
523 		__func__, chap->qid, chap->s2, chap->transaction);
524 	dev_dbg(ctrl->device, "%s: qid %d challenge %*ph\n",
525 		__func__, chap->qid, (int)chap->hash_len, challenge);
526 	dev_dbg(ctrl->device, "%s: qid %d subsysnqn %s\n",
527 		__func__, chap->qid, ctrl->opts->subsysnqn);
528 	dev_dbg(ctrl->device, "%s: qid %d hostnqn %s\n",
529 		__func__, chap->qid, ctrl->opts->host->nqn);
530 
531 	nvme_auth_hmac_update(&hmac, challenge, chap->hash_len);
532 
533 	put_unaligned_le32(chap->s2, buf);
534 	nvme_auth_hmac_update(&hmac, buf, 4);
535 
536 	put_unaligned_le16(chap->transaction, buf);
537 	nvme_auth_hmac_update(&hmac, buf, 2);
538 
539 	*buf = chap->sc_c;
540 	nvme_auth_hmac_update(&hmac, buf, 1);
541 	nvme_auth_hmac_update(&hmac, "Controller", 10);
542 	nvme_auth_hmac_update(&hmac, ctrl->opts->subsysnqn,
543 			      strlen(ctrl->opts->subsysnqn));
544 	memset(buf, 0, 4);
545 	nvme_auth_hmac_update(&hmac, buf, 1);
546 	nvme_auth_hmac_update(&hmac, ctrl->opts->host->nqn,
547 			      strlen(ctrl->opts->host->nqn));
548 	nvme_auth_hmac_final(&hmac, chap->response);
549 	ret = 0;
550 out:
551 	if (challenge != chap->c2)
552 		kfree(challenge);
553 	memzero_explicit(&hmac, sizeof(hmac));
554 	nvme_auth_free_key(transformed_key);
555 	return ret;
556 }
557 
nvme_auth_dhchap_exponential(struct nvme_ctrl * ctrl,struct nvme_dhchap_queue_context * chap)558 static int nvme_auth_dhchap_exponential(struct nvme_ctrl *ctrl,
559 		struct nvme_dhchap_queue_context *chap)
560 {
561 	int ret;
562 
563 	if (chap->host_key && chap->host_key_len) {
564 		dev_dbg(ctrl->device,
565 			"qid %d: reusing host key\n", chap->qid);
566 		goto gen_sesskey;
567 	}
568 	ret = nvme_auth_gen_privkey(chap->dh_tfm, chap->dhgroup_id);
569 	if (ret < 0) {
570 		chap->status = NVME_AUTH_DHCHAP_FAILURE_INCORRECT_PAYLOAD;
571 		return ret;
572 	}
573 
574 	chap->host_key_len = crypto_kpp_maxsize(chap->dh_tfm);
575 
576 	chap->host_key = kzalloc(chap->host_key_len, GFP_KERNEL);
577 	if (!chap->host_key) {
578 		chap->host_key_len = 0;
579 		chap->status = NVME_AUTH_DHCHAP_FAILURE_FAILED;
580 		return -ENOMEM;
581 	}
582 	ret = nvme_auth_gen_pubkey(chap->dh_tfm,
583 				   chap->host_key, chap->host_key_len);
584 	if (ret) {
585 		dev_dbg(ctrl->device,
586 			"failed to generate public key, error %d\n", ret);
587 		chap->status = NVME_AUTH_DHCHAP_FAILURE_INCORRECT_PAYLOAD;
588 		return ret;
589 	}
590 
591 gen_sesskey:
592 	chap->sess_key_len = chap->hash_len;
593 	chap->sess_key = kmalloc(chap->sess_key_len, GFP_KERNEL);
594 	if (!chap->sess_key) {
595 		chap->sess_key_len = 0;
596 		chap->status = NVME_AUTH_DHCHAP_FAILURE_FAILED;
597 		return -ENOMEM;
598 	}
599 
600 	ret = nvme_auth_gen_session_key(chap->dh_tfm,
601 					chap->ctrl_key, chap->ctrl_key_len,
602 					chap->sess_key, chap->sess_key_len,
603 					chap->hash_id);
604 	if (ret) {
605 		dev_dbg(ctrl->device,
606 			"failed to generate session key, error %d\n", ret);
607 		chap->status = NVME_AUTH_DHCHAP_FAILURE_INCORRECT_PAYLOAD;
608 		return ret;
609 	}
610 	dev_dbg(ctrl->device, "session key %*ph\n",
611 		(int)chap->sess_key_len, chap->sess_key);
612 	return 0;
613 }
614 
nvme_auth_reset_dhchap(struct nvme_dhchap_queue_context * chap)615 static void nvme_auth_reset_dhchap(struct nvme_dhchap_queue_context *chap)
616 {
617 	nvme_auth_free_key(chap->transformed_key);
618 	chap->transformed_key = NULL;
619 	kfree_sensitive(chap->host_key);
620 	chap->host_key = NULL;
621 	chap->host_key_len = 0;
622 	kfree_sensitive(chap->ctrl_key);
623 	chap->ctrl_key = NULL;
624 	chap->ctrl_key_len = 0;
625 	kfree_sensitive(chap->sess_key);
626 	chap->sess_key = NULL;
627 	chap->sess_key_len = 0;
628 	chap->status = 0;
629 	chap->error = 0;
630 	chap->s1 = 0;
631 	chap->s2 = 0;
632 	chap->bi_directional = false;
633 	chap->transaction = 0;
634 	memset(chap->c1, 0, sizeof(chap->c1));
635 	memset(chap->c2, 0, sizeof(chap->c2));
636 	mempool_free(chap->buf, nvme_chap_buf_pool);
637 	chap->buf = NULL;
638 }
639 
nvme_auth_free_dhchap(struct nvme_dhchap_queue_context * chap)640 static void nvme_auth_free_dhchap(struct nvme_dhchap_queue_context *chap)
641 {
642 	nvme_auth_reset_dhchap(chap);
643 	chap->authenticated = false;
644 	if (chap->dh_tfm)
645 		crypto_free_kpp(chap->dh_tfm);
646 }
647 
nvme_auth_revoke_tls_key(struct nvme_ctrl * ctrl)648 void nvme_auth_revoke_tls_key(struct nvme_ctrl *ctrl)
649 {
650 	dev_dbg(ctrl->device, "Wipe generated TLS PSK %08x\n",
651 		key_serial(ctrl->opts->tls_key));
652 	key_revoke(ctrl->opts->tls_key);
653 	key_put(ctrl->opts->tls_key);
654 	ctrl->opts->tls_key = NULL;
655 }
656 EXPORT_SYMBOL_GPL(nvme_auth_revoke_tls_key);
657 
nvme_auth_secure_concat(struct nvme_ctrl * ctrl,struct nvme_dhchap_queue_context * chap)658 static int nvme_auth_secure_concat(struct nvme_ctrl *ctrl,
659 				   struct nvme_dhchap_queue_context *chap)
660 {
661 	u8 *psk, *tls_psk;
662 	char *digest;
663 	struct key *tls_key;
664 	size_t psk_len;
665 	int ret = 0;
666 
667 	if (!chap->sess_key) {
668 		dev_warn(ctrl->device,
669 			 "%s: qid %d no session key negotiated\n",
670 			 __func__, chap->qid);
671 		return -ENOKEY;
672 	}
673 
674 	if (chap->qid) {
675 		dev_warn(ctrl->device,
676 			 "qid %d: secure concatenation not supported on I/O queues\n",
677 			 chap->qid);
678 		return -EINVAL;
679 	}
680 	ret = nvme_auth_generate_psk(chap->hash_id, chap->sess_key,
681 				     chap->sess_key_len,
682 				     chap->c1, chap->c2,
683 				     chap->hash_len, &psk, &psk_len);
684 	if (ret) {
685 		dev_warn(ctrl->device,
686 			 "%s: qid %d failed to generate PSK, error %d\n",
687 			 __func__, chap->qid, ret);
688 		return ret;
689 	}
690 	dev_dbg(ctrl->device,
691 		  "%s: generated psk %*ph\n", __func__, (int)psk_len, psk);
692 
693 	ret = nvme_auth_generate_digest(chap->hash_id, psk, psk_len,
694 					ctrl->opts->subsysnqn,
695 					ctrl->opts->host->nqn, &digest);
696 	if (ret) {
697 		dev_warn(ctrl->device,
698 			 "%s: qid %d failed to generate digest, error %d\n",
699 			 __func__, chap->qid, ret);
700 		goto out_free_psk;
701 	}
702 	dev_dbg(ctrl->device, "%s: generated digest %s\n",
703 		 __func__, digest);
704 	ret = nvme_auth_derive_tls_psk(chap->hash_id, psk, psk_len,
705 				       digest, &tls_psk);
706 	if (ret) {
707 		dev_warn(ctrl->device,
708 			 "%s: qid %d failed to derive TLS psk, error %d\n",
709 			 __func__, chap->qid, ret);
710 		goto out_free_digest;
711 	}
712 
713 	tls_key = nvme_tls_psk_refresh(ctrl->opts->keyring,
714 				       ctrl->opts->host->nqn,
715 				       ctrl->opts->subsysnqn, chap->hash_id,
716 				       tls_psk, psk_len, digest);
717 	if (IS_ERR(tls_key)) {
718 		ret = PTR_ERR(tls_key);
719 		dev_warn(ctrl->device,
720 			 "%s: qid %d failed to insert generated key, error %d\n",
721 			 __func__, chap->qid, ret);
722 		tls_key = NULL;
723 	}
724 	kfree_sensitive(tls_psk);
725 	if (ctrl->opts->tls_key)
726 		nvme_auth_revoke_tls_key(ctrl);
727 	ctrl->opts->tls_key = tls_key;
728 out_free_digest:
729 	kfree_sensitive(digest);
730 out_free_psk:
731 	kfree_sensitive(psk);
732 	return ret;
733 }
734 
nvme_queue_auth_work(struct work_struct * work)735 static void nvme_queue_auth_work(struct work_struct *work)
736 {
737 	struct nvme_dhchap_queue_context *chap =
738 		container_of(work, struct nvme_dhchap_queue_context, auth_work);
739 	struct nvme_ctrl *ctrl = chap->ctrl;
740 	size_t tl;
741 	int ret = 0;
742 
743 	/*
744 	 * Allocate a large enough buffer for the entire negotiation:
745 	 * 4k is enough to ffdhe8192.
746 	 */
747 	chap->buf = mempool_alloc(nvme_chap_buf_pool, GFP_KERNEL);
748 	if (!chap->buf) {
749 		chap->error = -ENOMEM;
750 		return;
751 	}
752 
753 	chap->transaction = ctrl->transaction++;
754 
755 	/* DH-HMAC-CHAP Step 1: send negotiate */
756 	dev_dbg(ctrl->device, "%s: qid %d send negotiate\n",
757 		__func__, chap->qid);
758 	ret = nvme_auth_set_dhchap_negotiate_data(ctrl, chap);
759 	if (ret < 0) {
760 		chap->error = ret;
761 		return;
762 	}
763 	tl = ret;
764 	ret = nvme_auth_submit(ctrl, chap->qid, chap->buf, tl, true);
765 	if (ret) {
766 		chap->error = ret;
767 		return;
768 	}
769 
770 	/* DH-HMAC-CHAP Step 2: receive challenge */
771 	dev_dbg(ctrl->device, "%s: qid %d receive challenge\n",
772 		__func__, chap->qid);
773 
774 	memset(chap->buf, 0, CHAP_BUF_SIZE);
775 	ret = nvme_auth_submit(ctrl, chap->qid, chap->buf, CHAP_BUF_SIZE,
776 			       false);
777 	if (ret) {
778 		dev_warn(ctrl->device,
779 			 "qid %d failed to receive challenge, %s %d\n",
780 			 chap->qid, ret < 0 ? "error" : "nvme status", ret);
781 		chap->error = ret;
782 		return;
783 	}
784 	ret = nvme_auth_receive_validate(ctrl, chap->qid, chap->buf, chap->transaction,
785 					 NVME_AUTH_DHCHAP_MESSAGE_CHALLENGE);
786 	if (ret) {
787 		chap->status = ret;
788 		chap->error = -EKEYREJECTED;
789 		return;
790 	}
791 
792 	ret = nvme_auth_process_dhchap_challenge(ctrl, chap);
793 	if (ret) {
794 		/* Invalid challenge parameters */
795 		chap->error = ret;
796 		goto fail2;
797 	}
798 
799 	if (chap->ctrl_key_len) {
800 		dev_dbg(ctrl->device,
801 			"%s: qid %d DH exponential\n",
802 			__func__, chap->qid);
803 		ret = nvme_auth_dhchap_exponential(ctrl, chap);
804 		if (ret) {
805 			chap->error = ret;
806 			goto fail2;
807 		}
808 	}
809 
810 	dev_dbg(ctrl->device, "%s: qid %d host response\n",
811 		__func__, chap->qid);
812 	mutex_lock(&ctrl->dhchap_auth_mutex);
813 	ret = nvme_auth_dhchap_setup_host_response(ctrl, chap);
814 	mutex_unlock(&ctrl->dhchap_auth_mutex);
815 	if (ret) {
816 		chap->error = ret;
817 		goto fail2;
818 	}
819 
820 	/* DH-HMAC-CHAP Step 3: send reply */
821 	dev_dbg(ctrl->device, "%s: qid %d send reply\n",
822 		__func__, chap->qid);
823 	ret = nvme_auth_set_dhchap_reply_data(ctrl, chap);
824 	if (ret < 0) {
825 		chap->error = ret;
826 		goto fail2;
827 	}
828 
829 	tl = ret;
830 	ret = nvme_auth_submit(ctrl, chap->qid, chap->buf, tl, true);
831 	if (ret) {
832 		chap->error = ret;
833 		goto fail2;
834 	}
835 
836 	/* DH-HMAC-CHAP Step 4: receive success1 */
837 	dev_dbg(ctrl->device, "%s: qid %d receive success1\n",
838 		__func__, chap->qid);
839 
840 	memset(chap->buf, 0, CHAP_BUF_SIZE);
841 	ret = nvme_auth_submit(ctrl, chap->qid, chap->buf, CHAP_BUF_SIZE,
842 			       false);
843 	if (ret) {
844 		dev_warn(ctrl->device,
845 			 "qid %d failed to receive success1, %s %d\n",
846 			 chap->qid, ret < 0 ? "error" : "nvme status", ret);
847 		chap->error = ret;
848 		return;
849 	}
850 	ret = nvme_auth_receive_validate(ctrl, chap->qid,
851 					 chap->buf, chap->transaction,
852 					 NVME_AUTH_DHCHAP_MESSAGE_SUCCESS1);
853 	if (ret) {
854 		chap->status = ret;
855 		chap->error = -EKEYREJECTED;
856 		return;
857 	}
858 
859 	mutex_lock(&ctrl->dhchap_auth_mutex);
860 	if (ctrl->ctrl_key) {
861 		dev_dbg(ctrl->device,
862 			"%s: qid %d controller response\n",
863 			__func__, chap->qid);
864 		ret = nvme_auth_dhchap_setup_ctrl_response(ctrl, chap);
865 		if (ret) {
866 			mutex_unlock(&ctrl->dhchap_auth_mutex);
867 			chap->error = ret;
868 			goto fail2;
869 		}
870 	}
871 	mutex_unlock(&ctrl->dhchap_auth_mutex);
872 
873 	ret = nvme_auth_process_dhchap_success1(ctrl, chap);
874 	if (ret) {
875 		/* Controller authentication failed */
876 		chap->error = -EKEYREJECTED;
877 		goto fail2;
878 	}
879 
880 	if (chap->bi_directional) {
881 		/* DH-HMAC-CHAP Step 5: send success2 */
882 		dev_dbg(ctrl->device, "%s: qid %d send success2\n",
883 			__func__, chap->qid);
884 		tl = nvme_auth_set_dhchap_success2_data(ctrl, chap);
885 		ret = nvme_auth_submit(ctrl, chap->qid, chap->buf, tl, true);
886 		if (ret)
887 			chap->error = ret;
888 	}
889 	if (!ret) {
890 		chap->error = 0;
891 		chap->authenticated = true;
892 		if (ctrl->opts->concat &&
893 		    (ret = nvme_auth_secure_concat(ctrl, chap))) {
894 			dev_warn(ctrl->device,
895 				 "%s: qid %d failed to enable secure concatenation\n",
896 				 __func__, chap->qid);
897 			chap->error = ret;
898 			chap->authenticated = false;
899 		}
900 		return;
901 	}
902 
903 fail2:
904 	if (chap->status == 0)
905 		chap->status = NVME_AUTH_DHCHAP_FAILURE_FAILED;
906 	dev_dbg(ctrl->device, "%s: qid %d send failure2, status %x\n",
907 		__func__, chap->qid, chap->status);
908 	tl = nvme_auth_set_dhchap_failure2_data(ctrl, chap);
909 	ret = nvme_auth_submit(ctrl, chap->qid, chap->buf, tl, true);
910 	/*
911 	 * only update error if send failure2 failed and no other
912 	 * error had been set during authentication.
913 	 */
914 	if (ret && !chap->error)
915 		chap->error = ret;
916 }
917 
nvme_auth_negotiate(struct nvme_ctrl * ctrl,int qid)918 int nvme_auth_negotiate(struct nvme_ctrl *ctrl, int qid)
919 {
920 	struct nvme_dhchap_queue_context *chap;
921 
922 	if (!ctrl->host_key) {
923 		dev_warn(ctrl->device, "qid %d: no key\n", qid);
924 		return -ENOKEY;
925 	}
926 
927 	if (ctrl->opts->dhchap_ctrl_secret && !ctrl->ctrl_key) {
928 		dev_warn(ctrl->device, "qid %d: invalid ctrl key\n", qid);
929 		return -ENOKEY;
930 	}
931 
932 	chap = &ctrl->dhchap_ctxs[qid];
933 	cancel_work_sync(&chap->auth_work);
934 	queue_work(nvme_auth_wq, &chap->auth_work);
935 	return 0;
936 }
937 EXPORT_SYMBOL_GPL(nvme_auth_negotiate);
938 
nvme_auth_wait(struct nvme_ctrl * ctrl,int qid)939 int nvme_auth_wait(struct nvme_ctrl *ctrl, int qid)
940 {
941 	struct nvme_dhchap_queue_context *chap;
942 	int ret;
943 
944 	chap = &ctrl->dhchap_ctxs[qid];
945 	flush_work(&chap->auth_work);
946 	ret = chap->error;
947 	/* clear sensitive info */
948 	nvme_auth_reset_dhchap(chap);
949 	return ret;
950 }
951 EXPORT_SYMBOL_GPL(nvme_auth_wait);
952 
nvme_ctrl_auth_work(struct work_struct * work)953 static void nvme_ctrl_auth_work(struct work_struct *work)
954 {
955 	struct nvme_ctrl *ctrl =
956 		container_of(work, struct nvme_ctrl, dhchap_auth_work);
957 	int ret, q;
958 
959 	/*
960 	 * If the ctrl is no connected, bail as reconnect will handle
961 	 * authentication.
962 	 */
963 	if (nvme_ctrl_state(ctrl) != NVME_CTRL_LIVE)
964 		return;
965 
966 	/* Authenticate admin queue first */
967 	ret = nvme_auth_negotiate(ctrl, 0);
968 	if (ret) {
969 		dev_warn(ctrl->device,
970 			 "qid 0: error %d setting up authentication\n", ret);
971 		return;
972 	}
973 	ret = nvme_auth_wait(ctrl, 0);
974 	if (ret) {
975 		dev_warn(ctrl->device,
976 			 "qid 0: authentication failed\n");
977 		return;
978 	}
979 	/*
980 	 * Only run authentication on the admin queue for secure concatenation.
981 	 */
982 	if (ctrl->opts->concat)
983 		return;
984 
985 	for (q = 1; q < ctrl->queue_count; q++) {
986 		struct nvme_dhchap_queue_context *chap =
987 			&ctrl->dhchap_ctxs[q];
988 		/*
989 		 * Skip re-authentication if the queue had
990 		 * not been authenticated initially.
991 		 */
992 		if (!chap->authenticated)
993 			continue;
994 		cancel_work_sync(&chap->auth_work);
995 		queue_work(nvme_auth_wq, &chap->auth_work);
996 	}
997 
998 	/*
999 	 * Failure is a soft-state; credentials remain valid until
1000 	 * the controller terminates the connection.
1001 	 */
1002 	for (q = 1; q < ctrl->queue_count; q++) {
1003 		struct nvme_dhchap_queue_context *chap =
1004 			&ctrl->dhchap_ctxs[q];
1005 		if (!chap->authenticated)
1006 			continue;
1007 		flush_work(&chap->auth_work);
1008 		ret = chap->error;
1009 		nvme_auth_reset_dhchap(chap);
1010 		if (ret)
1011 			dev_warn(ctrl->device,
1012 				 "qid %d: authentication failed\n", q);
1013 	}
1014 }
1015 
nvme_auth_init_ctrl(struct nvme_ctrl * ctrl)1016 int nvme_auth_init_ctrl(struct nvme_ctrl *ctrl)
1017 {
1018 	struct nvme_dhchap_queue_context *chap;
1019 	int i, ret;
1020 
1021 	mutex_init(&ctrl->dhchap_auth_mutex);
1022 	INIT_WORK(&ctrl->dhchap_auth_work, nvme_ctrl_auth_work);
1023 	if (!ctrl->opts)
1024 		return 0;
1025 	ret = nvme_auth_parse_key(ctrl->opts->dhchap_secret, &ctrl->host_key);
1026 	if (ret)
1027 		return ret;
1028 	ret = nvme_auth_parse_key(ctrl->opts->dhchap_ctrl_secret,
1029 				  &ctrl->ctrl_key);
1030 	if (ret)
1031 		goto err_free_dhchap_secret;
1032 
1033 	if (!ctrl->opts->dhchap_secret && !ctrl->opts->dhchap_ctrl_secret)
1034 		return 0;
1035 
1036 	ctrl->dhchap_ctxs = kvzalloc_objs(*chap, ctrl_max_dhchaps(ctrl));
1037 	if (!ctrl->dhchap_ctxs) {
1038 		ret = -ENOMEM;
1039 		goto err_free_dhchap_ctrl_secret;
1040 	}
1041 
1042 	for (i = 0; i < ctrl_max_dhchaps(ctrl); i++) {
1043 		chap = &ctrl->dhchap_ctxs[i];
1044 		chap->qid = i;
1045 		chap->ctrl = ctrl;
1046 		chap->authenticated = false;
1047 		INIT_WORK(&chap->auth_work, nvme_queue_auth_work);
1048 	}
1049 
1050 	return 0;
1051 err_free_dhchap_ctrl_secret:
1052 	nvme_auth_free_key(ctrl->ctrl_key);
1053 	ctrl->ctrl_key = NULL;
1054 err_free_dhchap_secret:
1055 	nvme_auth_free_key(ctrl->host_key);
1056 	ctrl->host_key = NULL;
1057 	return ret;
1058 }
1059 EXPORT_SYMBOL_GPL(nvme_auth_init_ctrl);
1060 
nvme_auth_stop(struct nvme_ctrl * ctrl)1061 void nvme_auth_stop(struct nvme_ctrl *ctrl)
1062 {
1063 	cancel_work_sync(&ctrl->dhchap_auth_work);
1064 }
1065 EXPORT_SYMBOL_GPL(nvme_auth_stop);
1066 
nvme_auth_free(struct nvme_ctrl * ctrl)1067 void nvme_auth_free(struct nvme_ctrl *ctrl)
1068 {
1069 	int i;
1070 
1071 	if (ctrl->dhchap_ctxs) {
1072 		for (i = 0; i < ctrl_max_dhchaps(ctrl); i++)
1073 			nvme_auth_free_dhchap(&ctrl->dhchap_ctxs[i]);
1074 		kvfree(ctrl->dhchap_ctxs);
1075 	}
1076 	if (ctrl->host_key) {
1077 		nvme_auth_free_key(ctrl->host_key);
1078 		ctrl->host_key = NULL;
1079 	}
1080 	if (ctrl->ctrl_key) {
1081 		nvme_auth_free_key(ctrl->ctrl_key);
1082 		ctrl->ctrl_key = NULL;
1083 	}
1084 }
1085 EXPORT_SYMBOL_GPL(nvme_auth_free);
1086 
nvme_init_auth(void)1087 int __init nvme_init_auth(void)
1088 {
1089 	nvme_auth_wq = alloc_workqueue("nvme-auth-wq",
1090 			       WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS, 0);
1091 	if (!nvme_auth_wq)
1092 		return -ENOMEM;
1093 
1094 	nvme_chap_buf_cache = kmem_cache_create("nvme-chap-buf-cache",
1095 				CHAP_BUF_SIZE, 0, SLAB_HWCACHE_ALIGN, NULL);
1096 	if (!nvme_chap_buf_cache)
1097 		goto err_destroy_workqueue;
1098 
1099 	nvme_chap_buf_pool = mempool_create(16, mempool_alloc_slab,
1100 			mempool_free_slab, nvme_chap_buf_cache);
1101 	if (!nvme_chap_buf_pool)
1102 		goto err_destroy_chap_buf_cache;
1103 
1104 	return 0;
1105 err_destroy_chap_buf_cache:
1106 	kmem_cache_destroy(nvme_chap_buf_cache);
1107 err_destroy_workqueue:
1108 	destroy_workqueue(nvme_auth_wq);
1109 	return -ENOMEM;
1110 }
1111 
nvme_exit_auth(void)1112 void __exit nvme_exit_auth(void)
1113 {
1114 	mempool_destroy(nvme_chap_buf_pool);
1115 	kmem_cache_destroy(nvme_chap_buf_cache);
1116 	destroy_workqueue(nvme_auth_wq);
1117 }
1118