1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 /* 26 * Copyright 2010 Nexenta Systems, Inc. All rights reserved. 27 */ 28 29 /* 30 * This file is part of the core Kernel Cryptographic Framework. 31 * It implements the SPI functions exported to cryptographic 32 * providers. 33 */ 34 35 #include <sys/ksynch.h> 36 #include <sys/cmn_err.h> 37 #include <sys/ddi.h> 38 #include <sys/sunddi.h> 39 #include <sys/modctl.h> 40 #include <sys/crypto/common.h> 41 #include <sys/crypto/impl.h> 42 #include <sys/crypto/sched_impl.h> 43 #include <sys/crypto/spi.h> 44 #include <sys/crypto/ioctladmin.h> 45 #include <sys/taskq.h> 46 #include <sys/disp.h> 47 #include <sys/kstat.h> 48 #include <sys/policy.h> 49 #include <sys/cpuvar.h> 50 51 /* 52 * minalloc and maxalloc values to be used for taskq_create(). 53 */ 54 int crypto_taskq_threads = CRYPTO_TASKQ_THREADS; 55 int crypto_taskq_minalloc = CYRPTO_TASKQ_MIN; 56 int crypto_taskq_maxalloc = CRYPTO_TASKQ_MAX; 57 58 static void remove_provider(kcf_provider_desc_t *); 59 static void process_logical_providers(crypto_provider_info_t *, 60 kcf_provider_desc_t *); 61 static int init_prov_mechs(crypto_provider_info_t *, kcf_provider_desc_t *); 62 static int kcf_prov_kstat_update(kstat_t *, int); 63 static void delete_kstat(kcf_provider_desc_t *); 64 65 static kcf_prov_stats_t kcf_stats_ks_data_template = { 66 { "kcf_ops_total", KSTAT_DATA_UINT64 }, 67 { "kcf_ops_passed", KSTAT_DATA_UINT64 }, 68 { "kcf_ops_failed", KSTAT_DATA_UINT64 }, 69 { "kcf_ops_returned_busy", KSTAT_DATA_UINT64 } 70 }; 71 72 #define KCF_SPI_COPY_OPS(src, dst, ops) if ((src)->ops != NULL) \ 73 *((dst)->ops) = *((src)->ops); 74 75 extern int sys_shutdown; 76 77 /* 78 * Copy an ops vector from src to dst. Used during provider registration 79 * to copy the ops vector from the provider info structure to the 80 * provider descriptor maintained by KCF. 81 * Copying the ops vector specified by the provider is needed since the 82 * framework does not require the provider info structure to be 83 * persistent. 84 */ 85 static void 86 copy_ops_vector_v1(crypto_ops_t *src_ops, crypto_ops_t *dst_ops) 87 { 88 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_control_ops); 89 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_digest_ops); 90 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_cipher_ops); 91 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_mac_ops); 92 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_sign_ops); 93 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_verify_ops); 94 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_dual_ops); 95 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_dual_cipher_mac_ops); 96 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_random_ops); 97 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_session_ops); 98 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_object_ops); 99 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_key_ops); 100 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_provider_ops); 101 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_ctx_ops); 102 } 103 104 static void 105 copy_ops_vector_v2(crypto_ops_t *src_ops, crypto_ops_t *dst_ops) 106 { 107 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_mech_ops); 108 } 109 110 static void 111 copy_ops_vector_v3(crypto_ops_t *src_ops, crypto_ops_t *dst_ops) 112 { 113 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_nostore_key_ops); 114 } 115 116 static void 117 copy_ops_vector_v4(crypto_ops_t *src_ops, crypto_ops_t *dst_ops) 118 { 119 KCF_SPI_COPY_OPS(src_ops, dst_ops, co_fips140_ops); 120 } 121 122 /* 123 * This routine is used to add cryptographic providers to the KEF framework. 124 * Providers pass a crypto_provider_info structure to crypto_register_provider() 125 * and get back a handle. The crypto_provider_info structure contains a 126 * list of mechanisms supported by the provider and an ops vector containing 127 * provider entry points. Hardware providers call this routine in their attach 128 * routines. Software providers call this routine in their _init() routine. 129 */ 130 int 131 crypto_register_provider(crypto_provider_info_t *info, 132 crypto_kcf_provider_handle_t *handle) 133 { 134 struct modctl *mcp; 135 char *name; 136 char ks_name[KSTAT_STRLEN]; 137 kcf_provider_desc_t *prov_desc = NULL; 138 int ret = CRYPTO_ARGUMENTS_BAD; 139 140 if (info->pi_interface_version > CRYPTO_SPI_VERSION_4) { 141 ret = CRYPTO_VERSION_MISMATCH; 142 goto errormsg; 143 } 144 145 /* 146 * Check provider type, must be software, hardware, or logical. 147 */ 148 if (info->pi_provider_type != CRYPTO_HW_PROVIDER && 149 info->pi_provider_type != CRYPTO_SW_PROVIDER && 150 info->pi_provider_type != CRYPTO_LOGICAL_PROVIDER) 151 goto errormsg; 152 153 /* 154 * Allocate and initialize a new provider descriptor. We also 155 * hold it and release it when done. 156 */ 157 prov_desc = kcf_alloc_provider_desc(info); 158 KCF_PROV_REFHOLD(prov_desc); 159 160 prov_desc->pd_prov_type = info->pi_provider_type; 161 162 /* provider-private handle, opaque to KCF */ 163 prov_desc->pd_prov_handle = info->pi_provider_handle; 164 165 /* copy provider description string */ 166 if (info->pi_provider_description != NULL) { 167 /* 168 * pi_provider_descriptor is a string that can contain 169 * up to CRYPTO_PROVIDER_DESCR_MAX_LEN + 1 characters 170 * INCLUDING the terminating null character. A bcopy() 171 * is necessary here as pd_description should not have 172 * a null character. See comments in kcf_alloc_provider_desc() 173 * for details on pd_description field. 174 */ 175 bcopy(info->pi_provider_description, prov_desc->pd_description, 176 min(strlen(info->pi_provider_description), 177 CRYPTO_PROVIDER_DESCR_MAX_LEN)); 178 } 179 180 if (info->pi_provider_type != CRYPTO_LOGICAL_PROVIDER) { 181 if (info->pi_ops_vector == NULL) { 182 goto bail; 183 } 184 copy_ops_vector_v1(info->pi_ops_vector, 185 prov_desc->pd_ops_vector); 186 if (info->pi_interface_version >= CRYPTO_SPI_VERSION_2) { 187 copy_ops_vector_v2(info->pi_ops_vector, 188 prov_desc->pd_ops_vector); 189 prov_desc->pd_flags = info->pi_flags; 190 } 191 if (info->pi_interface_version >= CRYPTO_SPI_VERSION_3) { 192 copy_ops_vector_v3(info->pi_ops_vector, 193 prov_desc->pd_ops_vector); 194 } 195 if (info->pi_interface_version == CRYPTO_SPI_VERSION_4) { 196 copy_ops_vector_v4(info->pi_ops_vector, 197 prov_desc->pd_ops_vector); 198 } 199 } 200 201 /* object_ops and nostore_key_ops are mutually exclusive */ 202 if (prov_desc->pd_ops_vector->co_object_ops && 203 prov_desc->pd_ops_vector->co_nostore_key_ops) { 204 goto bail; 205 } 206 /* 207 * For software providers, copy the module name and module ID. 208 * For hardware providers, copy the driver name and instance. 209 */ 210 switch (info->pi_provider_type) { 211 case CRYPTO_SW_PROVIDER: 212 if (info->pi_provider_dev.pd_sw == NULL) 213 goto bail; 214 215 if ((mcp = mod_getctl(info->pi_provider_dev.pd_sw)) == NULL) 216 goto bail; 217 218 prov_desc->pd_module_id = mcp->mod_id; 219 name = mcp->mod_modname; 220 break; 221 222 case CRYPTO_HW_PROVIDER: 223 case CRYPTO_LOGICAL_PROVIDER: 224 if (info->pi_provider_dev.pd_hw == NULL) 225 goto bail; 226 227 prov_desc->pd_instance = 228 ddi_get_instance(info->pi_provider_dev.pd_hw); 229 name = (char *)ddi_driver_name(info->pi_provider_dev.pd_hw); 230 break; 231 } 232 if (name == NULL) 233 goto bail; 234 235 prov_desc->pd_name = kmem_alloc(strlen(name) + 1, KM_SLEEP); 236 (void) strcpy(prov_desc->pd_name, name); 237 238 if ((prov_desc->pd_mctlp = kcf_get_modctl(info)) == NULL) 239 goto bail; 240 241 /* process the mechanisms supported by the provider */ 242 if ((ret = init_prov_mechs(info, prov_desc)) != CRYPTO_SUCCESS) 243 goto bail; 244 245 /* 246 * Add provider to providers tables, also sets the descriptor 247 * pd_prov_id field. 248 */ 249 if ((ret = kcf_prov_tab_add_provider(prov_desc)) != CRYPTO_SUCCESS) { 250 undo_register_provider(prov_desc, B_FALSE); 251 goto bail; 252 } 253 254 /* 255 * We create a taskq only for a hardware provider. The global 256 * software queue is used for software providers. We handle ordering 257 * of multi-part requests in the taskq routine. So, it is safe to 258 * have multiple threads for the taskq. We pass TASKQ_PREPOPULATE flag 259 * to keep some entries cached to improve performance. 260 */ 261 if (prov_desc->pd_prov_type == CRYPTO_HW_PROVIDER) 262 prov_desc->pd_taskq = taskq_create("kcf_taskq", 263 crypto_taskq_threads, minclsyspri, 264 crypto_taskq_minalloc, crypto_taskq_maxalloc, 265 TASKQ_PREPOPULATE); 266 else 267 prov_desc->pd_taskq = NULL; 268 269 /* no kernel session to logical providers and no pd_flags */ 270 if (prov_desc->pd_prov_type != CRYPTO_LOGICAL_PROVIDER) { 271 /* 272 * Open a session for session-oriented providers. This session 273 * is used for all kernel consumers. This is fine as a provider 274 * is required to support multiple thread access to a session. 275 * We can do this only after the taskq has been created as we 276 * do a kcf_submit_request() to open the session. 277 */ 278 if (KCF_PROV_SESSION_OPS(prov_desc) != NULL) { 279 kcf_req_params_t params; 280 281 KCF_WRAP_SESSION_OPS_PARAMS(¶ms, 282 KCF_OP_SESSION_OPEN, &prov_desc->pd_sid, 0, 283 CRYPTO_USER, NULL, 0, prov_desc); 284 ret = kcf_submit_request(prov_desc, NULL, NULL, ¶ms, 285 B_FALSE); 286 if (ret != CRYPTO_SUCCESS) 287 goto undo_then_bail; 288 } 289 290 /* 291 * Get the value for the maximum input length allowed if 292 * CRYPTO_HASH_NO_UPDATE or CRYPTO_HASH_NO_UPDATE is specified. 293 */ 294 if (prov_desc->pd_flags & 295 (CRYPTO_HASH_NO_UPDATE | CRYPTO_HMAC_NO_UPDATE)) { 296 kcf_req_params_t params; 297 crypto_provider_ext_info_t ext_info; 298 299 if (KCF_PROV_PROVMGMT_OPS(prov_desc) == NULL) 300 goto undo_then_bail; 301 302 bzero(&ext_info, sizeof (ext_info)); 303 KCF_WRAP_PROVMGMT_OPS_PARAMS(¶ms, 304 KCF_OP_MGMT_EXTINFO, 305 0, NULL, 0, NULL, 0, NULL, &ext_info, prov_desc); 306 ret = kcf_submit_request(prov_desc, NULL, NULL, 307 ¶ms, B_FALSE); 308 if (ret != CRYPTO_SUCCESS) 309 goto undo_then_bail; 310 311 if (prov_desc->pd_flags & CRYPTO_HASH_NO_UPDATE) { 312 prov_desc->pd_hash_limit = 313 ext_info.ei_hash_max_input_len; 314 } 315 if (prov_desc->pd_flags & CRYPTO_HMAC_NO_UPDATE) { 316 prov_desc->pd_hmac_limit = 317 ext_info.ei_hmac_max_input_len; 318 } 319 } 320 } 321 322 if (prov_desc->pd_prov_type != CRYPTO_LOGICAL_PROVIDER) { 323 /* 324 * Create the kstat for this provider. There is a kstat 325 * installed for each successfully registered provider. 326 * This kstat is deleted, when the provider unregisters. 327 */ 328 if (prov_desc->pd_prov_type == CRYPTO_SW_PROVIDER) { 329 (void) snprintf(ks_name, KSTAT_STRLEN, "%s_%s", 330 prov_desc->pd_name, "provider_stats"); 331 } else { 332 (void) snprintf(ks_name, KSTAT_STRLEN, "%s_%d_%u_%s", 333 prov_desc->pd_name, prov_desc->pd_instance, 334 prov_desc->pd_prov_id, "provider_stats"); 335 } 336 337 prov_desc->pd_kstat = kstat_create("kcf", 0, ks_name, "crypto", 338 KSTAT_TYPE_NAMED, sizeof (kcf_prov_stats_t) / 339 sizeof (kstat_named_t), KSTAT_FLAG_VIRTUAL); 340 341 if (prov_desc->pd_kstat != NULL) { 342 bcopy(&kcf_stats_ks_data_template, 343 &prov_desc->pd_ks_data, 344 sizeof (kcf_stats_ks_data_template)); 345 prov_desc->pd_kstat->ks_data = &prov_desc->pd_ks_data; 346 KCF_PROV_REFHOLD(prov_desc); 347 prov_desc->pd_kstat->ks_private = prov_desc; 348 prov_desc->pd_kstat->ks_update = kcf_prov_kstat_update; 349 kstat_install(prov_desc->pd_kstat); 350 } 351 } 352 353 if (prov_desc->pd_prov_type == CRYPTO_HW_PROVIDER) 354 process_logical_providers(info, prov_desc); 355 356 mutex_enter(&prov_desc->pd_lock); 357 prov_desc->pd_state = KCF_PROV_READY; 358 mutex_exit(&prov_desc->pd_lock); 359 kcf_do_notify(prov_desc, B_TRUE); 360 361 *handle = prov_desc->pd_kcf_prov_handle; 362 KCF_PROV_REFRELE(prov_desc); 363 return (CRYPTO_SUCCESS); 364 365 undo_then_bail: 366 undo_register_provider(prov_desc, B_TRUE); 367 ret = CRYPTO_FAILED; 368 bail: 369 KCF_PROV_REFRELE(prov_desc); 370 371 errormsg: 372 if (ret != CRYPTO_SUCCESS && sys_shutdown == 0) { 373 switch (ret) { 374 case CRYPTO_FAILED: 375 cmn_err(CE_WARN, "%s failed when registering with the " 376 "Cryptographic Framework.", 377 info->pi_provider_description); 378 break; 379 380 case CRYPTO_MODVERIFICATION_FAILED: 381 cmn_err(CE_WARN, "%s failed module verification when " 382 "registering with the Cryptographic Framework.", 383 info->pi_provider_description); 384 break; 385 386 case CRYPTO_ARGUMENTS_BAD: 387 cmn_err(CE_WARN, "%s provided bad arguments and was " 388 "not registered with the Cryptographic Framework.", 389 info->pi_provider_description); 390 break; 391 392 case CRYPTO_VERSION_MISMATCH: 393 cmn_err(CE_WARN, "%s was not registered with the " 394 "Cryptographic Framework as there is a SPI version " 395 "mismatch (%d) error.", 396 info->pi_provider_description, 397 info->pi_interface_version); 398 break; 399 400 case CRYPTO_FIPS140_ERROR: 401 cmn_err(CE_WARN, "%s was not registered with the " 402 "Cryptographic Framework as there was a FIPS 140 " 403 "validation error.", info->pi_provider_description); 404 break; 405 406 default: 407 cmn_err(CE_WARN, "%s did not register with the " 408 "Cryptographic Framework. (0x%x)", 409 info->pi_provider_description, ret); 410 }; 411 } 412 413 return (ret); 414 } 415 416 /* Return the number of holds on a provider. */ 417 int 418 kcf_get_refcnt(kcf_provider_desc_t *pd, boolean_t do_lock) 419 { 420 int i; 421 int refcnt = 0; 422 423 if (do_lock) 424 for (i = 0; i < pd->pd_nbins; i++) 425 mutex_enter(&(pd->pd_percpu_bins[i].kp_lock)); 426 427 for (i = 0; i < pd->pd_nbins; i++) 428 refcnt += pd->pd_percpu_bins[i].kp_holdcnt; 429 430 if (do_lock) 431 for (i = 0; i < pd->pd_nbins; i++) 432 mutex_exit(&(pd->pd_percpu_bins[i].kp_lock)); 433 434 return (refcnt); 435 } 436 437 /* 438 * This routine is used to notify the framework when a provider is being 439 * removed. Hardware providers call this routine in their detach routines. 440 * Software providers call this routine in their _fini() routine. 441 */ 442 int 443 crypto_unregister_provider(crypto_kcf_provider_handle_t handle) 444 { 445 uint_t mech_idx; 446 kcf_provider_desc_t *desc; 447 kcf_prov_state_t saved_state; 448 int ret = CRYPTO_SUCCESS; 449 450 /* lookup provider descriptor */ 451 if ((desc = kcf_prov_tab_lookup((crypto_provider_id_t)handle)) == 452 NULL) { 453 ret = CRYPTO_UNKNOWN_PROVIDER; 454 goto errormsg; 455 } 456 457 mutex_enter(&desc->pd_lock); 458 /* 459 * Check if any other thread is disabling or removing 460 * this provider. We return if this is the case. 461 */ 462 if (desc->pd_state >= KCF_PROV_DISABLED) { 463 mutex_exit(&desc->pd_lock); 464 /* Release reference held by kcf_prov_tab_lookup(). */ 465 KCF_PROV_REFRELE(desc); 466 ret = CRYPTO_BUSY; 467 goto errormsg; 468 } 469 470 saved_state = desc->pd_state; 471 desc->pd_state = KCF_PROV_UNREGISTERING; 472 473 if (saved_state == KCF_PROV_BUSY) { 474 /* 475 * The per-provider taskq threads may be waiting. We 476 * signal them so that they can start failing requests. 477 */ 478 cv_broadcast(&desc->pd_resume_cv); 479 } 480 481 mutex_exit(&desc->pd_lock); 482 483 if (desc->pd_prov_type != CRYPTO_SW_PROVIDER) { 484 remove_provider(desc); 485 } 486 487 if (desc->pd_prov_type != CRYPTO_LOGICAL_PROVIDER) { 488 /* remove the provider from the mechanisms tables */ 489 for (mech_idx = 0; mech_idx < desc->pd_mech_list_count; 490 mech_idx++) { 491 kcf_remove_mech_provider( 492 desc->pd_mechanisms[mech_idx].cm_mech_name, desc); 493 } 494 } 495 496 /* remove provider from providers table */ 497 if (kcf_prov_tab_rem_provider((crypto_provider_id_t)handle) != 498 CRYPTO_SUCCESS) { 499 /* Release reference held by kcf_prov_tab_lookup(). */ 500 KCF_PROV_REFRELE(desc); 501 ret = CRYPTO_UNKNOWN_PROVIDER; 502 goto errormsg; 503 } 504 505 delete_kstat(desc); 506 507 if (desc->pd_prov_type == CRYPTO_SW_PROVIDER) { 508 /* 509 * Wait till the existing requests with the provider complete 510 * and all the holds are released. All the holds on a software 511 * provider are from kernel clients and the hold time 512 * is expected to be short. So, we won't be stuck here forever. 513 */ 514 while (kcf_get_refcnt(desc, B_TRUE) > 1) { 515 /* wait 1 second and try again. */ 516 delay(1 * drv_usectohz(1000000)); 517 } 518 } else { 519 int i; 520 kcf_prov_cpu_t *mp; 521 522 /* 523 * Wait until requests that have been sent to the provider 524 * complete. 525 */ 526 for (i = 0; i < desc->pd_nbins; i++) { 527 mp = &(desc->pd_percpu_bins[i]); 528 529 mutex_enter(&mp->kp_lock); 530 while (mp->kp_jobcnt > 0) { 531 cv_wait(&mp->kp_cv, &mp->kp_lock); 532 } 533 mutex_exit(&mp->kp_lock); 534 } 535 } 536 537 mutex_enter(&desc->pd_lock); 538 desc->pd_state = KCF_PROV_UNREGISTERED; 539 mutex_exit(&desc->pd_lock); 540 541 kcf_do_notify(desc, B_FALSE); 542 543 mutex_enter(&prov_tab_mutex); 544 /* Release reference held by kcf_prov_tab_lookup(). */ 545 KCF_PROV_REFRELE(desc); 546 547 if (kcf_get_refcnt(desc, B_TRUE) == 0) { 548 /* kcf_free_provider_desc drops prov_tab_mutex */ 549 kcf_free_provider_desc(desc); 550 } else { 551 ASSERT(desc->pd_prov_type != CRYPTO_SW_PROVIDER); 552 /* 553 * We could avoid this if /dev/crypto can proactively 554 * remove any holds on us from a dormant PKCS #11 app. 555 * For now, we check the provider table for 556 * KCF_PROV_UNREGISTERED entries when a provider is 557 * added to the table or when a provider is removed from it 558 * and free them when refcnt reaches zero. 559 */ 560 kcf_need_provtab_walk = B_TRUE; 561 mutex_exit(&prov_tab_mutex); 562 } 563 564 errormsg: 565 if (ret != CRYPTO_SUCCESS && sys_shutdown == 0) { 566 switch (ret) { 567 case CRYPTO_UNKNOWN_PROVIDER: 568 cmn_err(CE_WARN, "Unknown provider \"%s\" was " 569 "requested to unregister from the cryptographic " 570 "framework.", desc->pd_description); 571 break; 572 573 case CRYPTO_BUSY: 574 cmn_err(CE_WARN, "%s could not be unregistered from " 575 "the Cryptographic Framework as it is busy.", 576 desc->pd_description); 577 break; 578 579 default: 580 cmn_err(CE_WARN, "%s did not unregister with the " 581 "Cryptographic Framework. (0x%x)", 582 desc->pd_description, ret); 583 }; 584 } 585 586 return (ret); 587 } 588 589 /* 590 * This routine is used to notify the framework that the state of 591 * a cryptographic provider has changed. Valid state codes are: 592 * 593 * CRYPTO_PROVIDER_READY 594 * The provider indicates that it can process more requests. A provider 595 * will notify with this event if it previously has notified us with a 596 * CRYPTO_PROVIDER_BUSY. 597 * 598 * CRYPTO_PROVIDER_BUSY 599 * The provider can not take more requests. 600 * 601 * CRYPTO_PROVIDER_FAILED 602 * The provider encountered an internal error. The framework will not 603 * be sending any more requests to the provider. The provider may notify 604 * with a CRYPTO_PROVIDER_READY, if it is able to recover from the error. 605 * 606 * This routine can be called from user or interrupt context. 607 */ 608 void 609 crypto_provider_notification(crypto_kcf_provider_handle_t handle, uint_t state) 610 { 611 kcf_provider_desc_t *pd; 612 613 /* lookup the provider from the given handle */ 614 if ((pd = kcf_prov_tab_lookup((crypto_provider_id_t)handle)) == NULL) 615 return; 616 617 mutex_enter(&pd->pd_lock); 618 619 if (pd->pd_state <= KCF_PROV_VERIFICATION_FAILED) 620 goto out; 621 622 if (pd->pd_prov_type == CRYPTO_LOGICAL_PROVIDER) { 623 cmn_err(CE_WARN, "crypto_provider_notification: " 624 "logical provider (%x) ignored\n", handle); 625 goto out; 626 } 627 switch (state) { 628 case CRYPTO_PROVIDER_READY: 629 switch (pd->pd_state) { 630 case KCF_PROV_BUSY: 631 pd->pd_state = KCF_PROV_READY; 632 /* 633 * Signal the per-provider taskq threads that they 634 * can start submitting requests. 635 */ 636 cv_broadcast(&pd->pd_resume_cv); 637 break; 638 639 case KCF_PROV_FAILED: 640 /* 641 * The provider recovered from the error. Let us 642 * use it now. 643 */ 644 pd->pd_state = KCF_PROV_READY; 645 break; 646 } 647 break; 648 649 case CRYPTO_PROVIDER_BUSY: 650 switch (pd->pd_state) { 651 case KCF_PROV_READY: 652 pd->pd_state = KCF_PROV_BUSY; 653 break; 654 } 655 break; 656 657 case CRYPTO_PROVIDER_FAILED: 658 /* 659 * We note the failure and return. The per-provider taskq 660 * threads check this flag and start failing the 661 * requests, if it is set. See process_req_hwp() for details. 662 */ 663 switch (pd->pd_state) { 664 case KCF_PROV_READY: 665 pd->pd_state = KCF_PROV_FAILED; 666 break; 667 668 case KCF_PROV_BUSY: 669 pd->pd_state = KCF_PROV_FAILED; 670 /* 671 * The per-provider taskq threads may be waiting. We 672 * signal them so that they can start failing requests. 673 */ 674 cv_broadcast(&pd->pd_resume_cv); 675 break; 676 } 677 break; 678 } 679 out: 680 mutex_exit(&pd->pd_lock); 681 KCF_PROV_REFRELE(pd); 682 } 683 684 /* 685 * This routine is used to notify the framework the result of 686 * an asynchronous request handled by a provider. Valid error 687 * codes are the same as the CRYPTO_* errors defined in common.h. 688 * 689 * This routine can be called from user or interrupt context. 690 */ 691 void 692 crypto_op_notification(crypto_req_handle_t handle, int error) 693 { 694 kcf_call_type_t ctype; 695 696 if (handle == NULL) 697 return; 698 699 if ((ctype = GET_REQ_TYPE(handle)) == CRYPTO_SYNCH) { 700 kcf_sreq_node_t *sreq = (kcf_sreq_node_t *)handle; 701 702 KCF_PROV_JOB_RELE_STAT(sreq->sn_mp, (error != CRYPTO_SUCCESS)); 703 kcf_sop_done(sreq, error); 704 } else { 705 kcf_areq_node_t *areq = (kcf_areq_node_t *)handle; 706 707 ASSERT(ctype == CRYPTO_ASYNCH); 708 KCF_PROV_JOB_RELE_STAT(areq->an_mp, (error != CRYPTO_SUCCESS)); 709 kcf_aop_done(areq, error); 710 } 711 } 712 713 /* 714 * This routine is used by software providers to determine 715 * whether to use KM_SLEEP or KM_NOSLEEP during memory allocation. 716 * Note that hardware providers can always use KM_SLEEP. So, 717 * they do not need to call this routine. 718 * 719 * This routine can be called from user or interrupt context. 720 */ 721 int 722 crypto_kmflag(crypto_req_handle_t handle) 723 { 724 return (REQHNDL2_KMFLAG(handle)); 725 } 726 727 /* 728 * Process the mechanism info structures specified by the provider 729 * during registration. A NULL crypto_provider_info_t indicates 730 * an already initialized provider descriptor. 731 * 732 * Mechanisms are not added to the kernel's mechanism table if the 733 * provider is a logical provider. 734 * 735 * Returns CRYPTO_SUCCESS on success, CRYPTO_ARGUMENTS if one 736 * of the specified mechanisms was malformed, or CRYPTO_HOST_MEMORY 737 * if the table of mechanisms is full. 738 */ 739 static int 740 init_prov_mechs(crypto_provider_info_t *info, kcf_provider_desc_t *desc) 741 { 742 uint_t mech_idx; 743 uint_t cleanup_idx; 744 int err = CRYPTO_SUCCESS; 745 kcf_prov_mech_desc_t *pmd; 746 int desc_use_count = 0; 747 int mcount = desc->pd_mech_list_count; 748 749 if (desc->pd_prov_type == CRYPTO_LOGICAL_PROVIDER) { 750 if (info != NULL) { 751 ASSERT(info->pi_mechanisms != NULL); 752 bcopy(info->pi_mechanisms, desc->pd_mechanisms, 753 sizeof (crypto_mech_info_t) * mcount); 754 } 755 return (CRYPTO_SUCCESS); 756 } 757 758 /* 759 * Copy the mechanism list from the provider info to the provider 760 * descriptor. desc->pd_mechanisms has an extra crypto_mech_info_t 761 * element if the provider has random_ops since we keep an internal 762 * mechanism, SUN_RANDOM, in this case. 763 */ 764 if (info != NULL) { 765 if (info->pi_ops_vector->co_random_ops != NULL) { 766 crypto_mech_info_t *rand_mi; 767 768 /* 769 * Need the following check as it is possible to have 770 * a provider that implements just random_ops and has 771 * pi_mechanisms == NULL. 772 */ 773 if (info->pi_mechanisms != NULL) { 774 bcopy(info->pi_mechanisms, desc->pd_mechanisms, 775 sizeof (crypto_mech_info_t) * (mcount - 1)); 776 } 777 rand_mi = &desc->pd_mechanisms[mcount - 1]; 778 779 bzero(rand_mi, sizeof (crypto_mech_info_t)); 780 (void) strncpy(rand_mi->cm_mech_name, SUN_RANDOM, 781 CRYPTO_MAX_MECH_NAME); 782 rand_mi->cm_func_group_mask = CRYPTO_FG_RANDOM; 783 } else { 784 ASSERT(info->pi_mechanisms != NULL); 785 bcopy(info->pi_mechanisms, desc->pd_mechanisms, 786 sizeof (crypto_mech_info_t) * mcount); 787 } 788 } 789 790 /* 791 * For each mechanism support by the provider, add the provider 792 * to the corresponding KCF mechanism mech_entry chain. 793 */ 794 for (mech_idx = 0; mech_idx < desc->pd_mech_list_count; mech_idx++) { 795 crypto_mech_info_t *mi = &desc->pd_mechanisms[mech_idx]; 796 797 if ((mi->cm_mech_flags & CRYPTO_KEYSIZE_UNIT_IN_BITS) && 798 (mi->cm_mech_flags & CRYPTO_KEYSIZE_UNIT_IN_BYTES)) { 799 err = CRYPTO_ARGUMENTS_BAD; 800 break; 801 } 802 803 if ((err = kcf_add_mech_provider(mech_idx, desc, &pmd)) != 804 KCF_SUCCESS) 805 break; 806 807 if (pmd == NULL) 808 continue; 809 810 /* The provider will be used for this mechanism */ 811 desc_use_count++; 812 } 813 814 /* 815 * Don't allow multiple software providers with disabled mechanisms 816 * to register. Subsequent enabling of mechanisms will result in 817 * an unsupported configuration, i.e. multiple software providers 818 * per mechanism. 819 */ 820 if (desc_use_count == 0 && desc->pd_prov_type == CRYPTO_SW_PROVIDER) 821 return (CRYPTO_ARGUMENTS_BAD); 822 823 if (err == KCF_SUCCESS) 824 return (CRYPTO_SUCCESS); 825 826 /* 827 * An error occurred while adding the mechanism, cleanup 828 * and bail. 829 */ 830 for (cleanup_idx = 0; cleanup_idx < mech_idx; cleanup_idx++) { 831 kcf_remove_mech_provider( 832 desc->pd_mechanisms[cleanup_idx].cm_mech_name, desc); 833 } 834 835 if (err == KCF_MECH_TAB_FULL) 836 return (CRYPTO_HOST_MEMORY); 837 838 return (CRYPTO_ARGUMENTS_BAD); 839 } 840 841 /* 842 * Update routine for kstat. Only privileged users are allowed to 843 * access this information, since this information is sensitive. 844 * There are some cryptographic attacks (e.g. traffic analysis) 845 * which can use this information. 846 */ 847 static int 848 kcf_prov_kstat_update(kstat_t *ksp, int rw) 849 { 850 kcf_prov_stats_t *ks_data; 851 kcf_provider_desc_t *pd = (kcf_provider_desc_t *)ksp->ks_private; 852 int i; 853 854 if (rw == KSTAT_WRITE) 855 return (EACCES); 856 857 ks_data = ksp->ks_data; 858 859 if (secpolicy_sys_config(CRED(), B_TRUE) != 0) { 860 ks_data->ps_ops_total.value.ui64 = 0; 861 ks_data->ps_ops_passed.value.ui64 = 0; 862 ks_data->ps_ops_failed.value.ui64 = 0; 863 ks_data->ps_ops_busy_rval.value.ui64 = 0; 864 } else { 865 uint64_t dtotal, ftotal, btotal; 866 867 dtotal = ftotal = btotal = 0; 868 /* No locking done since an exact count is not required. */ 869 for (i = 0; i < pd->pd_nbins; i++) { 870 dtotal += pd->pd_percpu_bins[i].kp_ndispatches; 871 ftotal += pd->pd_percpu_bins[i].kp_nfails; 872 btotal += pd->pd_percpu_bins[i].kp_nbusy_rval; 873 } 874 875 ks_data->ps_ops_total.value.ui64 = dtotal; 876 ks_data->ps_ops_failed.value.ui64 = ftotal; 877 ks_data->ps_ops_busy_rval.value.ui64 = btotal; 878 ks_data->ps_ops_passed.value.ui64 = dtotal - ftotal - btotal; 879 } 880 881 return (0); 882 } 883 884 885 /* 886 * Utility routine called from failure paths in crypto_register_provider() 887 * and from crypto_load_soft_disabled(). 888 */ 889 void 890 undo_register_provider(kcf_provider_desc_t *desc, boolean_t remove_prov) 891 { 892 uint_t mech_idx; 893 894 /* remove the provider from the mechanisms tables */ 895 for (mech_idx = 0; mech_idx < desc->pd_mech_list_count; 896 mech_idx++) { 897 kcf_remove_mech_provider( 898 desc->pd_mechanisms[mech_idx].cm_mech_name, desc); 899 } 900 901 /* remove provider from providers table */ 902 if (remove_prov) 903 (void) kcf_prov_tab_rem_provider(desc->pd_prov_id); 904 } 905 906 /* 907 * Utility routine called from crypto_load_soft_disabled(). Callers 908 * should have done a prior undo_register_provider(). 909 */ 910 void 911 redo_register_provider(kcf_provider_desc_t *pd) 912 { 913 /* process the mechanisms supported by the provider */ 914 (void) init_prov_mechs(NULL, pd); 915 916 /* 917 * Hold provider in providers table. We should not call 918 * kcf_prov_tab_add_provider() here as the provider descriptor 919 * is still valid which means it has an entry in the provider 920 * table. 921 */ 922 KCF_PROV_REFHOLD(pd); 923 } 924 925 /* 926 * Add provider (p1) to another provider's array of providers (p2). 927 * Hardware and logical providers use this array to cross-reference 928 * each other. 929 */ 930 static void 931 add_provider_to_array(kcf_provider_desc_t *p1, kcf_provider_desc_t *p2) 932 { 933 kcf_provider_list_t *new; 934 935 new = kmem_alloc(sizeof (kcf_provider_list_t), KM_SLEEP); 936 mutex_enter(&p2->pd_lock); 937 new->pl_next = p2->pd_provider_list; 938 p2->pd_provider_list = new; 939 new->pl_provider = p1; 940 mutex_exit(&p2->pd_lock); 941 } 942 943 /* 944 * Remove provider (p1) from another provider's array of providers (p2). 945 * Hardware and logical providers use this array to cross-reference 946 * each other. 947 */ 948 static void 949 remove_provider_from_array(kcf_provider_desc_t *p1, kcf_provider_desc_t *p2) 950 { 951 952 kcf_provider_list_t *pl = NULL, **prev; 953 954 mutex_enter(&p2->pd_lock); 955 for (pl = p2->pd_provider_list, prev = &p2->pd_provider_list; 956 pl != NULL; prev = &pl->pl_next, pl = pl->pl_next) { 957 if (pl->pl_provider == p1) { 958 break; 959 } 960 } 961 962 if (p1 == NULL) { 963 mutex_exit(&p2->pd_lock); 964 return; 965 } 966 967 /* detach and free kcf_provider_list structure */ 968 *prev = pl->pl_next; 969 kmem_free(pl, sizeof (*pl)); 970 mutex_exit(&p2->pd_lock); 971 } 972 973 /* 974 * Convert an array of logical provider handles (crypto_provider_id) 975 * stored in a crypto_provider_info structure into an array of provider 976 * descriptors (kcf_provider_desc_t) attached to a logical provider. 977 */ 978 static void 979 process_logical_providers(crypto_provider_info_t *info, kcf_provider_desc_t *hp) 980 { 981 kcf_provider_desc_t *lp; 982 crypto_provider_id_t handle; 983 int count = info->pi_logical_provider_count; 984 int i; 985 986 /* add hardware provider to each logical provider */ 987 for (i = 0; i < count; i++) { 988 handle = info->pi_logical_providers[i]; 989 lp = kcf_prov_tab_lookup((crypto_provider_id_t)handle); 990 if (lp == NULL) { 991 continue; 992 } 993 add_provider_to_array(hp, lp); 994 hp->pd_flags |= KCF_LPROV_MEMBER; 995 996 /* 997 * A hardware provider has to have the provider descriptor of 998 * every logical provider it belongs to, so it can be removed 999 * from the logical provider if the hardware provider 1000 * unregisters from the framework. 1001 */ 1002 add_provider_to_array(lp, hp); 1003 KCF_PROV_REFRELE(lp); 1004 } 1005 } 1006 1007 /* 1008 * This routine removes a provider from all of the logical or 1009 * hardware providers it belongs to, and frees the provider's 1010 * array of pointers to providers. 1011 */ 1012 static void 1013 remove_provider(kcf_provider_desc_t *pp) 1014 { 1015 kcf_provider_desc_t *p; 1016 kcf_provider_list_t *e, *next; 1017 1018 mutex_enter(&pp->pd_lock); 1019 for (e = pp->pd_provider_list; e != NULL; e = next) { 1020 p = e->pl_provider; 1021 remove_provider_from_array(pp, p); 1022 if (p->pd_prov_type == CRYPTO_HW_PROVIDER && 1023 p->pd_provider_list == NULL) 1024 p->pd_flags &= ~KCF_LPROV_MEMBER; 1025 next = e->pl_next; 1026 kmem_free(e, sizeof (*e)); 1027 } 1028 pp->pd_provider_list = NULL; 1029 mutex_exit(&pp->pd_lock); 1030 } 1031 1032 /* 1033 * Dispatch events as needed for a provider. is_added flag tells 1034 * whether the provider is registering or unregistering. 1035 */ 1036 void 1037 kcf_do_notify(kcf_provider_desc_t *prov_desc, boolean_t is_added) 1038 { 1039 int i; 1040 crypto_notify_event_change_t ec; 1041 1042 ASSERT(prov_desc->pd_state > KCF_PROV_VERIFICATION_FAILED); 1043 1044 /* 1045 * Inform interested clients of the mechanisms becoming 1046 * available/unavailable. We skip this for logical providers 1047 * as they do not affect mechanisms. 1048 */ 1049 if (prov_desc->pd_prov_type != CRYPTO_LOGICAL_PROVIDER) { 1050 ec.ec_provider_type = prov_desc->pd_prov_type; 1051 ec.ec_change = is_added ? CRYPTO_MECH_ADDED : 1052 CRYPTO_MECH_REMOVED; 1053 for (i = 0; i < prov_desc->pd_mech_list_count; i++) { 1054 /* Skip any mechanisms not allowed by the policy */ 1055 if (is_mech_disabled(prov_desc, 1056 prov_desc->pd_mechanisms[i].cm_mech_name)) 1057 continue; 1058 1059 (void) strncpy(ec.ec_mech_name, 1060 prov_desc->pd_mechanisms[i].cm_mech_name, 1061 CRYPTO_MAX_MECH_NAME); 1062 kcf_walk_ntfylist(CRYPTO_EVENT_MECHS_CHANGED, &ec); 1063 } 1064 1065 } 1066 1067 /* 1068 * Inform interested clients about the new or departing provider. 1069 * In case of a logical provider, we need to notify the event only 1070 * for the logical provider and not for the underlying 1071 * providers which are known by the KCF_LPROV_MEMBER bit. 1072 */ 1073 if (prov_desc->pd_prov_type == CRYPTO_LOGICAL_PROVIDER || 1074 (prov_desc->pd_flags & KCF_LPROV_MEMBER) == 0) { 1075 kcf_walk_ntfylist(is_added ? CRYPTO_EVENT_PROVIDER_REGISTERED : 1076 CRYPTO_EVENT_PROVIDER_UNREGISTERED, prov_desc); 1077 } 1078 } 1079 1080 static void 1081 delete_kstat(kcf_provider_desc_t *desc) 1082 { 1083 /* destroy the kstat created for this provider */ 1084 if (desc->pd_kstat != NULL) { 1085 kcf_provider_desc_t *kspd = desc->pd_kstat->ks_private; 1086 1087 /* release reference held by desc->pd_kstat->ks_private */ 1088 ASSERT(desc == kspd); 1089 kstat_delete(kspd->pd_kstat); 1090 desc->pd_kstat = NULL; 1091 KCF_PROV_REFRELE(kspd); 1092 } 1093 } 1094