summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/crypto/spi/kcf_spi.c
diff options
context:
space:
mode:
authorJanie Lu <Janie.Lu@Sun.COM>2009-12-11 10:41:17 -0800
committerJanie Lu <Janie.Lu@Sun.COM>2009-12-11 10:41:17 -0800
commit4df55fde49134f9735f84011f23a767c75e393c7 (patch)
treec931c232038f950125a092f71e687cd653485b16 /usr/src/uts/common/crypto/spi/kcf_spi.c
parent93fcb0b9b3e0792a42d10584632c1c566f89d64a (diff)
downloadillumos-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.c61
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, &params,
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(&params,
+ KCF_OP_MGMT_EXTINFO,
+ 0, NULL, 0, NULL, 0, NULL, &ext_info, prov_desc);
+ ret = kcf_submit_request(prov_desc, NULL, NULL,
+ &params, 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;