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* |
struct 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);