diff options
author | Janie Lu <Janie.Lu@Sun.COM> | 2009-12-11 10:41:17 -0800 |
---|---|---|
committer | Janie Lu <Janie.Lu@Sun.COM> | 2009-12-11 10:41:17 -0800 |
commit | 4df55fde49134f9735f84011f23a767c75e393c7 (patch) | |
tree | c931c232038f950125a092f71e687cd653485b16 /usr/src/uts/common/crypto/spi/kcf_spi.c | |
parent | 93fcb0b9b3e0792a42d10584632c1c566f89d64a (diff) | |
download | illumos-joyent-4df55fde49134f9735f84011f23a767c75e393c7.tar.gz |
FWARC 2008/613 KT IOS Performance Counters API
FWARC 2008/615 KT Perf Reg HV API
FWARC 2009/434 KT IOS Performance Counters API Update
FWARC 2009/567 Parallel Boot HV APIs
PSARC 2009/177 Solaris support for Rainbow Falls platforms
PSARC 2009/389 Sun4v faulted SP events extension
PSARC 2009/533 CRYPTO_HMAC_NO_UPDATE - A new KCF SPI flag
PSARC 2009/605 more sun4v platform-independent cpu/mem FMA events
PSARC 2009/649 Generic PCIe root complex FMA events
6704999 extend xaui enum to work in platform independent world
6773223 RFE: guest epkt for faulted SP
6773225 RFE: Diagnosis of a faulted SP
6797776 Solaris support for Rainbow Falls platforms
Diffstat (limited to 'usr/src/uts/common/crypto/spi/kcf_spi.c')
-rw-r--r-- | usr/src/uts/common/crypto/spi/kcf_spi.c | 61 |
1 files changed, 37 insertions, 24 deletions
diff --git a/usr/src/uts/common/crypto/spi/kcf_spi.c b/usr/src/uts/common/crypto/spi/kcf_spi.c index c43cd34ed7..2634ed3624 100644 --- a/usr/src/uts/common/crypto/spi/kcf_spi.c +++ b/usr/src/uts/common/crypto/spi/kcf_spi.c @@ -276,7 +276,7 @@ crypto_register_provider(crypto_provider_info_t *info, else prov_desc->pd_taskq = NULL; - /* no kernel session to logical providers */ + /* no kernel session to logical providers and no pd_flags */ if (prov_desc->pd_prov_type != CRYPTO_LOGICAL_PROVIDER) { /* * Open a session for session-oriented providers. This session @@ -293,11 +293,38 @@ crypto_register_provider(crypto_provider_info_t *info, CRYPTO_USER, NULL, 0, prov_desc); ret = kcf_submit_request(prov_desc, NULL, NULL, ¶ms, B_FALSE); + if (ret != CRYPTO_SUCCESS) + goto undo_then_bail; + } - if (ret != CRYPTO_SUCCESS) { - undo_register_provider(prov_desc, B_TRUE); - ret = CRYPTO_FAILED; - goto bail; + /* + * Get the value for the maximum input length allowed if + * CRYPTO_HASH_NO_UPDATE or CRYPTO_HASH_NO_UPDATE is specified. + */ + if (prov_desc->pd_flags & + (CRYPTO_HASH_NO_UPDATE | CRYPTO_HMAC_NO_UPDATE)) { + kcf_req_params_t params; + crypto_provider_ext_info_t ext_info; + + if (KCF_PROV_PROVMGMT_OPS(prov_desc) == NULL) + goto undo_then_bail; + + bzero(&ext_info, sizeof (ext_info)); + KCF_WRAP_PROVMGMT_OPS_PARAMS(¶ms, + KCF_OP_MGMT_EXTINFO, + 0, NULL, 0, NULL, 0, NULL, &ext_info, prov_desc); + ret = kcf_submit_request(prov_desc, NULL, NULL, + ¶ms, B_FALSE); + if (ret != CRYPTO_SUCCESS) + goto undo_then_bail; + + if (prov_desc->pd_flags & CRYPTO_HASH_NO_UPDATE) { + prov_desc->pd_hash_limit = + ext_info.ei_hash_max_input_len; + } + if (prov_desc->pd_flags & CRYPTO_HMAC_NO_UPDATE) { + prov_desc->pd_hmac_limit = + ext_info.ei_hmac_max_input_len; } } } @@ -380,8 +407,12 @@ crypto_register_provider(crypto_provider_info_t *info, exit: *handle = prov_desc->pd_kcf_prov_handle; - ret = CRYPTO_SUCCESS; + KCF_PROV_REFRELE(prov_desc); + return (CRYPTO_SUCCESS); +undo_then_bail: + undo_register_provider(prov_desc, B_TRUE); + ret = CRYPTO_FAILED; bail: KCF_PROV_REFRELE(prov_desc); return (ret); @@ -746,24 +777,6 @@ init_prov_mechs(crypto_provider_info_t *info, kcf_provider_desc_t *desc) break; } - if (desc->pd_flags & CRYPTO_HASH_NO_UPDATE && - mi->cm_func_group_mask & CRYPTO_FG_DIGEST) { - /* - * We ask the provider to specify the limit - * per hash mechanism. But, in practice, a - * hardware limitation means all hash mechanisms - * will have the same maximum size allowed for - * input data. So, we make it a per provider - * limit to keep it simple. - */ - if (mi->cm_max_input_length == 0) { - err = CRYPTO_ARGUMENTS_BAD; - break; - } else { - desc->pd_hash_limit = mi->cm_max_input_length; - } - } - if ((err = kcf_add_mech_provider(mech_idx, desc, &pmd)) != KCF_SUCCESS) break; |