/* * See comments for crypto_mac_update() and crypto_mac_final(). */ int crypto_mac_single(crypto_context_t context, crypto_data_t *data, crypto_data_t *mac, crypto_call_req_t *cr) { crypto_ctx_t *ctx = (crypto_ctx_t *)context; kcf_context_t *kcf_ctx; kcf_provider_desc_t *pd; int error; kcf_req_params_t params; if ((ctx == NULL) || ((kcf_ctx = (kcf_context_t *)ctx->cc_framework_private) == NULL) || ((pd = kcf_ctx->kc_prov_desc) == NULL)) { return (CRYPTO_INVALID_CONTEXT); } /* The fast path for SW providers. */ if (CHECK_FASTPATH(cr, pd)) { error = KCF_PROV_MAC(pd, ctx, data, mac, NULL); KCF_PROV_INCRSTATS(pd, error); } else { KCF_WRAP_MAC_OPS_PARAMS(¶ms, KCF_OP_SINGLE, pd->pd_sid, NULL, NULL, data, mac, NULL); error = kcf_submit_request(pd, ctx, cr, ¶ms, B_FALSE); } /* Release the hold done in kcf_new_ctx() during init step. */ KCF_CONTEXT_COND_RELEASE(error, kcf_ctx); return (error); }
int crypto_sign_recover_single(crypto_context_t context, crypto_data_t *data, crypto_data_t *signature, crypto_call_req_t *cr) { crypto_ctx_t *ctx = (crypto_ctx_t *)context; kcf_context_t *kcf_ctx; kcf_provider_desc_t *pd; int error; kcf_req_params_t params; if ((ctx == NULL) || ((kcf_ctx = (kcf_context_t *)ctx->cc_framework_private) == NULL) || ((pd = kcf_ctx->kc_prov_desc) == NULL)) { return (CRYPTO_INVALID_CONTEXT); } KCF_PROV_REFHOLD(pd); KCF_WRAP_SIGN_OPS_PARAMS(¶ms, KCF_OP_SIGN_RECOVER, 0, NULL, NULL, data, signature, NULL); error = kcf_submit_request(pd, ctx, cr, ¶ms, B_FALSE); KCF_PROV_REFRELE(pd); /* Release the hold done in kcf_new_ctx() during init step. */ KCF_CONTEXT_COND_RELEASE(error, kcf_ctx); return (error); }
/* * crypto_mac_final() * * Arguments: * context: A crypto_context_t initialized by mac_init(). * mac: Storage for the message authentication code. * cr: crypto_call_req_t calling conditions and call back info. * * Description: * Asynchronously submits a request for, or synchronously performs a * part of a message authentication operation. * * Context: * Process or interrupt, according to the semantics dictated by the 'cr'. * * Returns: * See comment in the beginning of the file. */ int crypto_mac_final(crypto_context_t context, crypto_data_t *mac, crypto_call_req_t *cr) { crypto_ctx_t *ctx = (crypto_ctx_t *)context; kcf_context_t *kcf_ctx; kcf_provider_desc_t *pd; kcf_req_params_t params; int rv; if ((ctx == NULL) || ((kcf_ctx = (kcf_context_t *)ctx->cc_framework_private) == NULL) || ((pd = kcf_ctx->kc_prov_desc) == NULL)) { return (CRYPTO_INVALID_CONTEXT); } ASSERT(pd->pd_prov_type != CRYPTO_LOGICAL_PROVIDER); /* The fast path for SW providers. */ if (CHECK_FASTPATH(cr, pd)) { rv = KCF_PROV_MAC_FINAL(pd, ctx, mac, NULL); KCF_PROV_INCRSTATS(pd, rv); } else { KCF_WRAP_MAC_OPS_PARAMS(¶ms, KCF_OP_FINAL, ctx->cc_session, NULL, NULL, NULL, mac, NULL); rv = kcf_submit_request(pd, ctx, cr, ¶ms, B_FALSE); } /* Release the hold done in kcf_new_ctx() during init step. */ KCF_CONTEXT_COND_RELEASE(rv, kcf_ctx); return (rv); }
/* * See comments for crypto_digest_final(). */ int crypto_sign_final(crypto_context_t context, crypto_data_t *signature, crypto_call_req_t *cr) { crypto_ctx_t *ctx = (crypto_ctx_t *)context; kcf_context_t *kcf_ctx; kcf_provider_desc_t *pd; int rv; kcf_req_params_t params; if ((ctx == NULL) || ((kcf_ctx = (kcf_context_t *)ctx->cc_framework_private) == NULL) || ((pd = kcf_ctx->kc_prov_desc) == NULL)) { return (CRYPTO_INVALID_CONTEXT); } ASSERT(pd->pd_prov_type != CRYPTO_LOGICAL_PROVIDER); KCF_PROV_REFHOLD(pd); KCF_WRAP_SIGN_OPS_PARAMS(¶ms, KCF_OP_FINAL, ctx->cc_session, NULL, NULL, NULL, signature, NULL); rv = kcf_submit_request(pd, ctx, cr, ¶ms, B_FALSE); KCF_PROV_REFRELE(pd); /* Release the hold done in kcf_new_ctx() during init step. */ KCF_CONTEXT_COND_RELEASE(rv, kcf_ctx); return (rv); }