📄 chedrv.c
字号:
else if (che_type == CHE_DES_ECB_ENC)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_DES|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
}
if ((((kal_uint32)key)&0x03)==0)
{
che_update_key0_1(*(kal_uint32 *)(key+0x0),
*(kal_uint32 *)(key+0x4) );
}
else
{
che_update_key0_1(( (*(key+0x0)) | (*(key+0x1)<<8) | (*(key+0x2)<<16) | (*(key+0x3)<<24) ),
( (*(key+0x4)) | (*(key+0x5)<<8) | (*(key+0x6)<<16) | (*(key+0x7)<<24) ) );
}
break;
case CHE_3DES_ECB_ENC:
case CHE_3DES_CBC_ENC:
case CHE_3DES_ECB_DEC:
case CHE_3DES_CBC_DEC:
if (che_type == CHE_3DES_CBC_DEC)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
}
else if (che_type == CHE_3DES_ECB_DEC)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
}
else if (che_type == CHE_3DES_CBC_ENC)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
}
else if (che_type == CHE_3DES_ECB_ENC)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
}
if ((((kal_uint32)key)&0x03)==0)
{
che_update_key0_3(*(kal_uint32 *)(key+0x0),
*(kal_uint32 *)(key+0x4),
*(kal_uint32 *)(key+0x8),
*(kal_uint32 *)(key+0xc) );
che_update_key4_5(*(kal_uint32 *)(key+0x10),
*(kal_uint32 *)(key+0x14) );
}
else
{
che_update_key0_3(( (*(key+0x0)) | (*(key+0x1)<<8) | (*(key+0x2)<<16) | (*(key+0x3)<<24) ),
( (*(key+0x4)) | (*(key+0x5)<<8) | (*(key+0x6)<<16) | (*(key+0x7)<<24) ),
( (*(key+0x8)) | (*(key+0x9)<<8) | (*(key+0xa)<<16) | (*(key+0xb)<<24) ),
( (*(key+0xc)) | (*(key+0xd)<<8) | (*(key+0xe)<<16) | (*(key+0xf)<<24) ) );
che_update_key4_5(( (*(key+0x10)) | (*(key+0x11)<<8) | (*(key+0x12)<<16) | (*(key+0x13)<<24) ),
( (*(key+0x14)) | (*(key+0x15)<<8) | (*(key+0x16)<<16) | (*(key+0x17)<<24) ) );
}
break;
case CHE_AES_ECB_ENC_128:
case CHE_AES_CBC_ENC_128:
case CHE_AES_ECB_DEC_128:
case CHE_AES_CBC_DEC_128:
if (che_type == CHE_AES_CBC_DEC_128)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
}
else if (che_type == CHE_AES_ECB_DEC_128)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
}
else if (che_type == CHE_AES_CBC_ENC_128)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
}
else if (che_type == CHE_AES_ECB_ENC_128)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
}
if ((((kal_uint32)key)&0x03)==0)
{
che_update_key0_3(*(kal_uint32 *)(key+0x0),
*(kal_uint32 *)(key+0x4),
*(kal_uint32 *)(key+0x8),
*(kal_uint32 *)(key+0xc) );
}
else
{
che_update_key0_3(( (*(key+0x0)) | (*(key+0x1)<<8) | (*(key+0x2)<<16) | (*(key+0x3)<<24) ),
( (*(key+0x4)) | (*(key+0x5)<<8) | (*(key+0x6)<<16) | (*(key+0x7)<<24) ),
( (*(key+0x8)) | (*(key+0x9)<<8) | (*(key+0xa)<<16) | (*(key+0xb)<<24) ),
( (*(key+0xc)) | (*(key+0xd)<<8) | (*(key+0xe)<<16) | (*(key+0xf)<<24) ) );
}
break;
case CHE_AES_ECB_ENC_192:
case CHE_AES_CBC_ENC_192:
case CHE_AES_ECB_DEC_192:
case CHE_AES_CBC_DEC_192:
if (che_type == CHE_AES_CBC_DEC_192)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
}
else if (che_type == CHE_AES_ECB_DEC_192)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
}
else if (che_type == CHE_AES_CBC_ENC_192)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
}
else if (che_type == CHE_AES_ECB_ENC_192)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
}
if ((((kal_uint32)key)&0x03)==0)
{
che_update_key0_3(*(kal_uint32 *)(key+0x0),
*(kal_uint32 *)(key+0x4),
*(kal_uint32 *)(key+0x8),
*(kal_uint32 *)(key+0xc) );
che_update_key4_5(*(kal_uint32 *)(key+0x10),
*(kal_uint32 *)(key+0x14) );
}
else
{
che_update_key0_3(( (*(key+0x0)) | (*(key+0x1)<<8) | (*(key+0x2)<<16) | (*(key+0x3)<<24) ),
( (*(key+0x4)) | (*(key+0x5)<<8) | (*(key+0x6)<<16) | (*(key+0x7)<<24) ),
( (*(key+0x8)) | (*(key+0x9)<<8) | (*(key+0xa)<<16) | (*(key+0xb)<<24) ),
( (*(key+0xc)) | (*(key+0xd)<<8) | (*(key+0xe)<<16) | (*(key+0xf)<<24) ) );
che_update_key4_5(( (*(key+0x10)) | (*(key+0x11)<<8) | (*(key+0x12)<<16) | (*(key+0x13)<<24) ),
( (*(key+0x14)) | (*(key+0x15)<<8) | (*(key+0x16)<<16) | (*(key+0x17)<<24) ) );
}
break;
case CHE_AES_ECB_ENC_256:
case CHE_AES_CBC_ENC_256:
case CHE_AES_ECB_DEC_256:
case CHE_AES_CBC_DEC_256:
if (che_type == CHE_AES_CBC_DEC_256)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
}
else if (che_type == CHE_AES_ECB_DEC_256)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
}
else if (che_type == CHE_AES_CBC_ENC_256)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
}
else if (che_type == CHE_AES_ECB_ENC_256)
{
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
}
if ((((kal_uint32)key)&0x03)==0)
{
che_update_key0_3(*(kal_uint32 *)(key+0x0),
*(kal_uint32 *)(key+0x4),
*(kal_uint32 *)(key+0x8),
*(kal_uint32 *)(key+0xc) );
che_update_key4_7(*(kal_uint32 *)(key+0x10),
*(kal_uint32 *)(key+0x14),
*(kal_uint32 *)(key+0x18),
*(kal_uint32 *)(key+0x1c));
}
else
{
che_update_key0_3(( (*(key+0x0)) | (*(key+0x1)<<8) | (*(key+0x2)<<16) | (*(key+0x3)<<24) ),
( (*(key+0x4)) | (*(key+0x5)<<8) | (*(key+0x6)<<16) | (*(key+0x7)<<24) ),
( (*(key+0x8)) | (*(key+0x9)<<8) | (*(key+0xa)<<16) | (*(key+0xb)<<24) ),
( (*(key+0xc)) | (*(key+0xd)<<8) | (*(key+0xe)<<16) | (*(key+0xf)<<24) ) );
che_update_key4_7(( (*(key+0x10)) | (*(key+0x11)<<8) | (*(key+0x12)<<16) | (*(key+0x13)<<24) ),
( (*(key+0x14)) | (*(key+0x15)<<8) | (*(key+0x16)<<16) | (*(key+0x17)<<24) ),
( (*(key+0x18)) | (*(key+0x19)<<8) | (*(key+0x1a)<<16) | (*(key+0x1b)<<24) ),
( (*(key+0x1c)) | (*(key+0x1d)<<8) | (*(key+0x1e)<<16) | (*(key+0x1f)<<24) ));
}
break;
default:
ASSERT(0);
}
/*Output cipher key*/
che_output_ckey((kal_uint32)ckey); /*ckey*/
CHE_PDN_ENABLE(handle);
}
void aes_set_iv(kal_uint8 *che_iv)
{
if ( (((kal_uint32)che_iv)&0x03) == 0)
{
CHE_REGSET_IV0(*(kal_uint32 *)(che_iv+0x0));
CHE_REGSET_IV1(*(kal_uint32 *)(che_iv+0x4));
CHE_REGSET_IV2(*(kal_uint32 *)(che_iv+0x8));
CHE_REGSET_IV3(*(kal_uint32 *)(che_iv+0xc));
}
else
{
CHE_REGSET_IV0(( (*(che_iv+0x0)) | (*(che_iv+0x1)<<8) | (*(che_iv+0x2)<<16) | (*(che_iv+0x3)<<24) ));
CHE_REGSET_IV1(( (*(che_iv+0x4)) | (*(che_iv+0x5)<<8) | (*(che_iv+0x6)<<16) | (*(che_iv+0x7)<<24) ));
CHE_REGSET_IV2(( (*(che_iv+0x8)) | (*(che_iv+0x9)<<8) | (*(che_iv+0xa)<<16) | (*(che_iv+0xb)<<24) ));
CHE_REGSET_IV3(( (*(che_iv+0xc)) | (*(che_iv+0xd)<<8) | (*(che_iv+0xe)<<16) | (*(che_iv+0xf)<<24) ));
}
CHE_REGSET_START((CHE_START_UPIV01|CHE_START_UPIV23));
CHE_REGSET_START(CHE_START_DONE);
}
void des_set_iv(kal_uint8 *che_iv)
{
if ( (((kal_uint32)che_iv)&0x03) == 0)
{
CHE_REGSET_IV0(*(kal_uint32 *)(che_iv+0x0));
CHE_REGSET_IV1(*(kal_uint32 *)(che_iv+0x4));
}
else
{
CHE_REGSET_IV0(( (*(che_iv+0x0)) | (*(che_iv+0x1)<<8) | (*(che_iv+0x2)<<16) | (*(che_iv+0x3)<<24) ));
CHE_REGSET_IV1(( (*(che_iv+0x4)) | (*(che_iv+0x5)<<8) | (*(che_iv+0x6)<<16) | (*(che_iv+0x7)<<24) ));
}
CHE_REGSET_START(CHE_START_UPIV01);
CHE_REGSET_START(CHE_START_DONE);
}
void aes_decipher(kal_uint8 handle, CHE_TYPE che_type, kal_uint8 *che_iv, kal_uint8 *ckey, kal_uint8 *srcData, kal_uint8 *decryptedData, kal_uint32 data_length, kal_bool last_block)
{
switch(che_type)
{
case CHE_AES_CBC_DEC_128:
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
aes_set_iv(che_iv);
break;
case CHE_AES_CBC_DEC_192:
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
aes_set_iv(che_iv);
break;
case CHE_AES_CBC_DEC_256:
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
aes_set_iv(che_iv);
break;
case CHE_AES_ECB_DEC_128:
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
break;
case CHE_AES_ECB_DEC_192:
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
break;
case CHE_AES_ECB_DEC_256:
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
break;
default:
ASSERT(0);
}
/*Read the ckey to aes engine*/
che_input_ckey((kal_uint32)ckey);
/*Detail src/dst/length*/
CHE_REGSET_SRC((kal_uint32)srcData);
CHE_REGSET_DST((kal_uint32)decryptedData);
CHE_REGSET_LEN((kal_uint32)data_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 aes_decipher_next(kal_uint8 handle, CHE_TYPE che_type, kal_uint8 *srcData, kal_uint8 *decryptedData, 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_AES_CBC_DEC_128:
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
break;
case CHE_AES_CBC_DEC_192:
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
break;
case CHE_AES_CBC_DEC_256:
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
break;
case CHE_AES_ECB_DEC_128:
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
break;
case CHE_AES_ECB_DEC_192:
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
break;
case CHE_AES_ECB_DEC_256:
CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
break;
default:
ASSERT(0);
}
/*Detail src/dst/length*/
CHE_REGSET_SRC((kal_uint32)srcData); /*src*/
if (decryptedData != NULL)
{
CHE_REGSET_DST((kal_uint32)decryptedData); /*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);
}
void des_decipher(kal_uint8 handle, CHE_TYPE che_type, kal_uint8 *che_iv, kal_uint8 *ckey, kal_uint8 *srcData, kal_uint8 *decryptedData, kal_uint32 data_length, kal_bool last_block)
{
switch(che_type)
{
case CHE_DES_CBC_DEC:
CHE_REGSET_CON( (CHE_CON_ATYPE_DES|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
des_set_iv(che_iv);
break;
case CHE_3DES_CBC_DEC:
CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
des_set_iv(che_iv);
break;
case CHE_DES_ECB_DEC:
CHE_REGSET_CON( (CHE_CON_ATYPE_DES|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
break;
case CHE_3DES_ECB_DEC:
CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
break;
default:
ASSERT(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -