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