dcmi_sm_decrypt接口原型
函数原型
int dcmi_sm_decrypt(int card_id, int device_id, struct sm_parm* parm, struct 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 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 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; unsigned char data1[] = { // 待解密的密文 /密文/ }; unsigned char key_in1[] = { // 加密/解密输入的key /16字节的密钥/ }; unsigned char iv_in1[] = { // 加密/解密输入的iv值 /16字节的iv值/ }; struct sm_parm sm_test_param = {0}; sm_test_param.key_type = SM4_CBC_DECRYPT; memcpy(sm_test_param.key, key_in1, sizeof(key_in1)); memcpy(sm_test_param.key, iv_in1, sizeof(iv_in1)); sm_test_param.key_len = 16; sm_test_param.iv_len = 16; unsigned char *out_buf = (unsigned char *)malloc(sizeof(data1)); unsigned int *out_len =(unsigned int *)malloc(sizeof(unsigned int)); *out_len = sizeof(data1); struct dcmi_sm_data sm_test_data = {(const unsigned char *)data1, sizeof(data1), out_buf, out_len}; dcmi_init(); ret = dcmi_sm_decrypt(0, 0, &sm_test_param, &sm_test_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);