dcmi_sm_encrypt接口原型
函数原型
int dcmi_sm_encrypt(int card_id, int device_id, struct dcmi_sm_parm* parm, struct dcmi_sm_data *data)
功能说明
调用此接口,输入需加密的明文、加密的密钥以及国密加密算法类型,获取加密后的密文。
参数说明
参数名称 |
输入/输出 |
类型 |
描述 |
---|---|---|---|
card_id |
输入 |
int |
指定NPU管理单元的ID,当前实际支持的ID通过dcmi_get_card_list接口获取。 |
device_id |
输入 |
int |
指定设备编号,通过dcmi_get_device_id_in_card接口获取。取值范围如下: NPU芯片:[0, device_id_max-1]。 |
parm |
输入 |
struct dcmi_sm_parm* |
srtuct sm_parm { unsigned int key_type; unsigned int key_len;//SM4密钥长度为16字节,不涉及SM3 unsigned int iv_len;//SM4初始值长度为16字节,不涉及SM3 unsigned int reserves;//预留 unsigned char iv[64];//CBC算法初始化向量 unsigned char key[512];//密钥 unsigned char reserved[512];//预留 }; key_type入参范围: enum sm_key_type{ SM3_NORMAL_SUMMARY = 0,//SM3杂凑算法操作 SM4_CBC_ENCRYPT = 1,//SM4 CBC加密算法 SM4_CBC_DECRYPT = 2,//SM4 CBC解密算法 }; |
data |
输入;输出 |
struct dcmi_sm_data * |
struct sm_data { const unsigned char *in_buf; unsigned in_len;//SM3长度、SM4长度最多为3072字节,且SM4长度必须为16字节的整数倍 unsigned char *out_buf;//输出缓存 unsigned int *out_len;//输出缓存长度 }; |
返回值
类型 |
描述 |
---|---|
int |
处理结果:
|
异常处理
无。
约束说明
Linux物理机 |
Linux物理机容器 |
|
root用户 |
运行用户组(非root用户) |
root用户 |
N |
N |
N |
调用示例
int ret; int card_id = 0; int device_id = 0; struct dcmi_sm_parm parm = {0}; parm.key_type = 0; unsigned char hash1[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; unsigned char *out_buf = (unsigned char *)malloc(100); unsigned int *out_len =(unsigned int *)malloc(sizeof(unsigned int)); *out_len = 100; struct dcmi_sm_data data = {(const unsigned char *)hash1, sizeof(hash1), out_buf, out_len}; dcmi_init(); ret = dcmi_sm_encrypt(0, 0, &parm, &data); if (ret != 0) { //todo:记录日志 free(out_buf); free(out_len); return ret; } //data.out_buf中记录加密后的数据,data.out_len记录加密后的数据长度 free(out_buf); free(out_len);