跳到主要内容

GB/T 36322-2018 信息安全技术 密码设备应用接口规范

返回主题目录 · 官方来源

来源:国家标准全文公开系统;发布日期:2018-06-07;实施日期:2019-01-01。 官方在线预览页面图像 SHA-256:7586df10d32e6c13cb72277fe84f87e1dc8313100fbac3a4a9d218aa18afde99。 依据官方在线预览全部 43 页页面图像转写与校核;省略封面、目录、页眉、页脚、留白和分页,合并印刷折行。函数原型中的印刷错误按原文保留,并在相应位置说明。

转写注:表 9 原文写作 SDF_ReleasePrivateKeyAccessRigh,6.2.9 写作 SDF_ReleasePrivateKeyAccessRight;6.3.23、6.3.24 原型使用 phKeyHandle,参数说明使用 hKeyHandle;6.3.22 的 pucKeyA、pucKeyE 说明使用大写 SKEYID_A、SKEYID_E。以上差异按原页保留。

前言​

本标准按照 GB/T 1.1—2009 给出的规则起草。

请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别这些专利的责任。

本标准由全国信息安全标准化技术委员会(SAC/TC 260)提出并归口。

本标准起草单位:卫士通信息产业股份有限公司、无锡江南信息安全工程技术中心、四川大学、上海格尔软件股份有限公司、北京数字认证股份有限公司、兴唐通信科技股份有限公司、山东得安信息技术有限公司、北京三未信安科技发展有限公司、海泰方圆科技有限公司、山东大学。

本标准主要起草人:刘平、罗俊、龚勋、李元正、徐强、郑强、李述胜、李玉峰、孔凡玉、马洪富、高志权、徐明翼、柳增寿、蒋红宇。

引言​

本标准的目标是为公钥密码基础设施应用体系框架下的服务类密码设备制定统一的应用接口标准,通过该接口调用密码设备,向上层提供基础密码服务。为该类密码设备的开发、使用及检测提供标准依据和指导,有利于提高该类密码设备的产品化、标准化和系列化水平。

本标准中涉及密码算法的相关内容,按照国家有关法规实施。

1 范围​

本标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。

本标准适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。

2 规范性引用文件​

下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。

GB/T 33560 信息安全技术 密码应用标识规范

3 术语和定义​

下列术语和定义适用于本文件。

3.1 算法标识 algorithm identifier​

用于对密码算法进行唯一标识的符号。

3.2 非对称密码算法 asymmetric cryptographic algorithm/public key cryptographic algorithm​

公钥密码算法。

加解密使用不同密钥的密码算法。

3.3 解密 decipherment/decryption​

加密过程对应的逆过程。

3.4 设备密钥 device key pair​

存储在设备内部的用于设备管理的非对称密钥对,包含签名密钥对和加密密钥对。

3.5 加密 encipherment/encryption​

对数据进行密码变换以产生密文的过程。

3.6 密钥加密密钥 key encryption key​

对密钥进行加密保护的密钥。

3.7 公钥基础设施 public key infrastructure​

用公钥密码技术建立的普遍适用的基础设施,为用户提供证书管理和密钥管理等安全服务。

3.8 私钥访问控制码 private key access password​

用于验证私钥使用权限的口令字。

3.9 对称密码技术 symmetric cryptographic technique​

对称密码体制。

原发者和接收者均采用同一秘密密钥进行变换的密码技术(体制)。

注:加密密钥与解密密钥相同,或者一个密钥可以从另一个密钥导出的密码体制。

3.10 会话密钥 session key​

处于层次化密钥结构中的最低层,仅在一次会话中使用的密钥。

3.11 用户密钥 user key​

存储在设备内部的用于应用密码运算的非对称密钥,包含签名密钥对和加密密钥对。

4 符号和缩略语​

下列符号和缩略语适用于本文件。

缩略语含义
ECC椭圆曲线算法(Elliptic Curve Cryptography)
EPK外部加密公钥(External Public Key)
IPK内部加密公钥(Internal Public Key)
ISK内部加密私钥(Internal Private Key)
KEK密钥加密密钥(Key Encrypt Key)

5 算法标识和数据结构​

5.1 算法标识定义​

本标准中所使用的算法其算法标识见 GB/T 33560。对称加密算法的算法标识包含其工作模式。

5.2 基本数据类型定义​

本标准中的字节数组均为高位字节在前(Big-Endian)方式存储和交换。基本数据类型定义如表 1 所示。

表 1 基本数据类型

类型名称描述定义
BYTE字节类型,无符号 8 位字符typedef unsigned char BYTE
CHAR字符类型,无符号 8 位字符typedef unsigned char CHAR
LONG长整数,有符号 32 位整数typedef int LONG
ULONG长整数,无符号 32 位整数typedef unsigned int ULONG
FLAGS标志类型,无符号 32 位整数typedef unsigned int FLAGS
LPSTR8 位字符串指针,按照 UTF8 格式存储及交换typedef CHAR * LPSTR
HANDLE句柄,指向任意数据对象的起始地址typedef void * HANDLE

5.3 设备信息定义​

设备信息描述如表 2 所示。

表 2 设备信息描述

字段名称数据长度(字节)含义
IssuerName40设备生产厂商名称
DeviceName16设备型号
DeviceSerial16设备编号,包含:日期(8 字符)、批次号(3 字符)、流水号(5 字符)
DeviceVersion4密码设备内部软件的版本号
StandardVersion4密码设备支持的接口规范版本号
AsymAlgAbility8前 4 字节表示支持的算法,表示方法为非对称算法标识按位或运算的结果;后 4 字节表示算法的最大模长,表示方法为支持的模长按位或运算的结果
SymAlgAbility4所有支持的对称算法,表示方法为对称算法标识按位或运算的结果
HashAlgAbility4所有支持的杂凑算法,表示方法为杂凑算法标识按位或运算的结果
BufferSize4支持的最大文件存储空间(单位字节)

实际数据结构定义:

typedef struct DeviceInfo_st{
CHAR IssuerName[40];
CHAR DeviceName[16];
CHAR DeviceSerial[16]
ULONG DeviceVersion;
ULONG StandardVersion;
ULONG AsymAlgAbility[2];
ULONG SymAlgAbility;
ULONG HashAlgAbility;
ULONG BufferSize;
}DEVICEINFO;

5.4 密钥分类及存储定义​

5.4.1 设备密钥与用户密钥​

设备密钥只能在设备初始化时生成或安装,用户密钥通过密码设备管理工具生成或安装。

设备密钥和用户密钥存放于密钥存储区,索引号从 0 开始检索,每个索引号对应一个签名密钥对和一个加密密钥对。其中,索引号为 0 表示设备密钥。索引号 1 开始表示用户密钥。设备密钥和用户密钥存储描述如表 3 所示。

表 3 设备密钥和用户密钥存储描述

密钥对索引号公钥私钥
0x00设备签名公钥设备签名私钥
0x00设备加密公钥设备加密私钥
0x01用户签名公钥用户签名私钥
0x01用户加密公钥用户加密私钥
………………
………………

5.4.2 密钥加密密钥​

密钥加密密钥通过密码设备管理工具生成或安装,密钥长度为 128 位,存放于密钥存储区,使用索引号从 1 开始。密钥加密密钥存储描述如表 4 所示。

表 4 密钥加密密钥存储描述

密钥索引号密钥加密密钥
0x01密钥加密密钥 001
…………

5.4.3 会话密钥​

会话密钥使用设备接口函数生成或导入,会话密钥使用句柄检索。

5.5 RSA 密钥数据结构定义​

RSA 密钥结构存储时顺序为从高到低,即密钥存放时从密钥结构数组的最高位开始,最高字节填在最高位,不足位填充数据 0。RSA 密钥数据结构如表 5 所示。

表 5 RSA 密钥数据结构

分类字段名称数据长度(字节)含义
公钥bits4模长
公钥m256模 N
公钥e256公钥指数
私钥bits4模长
私钥m256模 N
私钥e256公钥指数
私钥d256私钥指数
私钥prime[2]128 × 2素数 p 和 q
私钥pexp[2]128 × 2Dp 和 Dq
私钥coef128系数 i

实际数据结构定义:

#define RSAref_MAX_BITS 2048
#define RSAref_MAX_LEN ((RSAref_MAX_BITS + 7) / 8)
#define RSAref_MAX_PBITS ((RSAref_MAX_BITS + 1) / 2)
#define RSAref_MAX_PLEN ((RSAref_MAX_PBITS + 7) / 8)

typedef struct RSArefPublicKey_st
{
ULONG bits;
BYTE m[RSAref_MAX_LEN];
BYTE e[RSAref_MAX_LEN];
} RSArefPublicKey;

typedef struct RSArefPrivateKey_st
{
ULONG bits;
BYTE m[RSAref_MAX_LEN];
BYTE e[RSAref_MAX_LEN];
BYTE d[RSAref_MAX_LEN];
BYTE prime[2][RSAref_MAX_PLEN];
BYTE pexp[2][RSAref_MAX_PLEN];
BYTE coef[RSAref_MAX_PLEN];
} RSArefPrivateKey;

5.6 ECC 密钥数据结构定义​

ECC 密钥数据结构如表 6 所示。

表 6 ECC 密钥数据结构

分类字段名称数据长度(字节)含义
公钥bits4密钥位长
公钥xECCref_MAX_LEN公钥 x 坐标
公钥yECCref_MAX_LEN公钥 y 坐标
私钥bits4密钥位长
私钥KECCref_MAX_LEN私钥

实际数据结构定义:

#define ECCref_MAX_BITS 512
#define ECCref_MAX_LEN ((ECCref_MAX_BITS+7) / 8)

typedef struct ECCrefPublicKey_st
{
ULONG bits;
BYTE x[ECCref_MAX_LEN];
BYTE y[ECCref_MAX_LEN];
} ECCrefPublicKey;

typedef struct ECCrefPrivateKey_st
{
ULONG bits;
BYTE K[ECCref_MAX_LEN];
} ECCrefPrivateKey;

5.7 ECC 加密数据结构定义​

ECC 加密数据结构如表 7 所示。

表 7 ECC 加密数据结构

字段名称数据长度(字节)含义
xECCref_MAX_LENX 分量
yECCref_MAX_LENY 分量
M32明文的杂凑值
L4密文数据长度
CL密文数据

实际数据结构定义:

typedef struct ECCCipher_st
{
BYTE x[ECCref_MAX_LEN];
BYTE y[ECCref_MAX_LEN];
BYTE M[32];
ULONG L;
BYTE C[1];
} ECCCipher;

5.8 ECC 签名数据结构定义​

ECC 签名数据结构如表 8 所示。

表 8 ECC 签名数据结构

字段名称数据长度(字节)含义
rECCref_MAX_LEN签名的 r 部分
sECCref_MAX_LEN签名的 s 部分

实际数据结构定义:

typedef struct ECCSignature_st
{
BYTE r[ECCref_MAX_LEN];
BYTE s[ECCref_MAX_LEN];
} ECCSignature;

6 设备接口描述​

6.1 密码设备应用接口在公钥密码基础设施应用技术体系框架中的位置​

在公钥密码基础设施应用技术体系框架中,密码设备服务层由密码机、密码卡、智能密码终端等设备组成,通过本标准规定的密码设备应用接口向通用密码服务层提供基础密码服务。如图 1 所示。

基础密码服务包括密钥生成、单一的密码运算、文件管理等的服务。

本标准采用 C 语言描述接口函数。如无特别说明,函数中参数的长度单位均为字节数。

图 1 密码设备应用接口在公钥密码基础设施应用技术体系框架中的位置图 1 密码设备应用接口在公钥密码基础设施应用技术体系框架中的位置

6.2 设备管理类函数​

6.2.1 概述​

设备管理类函数提供设备打开与关闭、会话创建与关闭、设备信息获取、随机数产生、私钥权限获取与释放等功能,如表 9 所示,各函数返回代码见附录 A。

表 9 设备管理类函数

函数名称功能
SDF_OpenDevice打开设备
SDF_CloseDevice关闭设备
SDF_OpenSession创建会话
SDF_CloseSession关闭会话
SDF_GetDeviceInfo获取设备信息
SDF_GenerateRandom产生随机数
SDF_GetPrivateKeyAccessRight获取私钥使用权限
SDF_ReleasePrivateKeyAccessRigh释放私钥使用权限

6.2.2 打开设备​

原型:

LONG SDF_OpenDevice(
HANDLE * phDeviceHandle);

描述:打开密码设备。

参数:phDeviceHandle[out] 返回的设备句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:phDeviceHandle 由函数初始化并填写内容。

6.2.3 关闭设备​

原型:

LONG SDF_CloseDevice(
HANDLE hDeviceHandle);

描述:关闭密码设备,并释放相关资源。

参数:hDeviceHandle[in] 已打开的设备句柄。

返回值:0 成功;非 0 失败,返回错误代码。

6.2.4 创建会话​

原型:

LONG SDF_OpenSession(
HANDLE hDeviceHandle,
HANDLE * phSessionHandle);

描述:创建与密码设备的会话。

参数:

  • hDeviceHandle[in] 已打开的设备句柄;
  • phSessionHandle[out] 返回与密码设备建立的新会话句柄。

返回值:0 成功;非 0 失败,返回错误代码。

6.2.5 关闭会话​

原型:

LONG SDF_CloseSession(
HANDLE hSessionHandle);

描述:关闭与密码设备已建立的会话,并释放相关资源。

参数:hSessionHandle[in] 与密码设备已建立的会话句柄。

返回值:0 成功;非 0 失败,返回错误代码。

6.2.6 获取设备信息​

原型:

LONG SDF_GetDeviceInfo(
HANDLE hSessionHandle,
DEVICEINFO * pstDeviceInfo);

描述:获取密码设备能力描述。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pstDeviceInfo[out] 设备能力描述信息,内容及格式见设备信息定义。

返回值:0 成功;非 0 失败,返回错误代码。

6.2.7 产生随机数​

原型:

LONG SDF_GenerateRandom(
HANDLE hSessionHandle,
ULONG uiLength,
BYTE * pucRandom);

描述:获取指定长度的随机数。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiLength[in] 获取的随机数长度;
  • pucRandom[out] 缓冲区指针,用于存放获取的随机数。

返回值:0 成功;非 0 失败,返回错误代码。

6.2.8 获取私钥使用权限​

原型:

LONG SDF_GetPrivateKeyAccessRight(
HANDLE hSessionHandle,
ULONG uiKeyIndex,
LPSTR pucPassword,
ULONG uiPwdLength);

描述:获取密码设备内部存储的指定索引私钥的使用权。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyIndex[in] 密码设备存储私钥的索引值;
  • pucPassword[in] 私钥访问控制码;
  • uiPwdLength[in] 私钥访问控制码长度,不少于 8 字节。

返回值:0 成功;非 0 失败,返回错误代码。

注:本标准涉及密码设备存储的密钥对索引值的起始索引值为 1,最大为 n,密码设备的实际存储容量决定 n 值。

6.2.9 释放私钥使用权限​

原型:

LONG SDF_ReleasePrivateKeyAccessRight(
HANDLE hSessionHandle,
ULONG uiKeyIndex);

描述:释放密码设备存储的指定索引私钥的使用授权。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyIndex[in] 密码设备存储私钥索引值。

返回值:0 成功;非 0 失败,返回错误代码。

6.3 密钥管理类函数​

6.3.1 概述​

密钥管理类函数提供密钥的生成和导入导出等功能,包括签名公钥和加密公钥的导出、非对称密钥对的产生并输出、会话密钥的生成并输出、会话密钥的导入、数字信封转换、密钥协商参数的生成并输出、会话密钥的计算、IKE 工作密钥的计算、IPSEC 会话密钥的计算、SSL 工作密钥的计算以及会话密钥的销毁等函数,如表 10 所示,各函数返回代码见附录 A。

表 10 密钥管理类函数

函数名称功能
SDF_ExportSignPublicKey_RSA导出 RSA 签名公钥
SDF_ExportEncPublicKey_RSA导出 RSA 加密公钥
SDF_GenerateKeyPair_RSA产生 RSA 非对称密钥对并输出
SDF_GenerateKeyWithIPK_RSA生成会话密钥并用内部 RSA 公钥加密输出
SDF_GenerateKeyWithEPK_RSA生成会话密钥并用外部 RSA 公钥加密输出
SDF_ImportKeyWithISK_RSA导入会话密钥并用内部 RSA 私钥解密
SDF_ExchangeDigitEnvelopeBaseOnRSA基于 RSA 算法的数字信封转换
SDF_ExportSignPublicKey_ECC导出 ECC 签名公钥
SDF_ExportEncPublicKey_ECC导出 ECC 加密公钥
SDF_GenerateKeyPair_ECC产生 ECC 非对称密钥对并输出
SDF_GenerateKeyWithIPK_ECC生成会话密钥并用内部 ECC 公钥加密输出
SDF_GenerateKeyWithEPK_ECC生成会话密钥并用外部 ECC 公钥加密输出
SDF_ImportKeyWithISK_ECC导入会话密钥并用内部 ECC 私钥解密
SDF_GenerateAgreementDataWithECC生成密钥协商参数并输出
SDF_GenerateKeyWithECC计算会话密钥
SDF_GenerateAgreementDataAndKeyWithECC产生协商数据并计算会话密钥
SDF_ExchangeDigitEnvelopeBaseOnECC基于 ECC 算法的数字信封转换
SDF_GenerateKeyWithKEK生成会话密钥并用密钥加密密钥加密输出
SDF_ImportKeyWithKEK导入会话密钥并用密钥加密密钥解密
SDF_GenerateKeywithIKE计算 IKE 工作密钥
SDF_GenerateKeywithEPK_IKE计算 IKE 工作密钥并用外部 ECC 公钥加密输出
SDF_GenerateKeywithIPSEC计算 IPSEC 会话密钥
SDF_GenerateKeywithEPK_IPSEC计算 IPSEC 会话密钥并用外部 ECC 公钥加密输出
SDF_GenerateKeywithSSL计算 SSL 工作密钥
SDF_GenerateKeywithEPK_SSL计算 SSL 工作密钥并用外部 ECC 公钥加密输出
SDF_GenerateKeywithECDHE_SSL计算 SSL 工作密钥(ECDHE)
SDF_GenerateKeywithEPK_ECDHE_SSL计算 SSL 工作密钥并用外部 ECC 公钥加密输出(ECDHE)
SDF_DestroyKey销毁会话密钥

6.3.2 导出 RSA 签名公钥​

原型:

LONG SDF_ExportSignPublicKey_RSA(
HANDLE hSessionHandle,
ULONG uiKeyIndex,
RSArefPublicKey * pucPublicKey);

描述:导出密码设备内部存储的指定索引位置的签名公钥。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyIndex[in] 密码设备存储的 RSA 密钥对索引值;
  • pucPublicKey[out] RSA 公钥结构。

返回值:0 成功;非 0 失败,返回错误代码。

6.3.3 导出 RSA 加密公钥​

原型:

LONG SDF_ExportEncPublicKey_RSA(
HANDLE hSessionHandle,
ULONG uiKeyIndex,
RSArefPublicKey * pucPublicKey);

描述:导出密码设备内部存储的指定索引位置的加密公钥。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyIndex[in] 密码设备存储的 RSA 密钥对索引值;
  • pucPublicKey[out] RSA 公钥结构。

返回值:0 成功;非 0 失败,返回错误代码。

6.3.4 产生 RSA 密钥对并输出​

原型:

LONG SDF_GenerateKeyPair_RSA(
HANDLE hSessionHandle,
ULONG uiKeyBits,
RSArefPublicKey * pucPublicKey,
RSArefPrivateKey * pucPrivateKey);

描述:请求密码设备产生指定模长的 RSA 密钥对。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyBits[in] 指定密钥模长;
  • pucPublicKey[out] RSA 公钥结构;
  • pucPrivateKey[out] RSA 私钥结构。

返回值:0 成功;非 0 失败,返回错误代码。

6.3.5 生成会话密钥并用内部 RSA 公钥加密输出​

原型:

LONG SDF_GenerateKeyWithIPK_RSA(
HANDLE hSessionHandle,
ULONG uiIPKIndex,
ULONG uiKeyBits,
BYTE * pucKey,
ULONG * puiKeyLength,
HANDLE * phKeyHandle);

描述:生成会话密钥并用指定索引的内部加密公钥加密输出,同时返回密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiIPKIndex[in] 密码设备内部存储公钥的索引值;
  • uiKeyBits[in] 指定产生的会话密钥长度;
  • pucKey[out] 缓冲区指针,用于存放返回的密钥密文;
  • puiKeyLength[out] 返回的密钥密文长度;
  • phKeyHandle[out] 返回的密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:公钥加密数据时填充方式与 PKCS#1 v1.5 相同。

6.3.6 生成会话密钥并用外部 RSA 公钥加密输出​

原型:

LONG SDF_GenerateKeyWithEPK_RSA(
HANDLE hSessionHandle,
ULONG uiKeyBits,
RSArefPublicKey * pucPublicKey,
BYTE * pucKey,
ULONG * puiKeyLength,
HANDLE * phKeyHandle);

描述:生成会话密钥并用外部公钥加密输出,同时返回密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyBits[in] 指定产生的会话密钥长度;
  • pucPublicKey[in] 输入的外部 RSA 公钥结构;
  • pucKey[out] 缓冲区指针,用于存放返回的密钥密文;
  • puiKeyLength[out] 返回的密钥密文长度;
  • phKeyHandle[out] 返回的密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:公钥加密数据时填充方式与 PKCS#1 v1.5 相同。

6.3.7 导入会话密钥并用内部 RSA 私钥解密​

原型:

LONG SDF_ImportKeyWithISK_RSA(
HANDLE hSessionHandle,
ULONG uiISKIndex,
BYTE * pucKey,
ULONG puiKeyLength,
HANDLE * phKeyHandle);

描述:导入会话密钥并用内部私钥解密,同时返回密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiISKIndex[in] 密码设备内部存储加密私钥的索引值,对应于加密时的公钥;
  • pucKey[in] 缓冲区指针,用于存放输入的密钥密文;
  • puiKeyLength[in] 输入的密钥密文长度;
  • phKeyHandle[out] 返回的密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:填充方式与公钥加密时相同。

6.3.8 基于 RSA 算法的数字信封转换​

原型:

LONG SDF_ExchangeDigitEnvelopeBaseOnRSA(
HANDLE hSessionHandle,
ULONG uiKeyIndex,
RSArefPublicKey * pucPublicKey,
BYTE * pucDEInput,
ULONG uiDELength,
BYTE * pucDEOutput,
ULONG * puiDELength);

描述:将由内部加密公钥加密的会话密钥转换为由外部指定的公钥加密,可用于数字信封转换。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyIndex[in] 密码设备存储的内部 RSA 密钥对索引值;
  • pucPublicKey[in] 外部 RSA 公钥结构;
  • pucDEInput[in] 缓冲区指针,用于存放输入的会话密钥密文;
  • uiDELength[in] 输入的会话密钥密文长度;
  • pucDEOutput[out] 缓冲区指针,用于存放输出的会话密钥密文;
  • puiDELength[out] 输出的会话密钥密文长度。

返回值:0 成功;非 0 失败,返回错误代码。

6.3.9 导出 ECC 签名公钥​

原型:

LONG SDF_ExportSignPublicKey_ECC(
HANDLE hSessionHandle,
ULONG uiKeyIndex,
ECCrefPublicKey * pucPublicKey);

描述:导出密码设备内部存储的指定索引位置的签名公钥。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyIndex[in] 密码设备存储的 ECC 密钥对索引值;
  • pucPublicKey[out] ECC 公钥结构。

返回值:0 成功;非 0 失败,返回错误代码。

6.3.10 导出 ECC 加密公钥​

原型:

LONG SDF_ExportEncPublicKey_ECC(
HANDLE hSessionHandle,
ULONG uiKeyIndex,
ECCrefPublicKey * pucPublicKey);

描述:导出密码设备内部存储的指定索引位置的加密公钥。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyIndex[in] 密码设备存储的 ECC 密钥对索引值;
  • pucPublicKey[out] ECC 公钥结构。

返回值:0 成功;非 0 失败,返回错误代码。

6.3.11 产生 ECC 密钥对并输出​

原型:

LONG SDF_GenerateKeyPair_ECC(
HANDLE hSessionHandle,
ULONG uiAlgID,
ULONG uiKeyBits,
ECCrefPublicKey * pucPublicKey,
ECCrefPrivateKey * pucPrivateKey);

描述:请求密码设备产生指定类型和模长的 ECC 密钥对。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiAlgID[in] 指定算法标识;
  • uiKeyBits[in] 指定密钥长度;
  • pucPublicKey[out] ECC 公钥结构;
  • pucPrivateKey[out] ECC 私钥结构。

返回值:0 成功;非 0 失败,返回错误代码。

6.3.12 生成会话密钥并用内部 ECC 公钥加密输出​

原型:

LONG SDF_GenerateKeyWithIPK_ECC(
HANDLE hSessionHandle,
ULONG uiIPKIndex,
ULONG uiKeyBits,
ECCCipher * pucKey,
HANDLE * phKeyHandle);

描述:生成会话密钥并用指定索引的内部 ECC 加密公钥加密输出,同时返回密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiIPKIndex[in] 密码设备内部存储公钥的索引值;
  • uiKeyBits[in] 指定产生的会话密钥长度;
  • pucKey[out] 缓冲区指针,用于存放返回的密钥密文;
  • phKeyHandle[out] 返回的密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

6.3.13 生成会话密钥并用外部 ECC 公钥加密输出​

原型:

LONG SDF_GenerateKeyWithEPK_ECC(
HANDLE hSessionHandle,
ULONG uiKeyBits,
ULONG uiAlgID,
ECCrefPublicKey * pucPublicKey,
ECCCipher * pucKey,
HANDLE * phKeyHandle);

描述:生成会话密钥并用外部 ECC 公钥加密输出,同时返回密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyBits[in] 指定产生的会话密钥长度;
  • uiAlgID[in] 外部 ECC 公钥的算法标识;
  • pucPublicKey[in] 输入的外部 ECC 公钥结构;
  • pucKey[out] 缓冲区指针,用于存放返回的密钥密文;
  • phKeyHandle[out] 返回的密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

6.3.14 导入会话密钥并用内部 ECC 私钥解密​

原型:

LONG SDF_ImportKeyWithISK_ECC(
HANDLE hSessionHandle,
ULONG uiISKIndex,
ECCCipher * pucKey,
HANDLE * phKeyHandle);

描述:导入会话密钥并用内部 ECC 加密私钥解密,同时返回密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiISKIndex[in] 密码设备内部存储加密私钥的索引值,对应于加密时的公钥;
  • pucKey[in] 缓冲区指针,用于存放输入的密钥密文;
  • phKeyHandle[out] 返回的密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

6.3.15 生成密钥协商参数并输出​

原型:

LONG SDF_GenerateAgreementDataWithECC(
HANDLE hSessionHandle,
ULONG uiISKIndex,
ULONG uiKeyBits,
BYTE * pucSponsorID,
ULONG uiSponsorIDLength,
ECCrefPublicKey * pucSponsorPublicKey,
ECCrefPublicKey * pucSponsorTmpPublicKey,
HANDLE * phAgreementHandle);

描述:使用 ECC 密钥协商算法,为计算会话密钥而产生协商参数,同时返回指定索引位置的 ECC 公钥、临时 ECC 密钥对的公钥及协商句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiISKIndex[in] 密码设备内部存储加密私钥的索引值,该私钥用于参与密钥协商;
  • uiKeyBits[in] 要求协商的密钥长度;
  • pucSponsorID[in] 参与密钥协商的发起方 ID 值;
  • uiSponsorIDLength[in] 发起方 ID 长度;
  • pucSponsorPublicKey[out] 返回的发起方 ECC 公钥结构;
  • pucSponsorTmpPublicKey[out] 返回的发起方临时 ECC 公钥结构;
  • phAgreementHandle[out] 返回的协商句柄,用于计算协商密钥。

返回值:0 成功;非 0 失败,返回错误代码。

注:协商会话密钥时,本函数首先由协商的发起方调用。

6.3.16 计算会话密钥​

原型:

LONG SDF_GenerateKeyWithECC(
HANDLE hSessionHandle,
BYTE * pucResponseID,
ULONG uiResponseIDLength,
ECCrefPublicKey * pucResponsePublicKey,
ECCrefPublicKey * pucResponseTmpPublicKey,
HANDLE hAgreementHandle,
HANDLE * phKeyHandle);

描述:使用 ECC 密钥协商算法,使用自身协商句柄和响应方的协商参数计算会话密钥,同时返回会话密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucResponseID[in] 外部输入的响应方 ID 值;
  • uiResponseIDLength[in] 外部输入的响应方 ID 长度;
  • pucResponsePublicKey[in] 外部输入的响应方 ECC 公钥结构;
  • pucResponseTmpPublicKey[in] 外部输入的响应方临时 ECC 公钥结构;
  • hAgreementHandle[in] 协商句柄,用于计算协商密钥;
  • phKeyHandle[out] 返回的密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:本函数由协商的发起方在获得响应方的协商参数后调用。使用 SM2 算法计算会话密钥的过程参见 GB/T 35276。会话密钥计算完成后,协商句柄被销毁,为协商句柄分配的内存等资源也被释放。

6.3.17 产生协商数据并计算会话密钥​

原型:

LONG SDF_GenerateAgreementDataAndKeyWithECC(
HANDLE hSessionHandle,
ULONG uiISKIndex,
ULONG uiKeyBits,
BYTE * pucResponseID,
ULONG uiResponseIDLength,
BYTE * pucSponsorID,
ULONG uiSponsorIDLength,
ECCrefPublicKey * pucSponsorPublicKey,
ECCrefPublicKey * pucSponsorTmpPublicKey,
ECCrefPublicKey * pucResponsePublicKey,
ECCrefPublicKey * pucResponseTmpPublicKey,
HANDLE * phKeyHandle);

描述:使用 ECC 密钥协商算法,产生协商参数并计算会话密钥,同时返回产生的协商参数和密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiISKIndex[in] 密码设备内部存储加密私钥的索引值,该私钥用于参与密钥协商;
  • uiKeyBits[in] 协商后要求输出的密钥长度;
  • pucResponseID[in] 响应方 ID 值;
  • uiResponseIDLength[in] 响应方 ID 长度;
  • pucSponsorID[in] 发起方 ID 值;
  • uiSponsorIDLength[in] 发起方 ID 长度;
  • pucSponsorPublicKey[in] 外部输入的发起方 ECC 公钥结构;
  • pucSponsorTmpPublicKey[in] 外部输入的发起方临时 ECC 公钥结构;
  • pucResponsePublicKey[out] 返回的响应方 ECC 公钥结构;
  • pucResponseTmpPublicKey[out] 返回的响应方临时 ECC 公钥结构;
  • phKeyHandle[out] 返回的密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:本函数由响应方调用。使用 SM2 算法计算会话密钥的过程参见 GB/T 35276。

6.3.18 基于 ECC 算法的数字信封转换​

原型:

LONG SDF_ExchangeDigitEnvelopeBaseOnECC(
HANDLE hSessionHandle,
ULONG uiKeyIndex,
ULONG uiAlgID,
ECCrefPublicKey * pucPublicKey,
ECCCipher * pucEncDataIn,
ECCCipher * pucEncDataOut);

描述:将由内部加密公钥加密的会话密钥转换为由外部指定的公钥加密,可用于数字信封转换。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyIndex[in] 密码设备存储的 ECC 密钥对索引值;
  • uiAlgID[in] 外部 ECC 公钥的算法标识;
  • pucPublicKey[in] 外部 ECC 公钥结构;
  • pucEncDataIn[in] 缓冲区指针,用于存放输入的会话密钥密文;
  • pucEncDataOut[out] 缓冲区指针,用于存放输出的会话密钥密文。

返回值:0 成功;非 0 失败,返回错误代码。

6.3.19 生成会话密钥并用密钥加密密钥加密输出​

原型:

LONG SDF_GenerateKeyWithKEK(
HANDLE hSessionHandle,
ULONG uiKeyBits,
ULONG uiAlgID,
ULONG uiKEKIndex,
BYTE * pucKey,
ULONG * puiKeyLength,
HANDLE * phKeyHandle);

描述:生成会话密钥并用密钥加密密钥加密输出,同时返回密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyBits[in] 指定产生的会话密钥长度;
  • uiAlgID[in] 算法标识,指定对称加密算法;
  • uiKEKIndex[in] 密码设备内部存储密钥加密密钥的索引值;
  • pucKey[out] 缓冲区指针,用于存放返回的密钥密文;
  • puiKeyLength[out] 返回的密钥密文长度;
  • phKeyHandle[out] 返回的密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:加密模式为 ECB 模式。

6.3.20 导入会话密钥并用密钥加密密钥解密​

原型:

LONG SDF_ImportKeyWithKEK(
HANDLE hSessionHandle,
ULONG uiAlgID,
ULONG uiKEKIndex,
BYTE * pucKey,
ULONG puiKeyLength,
HANDLE * phKeyHandle);

描述:导入会话密钥并用密钥加密密钥解密,同时返回会话密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiAlgID[in] 算法标识,指定对称加密算法;
  • uiKEKIndex[in] 密码设备内部存储密钥加密密钥的索引值;
  • pucKey[in] 缓冲区指针,用于存放输入的密钥密文;
  • puiKeyLength[in] 输入的密钥密文长度;
  • phKeyHandle[out] 返回的密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:加密模式为 ECB 模式。

6.3.21 计算 IKE 工作密钥​

原型:

LONG SDF_GenerateKeywithIKE(
HANDLE hSessionHandle,
BYTE * pucSponsorNonce,
ULONG uiSponsorNonceLength,
BYTE * pucResponseNonce,
ULONG uiResponseNonceLength,
BYTE * pucSponsorCookie,
ULONG uiSponsorCookieLength,
BYTE * pucResponseCookie,
ULONG uiResponseCookieLength,
ULONG uiPrfAlgID,
ULONG uiKeyBitsD,
HANDLE * phKeyHandleD,
ULONG uiKeyBitsA,
HANDLE * phKeyHandleA,
ULONG uiKeyBitsE,
HANDLE * phKeyHandleE);

描述:使用 IKE 一阶段(主模式)交换得到的密钥计算参数计算 IKE 工作密钥,同时返回工作密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucSponsorNonce[in] 发起方 nonce 载荷主体;
  • uiSponsorNonceLength[in] 发起方 nonce 载荷主体长度;
  • pucResponseNonce[in] 响应方 nonce 载荷主体;
  • uiResponseNonceLength[in] 响应方 nonce 载荷主体长度;
  • pucSponsorCookie[in] 发起方 cookie;
  • uiSponsorCookieLength[in] 发起方 cookie 长度;
  • pucResponseCookie[in] 响应方 cookie;
  • uiResponseCookieLength[in] 响应方 cookie 长度;
  • uiPrfAlgID[in] PRF 算法标识;
  • uiKeyBitsD[in] SKEYID_d 密钥长度;
  • phKeyHandleD[out] 返回的 SKEYID_d 密钥句柄;
  • uiKeyBitsA[in] SKEYID_a 密钥长度;
  • phKeyHandleA[out] 返回的 SKEYID_a 密钥句柄;
  • uiKeyBitsE[in] SKEYID_e 密钥长度;
  • phKeyHandleE[out] 返回的 SKEYID_e 密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:IKE 一阶段(主模式)消息 3 和消息 4 交互完成后,本函数由参与通信的双方各自调用,计算后续工作密钥 SKEYID_d、SKEYID_a、SKEYID_e。IKE 一阶段(主模式)计算 IKE 工作密钥的过程参见 GM/T 0022,输入的密钥参数按顺序为 Ni_b、Nr_b、CKY-I、CKY-R,返回的密钥句柄按顺序为 SKEYID_d、SKEYID_a、SKEYID_e。

6.3.22 计算 IKE 工作密钥并用外部 ECC 公钥加密输出​

原型:

LONG SDF_GenerateKeywithEPK_IKE(
HANDLE hSessionHandle,
BYTE * pucSponsorNonce,
ULONG uiSponsorNonceLength,
BYTE * pucResponseNonce,
ULONG uiResponseNonceLength,
BYTE * pucSponsorCookie,
ULONG uiSponsorCookieLength,
BYTE * pucResponseCookie,
ULONG uiResponseCookieLength,
ULONG uiPrfAlgID,
ULONG uiEccAlgID,
ECCrefPublicKey * pucPublicKey,
ULONG uiKeyBitsD,
ECCCipher * pucKeyD,
HANDLE * phKeyHandleD,
ULONG uiKeyBitsA,
ECCCipher * pucKeyA,
HANDLE * phKeyHandleA,
ULONG uiKeyBitsE,
ECCCipher * pucKeyE,
HANDLE * phKeyHandleE);

描述:使用 IKE 一阶段(主模式)交换得到的密钥计算参数计算 IKE 工作密钥,并用外部 ECC 公钥加密输出,同时返回工作密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucSponsorNonce[in] 发起方 nonce 载荷主体;
  • uiSponsorNonceLength[in] 发起方 nonce 载荷主体长度;
  • pucResponseNonce[in] 响应方 nonce 载荷主体;
  • uiResponseNonceLength[in] 响应方 nonce 载荷主体长度;
  • pucSponsorCookie[in] 发起方 cookie;
  • uiSponsorCookieLength[in] 发起方 cookie 长度;
  • pucResponseCookie[in] 响应方 cookie;
  • uiResponseCookieLength[in] 响应方 cookie 长度;
  • uiPrfAlgID[in] PRF 算法标识;
  • uiEccAlgID[in] 外部 ECC 公钥的算法标识;
  • pucPublicKey[in] 输入的外部 ECC 公钥结构;
  • uiKeyBitsD[in] SKEYID_d 密钥长度;
  • pucKeyD[out] 缓冲区指针,用于存放返回的 SKEYID_d 密钥密文;
  • phKeyHandleD[out] 返回的 SKEYID_d 密钥句柄;
  • uiKeyBitsA[in] SKEYID_a 密钥长度;
  • pucKeyA[out] 缓冲区指针,用于存放返回的 SKEYID_A 密钥密文;
  • phKeyHandleA[out] 返回的 SKEYID_a 密钥句柄;
  • uiKeyBitsE[in] SKEYID_e 密钥长度;
  • pucKeyE[out] 缓冲区指针,用于存放返回的 SKEYID_E 密钥密文;
  • phKeyHandleE[out] 返回的 SKEYID_e 密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:IKE 一阶段(主模式)消息 3 和消息 4 交互完成后,本函数由参与通信的双方各自调用,计算后续工作密钥 SKEYID_d、SKEYID_a、SKEYID_e。IKE 一阶段(主模式)计算 IKE 工作密钥的过程参见 GM/T 0022,输入的密钥参数按顺序为 Ni_b、Nr_b、CKY-I、CKY-R,返回的密钥密文及密钥句柄按顺序为 SKEYID_d、SKEYID_a、SKEYID_e。

6.3.23 计算 IPSEC 会话密钥​

原型:

LONG SDF_GenerateKeywithIPSEC(
HANDLE hSessionHandle,
BYTE * pucProtocolID,
ULONG uiProtocolIDLength,
BYTE * pucSpi,
ULONG uiSpiLength,
BYTE * pucSponsorNonce,
ULONG uiSponsorNonceLength,
BYTE * pucResponseNonce,
ULONG uiResponseNonceLength,
HANDLE phKeyHandle,
ULONG uiPrfAlgID,
ULONG uiKeyBitsEnc,
HANDLE * phKeyHandleEnc,
ULONG uiKeyBitsMac,
HANDLE * phKeyHandleMac);

描述:使用 IKE 二阶段(快速模式)交换得到的密钥计算参数计算 IPSEC 会话密钥,同时返回会话密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucProtocolID[in] 协议 ID;
  • uiProtocolIDLength[in] 协议 ID 长度;
  • pucSpi[in] 安全参数索引 SPI;
  • uiSpiLength[in] 安全参数索引 SPI 长度;
  • pucSponsorNonce[in] 发起方 nonce 载荷主体;
  • uiSponsorNonceLength[in] 发起方 nonce 载荷主体长度;
  • pucResponseNonce[in] 响应方 nonce 载荷主体;
  • uiResponseNonceLength[in] 响应方 nonce 载荷主体长度;
  • hKeyHandle[in] 输入的 SKEYID_d 密钥句柄;
  • uiPrfAlgID[in] PRF 算法标识;
  • uiKeyBitsEnc[in] 加密密钥长度;
  • phKeyHandleEnc[out] 返回的加密密钥句柄;
  • uiKeyBitsMac[in] 杂凑密钥长度;
  • phKeyHandleMac[out] 返回的杂凑密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:IKE 二阶段(快速模式)消息交互完成后,本函数由参与通信的双方各自调用,计算 IPSEC 会话密钥,包括用于加密的会话密钥和用于完整性校验的会话密钥。IKE 二阶段(快速模式)计算 IPSEC 会话密钥的过程参见 GM/T 0022,输入的密钥参数按顺序为 protocol、SPI、Ni_b、Nr_b,返回的密钥句柄按顺序为加密密钥和杂凑密钥(用于完整性校验)。本函数在 6.3.21 计算 IKE 工作密钥函数调用之后调用,该函数返回的密钥句柄之一(SKEYID_d)作为本函数输入。

6.3.24 计算 IPSEC 会话密钥并用外部 ECC 公钥加密输出​

原型(原文中 pucKeyEnc 与 pucKeyMac 行末没有逗号):

LONG SDF_GenerateKeywithEPK_IPSEC(
HANDLE hSessionHandle,
BYTE * pucProtocolID,
ULONG uiProtocolIDLength,
BYTE * pucSpi,
ULONG uiSpiLength,
BYTE * pucSponsorNonce,
ULONG uiSponsorNonceLength,
BYTE * pucResponseNonce,
ULONG uiResponseNonceLength,
HANDLE phKeyHandle,
ULONG uiPrfAlgID,
ULONG uiEccAlgID,
ECCrefPublicKey * pucPublicKey,
ULONG uiKeyBitsEnc,
ECCCipher * pucKeyEnc
HANDLE * phKeyHandleEnc,
ULONG uiKeyBitsMac,
ECCCipher * pucKeyMac
HANDLE * phKeyHandleMac);

描述:使用 IKE 二阶段(快速模式)交换得到的密钥计算参数计算 IPSEC 会话密钥,并用外部 ECC 公钥加密输出,同时返回会话密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucProtocolID[in] 协议 ID;
  • uiProtocolIDLength[in] 协议 ID 长度;
  • pucSpi[in] 安全参数索引 SPI;
  • uiSpiLength[in] 安全参数索引 SPI 长度;
  • pucSponsorNonce[in] 发起方 nonce 载荷主体;
  • uiSponsorNonceLength[in] 发起方 nonce 载荷主体长度;
  • pucResponseNonce[in] 响应方 nonce 载荷主体;
  • uiResponseNonceLength[in] 响应方 nonce 载荷主体长度;
  • hKeyHandle[in] 输入的 SKEYID_d 密钥句柄;
  • uiPrfAlgID[in] PRF 算法标识;
  • uiEccAlgID[in] 外部 ECC 公钥的算法标识;
  • pucPublicKey[in] 输入的外部 ECC 公钥结构;
  • uiKeyBitsEnc[in] 加密密钥长度;
  • pucKeyEnc[out] 缓冲区指针,用于存放返回的加密密钥密文;
  • phKeyHandleEnc[out] 返回的加密密钥句柄;
  • uiKeyBitsMac[in] 杂凑密钥长度;
  • pucKeyMac[out] 缓冲区指针,用于存放返回的杂凑密钥密文;
  • phKeyHandleMac[out] 返回的杂凑密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:IKE 二阶段(快速模式)消息交互完成后,本函数由参与通信的双方各自调用,计算 IPSEC 会话密钥,包括用于加密的会话密钥和用于完整性校验的会话密钥。IKE 二阶段(快速模式)计算 IPSEC 会话密钥的过程参见 GM/T 0022,输入的密钥参数按顺序为 protocol、SPI、Ni_b、Nr_b,返回的密钥密文和密钥句柄按顺序为加密密钥和杂凑密钥(用于完整性校验)。本函数在 6.3.21 计算 IKE 工作密钥函数调用之后调用,该函数返回的密钥句柄之一(SKEYID_d)作为本函数输入。

6.3.25 计算 SSL 工作密钥​

原型:

LONG SDF_GenerateKeywithSSL(
HANDLE hSessionHandle,
BYTE * pucKeyPreMaster,
ULONG uiKeyPreMasterLength,
BYTE * pucClientRandom,
ULONG uiClientRandomLength,
BYTE * pucServerRandom,
ULONG uiServerRandomLength,
ULONG uiPrfAlgID,
ULONG uiKeyBitsClientMac,
HANDLE * phKeyHandleClientMac,
ULONG uiKeyBitsServerMac,
HANDLE * phKeyHandleServerMac,
ULONG uiKeyBitsClientEnc,
HANDLE * phKeyHandleClientEnc,
ULONG uiKeyBitsServerEnc,
HANDLE * phKeyHandleServerEnc);

描述:使用 SSL 握手协议得到的密钥计算参数计算 SSL 工作密钥,同时返回工作密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucKeyPreMaster[in] 预主密钥 pre_master_secret;
  • uiKeyPreMasterLength[in] 预主密钥长度;
  • pucClientRandom[in] 客户端随机数;
  • uiClientRandomLength[in] 客户端随机数长度;
  • pucServerRandom[in] 服务端随机数;
  • uiServerRandomLength[in] 服务端随机数长度;
  • uiPrfAlgID[in] PRF 算法标识;
  • uiKeyBitsClientMac[in] 客户端杂凑密钥长度;
  • phKeyHandleClientMac[out] 返回的客户端杂凑密钥句柄;
  • uiKeyBitsServerMac[in] 服务端杂凑密钥长度;
  • phKeyHandleServerMac[out] 返回的服务端杂凑密钥句柄;
  • uiKeyBitsClientEnc[in] 客户端加密密钥长度;
  • phKeyHandleClientEnc[out] 返回的客户端加密密钥句柄;
  • uiKeyBitsServerEnc[in] 服务端加密密钥长度;
  • phKeyHandleServerEnc[out] 返回的服务端加密密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:SSL 握手协议消息交互完成后,本函数由参与通信的双方各自调用,计算 SSL 记录层协议的工作密钥并返回密钥句柄:client_write_MAC_secret(客户端杂凑密钥)、server_write_MAC_secret(服务端杂凑密钥)、client_write_key(客户端加密密钥)、server_write_key(服务端加密密钥)。SSL 计算工作密钥的过程参见 GM/T 0024。

6.3.26 计算 SSL 工作密钥并用外部 ECC 公钥加密输出​

原型:

LONG SDF_GenerateKeywithEPK_SSL(
HANDLE hSessionHandle,
BYTE * pucKeyPreMaster,
ULONG uiKeyPreMasterLength,
BYTE * pucClientRandom,
ULONG uiClientRandomLength,
BYTE * pucServerRandom,
ULONG uiServerRandomLength,
ULONG uiPrfAlgID,
ULONG uiEccAlgID,
ECCrefPublicKey * pucPublicKey,
ULONG uiKeyBitsClientMac,
ECCCipher * pucKeyClientMac,
HANDLE * phKeyHandleClientMac,
ULONG uiKeyBitsServerMac,
ECCCipher * pucKeyServerMac,
HANDLE * phKeyHandleServerMac,
ULONG uiKeyBitsClientEnc,
ECCCipher * pucKeyClientEnc,
HANDLE * phKeyHandleClientEnc,
ULONG uiKeyBitsServerEnc,
ECCCipher * pucKeyServerEnc,
HANDLE * phKeyHandleServerEnc);

描述:使用 SSL 握手协议得到的密钥计算参数计算 SSL 工作密钥,并用外部 ECC 公钥加密输出,同时返回工作密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucKeyPreMaster[in] 预主密钥 pre_master_secret;
  • uiKeyPreMasterLength[in] 预主密钥长度;
  • pucClientRandom[in] 客户端随机数;
  • uiClientRandomLength[in] 客户端随机数长度;
  • pucServerRandom[in] 服务端随机数;
  • uiServerRandomLength[in] 服务端随机数长度;
  • uiPrfAlgID[in] PRF 算法标识;
  • uiEccAlgID[in] 外部 ECC 公钥的算法标识;
  • pucPublicKey[in] 输入的外部 ECC 公钥结构;
  • uiKeyBitsClientMac[in] 客户端杂凑密钥长度;
  • pucKeyClientMac[out] 缓冲区指针,用于存放返回的客户端杂凑密钥;
  • phKeyHandleClientMac[out] 返回的客户端杂凑密钥句柄;
  • uiKeyBitsServerMac[in] 服务端杂凑密钥长度;
  • pucKeyServerMac[out] 缓冲区指针,用于存放返回的服务端杂凑密钥;
  • phKeyHandleServerMac[out] 返回的服务端杂凑密钥句柄;
  • uiKeyBitsClientEnc[in] 客户端加密密钥长度;
  • pucKeyClientEnc[out] 缓冲区指针,用于存放返回的客户端加密密钥;
  • phKeyHandleClientEnc[out] 返回的客户端加密密钥句柄;
  • uiKeyBitsServerEnc[in] 服务端加密密钥长度;
  • pucKeyServerEnc[out] 缓冲区指针,用于存放返回的服务端加密密钥;
  • phKeyHandleServerEnc[out] 返回的服务端加密密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:SSL 握手协议消息交互完成后,本函数由参与通信的双方各自调用,计算 SSL 记录层协议的工作密钥并返回密钥密文和密钥句柄:client_write_MAC_secret(客户端杂凑密钥)、server_write_MAC_secret(服务端杂凑密钥)、client_write_key(客户端加密密钥)、server_write_key(服务端加密密钥)。SSL 计算工作密钥的过程参见 GM/T 0024。

6.3.27 计算 SSL 工作密钥(ECDHE)​

原型:

LONG SDF_GenerateKeywithECDHE_SSL(
HANDLE hSessionHandle,
HANDLE phKeyHandlePreMaster,
BYTE * pucClientRandom,
ULONG uiClientRandomLength,
BYTE * pucServerRandom,
ULONG uiServerRandomLength,
ULONG uiPrfAlgID,
ULONG uiKeyBitsClientMac,
HANDLE * phKeyHandleClientMac,
ULONG uiKeyBitsServerMac,
HANDLE * phKeyHandleServerMac,
ULONG uiKeyBitsClientEnc,
HANDLE * phKeyHandleClientEnc,
ULONG uiKeyBitsServerEnc,
HANDLE * phKeyHandleServerEnc);

描述:使用 SSL 握手协议得到的密钥计算参数计算 SSL 工作密钥,同时返回工作密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • phKeyHandlePreMaster[in] 预主密钥 pre_master_secret 密钥句柄;
  • pucClientRandom[in] 客户端随机数;
  • uiClientRandomLength[in] 客户端随机数长度;
  • pucServerRandom[in] 服务端随机数;
  • uiServerRandomLength[in] 服务端随机数长度;
  • uiPrfAlgID[in] PRF 算法标识;
  • uiKeyBitsClientMac[in] 客户端杂凑密钥长度;
  • phKeyHandleClientMac[out] 返回的客户端杂凑密钥句柄;
  • uiKeyBitsServerMac[in] 服务端杂凑密钥长度;
  • phKeyHandleServerMac[out] 返回的服务端杂凑密钥句柄;
  • uiKeyBitsClientEnc[in] 客户端加密密钥长度;
  • phKeyHandleClientEnc[out] 返回的客户端加密密钥句柄;
  • uiKeyBitsServerEnc[in] 服务端加密密钥长度;
  • phKeyHandleServerEnc[out] 返回的服务端加密密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:SSL 握手协议消息交互完成后,本函数由参与通信的双方各自调用,计算 SSL 记录层协议的工作密钥并返回密钥句柄:client_write_MAC_secret(客户端杂凑密钥)、server_write_MAC_secret(服务端杂凑密钥)、client_write_key(客户端加密密钥)、server_write_key(服务端加密密钥)。SSL 计算工作密钥的过程参见 GM/T 0024。本函数适用于 ECDHE 的密钥交换方式,该方式的预主密钥采用 SM2 密钥协商产生并且密码设备只返回密钥句柄。

6.3.28 计算 SSL 工作密钥并用外部 ECC 公钥加密输出(ECDHE)​

原型:

LONG SDF_GenerateKeywithEPK_ECDHE_SSL(
HANDLE hSessionHandle,
HANDLE phKeyHandlePreMaster,
BYTE * pucClientRandom,
ULONG uiClientRandomLength,
BYTE * pucServerRandom,
ULONG uiServerRandomLength,
ULONG uiPrfAlgID,
ULONG uiEccAlgID,
ECCrefPublicKey * pucPublicKey,
ULONG uiKeyBitsClientMac,
ECCCipher * pucKeyClientMac,
HANDLE * phKeyHandleClientMac,
ULONG uiKeyBitsServerMac,
ECCCipher * pucKeyServerMac,
HANDLE * phKeyHandleServerMac,
ULONG uiKeyBitsClientEnc,
ECCCipher * pucKeyClientEnc,
HANDLE * phKeyHandleClientEnc,
ULONG uiKeyBitsServerEnc,
ECCCipher * pucKeyServerEnc,
HANDLE * phKeyHandleServerEnc);

描述:使用 SSL 握手协议得到的密钥计算参数计算 SSL 工作密钥,并用外部 ECC 公钥加密输出,同时返回工作密钥句柄。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • phKeyHandlePreMaster[in] 预主密钥 pre_master_secret 密钥句柄;
  • pucClientRandom[in] 客户端随机数;
  • uiClientRandomLength[in] 客户端随机数长度;
  • pucServerRandom[in] 服务端随机数;
  • uiServerRandomLength[in] 服务端随机数长度;
  • uiPrfAlgID[in] PRF 算法标识;
  • uiEccAlgID[in] 外部 ECC 公钥的算法标识;
  • pucPublicKey[in] 输入的外部 ECC 公钥结构;
  • uiKeyBitsClientMac[in] 客户端杂凑密钥长度;
  • pucKeyClientMac[out] 缓冲区指针,用于存放返回的客户端杂凑密钥;
  • phKeyHandleClientMac[out] 返回的客户端杂凑密钥句柄;
  • uiKeyBitsServerMac[in] 服务端杂凑密钥长度;
  • pucKeyServerMac[out] 缓冲区指针,用于存放返回的服务端杂凑密钥;
  • phKeyHandleServerMac[out] 返回的服务端杂凑密钥句柄;
  • uiKeyBitsClientEnc[in] 客户端加密密钥长度;
  • pucKeyClientEnc[out] 缓冲区指针,用于存放返回的客户端加密密钥;
  • phKeyHandleClientEnc[out] 返回的客户端加密密钥句柄;
  • uiKeyBitsServerEnc[in] 服务端加密密钥长度;
  • pucKeyServerEnc[out] 缓冲区指针,用于存放返回的服务端加密密钥;
  • phKeyHandleServerEnc[out] 返回的服务端加密密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:SSL 握手协议消息交互完成后,本函数由参与通信的双方各自调用,计算 SSL 记录层协议的工作密钥并返回密钥密文和密钥句柄:client_write_MAC_secret(客户端杂凑密钥)、server_write_MAC_secret(服务端杂凑密钥)、client_write_key(客户端加密密钥)、server_write_key(服务端加密密钥)。SSL 计算工作密钥的过程参见 GM/T 0024。本函数适用于 ECDHE 的密钥交换方式,该方式的预主密钥采用 SM2 密钥协商产生并且密码设备返回密钥密文和密钥句柄。

6.3.29 销毁会话密钥​

原型:

LONG SDF_DestroyKey(
HANDLE hSessionHandle,
HANDLE hKeyHandle);

描述:销毁会话密钥,并释放为密钥句柄分配的内存等资源。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • hKeyHandle[in] 输入的密钥句柄。

返回值:0 成功;非 0 失败,返回错误代码。

注:本函数在对称算法运算完成后调用。

6.4 非对称算法运算类函数​

6.4.1 概述​

非对称算法运算类函数提供 RSA 公私钥运算、ECC 签名验证和加密等功能,如表 11 所示,各函数返回代码见附录 A。

表 11 非对称算法运算类函数

函数名称功能
SDF_ExternalPublicKeyOperation_RSA外部公钥 RSA 运算
SDF_InternalPublicKeyOperation_RSA内部公钥 RSA 运算
SDF_InternalPrivateKeyOperation_RSA内部私钥 RSA 运算
SDF_ExternalVerify_ECC外部密钥 ECC 验证
SDF_InternalSign_ECC内部密钥 ECC 签名
SDF_InternalVerify_ECC内部密钥 ECC 验证
SDF_ExternalEncrypt_ECC外部密钥 ECC 加密

6.4.2 外部公钥 RSA 运算​

原型:

LONG SDF_ExternalPublicKeyOperation_RSA(
HANDLE hSessionHandle,
RSArefPublicKey * pucPublicKey,
BYTE * pucDataInput,
ULONG uiInputLength,
BYTE * pucDataOutput,
ULONG * puiOutputLength);

描述:指定使用外部公钥对数据进行运算。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucPublicKey[in] 外部 RSA 公钥结构;
  • pucDataInput[in] 缓冲区指针,用于存放输入的数据;
  • uiInputLength[in] 输入的数据长度;
  • pucDataOutput[out] 缓冲区指针,用于存放输出的数据;
  • puiOutputLength[out] 输出的数据长度。

返回值:0 成功;非 0 失败,返回错误代码。

注:数据格式由应用层封装。

6.4.3 内部公钥 RSA 运算​

原型:

LONG SDF_InternalPublicKeyOperation_RSA(
HANDLE hSessionHandle,
ULONG uiKeyIndex,
BYTE * pucDataInput,
ULONG uiInputLength,
BYTE * pucDataOutput,
ULONG * puiOutputLength);

描述:使用内部指定索引的公钥对数据进行运算。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyIndex[in] 密码设备内部存储公钥的索引值;
  • pucDataInput[in] 缓冲区指针,用于存放外部输入的数据;
  • uiInputLength[in] 输入的数据长度;
  • pucDataOutput[out] 缓冲区指针,用于存放输出的数据;
  • puiOutputLength[out] 输出的数据长度。

返回值:0 成功;非 0 失败,返回错误代码。

注:索引范围仅限于内部签名密钥对,数据格式由应用层封装。

6.4.4 内部私钥 RSA 运算​

原型:

LONG SDF_InternalPrivateKeyOperation_RSA(
HANDLE hSessionHandle,
ULONG uiKeyIndex,
BYTE * pucDataInput,
ULONG uiInputLength,
BYTE * pucDataOutput,
ULONG * puiOutputLength);

描述:使用内部指定索引的私钥对数据进行运算。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiKeyIndex[in] 密码设备内部存储私钥的索引值;
  • pucDataInput[in] 缓冲区指针,用于存放外部输入的数据;
  • uiInputLength[in] 输入的数据长度;
  • pucDataOutput[out] 缓冲区指针,用于存放输出的数据;
  • puiOutputLength[out] 输出的数据长度。

返回值:0 成功;非 0 失败,返回错误代码。

注:索引范围仅限于内部签名密钥对,数据格式由应用层封装。

6.4.5 外部密钥 ECC 验证​

原型:

LONG SDF_ExternalVerify_ECC(
HANDLE hSessionHandle,
ULONG uiAlgID,
ECCrefPublicKey * pucPublicKey,
BYTE * pucDataInput,
ULONG uiInputLength,
ECCSignature * pucSignature);

描述:使用外部 ECC 公钥对 ECC 签名值进行验证运算。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiAlgID[in] 算法标识,指定使用的 ECC 算法;
  • pucPublicKey[in] 外部 ECC 公钥结构;
  • pucData[in] 缓冲区指针,用于存放外部输入的数据;
  • uiDataLength[in] 输入的数据长度;
  • pucSignature[in] 缓冲区指针,用于存放输入的签名值数据。

返回值:0 成功;非 0 失败,返回错误代码。

注:输入数据为待签数据的杂凑值。当使用 SM2 算法时,该输入数据为待签数据经过 SM2 签名预处理的结果,预处理过程参见 GB/T 35276。

转写注:原型写作 pucDataInput、uiInputLength,而参数说明写作 pucData、uiDataLength,均依照原文保留。

6.4.6 内部密钥 ECC 签名​

原型:

LONG SDF_InternalSign_ECC(
HANDLE hSessionHandle,
ULONG uiISKIndex,
BYTE * pucData,
ULONG uiDataLength,
ECCSignature * pucSignature);

描述:使用内部 ECC 私钥对数据进行签名运算。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiISKIndex[in] 密码设备内部存储的 ECC 签名私钥的索引值;
  • pucData[in] 缓冲区指针,用于存放外部输入的数据;
  • uiDataLength[in] 输入的数据长度;
  • pucSignature[out] 缓冲区指针,用于存放输出的签名值数据。

返回值:0 成功;非 0 失败,返回错误代码。

注:输入数据为待签数据的杂凑值。当使用 SM2 算法时,该输入数据为待签数据经过 SM2 签名预处理的结果,预处理过程参见 GB/T 35276。

6.4.7 内部密钥 ECC 验证​

原型:

LONG SDF_InternalVerify_ECC(
HANDLE hSessionHandle,
ULONG uiISKIndex,
BYTE * pucData,
ULONG uiDataLength,
ECCSignature * pucSignature);

描述:使用内部 ECC 公钥对 ECC 签名值进行验证运算。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiISKIndex[in] 密码设备内部存储的 ECC 签名公钥的索引值;
  • pucData[in] 缓冲区指针,用于存放外部输入的数据;
  • uiDataLength[in] 输入的数据长度;
  • pucSignature[in] 缓冲区指针,用于存放输入的签名值数据。

返回值:0 成功;非 0 失败,返回错误代码。

注:输入数据为待签数据的杂凑值。当使用 SM2 算法时,该输入数据为待签数据经过 SM2 签名预处理的结果,预处理过程参见 GB/T 35276。

6.4.8 外部密钥 ECC 加密​

原型:

LONG SDF_ExternalEncrypt_ECC(
HANDLE hSessionHandle,
ULONG uiAlgID,
ECCrefPublicKey * pucPublicKey,
BYTE * pucData,
ULONG uiDataLength,
ECCCipher * pucEncData);

描述:使用外部 ECC 公钥对数据进行加密运算。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiAlgID[in] 算法标识,指定使用的 ECC 算法;
  • pucPublicKey[in] 外部 ECC 公钥结构;
  • pucData[in] 缓冲区指针,用于存放外部输入的数据;
  • uiDataLength[in] 输入的数据长度;
  • pucEncData[out] 缓冲区指针,用于存放输出的数据密文。

返回值:0 成功;非 0 失败,返回错误代码。

6.5 对称算法运算类函数​

6.5.1 概述​

对称算法运算类函数提供对称加解密和 MAC 计算等功能,如表 12 所示,各函数返回代码见附录 A。

表 12 对称算法运算类函数

函数名称功能
SDF_Encrypt对称加密
SDF_Decrypt对称解密
SDF_CalculateMAC计算 MAC

6.5.2 对称加密​

原型:

LONG SDF_Encrypt(
HANDLE hSessionHandle,
HANDLE hKeyHandle,
ULONG uiAlgID,
BYTE * pucIV,
BYTE * pucData,
ULONG uiDataLength,
BYTE * pucEncData,
ULONG * puiEncDataLength);

描述:使用指定的密钥句柄和 IV 对数据进行对称加密运算。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • hKeyHandle[in] 指定的密钥句柄;
  • uiAlgID[in] 算法标识,指定对称加密算法;
  • pucIV[in|out] 缓冲区指针,用于存放输入和返回的 IV 数据;
  • pucData[in] 缓冲区指针,用于存放输入的数据明文;
  • uiDataLength[in] 输入的数据明文长度;
  • pucEncData[out] 缓冲区指针,用于存放输出的数据密文;
  • puiEncDataLength[out] 输出的数据密文长度。

返回值:0 成功;非 0 失败,返回错误代码。

注:此函数不对数据进行填充处理,输入的数据是指定算法分组长度的整数倍。返回的 IV 数据用于多包数据对称加密运算。

6.5.3 对称解密​

原型:

LONG SDF_Decrypt(
HANDLE hSessionHandle,
HANDLE hKeyHandle,
ULONG uiAlgID,
BYTE * pucIV,
BYTE * pucEncData,
ULONG uiEncDataLength,
BYTE * pucData,
ULONG * puiDataLength);

描述:使用指定的密钥句柄和 IV 对数据进行对称解密运算。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • hKeyHandle[in] 指定的密钥句柄;
  • uiAlgID[in] 算法标识,指定对称加密算法;
  • pucIV[in|out] 缓冲区指针,用于存放输入和返回的 IV 数据;
  • pucEncData[in] 缓冲区指针,用于存放输入的数据密文;
  • uiEncDataLength[in] 输入的数据密文长度;
  • pucData[out] 缓冲区指针,用于存放输出的数据明文;
  • puiDataLength[out] 输出的数据明文长度。

返回值:0 成功;非 0 失败,返回错误代码。

注:此函数不对数据进行填充处理,输入的数据是指定算法分组长度的整数倍。返回的 IV 数据用于多包数据对称解密运算。

6.5.4 计算 MAC​

原型:

LONG SDF_CalculateMAC(
HANDLE hSessionHandle,
HANDLE hKeyHandle,
ULONG uiAlgID,
BYTE * pucIV,
BYTE * pucData,
ULONG uiDataLength,
BYTE * pucMAC,
ULONG * puiMACLength);

描述:使用指定的密钥句柄和 IV 对数据进行 MAC 运算。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • hKeyHandle[in] 指定的密钥句柄;
  • uiAlgID[in] 算法标识,指定 MAC 加密算法;
  • pucIV[in|out] 缓冲区指针,用于存放输入和返回的 IV 数据;
  • pucData[in] 缓冲区指针,用于存放输入的数据明文;
  • uiDataLength[in] 输入的数据明文长度;
  • pucMAC[out] 缓冲区指针,用于存放输出的 MAC 值;
  • puiMACLength[out] 输出的 MAC 值长度。

返回值:0 成功;非 0 失败,返回错误代码。

注:此函数不对数据进行分包处理,多包数据 MAC 运算由 IV 控制最后的 MAC 值。

6.6 杂凑运算类函数​

6.6.1 概述​

杂凑运算类函数提供杂凑运算功能,如表 13 所示,各函数返回代码见附录 A。

表 13 杂凑运算类函数

函数名称功能
SDF_HashInit杂凑运算初始化
SDF_HashUpdate多包杂凑运算
SDF_HashFinal杂凑运算结束

6.6.2 杂凑运算初始化​

原型:

LONG SDF_HashInit(
HANDLE hSessionHandle,
ULONG uiAlgID
ECCrefPublicKey * pucPublicKey,
BYTE * pucID,
ULONG uiIDLength);

转写注:原型中 uiAlgID 行末缺少逗号,此处按原文保留。

描述:三步式数据杂凑运算第一步。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • uiAlgID[in] 指定杂凑算法标识;
  • pucPublicKey[in] 签名者公钥,当 uiAlgID 为 SGD_SM3 时有效;
  • pucID[in] 签名者的 ID 值,当 uiAlgID 为 SGD_SM3 时有效;
  • uiIDLength[in] 签名者 ID 的长度,当 uiAlgID 为 SGD_SM3 时有效。

返回值:0 成功;非 0 失败,返回错误代码。

注:uiIDLength 非零且 uiAlgID 为 SGD_SM3 时,本函数执行的是 SM2 的预处理 1 操作。计算过程参见 GB/T 35276。

6.6.3 多包杂凑运算​

原型:

LONG SDF_HashUpdate(
HANDLE hSessionHandle,
BYTE * pucData,
ULONG uiDataLength);

描述:三步式数据杂凑运算第二步,对输入的明文进行杂凑运算。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucData[in] 缓冲区指针,用于存放输入的数据明文;
  • uiDataLength[in] 输入的数据明文长度。

返回值:0 成功;非 0 失败,返回错误代码。

6.6.4 杂凑运算结束​

原型:

LONG SDF_HashFinal(
HANDLE hSessionHandle,
BYTE * pucHash,
ULONG * puiHashLength);

描述:三步式数据杂凑运算第三步,杂凑运算结束返回杂凑数据并清除中间数据。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucHash[out] 缓冲区指针,用于存放输出的杂凑数据;
  • puiHashLength[out] 返回的杂凑数据长度。

返回值:0 成功;非 0 失败,返回错误代码。

6.7 用户文件操作类函数​

6.7.1 概述​

用户文件操作类函数提供文件的创建、读写和删除功能,如表 14 所示,各函数返回代码见附录 A。

表 14 用户文件操作类函数

函数名称功能
SDF_CreateFile创建文件
SDF_ReadFile读取文件
SDF_WriteFile写文件
SDF_DeleteFile删除文件

6.7.2 创建文件​

原型:

LONG SDF_CreateFile(
HANDLE hSessionHandle,
LPSTR pucFileName,
ULONG uiNameLen,
ULONG uiFileSize);

描述:在密码设备内部创建用于存储用户数据的文件。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucFileName[in] 缓冲区指针,用于存放输入的文件名,最大长度 128 字节;
  • uiNameLen[in] 文件名长度;
  • uiFileSize[in] 文件所占存储空间的长度。

返回值:0 成功;非 0 失败,返回错误代码。

6.7.3 读取文件​

原型:

LONG SDF_ReadFile(
HANDLE hSessionHandle,
LPSTR pucFileName,
ULONG uiNameLen,
ULONG uiOffset,
ULONG * puiFileLength,
BYTE * pucBuffer);

描述:读取在密码设备内部存储用户数据的文件的内容。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucFileName[in] 缓冲区指针,用于存放输入的文件名,最大长度 128 字节;
  • uiNameLen[in] 文件名长度;
  • uiOffset[in] 指定读取文件时的偏移值;
  • puiFileLength[in|out] 入参时指定读取文件内容的长度;出参时返回实际读取文件内容的长度;
  • pucBuffer[out] 缓冲区指针,用于存放读取的文件数据。

返回值:0 成功;非 0 失败,返回错误代码。

6.7.4 写文件​

原型:

LONG SDF_WriteFile(
HANDLE hSessionHandle,
LPSTR pucFileName,
ULONG uiNameLen,
ULONG uiOffset,
ULONG uiFileLength,
BYTE * pucBuffer);

描述:向密码设备内部存储用户数据的文件中写入内容。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucFileName[in] 缓冲区指针,用于存放输入的文件名,最大长度 128 字节;
  • uiNameLen[in] 文件名长度;
  • uiOffset[in] 指定写入文件时的偏移值;
  • uiFileLength[in] 指定写入文件内容的长度;
  • pucBuffer[in] 缓冲区指针,用于存放输入的写文件数据。

返回值:0 成功;非 0 失败,返回错误代码。

6.7.5 删除文件​

原型:

LONG SDF_DeleteFile(
HANDLE hSessionHandle,
LPSTR pucFileName,
ULONG uiNameLen);

描述:删除指定文件名的密码设备内部存储用户数据的文件。

参数:

  • hSessionHandle[in] 与设备建立的会话句柄;
  • pucFileName[in] 缓冲区指针,用于存放输入的文件名,最大长度 128 字节;
  • uiNameLen[in] 文件名长度。

返回值:0 成功;非 0 失败,返回错误代码。

附录 A(规范性附录)函数返回代码定义​

本标准定义的各函数返回代码如表 A.1 所示。

表 A.1 函数返回代码定义

宏描述预定义值说明
#define SDR_OK0x0操作成功
#define SDR_BASE0x01000000错误码基础值
#define SDR_UNKNOWERRSDR_BASE + 0x00000001未知错误
#define SDR_NOTSUPPORTSDR_BASE + 0x00000002不支持的接口调用
#define SDR_COMMFAILSDR_BASE + 0x00000003与设备通信失败
#define SDR_HARDFAILSDR_BASE + 0x00000004运算模块无响应
#define SDR_OPENDEVICESDR_BASE + 0x00000005打开设备失败
#define SDR_OPENSESSIONSDR_BASE + 0x00000006创建会话失败
#define SDR_PARDENYSDR_BASE + 0x00000007无私钥使用权限
#define SDR_KEYNOTEXISTSDR_BASE + 0x00000008不存在的密钥调用
#define SDR_ALGNOTSUPPORTSDR_BASE + 0x00000009不支持的算法调用
#define SDR_ALGMODNOTSUPPORTSDR_BASE + 0x0000000A不支持的算法模式调用
#define SDR_PKOPERRSDR_BASE + 0x0000000B公钥运算失败
#define SDR_SKOPERRSDR_BASE + 0x0000000C私钥运算失败
#define SDR_SIGNERRSDR_BASE + 0x0000000D签名运算失败
#define SDR_VERIFYERRSDR_BASE + 0x0000000E验证签名失败
#define SDR_SYMOPERRSDR_BASE + 0x0000000F对称算法运算失败
#define SDR_STEPERRSDR_BASE + 0x00000010多步运算步骤错误
#define SDR_FILESIZEERRSDR_BASE + 0x00000011文件长度超出限制
#define SDR_FILENOEXISTSDR_BASE + 0x00000012指定的文件不存在
#define SDR_FILEOFSERRSDR_BASE + 0x00000013文件起始位置错误
#define SDR_KEYTYPEERRSDR_BASE + 0x00000014密钥类型错误
#define SDR_KEYERRSDR_BASE + 0x00000015密钥错误
#define SDR_ENCDATAERRSDR_BASE + 0x00000016ECC 加密数据错误
#define SDR_RANDERRSDR_BASE + 0x00000017随机数产生失败
#define SDR_PRKRERRSDR_BASE + 0x00000018私钥使用权限获取失败
#define SDR_MACERRSDR_BASE + 0x00000019MAC 运算失败
#define SDR_FILEEXISTSSDR_BASE + 0x0000001A指定文件已存在
#define SDR_FILEWERRSDR_BASE + 0x0000001B文件写入失败
#define SDR_NOBUFFERSDR_BASE + 0x0000001C存储空间不足
#define SDR_INARGERRSDR_BASE + 0x0000001D输入参数错误
#define SDR_OUTARGERRSDR_BASE + 0x0000001E输出参数错误
... ...SDR_BASE + 0x0000001F 至 SDR_BASE + 0x00FFFFFF预留

参考文献​

[1] GB/T 17901.1—1999 信息技术 安全技术 密钥管理 第 1 部分:框架

[2] GB/T 17903.2—2008 信息技术 安全技术 抗抵赖 第 2 部分:采用对称技术的机制

[3] GB/T 17903.3—2008 信息技术 安全技术 抗抵赖 第 3 部分:采用非对称技术的机制

[4] GB/T 17964—2008(站内 GB/T17964-2021 版) 信息安全技术 分组密码算法的工作模式

[5] GB/T 18238.1—2000 信息技术 安全技术 散列函数 第 1 部分:概述

[6] GB/T 18238.2—2002 信息技术 安全技术 散列函数 第 2 部分:采用 n 位块密码的散列函数

[7] GB/T 18238.3—2002 信息技术 安全技术 散列函数 第 3 部分:专用散列函数

[8] GB/T 35276 信息安全技术 SM2 密码算法使用规范

[9] GM/T 0022 IPSec VPN 技术规范

[10] GM/T 0024 SSL VPN 技术规范