You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

249 lines
6.3 KiB

/*
* Copyright (c) Hisilicon Technologies Co., Ltd. 2019-2021. All rights reserved.
* Description: tsr2rcipher drv func impl.
* Author: Hisilicon
* Create: 2019-08-02
*/
#include "td_type.h"
#include "soc_log.h"
#include "drv_tsr2rcipher_ext.h"
#include "drv_tsr2rcipher_func.h"
#include "drv_tsr2rcipher_utils.h"
td_s32 ext_drv_tsr2rcipher_get_capability(tsr2rcipher_capability *cap)
{
td_s32 ret;
if (cap == TD_NULL) {
soc_log_err("invalid parameter.\n");
ret = SOC_ERR_TSR2RCIPHER_INVALID_PARA;
goto out;
}
ret = tsr2rcipher_mgmt_get_cap(cap);
out:
return ret;
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_get_capability);
td_s32 ext_drv_tsr2rcipher_create_session(struct tsr2rcipher_session **new_session)
{
td_s32 ret;
if (new_session == TD_NULL) {
soc_log_err("invalid parameter.\n");
ret = SOC_ERR_TSR2RCIPHER_INVALID_PARA;
goto out;
}
ret = tsr2rcipher_session_create(new_session);
out:
return ret;
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_create_session);
td_s32 ext_drv_tsr2rcipher_destroy_session(struct tsr2rcipher_session *session)
{
td_s32 ret;
if (session == TD_NULL) {
soc_log_err("invalid parameter.\n");
ret = SOC_ERR_TSR2RCIPHER_INVALID_PARA;
goto out;
}
ret = tsr2rcipher_session_destroy(session);
out:
return ret;
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_destroy_session);
td_s32 ext_drv_tsr2rcipher_create(const tsr2rcipher_attr *tsc_attr, td_handle *handle,
struct tsr2rcipher_session *session)
{
td_s32 ret;
if ((handle == TD_NULL) || (session == TD_NULL) || (tsc_attr == TD_NULL)) {
soc_log_err("invalid parameter.\n");
ret = SOC_ERR_TSR2RCIPHER_INVALID_PARA;
goto out;
}
ret = tsr2rcipher_ch_create(tsc_attr, handle, session);
out:
return ret;
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_create);
td_s32 ext_drv_tsr2rcipher_get_attr(td_handle handle, tsr2rcipher_attr *tsc_attr)
{
td_s32 ret;
check_handle(handle);
if (tsc_attr == TD_NULL) {
soc_log_err("invalid parameter.\n");
ret = SOC_ERR_TSR2RCIPHER_INVALID_PARA;
goto out;
}
ret = tsr2rcipher_ch_get_attr(handle, tsc_attr);
out:
return ret;
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_get_attr);
td_s32 ext_drv_tsr2rcipher_set_attr(td_handle handle, const tsr2rcipher_attr *tsc_attr)
{
td_s32 ret;
check_handle(handle);
if (tsc_attr == TD_NULL) {
soc_log_err("invalid parameter.\n");
ret = SOC_ERR_TSR2RCIPHER_INVALID_PARA;
goto out;
}
ret = tsr2rcipher_ch_set_attr(handle, tsc_attr);
out:
return ret;
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_set_attr);
td_s32 ext_drv_tsr2rcipher_get_keyslot_handle(td_handle tsc_handle, td_handle *ks_handle)
{
td_s32 ret;
check_handle(tsc_handle);
if (ks_handle == TD_NULL) {
soc_log_err("invalid parameter.\n");
ret = SOC_ERR_TSR2RCIPHER_INVALID_PARA;
goto out;
}
ret = tsr2rcipher_ch_get_ks_handle(tsc_handle, ks_handle);
out:
return ret;
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_get_keyslot_handle);
td_s32 ext_drv_tsr2rcipher_attach_keyslot(td_handle tsc_handle, td_handle ks_handle)
{
check_handle(tsc_handle);
check_ks(ks_handle);
return tsr2rcipher_ch_attach_ks(tsc_handle, ks_handle);
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_attach_keyslot);
td_s32 ext_drv_tsr2rcipher_detach_keyslot(td_handle tsc_handle, td_handle ks_handle)
{
check_handle(tsc_handle);
check_ks(ks_handle);
return tsr2rcipher_ch_detach_ks(tsc_handle, ks_handle);
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_detach_keyslot);
td_s32 ext_drv_tsr2rcipher_set_iv(td_handle handle, tsr2rcipher_iv_type iv_type, const td_u8 *iv, td_u32 iv_len)
{
td_s32 ret;
check_handle(handle);
if ((iv == TD_NULL) || (iv_len < TSR2RCIPHER_MIN_IV_LEN) || (iv_len > TSR2RCIPHER_MAX_IV_LEN) ||
(iv_type >= TSR2RCIPHER_IV_MAX)) {
soc_log_err("invalid parameter. IV[%#x], ivlen[%#x], ivtype[%#x]\n", iv, iv_len, iv_type);
ret = SOC_ERR_TSR2RCIPHER_INVALID_PARA;
goto out;
}
ret = tsr2rcipher_ch_set_iv(handle, iv_type, iv, iv_len);
out:
return ret;
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_set_iv);
static td_s32 drv_tsr2rcipher_trim_data_args(td_mem_handle_t src_buf_handle, td_mem_handle_t dst_buf_handle, td_u32 len)
{
if ((len < TSR2RCIPHER_TS_PACKAGE_LEN) || (len > TSR2RCIPHER_MAX_SIZE_PRE_DESC) ||
(len % TSR2RCIPHER_TS_PACKAGE_LEN)) {
soc_log_err("data len = 0x%x is invalid, correct rang is (0x%x ~ 0x%x ), or not 188 times\n",
len, TSR2RCIPHER_TS_PACKAGE_LEN, TSR2RCIPHER_MAX_SIZE_PRE_DESC);
return SOC_ERR_TSR2RCIPHER_INVALID_PARA;
}
if (src_buf_handle < 0 || dst_buf_handle < 0) {
soc_log_err("src_buf_handle[%d] or dst_buf_handle[%d] is invalid!\n",
src_buf_handle, dst_buf_handle);
return SOC_ERR_TSR2RCIPHER_INVALID_PARA;
}
return TD_SUCCESS;
}
td_s32 ext_drv_tsr2rcipher_encrypt(td_handle handle, tsr2rcipher_mem_handle src_mem_handle,
tsr2rcipher_mem_handle dst_mem_handle, td_u32 data_len)
{
td_s32 ret;
check_handle(handle);
ret = drv_tsr2rcipher_trim_data_args(src_mem_handle.mem_handle, dst_mem_handle.mem_handle, data_len);
if (ret != TD_SUCCESS) {
goto out;
}
ret = tsr2rcipher_ch_encrypt(handle, src_mem_handle, dst_mem_handle, data_len);
out:
return ret;
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_encrypt);
td_s32 ext_drv_tsr2rcipher_decrypt(td_handle handle, tsr2rcipher_mem_handle src_mem_handle,
tsr2rcipher_mem_handle dst_mem_handle, td_u32 data_len)
{
td_s32 ret;
check_handle(handle);
ret = drv_tsr2rcipher_trim_data_args(src_mem_handle.mem_handle, dst_mem_handle.mem_handle, data_len);
if (ret != TD_SUCCESS) {
goto out;
}
ret = tsr2rcipher_ch_decrypt(handle, src_mem_handle, dst_mem_handle, data_len);
out:
return ret;
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_decrypt);
td_s32 ext_drv_tsr2rcipher_destroy(td_handle handle)
{
check_handle(handle);
return tsr2rcipher_ch_destroy(handle);
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_destroy);
td_s32 ext_drv_tsr2rcipher_suspend(td_void)
{
return tsr2rcipher_mgmt_suspend();
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_suspend);
td_s32 ext_drv_tsr2rcipher_resume(td_void)
{
return tsr2rcipher_mgmt_resume();
}
EXPORT_SYMBOL(ext_drv_tsr2rcipher_resume);