diff options
Diffstat (limited to 'usr/src/uts/common/crypto/spi/kcf_spi.c')
-rw-r--r-- | usr/src/uts/common/crypto/spi/kcf_spi.c | 93 |
1 files changed, 84 insertions, 9 deletions
diff --git a/usr/src/uts/common/crypto/spi/kcf_spi.c b/usr/src/uts/common/crypto/spi/kcf_spi.c index 2634ed3624..826b4ab838 100644 --- a/usr/src/uts/common/crypto/spi/kcf_spi.c +++ b/usr/src/uts/common/crypto/spi/kcf_spi.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. + * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -70,6 +70,8 @@ static kcf_prov_stats_t kcf_stats_ks_data_template = { #define KCF_SPI_COPY_OPS(src, dst, ops) if ((src)->ops != NULL) \ *((dst)->ops) = *((src)->ops); +extern int sys_shutdown; + /* * Copy an ops vector from src to dst. Used during provider registration * to copy the ops vector from the provider info structure to the @@ -134,8 +136,10 @@ crypto_register_provider(crypto_provider_info_t *info, kcf_provider_desc_t *prov_desc = NULL; int ret = CRYPTO_ARGUMENTS_BAD; - if (info->pi_interface_version > CRYPTO_SPI_VERSION_4) - return (CRYPTO_VERSION_MISMATCH); + if (info->pi_interface_version > CRYPTO_SPI_VERSION_4) { + ret = CRYPTO_VERSION_MISMATCH; + goto errormsg; + } /* * Check provider type, must be software, hardware, or logical. @@ -143,7 +147,7 @@ crypto_register_provider(crypto_provider_info_t *info, if (info->pi_provider_type != CRYPTO_HW_PROVIDER && info->pi_provider_type != CRYPTO_SW_PROVIDER && info->pi_provider_type != CRYPTO_LOGICAL_PROVIDER) - return (CRYPTO_ARGUMENTS_BAD); + goto errormsg; /* * Allocate and initialize a new provider descriptor. We also @@ -415,6 +419,49 @@ undo_then_bail: ret = CRYPTO_FAILED; bail: KCF_PROV_REFRELE(prov_desc); + +errormsg: + if (ret != CRYPTO_SUCCESS && sys_shutdown == 0) { + switch (ret) { + case CRYPTO_FAILED: + cmn_err(CE_WARN, "%s failed when registering with the " + "Cryptographic Framework.", + info->pi_provider_description); + break; + + case CRYPTO_MODVERIFICATION_FAILED: + cmn_err(CE_WARN, "%s failed module verification when " + "registering with the Cryptographic Framework.", + info->pi_provider_description); + break; + + case CRYPTO_ARGUMENTS_BAD: + cmn_err(CE_WARN, "%s provided bad arguments and was " + "not registered with the Cryptographic Framework.", + info->pi_provider_description); + break; + + case CRYPTO_VERSION_MISMATCH: + cmn_err(CE_WARN, "%s was not registered with the " + "Cryptographic Framework as there is a SPI version " + "mismatch (%d) error.", + info->pi_provider_description, + info->pi_interface_version); + break; + + case CRYPTO_FIPS140_ERROR: + cmn_err(CE_WARN, "%s was not registered with the " + "Cryptographic Framework as there was a FIPS 140 " + "validation error.", info->pi_provider_description); + break; + + default: + cmn_err(CE_WARN, "%s did not register with the " + "Cryptographic Framework. (0x%x)", + info->pi_provider_description, ret); + }; + } + return (ret); } @@ -450,10 +497,14 @@ crypto_unregister_provider(crypto_kcf_provider_handle_t handle) uint_t mech_idx; kcf_provider_desc_t *desc; kcf_prov_state_t saved_state; + int ret = CRYPTO_SUCCESS; /* lookup provider descriptor */ - if ((desc = kcf_prov_tab_lookup((crypto_provider_id_t)handle)) == NULL) - return (CRYPTO_UNKNOWN_PROVIDER); + if ((desc = kcf_prov_tab_lookup((crypto_provider_id_t)handle)) == + NULL) { + ret = CRYPTO_UNKNOWN_PROVIDER; + goto errormsg; + } mutex_enter(&desc->pd_lock); /* @@ -464,7 +515,8 @@ crypto_unregister_provider(crypto_kcf_provider_handle_t handle) mutex_exit(&desc->pd_lock); /* Release reference held by kcf_prov_tab_lookup(). */ KCF_PROV_REFRELE(desc); - return (CRYPTO_BUSY); + ret = CRYPTO_BUSY; + goto errormsg; } saved_state = desc->pd_state; @@ -498,7 +550,8 @@ crypto_unregister_provider(crypto_kcf_provider_handle_t handle) CRYPTO_SUCCESS) { /* Release reference held by kcf_prov_tab_lookup(). */ KCF_PROV_REFRELE(desc); - return (CRYPTO_UNKNOWN_PROVIDER); + ret = CRYPTO_UNKNOWN_PROVIDER; + goto errormsg; } delete_kstat(desc); @@ -560,7 +613,29 @@ crypto_unregister_provider(crypto_kcf_provider_handle_t handle) mutex_exit(&prov_tab_mutex); } - return (CRYPTO_SUCCESS); +errormsg: + if (ret != CRYPTO_SUCCESS && sys_shutdown == 0) { + switch (ret) { + case CRYPTO_UNKNOWN_PROVIDER: + cmn_err(CE_WARN, "Unknown provider \"%s\" was " + "requested to unregister from the cryptographic " + "framework.", desc->pd_description); + break; + + case CRYPTO_BUSY: + cmn_err(CE_WARN, "%s could not be unregistered from " + "the Cryptographic Framework as it is busy.", + desc->pd_description); + break; + + default: + cmn_err(CE_WARN, "%s did not unregister with the " + "Cryptographic Framework. (0x%x)", + desc->pd_description, ret); + }; + } + + return (ret); } /* |