下载
中文
注册

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

处理结果:

  • 成功:返回0。
  • 失败:返回码请参见返回码

异常处理

无。

约束说明

表1 部署场景

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