📄 chedrv.c
字号:
/*Read the ckey to aes engine*/
che_input_ckey((kal_uint32)ckey);
/*Detail src/dst/length*/
CHE_REGSET_SRC((kal_uint32)srcData); /*src*/
CHE_REGSET_DST((kal_uint32)encryptedData); /*dst*/
CHE_REGSET_LEN((kal_uint32)data_length); /*length*/
CHE_REGSET_SADDR((kal_uint32)che_glb_data[handle].che_hw_status);
if (last_block)
{
CHE_REGSET_START((CHE_START_STUD|CHE_START_LAST));
che_wait_status_complete(data_length,KAL_TRUE, __LINE__);
}
else
{
CHE_REGSET_START((CHE_START_WSTAT|CHE_START_STUD));
che_wait_status_complete(data_length,KAL_FALSE, __LINE__);
}
CHE_REGSET_START(CHE_START_DONE);
}
void des_cipher_next(kal_uint8 handle, CHE_TYPE che_type, kal_uint8 *srcData, kal_uint8 *encryptedData, kal_uint32 data_length, kal_bool last_block)
{
/*if decryptedData == NULL, the dstination address will follow previous destination address.*/
kal_uint32 UPDES = 0;
/*1s: 1M bytes*/
switch(che_type)
{
case CHE_DES_CBC_ENC:
CHE_REGSET_CON((CHE_CON_ATYPE_DES|CHE_CON_CIPHER|CHE_CON_SMODE_CBC));
break;
case CHE_DES_ECB_ENC:
CHE_REGSET_CON((CHE_CON_ATYPE_DES|CHE_CON_CIPHER|CHE_CON_SMODE_ECB));
break;
case CHE_3DES_CBC_ENC:
CHE_REGSET_CON((CHE_CON_ATYPE_3DES|CHE_CON_CIPHER|CHE_CON_SMODE_CBC));
break;
case CHE_3DES_ECB_ENC:
CHE_REGSET_CON((CHE_CON_ATYPE_3DES|CHE_CON_CIPHER|CHE_CON_SMODE_ECB));
break;
default:
ASSERT(0);
}
/*Detail src/dst/length*/
CHE_REGSET_SRC((kal_uint32)srcData); /*src*/
if (encryptedData != NULL)
{
CHE_REGSET_DST((kal_uint32)encryptedData); /*dst*/
UPDES = CHE_START_UPDES;
}
CHE_REGSET_LEN((kal_uint32)data_length); /*length*/
CHE_REGSET_SADDR((kal_uint32)che_glb_data[handle].che_hw_status);
if (last_block)
{
CHE_REGSET_START((CHE_START_RSTAT|CHE_START_STUD|CHE_START_LAST|UPDES));
che_wait_status_complete(data_length,KAL_TRUE, __LINE__);
}
else
{
CHE_REGSET_START((CHE_START_RSTAT|CHE_START_WSTAT|CHE_START_STUD|UPDES));
che_wait_status_complete(data_length,KAL_FALSE, __LINE__);
}
CHE_REGSET_START(CHE_START_DONE);
}
kal_uint32 drv_cipher(kal_uint8 handle,
CHE_TYPE che_type,
kal_uint8 *che_iv,
kal_uint8 *ckey,
kal_uint8 *srcData,
kal_uint8 *encryptedData,
kal_uint32 data_length,
kal_bool last_block)
{
kal_uint32 decipher_bytes;
ASSERT(encryptedData != NULL);
ASSERT(che_cb.che_machie_running == KAL_FALSE);
che_cb.che_machie_running = KAL_TRUE;
CHE_PDN_DISABLE(handle);
ASSERT((((kal_uint32)ckey)&0x03)==0);
che_glb_data[handle].che_last_block = last_block;
che_glb_data[handle].che_type = che_type;
che_glb_data[handle].total_length = data_length;
CHE_REGSET_START(CHE_START_CLEAR);
CHE_REGSET_START(CHE_START_DONE);
switch(che_type)
{
case CHE_DES_CBC_ENC:
case CHE_DES_ECB_ENC:
case CHE_3DES_CBC_ENC:
case CHE_3DES_ECB_ENC:
des_cipher(handle,che_type,che_iv,ckey,srcData,encryptedData,data_length,last_block);
break;
case CHE_AES_CBC_ENC_128:
case CHE_AES_CBC_ENC_192:
case CHE_AES_CBC_ENC_256:
case CHE_AES_ECB_ENC_128:
case CHE_AES_ECB_ENC_192:
case CHE_AES_ECB_ENC_256:
aes_cipher(handle,che_type,che_iv,ckey,srcData,encryptedData,data_length,last_block);
break;
default:
ASSERT(0);
}
che_glb_data[handle].che_last_handle = che_cb.che_lastest_finish_handle;
che_cb.che_lastest_finish_handle = handle;
che_cb.che_machie_running = KAL_FALSE;
decipher_bytes = DRV_Reg32(CHE_CDES) - (kal_uint32)encryptedData;
if (last_block != 1)
{
che_glb_data[handle].keep_dst_addr = KAL_TRUE;
che_glb_data[handle].keep_dst_addr_value = DRV_Reg32(CHE_CDES);
}
CHE_PDN_ENABLE(handle);
return decipher_bytes;
}
kal_uint32 drv_cipher_next(kal_uint8 handle,
CHE_TYPE che_type,
kal_uint8 *srcData,
kal_uint8 *encryptedData,
kal_uint32 data_length,
kal_bool last_block)
{
kal_uint32 decipher_bytes;
ASSERT(che_cb.che_machie_running == KAL_FALSE);
che_cb.che_machie_running = KAL_TRUE;
CHE_PDN_DISABLE(handle);
che_glb_data[handle].che_type = che_type;
ASSERT(che_glb_data[handle].che_last_block == KAL_FALSE);
che_glb_data[handle].che_last_block = last_block;
che_glb_data[handle].total_length += data_length;
switch(che_type)
{
case CHE_DES_CBC_ENC:
case CHE_DES_ECB_ENC:
case CHE_3DES_CBC_ENC:
case CHE_3DES_ECB_ENC:
des_cipher_next(handle,che_type,srcData,encryptedData,data_length,last_block);
break;
case CHE_AES_CBC_ENC_128:
case CHE_AES_CBC_ENC_192:
case CHE_AES_CBC_ENC_256:
case CHE_AES_ECB_ENC_128:
case CHE_AES_ECB_ENC_192:
case CHE_AES_ECB_ENC_256:
aes_cipher_next(handle,che_type,srcData,encryptedData,data_length,last_block);
break;
default:
ASSERT(0);
}
che_glb_data[handle].che_last_handle = che_cb.che_lastest_finish_handle;
che_cb.che_lastest_finish_handle = handle;
che_cb.che_machie_running = KAL_FALSE;
if (encryptedData != NULL)
decipher_bytes = DRV_Reg32(CHE_CDES) - (kal_uint32)encryptedData;
else
{
ASSERT(che_glb_data[handle].keep_dst_addr == KAL_TRUE);
decipher_bytes = DRV_Reg32(CHE_CDES) - che_glb_data[handle].keep_dst_addr_value;
}
if (encryptedData != NULL)
{
che_glb_data[handle].keep_dst_addr = KAL_FALSE;
che_glb_data[handle].keep_dst_addr_value = 0;
}
else
{
che_glb_data[handle].keep_dst_addr = KAL_TRUE;
che_glb_data[handle].keep_dst_addr_value = DRV_Reg32(CHE_CDES);
}
CHE_PDN_ENABLE(handle);
return decipher_bytes;
}
kal_uint32 drv_hash(kal_uint8 handle,
CHE_TYPE che_type,
kal_uint8 *srcData,
kal_uint8 *output_data,
kal_uint32 data_length,
kal_bool last_block)
{
kal_uint32 hash_bytes;
ASSERT(output_data != NULL);
ASSERT(che_cb.che_machie_running == KAL_FALSE);
che_cb.che_machie_running = KAL_TRUE;
CHE_PDN_DISABLE(handle);
che_glb_data[handle].che_last_block = last_block;
che_glb_data[handle].che_type = che_type;
che_glb_data[handle].total_length = data_length;
CHE_REGSET_START(CHE_START_CLEAR);
CHE_REGSET_START(CHE_START_DONE);
switch(che_type)
{
case CHE_MD5:
CHE_REGSET_CON((CHE_CON_ATYPE_MD5));
break;
case CHE_SHA1:
CHE_REGSET_CON((CHE_CON_ATYPE_SHA1));
break;
default:
ASSERT(0);
}
/*Detail src/dst/length*/
CHE_REGSET_SRC((kal_uint32)srcData); /*src*/
CHE_REGSET_DST((kal_uint32)output_data); /*dst*/
CHE_REGSET_LEN((kal_uint32)data_length); /*length*/
CHE_REGSET_SADDR((kal_uint32)che_glb_data[handle].che_hw_status);
if (last_block)
{
CHE_REGSET_START((CHE_START_STUD|CHE_START_LAST));
che_wait_status_complete(data_length,KAL_TRUE, __LINE__);
}
else
{
CHE_REGSET_START((CHE_START_WSTAT|CHE_START_STUD));
che_wait_status_complete(data_length,KAL_FALSE, __LINE__);
che_glb_data[handle].keep_dst_addr = KAL_TRUE;
che_glb_data[handle].keep_dst_addr_value = DRV_Reg32(CHE_CDES);
}
CHE_REGSET_START(CHE_START_DONE);
che_glb_data[handle].che_last_handle = che_cb.che_lastest_finish_handle;
che_cb.che_lastest_finish_handle = handle;
che_cb.che_machie_running = KAL_FALSE;
hash_bytes = DRV_Reg32(CHE_CDES) - (kal_uint32)output_data;
CHE_PDN_ENABLE(handle);
return hash_bytes;
}
kal_uint32 drv_hash_next(kal_uint8 handle,
CHE_TYPE che_type,
kal_uint8 *srcData,
kal_uint8 *output_data,
kal_uint32 data_length,
kal_bool last_block)
{
kal_uint32 hash_bytes;
kal_uint32 UPDES;
ASSERT(che_cb.che_machie_running == KAL_FALSE);
che_cb.che_machie_running = KAL_TRUE;
CHE_PDN_DISABLE(handle);
che_glb_data[handle].che_type = che_type;
ASSERT(che_glb_data[handle].che_last_block == KAL_FALSE);
che_glb_data[handle].che_last_block = last_block;
che_glb_data[handle].total_length += data_length;
switch(che_type)
{
case CHE_MD5:
CHE_REGSET_CON(CHE_CON_ATYPE_MD5);
break;
case CHE_SHA1:
CHE_REGSET_CON(CHE_CON_ATYPE_SHA1);
break;
default:
ASSERT(0);
}
/*Detail src/dst/length*/
CHE_REGSET_SRC((kal_uint32)srcData); /*src*/
if (output_data != NULL)
{
CHE_REGSET_DST((kal_uint32)output_data); /*dst*/
UPDES = CHE_START_UPDES;
}
CHE_REGSET_LEN((kal_uint32)data_length); /*length*/
CHE_REGSET_SADDR((kal_uint32)che_glb_data[handle].che_hw_status);
if (last_block)
{
CHE_REGSET_START((CHE_START_RSTAT|CHE_START_STUD|CHE_START_LAST|UPDES));
che_wait_status_complete(data_length,KAL_TRUE, __LINE__);
}
else
{
CHE_REGSET_START((CHE_START_RSTAT|CHE_START_WSTAT|CHE_START_STUD|UPDES));
che_wait_status_complete(data_length,KAL_FALSE, __LINE__);
}
CHE_REGSET_START(CHE_START_DONE);
che_glb_data[handle].che_last_handle = che_cb.che_lastest_finish_handle;
che_cb.che_lastest_finish_handle = handle;
che_cb.che_machie_running = KAL_FALSE;
if (output_data != NULL)
hash_bytes = DRV_Reg32(CHE_CDES) - (kal_uint32)output_data;
else
{
ASSERT(che_glb_data[handle].keep_dst_addr == KAL_TRUE);
hash_bytes = DRV_Reg32(CHE_CDES) - che_glb_data[handle].keep_dst_addr_value;
}
if (output_data != NULL)
{
che_glb_data[handle].keep_dst_addr = KAL_FALSE;
che_glb_data[handle].keep_dst_addr_value = 0;
}
else
{
che_glb_data[handle].keep_dst_addr = KAL_TRUE;
che_glb_data[handle].keep_dst_addr_value = DRV_Reg32(CHE_CDES);
}
CHE_PDN_ENABLE(handle);
return hash_bytes;
}
#else /*__HW_CHE__*/
void che_init(void)
{
}
void che_slowdown(void)
{
}
void che_recover(void)
{
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -