8.3.5. 设计说明¶
8.3.5.1. 源码说明¶
- bsp/artinchip/drv/ce/drv_ce.c,CE Driver 层实现 
- bsp/artinchip/hal/ce/hal_ce.c,CE HAL 层实现 
- bsp/artinchip/include/hal/hal_ce.h,CE HAL 层接口头文件 
8.3.5.2. 模块架构¶
CE 驱动 Driver 层采用 RT-Thread 的 HWCRYPTO 设备驱动框架,如果只使用HAL层也可以支持 baremetal 方式的应用场景。
 
图 8.30 CE 驱动的软件架构图¶
8.3.5.3. Driver 层接口设计¶
8.3.5.3.1. drv_aes_init¶
| 函数原型 | rt_err_t drv_aes_init(struct rt_hwcrypto_ctx *ctx) | 
|---|---|
| 功能说明 | AES 算法初始化 | 
| 参数定义 | struct rt_hwcrypto_ctx *ctx - 上下文实例指针 | 
| 返回值 | 0,初始化成功;其它,初始化失败 | 
| 注意事项 | 
8.3.5.3.2. aes_ecb_crypto¶
| 函数原型 | s32 aes_ecb_crypto(u8 *key, u8 keylen, u8 dir, u8 *in, u8 *out, u32 len) | 
|---|---|
| 功能说明 | AES ECB 加解密实现 | 
| 参数定义 | u8 *key - 密钥的指针 u8 keylen - 密钥的长度 u8 dir - 运算方向;0,加密;1,解密 u8 *in - 输入数据 u8 *out - 输出数据 u32 len - 数据长度 | 
| 返回值 | 0,加解密成功;其它,加解密失败。 | 
| 注意事项 | 
8.3.5.3.3. aes_cbc_crypto¶
| 函数原型 | s32 aes_cbc_crypto(u8 *key, u8 keylen, u8 dir, u8 *iv, u8 *in, u8 *out, u32 len) | 
|---|---|
| 功能说明 | AES CBC 加解密实现 | 
| 参数定义 | u8 *key - 密钥的指针 u8 keylen - 密钥的长度 u8 dir - 运算方向;0,加密;1,解密 u8 *iv - 输入 iv u8 *in - 输入数据 u8 *out - 输出数据 u32 len - 数据长度 | 
| 返回值 | 0,加解密成功;其它,加解密失败。 | 
| 注意事项 | 
8.3.5.3.4. drv_sha_init¶
| 函数原型 | rt_err_t drv_sha_init(struct rt_hwcrypto_ctx *ctx) | 
|---|---|
| 功能说明 | SHA 算法初始化 | 
| 参数定义 | struct rt_hwcrypto_ctx *ctx - 上下文实例指针 | 
| 返回值 | 0,初始化成功;其它,初始化失败 | 
| 注意事项 | 
8.3.5.3.5. drv_sha_start¶
| 函数原型 | rt_err_t drv_sha_start(struct rt_hwcrypto_ctx *ctx) | 
|---|---|
| 功能说明 | SHA 算法启动 | 
| 参数定义 | struct rt_hwcrypto_ctx *ctx - 上下文实例指针 | 
| 返回值 | 0,初始化成功;其它,初始化失败 | 
| 注意事项 | 
8.3.5.3.6. drv_sha_update¶
| 函数原型 | rt_err_t drv_sha_update(aic_sha_context_t *context, const void *input, uint32_t size) | 
|---|---|
| 功能说明 | 更新一笔 SHA 算法数据 | 
| 参数定义 | struct rt_hwcrypto_ctx *ctx - 上下文实例指针 void *input - 输入数据 uint32_t size - 输入数据长度 | 
| 返回值 | 0,运算成功;其它,运算失败 | 
| 注意事项 | 
8.3.5.3.7. drv_sha_finish¶
| 函数原型 | rt_err_t drv_sha_finish(struct hwcrypto_hash *ctx, void *output, rt_size_t *out_size) | 
|---|---|
| 功能说明 | SHA 算法运算结束,获取结果 | 
| 参数定义 | struct hwcrypto_hash *ctx - 上下文 HASH 实例指针 void *output - 输出数据 rt_size_t *out_size - 输出数据长度 | 
| 返回值 | 0,获取结果成功;其它,获取结果失败 | 
| 注意事项 | 
8.3.5.4. HAL 层接口设计¶
HAL 层的函数接口声明存放在 hal_ce.h 中,主要接口有:
s32 hal_crypto_init(void);
s32 hal_crypto_deinit(void);
void hal_crypto_irq_handler();
s32 hal_crypto_start_symm(struct crypto_task *task);
s32 hal_crypto_start_asym(struct crypto_task *task);
s32 hal_crypto_start_hash(struct crypto_task *task);
u32 hal_crypto_poll_finish(u32 alg_unit);
void hal_crypto_pending_clear(u32 alg_unit);
u32 hal_crypto_get_err(u32 alg_unit);
s32 hal_crypto_bignum_byteswap(u8 *bn, u32 len);
s32 hal_crypto_bignum_le2be(u8 *src, u32 slen, u8 *dst, u32 dlen);
s32 hal_crypto_bignum_be2le(u8 *src, u32 slen, u8 *dst, u32 dlen);