昇腾社区首页
中文
注册

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

处理结果:

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

异常处理

无。

约束说明

表1 部署场景

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