📄 app_general_che.c
字号:
* isLastBlock [IN]
* iv_size:(?)
* key_size:(?)
* RETURNS
* pending_size:
* dest:
*****************************************************************************/
kal_bool app_drv_cipher
(kal_uint8 handle,
CHE_TYPE type,
kal_uint8 *init_vector,
kal_uint8 iv_len,
kal_uint8 *ciphered_key,
kal_uint8 key_len,
kal_uint8 *source, kal_uint8 *dest, kal_uint32 *data_size, kal_uint8 round, kal_bool isLastBlock)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if ((((kal_uint32) ciphered_key & 0x03) == 1) /* The key must be 4-byte alignment */
|| ((CHE_HANDLE[handle] != ciphered_key) && (CHE_HANDLE[handle] != (kal_uint8*) 1)) /* CHE handle misused */
|| !(type > CHE_SHA1 && type < MAX_CHE_TYPE))
{
return KAL_FALSE;
}
/* check the key and iv length */
switch (type)
{
case CHE_MD5:
case CHE_SHA1:
/* unknow length */
break;
case CHE_DES_ECB_DEC:
case CHE_DES_CBC_DEC:
case CHE_DES_ECB_ENC:
case CHE_DES_CBC_ENC:
if ((key_len != 8) || (iv_len != 8))
{
return KAL_FALSE;
}
break;
case CHE_3DES_ECB_DEC:
case CHE_3DES_CBC_DEC:
case CHE_3DES_ECB_ENC:
case CHE_3DES_CBC_ENC:
if ((key_len != 24) || (iv_len != 8))
{
return KAL_FALSE;
}
break;
case CHE_AES_CBC_DEC_128:
case CHE_AES_ECB_DEC_128:
case CHE_AES_CBC_ENC_128:
case CHE_AES_ECB_ENC_128:
if ((key_len != 16) || (iv_len != 16))
{
return KAL_FALSE;
}
break;
case CHE_AES_CBC_DEC_192:
case CHE_AES_ECB_DEC_192:
case CHE_AES_CBC_ENC_192:
case CHE_AES_ECB_ENC_192:
if ((key_len != 24) || (iv_len != 16))
{
return KAL_FALSE;
}
break;
case CHE_AES_CBC_DEC_256:
case CHE_AES_ECB_DEC_256:
case CHE_AES_CBC_ENC_256:
case CHE_AES_ECB_ENC_256:
if ((key_len != 32) || (iv_len != 16))
{
return KAL_FALSE;
}
break;
default:
return KAL_FALSE;
}
kal_take_mutex(app_che_mutex);
if (round == 0)
{
*data_size = drv_cipher(handle, type, init_vector, ciphered_key, source, dest, *data_size, isLastBlock);
}
else
{
*data_size = drv_cipher_next(handle, type, source, dest, *data_size, isLastBlock);
}
kal_give_mutex(app_che_mutex);
if (isLastBlock)
{
CHE_HANDLE[handle] = (kal_uint8*) 1;
}
return KAL_TRUE;
} /* end of app_free_che_handle */
/*****************************************************************************
* FUNCTION
* app_drv_decipher
* DESCRIPTION
* decipher interface between the application level and CHE driver
* PARAMETERS
* handle [IN]
* type [IN]
* init_vector [?]
* iv_len [IN]
* ciphered_key [?]
* key_len [IN]
* source [?]
* dest [?]
* data_size [?]
* round [IN]
* isLastBlock [IN]
* iv_size:(?)
* key_size:(?)
* RETURNS
* pending_size:
* dest:
*****************************************************************************/
kal_bool app_drv_decipher
(kal_uint8 handle,
CHE_TYPE type,
kal_uint8 *init_vector,
kal_uint8 iv_len,
kal_uint8 *ciphered_key,
kal_uint8 key_len,
kal_uint8 *source, kal_uint8 *dest, kal_uint32 *data_size, kal_uint8 round, kal_bool isLastBlock)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint32 padding_size;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if ((((kal_uint32) ciphered_key & 0x03) == 1) /* The key must be 4-byte alignment */
|| ((CHE_HANDLE[handle] != ciphered_key) && (CHE_HANDLE[handle] != (kal_uint8*) 1)) /* CHE handle misused */
|| !(type > CHE_SHA1 && type < MAX_CHE_TYPE))
{
return KAL_FALSE;
}
/* check the key and iv length */
switch (type)
{
case CHE_MD5:
case CHE_SHA1:
/* unknow length */
break;
case CHE_DES_ECB_DEC:
case CHE_DES_CBC_DEC:
case CHE_DES_ECB_ENC:
case CHE_DES_CBC_ENC:
if ((key_len != 8) || (iv_len != 8))
{
return KAL_FALSE;
}
break;
case CHE_3DES_ECB_DEC:
case CHE_3DES_CBC_DEC:
case CHE_3DES_ECB_ENC:
case CHE_3DES_CBC_ENC:
if ((key_len != 24) || (iv_len != 8))
{
return KAL_FALSE;
}
break;
case CHE_AES_CBC_DEC_128:
case CHE_AES_ECB_DEC_128:
case CHE_AES_CBC_ENC_128:
case CHE_AES_ECB_ENC_128:
if ((key_len != 16) || (iv_len != 16))
{
return KAL_FALSE;
}
break;
case CHE_AES_CBC_DEC_192:
case CHE_AES_ECB_DEC_192:
case CHE_AES_CBC_ENC_192:
case CHE_AES_ECB_ENC_192:
if ((key_len != 24) || (iv_len != 16))
{
return KAL_FALSE;
}
break;
case CHE_AES_CBC_DEC_256:
case CHE_AES_ECB_DEC_256:
case CHE_AES_CBC_ENC_256:
case CHE_AES_ECB_ENC_256:
if ((key_len != 32) || (iv_len != 16))
{
return KAL_FALSE;
}
break;
default:
return KAL_FALSE;
}
kal_take_mutex(app_che_mutex);
if (round == 0)
{
drv_decipher(handle, type, init_vector, ciphered_key, source, dest, *data_size, &padding_size, isLastBlock);
}
else
{
drv_decipher_next(handle, type, source, dest, *data_size, &padding_size, isLastBlock);
}
kal_give_mutex(app_che_mutex);
if (isLastBlock)
{
CHE_HANDLE[handle] = (kal_uint8*) 1;
*data_size -= padding_size;
}
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* app_drv_hash
* DESCRIPTION
* hash interface between the application level and CHE driver
* PARAMETERS
* handle [IN]
* type [IN]
* source [?]
* dest [?]
* data_size [IN]
* round [IN]
* isLastBlock [IN]
* init_vector:(?)
* iv_size:(?)
* ciphered_key:(?)
* key_size:(?)
* RETURNS
* pending_size:
* dest:
*****************************************************************************/
kal_bool app_drv_hash
(kal_uint8 handle,
CHE_TYPE type, kal_uint8 *source, kal_uint8 *dest, kal_uint32 data_size, kal_uint8 round, kal_bool isLastBlock)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint32 return_size;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if (((CHE_HANDLE[handle] != (kal_uint8*) 1) && (CHE_HANDLE[handle] != source)) /* CHE handle misused */
|| (type != CHE_MD5 && type != CHE_SHA1))
{
return KAL_FALSE;
}
kal_take_mutex(app_che_mutex);
if (round == 0)
{
return_size = drv_hash(handle, type, source, dest, data_size, isLastBlock);
}
else
{
return_size = drv_hash_next(handle, type, source, dest, data_size, isLastBlock);
}
kal_give_mutex(app_che_mutex);
if (isLastBlock)
{
CHE_HANDLE[handle] = (kal_uint8*) 1;
}
else
{
CHE_HANDLE[handle] = source + return_size;
}
return return_size;
}
#endif /* _APP_GENERAL_CHE_C */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -