跳到主要内容

GB/T 35291-2017 信息安全技术 智能密码钥匙应用接口规范

返回主题目录 · 官方来源

来源:GB/T 35291-2017 国家标准详情;封面发布日期:2017-12-29;实施日期:2018-07-01。 本次核验官方 PDF SHA-256:ff6f7b9f1c8df487f0804275fd375c121289dc139c29a268d591f36335ea5414。 官方在线预览截图 SHA-256:187432e2d662b8173b0ecc36d9fdad45b90f37db4328245ffab6cc41b3baffb3。 依据官方在线预览全部 52 页的页面图像转写与核对;省略封面、目录、页眉、页脚和分页,合并印刷折行;3 张结构图保留为从原文页面裁出的图像。

转写注:原版表 17 的 SKF_ClearSecueState、6.4.2 与 7.1.9 的 DEVINFO_SKF / DEVINFO、6.4.5 说明中的宏名、7.3.2 的“参见 6.4.9”、7.5.6 的“枚举容器下所有容器”、7.6.13 的 hKey、7.6.23—7.6.28 原型中的类型、指针及标点差异,以及表 A.1 的 0x0A00BBBB 均照原页保留。

前言​

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

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

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

本标准起草单位:北京海泰方圆科技股份有限公司、北京握奇智能科技有限公司、北京大明五洲科技有限公司、恒宝股份有限公司、深圳市明华澳汉科技股份有限公司、武汉天喻信息产业股份有限公司、北京飞天诚信科技股份有限公司、华翔腾数码科技有限公司。

本标准起草人:刘平、郭宝安、石玉平、柳增寿、胡俊义、管延军、赵再兴、刘伟丰、何永福、李高锋、汪雪林、赵李明、蒋红宇、王烨。

引言​

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

本标准未包含标识算法 SM9 相关的应用接口。

1 范围​

本标准规定了基于 PKI密码体制的智能密码钥匙应用接口,描述了密码相关应用接口的函数、数据类型、参数的定义和设备的安全要求。

本标准适用于智能密码钥匙产品的研制、使用和检测。

2 规范性引用文件​

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

  • GB/T 33560 信息安全技术 密码应用标识规范
  • GM/T 0022 IPSec VPN 技术规范
  • GM/T 0024 SSL VPN 技术规范

3 术语和定义​

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

3.1 容器 container​

密码设备中用于保存密钥所划分的唯一性存储空间。

3.2 设备认证 device authentication​

智能密码钥匙对应用程序的认证。

3.3 设备认证密钥 device authentication key​

用于设备认证的密钥。

3.4 设备标签 label​

由用户设定并存储于设备内部的用于对设备进行标识的字符串。

4 缩略语​

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

  • API:应用编程接口(Application Programming Interface)
  • MAC:消息鉴别码(Message Authentication Code)
  • PIN:个人身份识别码(Personal Identification Number)
  • PKCS#1:公钥密码使用标准系列规范中的第 1 部分,定义 RSA 公开密钥算法加密和签名机制(the Public-Key Cryptography Standard Part 1)
  • PKCS#5:公钥密码使用标准系列规范中的第 5 部分,描述一种利用从口令派生出来的安全密钥加密字符串的方法(the Public-Key Cryptography Standard Part 5)
  • PKI:公钥基础设施(Public Key Infrastructure)

5 结构模型​

5.1 层次关系​

智能密码钥匙应用接口位于智能密码钥匙应用程序与设备驱动程序之间,如图1所示。

图1 接口在应用层次关系中的位置

5.2 设备的应用结构​

一个设备中存在设备认证密钥和多个应用,应用之间相互独立。设备的逻辑结构如图2所示。

图2 设备逻辑结构

应用由管理员 PIN、用户PIN、文件和容器组成,可以存在多个文件和多个容器。

每个应用维护各自的与管理员 PIN 和用户 PIN 相关的权限状态。

一个应用的逻辑结构如图3所示。

容器中存放加密密钥对、签名密钥对和会话密钥。其中加密密钥对用于保护会话密钥,签名密钥对用于数字签名和验证,会话密钥用于数据加解密和 MAC运算。容器中也可以存放与加密密钥对对应的加密数字证书和与签名密钥对对应的签名数字证书。其中,签名密钥对由内部产生,加密密钥对由外部产生并安全导入,会话密钥可由内部产生或者由外部产生并安全导入。

图3 应用逻辑结构图

6 数据类型定义​

6.1 算法标识​

本标准中使用的算法其标识定义见GB/T33560。

6.2 基本数据类型​

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

表1 基本数据类型

类型名称描述定义
INT8有符号 8 位整数
INT16有符号 16 位整数
INT32有符号 32 位整数
UINT8无符号 8 位整数
UINT16无符号 16 位整数
UINT32无符号 32 位整数
BOOL布尔类型,取值为 TRUE 或 FALSE
BYTE字节类型,无符号 8 位整数typedef UINT8 BYTE
CHAR字符类型,无符号 8 位整数typedef UINT8 CHAR
SHORT短整数,有符号 16 位typedef INT16 SHORT
USHORT无符号 16 位整数typedef UINT16 USHORT
LONG长整数,有符号 32 位整数typedef INT32 LONG
ULONG长整数,无符号 32 位整数typedef UINT32 ULONG
UINT无符号 32 位整数typedef UINT32 UINT
WORD字类型,无符号 16 位整数typedef UINT16 WORD
DWORD双字类型,无符号 32 位整数typedef UINT32 DWORD
FLAGS标志类型,无符号 32 位整数typedef UINT32 FLAGS
LPSTR8 位字符串指针,按照 UTF8 格式存储及交换typedef CHAR * LPSTR
HANDLE句柄,指向任意数据对象的起始地址typedef void * HANDLE
DEVHANDLE设备句柄typedef HANDLE DEVHANDLE
HAPPLICATION应用句柄typedef HANDLE HAPPLICATION
HCONTAINER容器句柄typedef HANDLE HCONTAINER

6.3 常量定义​

数据常量标识定义了在规范中用到的常量的取值。

数据常量标识的定义如表2所示。

表2 常量定义

常量名取值描述
TRUE0x00000001布尔值为真
FALSE0x00000000布尔值为假
DEVAPI__stdcall__stdcall 函数调用方式
ADMIN_TYPE0管理员 PIN 类型
USER_TYPE1用户 PIN 类型

6.4 复合数据类型​

6.4.1 版本​

6.4.1.1 类型定义​
typedef struct Struct_Version {
BYTE major;
BYTE minor;
} VERSION;
6.4.1.2 数据项描述​

数据项描述见表3。

表3 版本定义

数据项类型意义备注
majorBYTE主版本号主版本号和次版本号以“.”分隔,例如 Version 1.0,主版本号为 1,次版本号为 0;Version 2.10,主版本号为 2,次版本号为 10
minorBYTE次版本号

6.4.2 设备信息​

6.4.2.1 类型定义​
typedef struct Struct_DEVINFO {
VERSION Version;
CHAR Manufacturer[64];
CHAR Issuer[64];
CHAR Label[32];
CHAR SerialNumber[32];
VERSION HWVersion;
VERSION FirmwareVersion;
ULONG AlgSymCap;
ULONG AlgAsymCap;
ULONG AlgHashCap;
ULONG DevAuthAlgId;
ULONG TotalSpace;
ULONG FreeSpace;
ULONG MaxECCBufferSize;
ULONG MaxBufferSize;
BYTE Reserved[64];
} DEVINFO_SKF, *PDEVINFO_SKF;
6.4.2.2 数据项描述​

数据项描述见表4。

表4 设备信息描述

数据项类型意义备注
VersionVERSION版本号数据结构版本号,本结构的版本号为 1.0
ManufacturerCHAR 数组设备厂商信息以 \0 为结束符的 ASCII 字符串
IssuerCHAR 数组发行厂商信息以 \0 为结束符的 ASCII 字符串
LabelCHAR 数组设备标签以 \0 为结束符的 ASCII 字符串
SerialNumberCHAR 数组序列号以 \0 为结束符的 ASCII 字符串
HWVersionVERSION设备硬件版本
FirmwareVersionVERSION设备本身固件版本
AlgSymCapULONG分组密码算法标识
AlgAsymCapULONG非对称密码算法标识
AlgHashCapULONG密码杂凑算法标识
DevAuthAlgIdULONG设备认证使用的分组密码算法标识
TotalSpaceULONG设备总空间大小
FreeSpaceULONG用户可用空间大小
MaxECCBufferSizeULONG能够处理的 ECC 加密数据大小
MaxBufferSizeULONG能够处理的分组运算和杂凑运算的数据大小
ReservedBYTE保留扩展

6.4.3 RSA 公钥数据结构​

6.4.3.1 类型定义​
typedef struct Struct_RSAPUBLICKEYBLOB {
ULONG AlgID;
ULONG BitLen;
BYTE Modulus[MAX_RSA_MODULUS_LEN];
BYTE PublicExponent[MAX_RSA_EXPONENT_LEN];
} RSAPUBLICKEYBLOB, *PRSAPUBLICKEYBLOB;

其中,MAX_RSA_MODULUS_LEN 为算法模数的最大长度;MAX_RSA_EXPONENT_LEN 为算法指数的最大长度。

6.4.3.2 数据项描述​

数据项描述见表5。

表5 RSA 公钥数据结构

数据项类型意义备注
AlgIDULONG算法标识号
BitLenULONG模数的实际位长度应为 8 的倍数
ModulusBYTE 数组模数 n=p*q实际长度为 BitLen/8 字节
#define MAX_RSA_MODULUS_LEN 256
#define MAX_RSA_EXPONENT_LEN 4
PublicExponentBYTE 数组公开密钥 e一般为 00010001

6.4.4 RSA 私钥数据结构​

6.4.4.1 类型定义​
typedef struct Struct_RSAPRIVATEKEYBLOB {
ULONG AlgID;
ULONG BitLen;
BYTE Modulus[MAX_RSA_MODULUS_LEN];
BYTE PublicExponent[MAX_RSA_EXPONENT_LEN];
BYTE PrivateExponent[MAX_RSA_MODULUS_LEN];
BYTE Prime1[MAX_RSA_MODULUS_LEN/2];
BYTE Prime2[MAX_RSA_MODULUS_LEN/2];
BYTE Prime1Exponent[MAX_RSA_MODULUS_LEN/2];
BYTE Prime2Exponent[MAX_RSA_MODULUS_LEN/2];
BYTE Coefficient[MAX_RSA_MODULUS_LEN/2];
} RSAPRIVATEKEYBLOB, *PRSAPRIVATEKEYBLOB;

其中,MAX_RSA_MODULUS_LEN 为算法模数的最大长度;MAX_RSA_EXPONENT_LEN 为算法指数的最大长度。

6.4.4.2 数据项描述​

数据项描述见表6。

表6 RSA 私钥数据结构

数据项类型意义备注
AlgIDULONG算法标识号
BitLenULONG模数的实际位长度应为 8 的倍数
ModulusBYTE 数组模数 n=p*q实际长度为 BitLen/8 字节
PublicExponentBYTE 数组公开密钥 e一般为 00010001
PrivateExponentBYTE 数组私有密钥 d实际长度为 BitLen/8 字节
Prime1BYTE 数组素数 p实际长度为 BitLen/16 字节
Prime2BYTE 数组素数 q实际长度为 BitLen/16 字节
Prime1ExponentBYTE 数组d mod (p-1) 的值实际长度为 BitLen/16 字节
Prime2ExponentBYTE 数组d mod (q-1) 的值实际长度为 BitLen/16 字节
CoefficientBYTE 数组q 模 p 的乘法逆元实际长度为 BitLen/16 字节

6.4.5 ECC公钥数据结构​

6.4.5.1 类型定义​
typedef struct Struct_ECCPUBLICKEYBLOB {
ULONG BitLen;
BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN/8];
BYTE YCoordinate[ECC_MAX_YCOORDINATE_BITS_LEN/8];
} ECCPUBLICKEYBLOB, *PECCPUBLICKEYBLOB;

其中,ECC_MAX_XCOORDINATE_LEN 为 ECC 算法 X 坐标的最大长度;ECC_MAX_YCOORDINATE_LEN 为 ECC 算法 Y 坐标的最大长度。

6.4.5.2 数据项描述​

数据项描述见表7。

表7 ECC 公钥数据结构

数据项类型意义备注
BitLenULONG模数的实际位长度应为 8 的倍数
XCoordinateBYTE 数组曲线上点的 X 坐标有限域上的整数
#define ECC_MAX_XCOORDINATE_BITS_LEN 512
YCoordinateBYTE 数组曲线上点的 Y 坐标有限域上的整数
#define ECC_MAX_YCOORDINATE_BITS_LEN 512

6.4.6 ECC 私钥数据结构​

6.4.6.1 类型定义​
typedef struct Struct_ECCPRIVATEKEYBLOB {
ULONG BitLen;
BYTE PrivateKey[ECC_MAX_MODULUS_BITS_LEN/8];
} ECCPRIVATEKEYBLOB, *PECCPRIVATEKEYBLOB;

其中,ECC_MAX_MODULUS_BITS_LEN 为 ECC算法模数的最大长度。

6.4.6.2 数据项描述​

数据项描述见表8。

表8 ECC私钥数据结构

数据项类型意义备注
BitLenULONG模数的实际位长度应为 8 的倍数
PrivateKeyBYTE 数组私有密钥有限域上的整数
#define ECC_MAX_MODULUS_BITS_LEN 512

6.4.7 ECC密文数据结构​

6.4.7.1 类型定义​
typedef struct Struct_ECCCIPHERBLOB {
BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN/8];
BYTE YCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN/8];
BYTE HASH[32];
ULONG CipherLen;
BYTE Cipher[1];
} ECCCIPHERBLOB, *PECCCIPHERBLOB;
6.4.7.2 数据项描述​

数据项描述见表9。

表9 ECC密文数据结构

数据项类型意义备注
XCoordinateBYTE 数组与 y 组成椭圆曲线上的点 (x,y)
YCoordinateBYTE 数组与 x 组成椭圆曲线上的点 (x,y)
HASHBYTE 数组明文的杂凑值
CipherLenULONG密文数据长度
CipherBYTE 数组密文数据实际长度为 CipherLen

6.4.8 ECC 签名数据结构​

6.4.8.1 类型定义​
typedef struct Struct_ECCSIGNATUREBLOB {
BYTE r[ECC_MAX_XCOORDINATE_BITS_LEN/8];
BYTE s[ECC_MAX_XCOORDINATE_BITS_LEN/8];
} ECCSIGNATUREBLOB, *PECCSIGNATUREBLOB;

其中,ECC_MAX_XCOORDINATE_BITS_LEN 为ECC算法X坐标的最大比特长度。

6.4.8.2 数据项描述​

数据项描述见表10。

表10 ECC签名数据结构

数据项类型意义备注
rBYTE 数组签名结果的 r 部分
sBYTE 数组签名结果的 s 部分

6.4.9 分组密码参数​

6.4.9.1 类型定义​
typedef struct Struct_BLOCKCIPHERPARAM {
BYTE IV[MAX_IV_LEN];
ULONG IVLen;
ULONG PaddingType;
ULONG FeedBitLen;
} BLOCKCIPHERPARAM, *PBLOCKCIPHERPARAM;
6.4.9.2 数据项描述​

数据项描述见表11。

表11 分组密码参数

数据项类型意义备注
IVBYTE 数组初始向量,MAX_IV_LEN 为初始化向量的最大长度
#define MAX_IV_LEN 32
IVLenULONG初始向量实际长度(按字节计算)
PaddingTypeULONG填充方式,0 表示不填充,1 表示按照 PKCS #5 方式进行填充
FeedBitLenULONG反馈值的位长度(按位计算)只针对 OFB、CFB 模式

6.4.10 ECC加密密钥对保护结构​

6.4.10.1 类型定义​
typedef struct SKF_ENVELOPEDKEYBLOB {
ULONG Version;
ULONG ulSymmAlgID;
ULONG ulBits;
BYTE cbEncryptedPriKey[64];
ECCPUBLICKEYBLOB PubKey;
ECCCIPHERBLOB ECCCipherBlob;
} ENVELOPEDKEYBLOB, *PENVELOPEDKEYBLOB;

私钥密文结构中 64 字节,有效密文分组从 0 偏移量字节开始,顺序解密密文分组后将明文连接得到加密密钥对的私钥的明文。

6.4.10.2 数据项描述​

数据项描述见表12。

表12 加密密钥对保护结构参数

数据项类型意义备注
VersionULONG版本号,本版本为 1
ulSymmAlgIDULONG对称算法标识应为 ECB 模式
ulBitsULONG加密密钥对的密钥位长
cbEncryptedPriKeyBYTE 数组对称算法加密的加密私钥,加密私钥的原文为 ECCPRIVATEKEYBLOB 结构中的 PrivateKey其有效长度为原文的 (ulBits+7)/8
PubKeyECCPUBLICKEYBLOB加密密钥对的公钥
ECCCipherBlobECCCIPHERBLOB用保护公钥加密过的对称密钥密文

6.4.11 文件属性​

6.4.11.1 类型定义​
typedef struct Struct_FILEATTRIBUTE {
CHAR FileName[32];
ULONG FileSize;
ULONG ReadRights;
ULONG WriteRights;
} FILEATTRIBUTE, *PFILEATTRIBUTE;
6.4.11.2 数据项描述​

数据项描述见表13。

表 13 文件属性

数据项类型意义备注
FileNameCHAR 数组文件名以 \0 结束的 ASCII 字符串,最大长度为 32
FileSizeULONG文件大小创建文件时定义的文件大小
ReadRightsULONG读取权限读取文件需要的权限
WriteRightsULONG写入权限写入文件需要的权限

6.4.12 权限类型​

权限类型的定义见表14。

表14 权限类型

权限类型值说明
SECURE_NEVER_ACCOUNT0x00000000禁用
SECURE_ADM_ACCOUNT0x00000001管理员权限
SECURE_USER_ACCOUNT0x00000010用户权限
SECURE_ANYONE_ACCOUNT0x000000FF任何人

6.4.13 设备状态​

设备状态的定义见表15。

表15 设备状态

设备状态值说明
DEV_ABSENT_STATE0x00000000设备不存在
DEV_PRESENT_STATE0x00000001设备存在
DEV_UNKNOW_STATE0x00000002设备状态未知

7 接口函数​

7.1 设备管理​

7.1.1 概述​

设备管理主要完成设备的插拔事件处理、枚举设备、连接设备、断开连接、获取设备状态、设置设备标签、获取设备信息、锁定设备、解锁设备和设备命令传输等操作。设备管理系列函数如表16 所示。

表16 设备管理系列函数

函数名称功能
SKF_WaitForDevEvent等待设备插拔事件
SKF_CancelWaitForDevEvent取消等待设备插拔事件
SKF_EnumDev枚举设备
SKF_ConnectDev连接设备
SKF_DisconnectDev断开连接
SKF_GetDevState获取设备状态
SKF_SetLabel设置设备标签
SKF_GetDevInfo获取设备信息
SKF_LockDev锁定设备
SKF_UnlockDev解锁设备
SKF_Transmit设备命令传输

设备管理函数可能返回的错误码见附录 A。

7.1.2 等待设备插拔事件​

原型 ULONG DEVAPI SKF_WaitForDevEvent(LPSTR szDevName, ULONG *pulDevNameLen, ULONG *pulEvent)

功能描述 该函数等待设备插入或者拔除事件。szDevName 返回发生事件的设备名称。

参数 szDevName [OUT]发生事件的设备名称。

pulDevNameLen [IN/OUT]输入/输出参数,当输入时表示缓冲区长度,输出时表示设备名称的有效长度,长度包含字符串结束符。

pulEvent [OUT]事件类型。1 表示插入,2 表示拔出。

返回值 SAR_OK: 成功。

其他: 错误码。

注:本函数为阻塞函数。

7.1.3 取消等待设备插拔事件​

原型 ULONG DEVAPI SKF_CancelWaitForDevEvent()

功能描述 该函数取消等待设备插入或者拔除事件。

参数

返回值 SAR_OK: 成功。

其他: 错误码。

注:使本进程正在执行的SKF_WaitForDevEvent 函数立即返回。

7.1.4 枚举设备​

原型 ULONG DEVAPI SKF_EnumDev(BOOL bPresent, LPSTR szNameList, ULONG *pulSize)

功能描述 获得当前系统中的设备列表。

参数 bPresent [IN] TRUE 表示取当前设备状态为存在的设备列表。为FALSE 表示取当前驱动支持的设备列表。

szNameList [OUT]设备名称列表。如果该参数为 NULL,将由 pulSize 返回所需要的内存空间大小。每个设备的名称以单个\0结束,以双\0表示列表的结束。

pulSize [IN,OUT]输入时表示设备名称列表的缓冲区长度,输出时表示 szNameList 所占用的空间大小。

返回值 SAR_OK: 成功。

其他: 错误码。

7.1.5 连接设备​

原型 ULONG DEVAPI SKF_ConnectDev(LPSTR szName, DEVHANDLE *phDev)

功能描述 通过设备名称连接设备,返回设备的句柄。

参数 szName [IN]设备名称。

phDev [OUT]返回设备操作句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

7.1.6 断开连接​

原型 ULONG DEVAPI SKF_DisConnectDev(DEVHANDLE hDev)

功能描述 断开一个已经连接的设备,并释放句柄。

参数 hDev [IN]连接设备时返回的设备句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

注:如果该设备已被锁定,函数应首先解锁该设备。断开连接操作并不影响设备的权限状态。

7.1.7 获取设备状态​

原型 ULONG DEVAPI SKF_GetDevState(LPSTR szDevName, ULONG *pulDevState)

功能描述 获取设备是否存在的状态。

参数 szDevName [IN]设备名称。

pulDevState [OUT] 返回设备状态。

返回值 SAR_OK: 成功。

其他: 错误码。

7.1.8 设置设备标签​

原型 ULONG DEVAPI SKF_SetLabel(DEVHANDLE hDev, LPSTR szLabel)

功能描述 设置设备标签。

参数 hDev [IN]连接设备时返回的设备句柄。

szLabel [IN]设备标签字符串。该字符串应小于 32 字节。

返回值 SAR_OK: 成功。

其他: 错误码。

7.1.9 获取设备信息​

原型 ULONG DEVAPI SKF_GetDevInfo(DEVHANDLE hDev, DEVINFO *pDevInfo)

功能描述 获取设备的一些特征信息,包括设备标签、厂商信息、支持的算法等。

参数 hDev [IN]连接设备时返回的设备句柄。

pDevInfo [OUT] 返回设备信息。

返回值 SAR_OK: 成功。

其他: 错误码。

7.1.10 锁定设备​

原型 ULONG DEVAPI SKF_LockDev(DEVHANDLE hDev, ULONG ulTimeOut)

功能描述 获得设备的独占使用权。

参数 hDev [IN]连接设备时返回的设备句柄。

ulTimeOut [IN]超时时间,单位为毫秒。如果为 0xFFFFFFFF 表示无限等待。

返回值 SAR_OK: 成功。

其他: 错误码。

7.1.11 解锁设备​

原型 ULONG DEVAPI SKF_UnlockDev(DEVHANDLE hDev)

功能描述 释放对设备的独占使用权。

参数 hDev [IN]连接设备时返回的设备句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

7.1.12 设备命令传输​

原型 ULONG DEVAPI SKF_Transmit(DEVHANDLE hDev, BYTE *pbCommand, ULONG ulCommandLen, BYTE *pbData, ULONG *pulDataLen)

功能描述 将命令直接发送给设备,并返回结果。

参数 hDev [IN]设备句柄。

pbCommand [IN] 设备命令。

ulCommandLen [IN]命令长度。

pbData [OUT]返回结果数据。

pulDataLen [IN,OUT]输入时表示结果数据缓冲区长度,输出时表示结果数据实际长度。

返回值 SAR_OK: 成功。

其他: 错误码。

注:本函数仅用于设备检测。

7.2 访问控制​

7.2.1 概述​

访问控制主要完成设备认证、PIN码管理和安全状态管理等操作。访问控制系列函数如表17所示。

表17 访问控制系列函数

函数名称功能
SKF_ChangeDevAuthKey修改设备认证密钥
SKF_DevAuth设备认证
SKF_ChangePIN修改 PIN
SKF_GetPINInfo获得 PIN 码信息
SKF_VerifyPIN校验 PIN
SKF_UnblockPIN解锁 PIN
SKF_ClearSecueState清除应用安全状态

访问控制函数可能返回的错误码见附录 A。

7.2.2 修改设备认证密钥​

原型 ULONG DEVAPI SKF_ChangeDevAuthKey(DEVHANDLE hDev, BYTE *pbKeyValue, ULONG ulKeyLen)

功能描述 更改设备认证密钥。

参数 hDev [IN]连接时返回的设备句柄。

pbKeyValue [IN]密钥值。

ulKeyLen [IN]密钥长度。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:设备认证成功后才能使用。

7.2.3 设备认证​

原型 ULONG DEVAPI SKF_DevAuth(DEVHANDLE hDev, BYTE *pbAuthData, ULONG ulLen)

功能描述 设备认证是设备对应用程序的认证。认证过程参见 8.2.3。

参数 hDev [IN]连接时返回的设备句柄。

pbAuthData [IN]认证数据。

ulLen [IN]认证数据的长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.2.4 修改PIN​

原型 ULONG DEVAPI SKF_ChangePIN(HAPPLICATION hApplication, ULONG ulPINType, LPSTR szOldPin, LPSTR szNewPin, ULONG *pulRetryCount)

功能描述 调用该函数可以修改 Administrator PIN 和 User PIN 的值。

如果原 PIN码错误导致验证失败,该函数会返回相应 PIN 码的剩余重试次数,当剩余次数为0时,表示 PIN 已经被锁死。

参数 hApplication [IN] 应用句柄。

ulPINType [IN]PIN 类型,可为 ADMIN_TYPE 或 USER_TYPE。

szOldPin [IN]原 PIN 值。

szNewPin [IN]新PIN值。

pulRetryCount [OUT]出错后重试次数。

返回值 SAR_OK: 成功。

其他: 错误码。

7.2.5 获取 PIN信息​

原型 ULONG DEVAPI SKF_GetPINInfo(HAPPLICATION hApplication, ULONG ulPINType, ULONG *pulMaxRetryCount, ULONG *pulRemainRetryCount, BOOL *pbDefaultPin)

功能描述 获取 PIN 码信息,包括最大重试次数、当前剩余重试次数,以及当前 PIN 码是否为出厂默认 PIN 码。

参数 hApplication [IN]应用句柄。

ulPINType [IN]PIN 类型。

pulMaxRetryCount [OUT]最大重试次数。

pulRemainRetryCount [OUT]当前剩余重试次数,当为 0 时表示已锁死。

pbDefaultPin [OUT] 是否为出厂默认 PIN码。

返回值 SAR_OK: 成功。

其他: 错误码。

7.2.6 校验 PIN​

原型 ULONG DEVAPI SKF_VerifyPIN(HAPPLICATION hApplication, ULONG ulPINType, LPSTR szPIN, ULONG *pulRetryCount)

功能描述 校验 PIN 码。校验成功后,会获得相应的权限,如果 PIN 码错误,会返回 PIN 码的重试次数,当重试次数为 0 时表示 PIN 码已经锁死。

参数 hApplication [IN]应用句柄。

ulPINType [IN]PIN 类型。

szPIN [IN]PIN 值。

pulRetryCount [OUT] 出错后返回的重试次数。

返回值 SAR_OK: 成功。

其他: 错误码。

7.2.7 解锁 PIN​

原型 ULONG DEVAPI SKF_UnblockPIN(HAPPLICATION hApplication, LPSTR szAdminPIN, LPSTR szNewUserPIN, ULONG *pulRetryCount)

功能描述 当用户的 PIN 码锁死后,通过调用该函数来解锁用户 PIN 码。

解锁后,用户 PIN码被设置成新值,用户 PIN码的重试次数也恢复到原值。

参数 hApplication [IN]应用句柄。

szAdminPIN [IN]管理员 PIN码。

szNewUserPIN [IN]新的用户 PIN码。

pulRetryCount [OUT] 管理员 PIN 码错误时,返回剩余重试次数。

返回值 SAR_OK: 成功。

其他: 错误码。

注:验证完管理员 PIN 才能够解锁用户 PIN 码,如果输入的 Administrator PIN 不正确或者已经锁死,会调用失败,并返回 Administrator PIN 的重试次数。

7.2.8 清除应用安全状态​

原型 ULONG DEVAPI SKF_ClearSecureState(HAPPLICATION hApplication)

功能描述 清除应用当前的安全状态。

参数 hApplication [IN] 应用句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

7.3 应用管理​

7.3.1 概述​

应用管理主要完成应用的创建、枚举、删除、打开、关闭等操作。应用管理系列函数如表18所示。

表18 应用管理系列函数

函数名称功能
SKF_CreateApplication创建应用
SKF_EnumApplication枚举应用
SKF_DeleteApplication删除应用
SKF_OpenApplication打开应用
SKF_CloseApplication关闭应用

应用管理函数可能返回的错误码见附录 A。

7.3.2 创建应用​

原型 ULONG DEVAPI SKF_CreateApplication(DEVHANDLE hDev, LPSTR szAppName, LPSTR szAdminPin, DWORD dwAdminPinRetryCount, LPSTR szUserPin, DWORD dwUserPinRetryCount, DWORD dwCreateFileRights, HAPPLICATION *phApplication)

功能描述 创建一个应用。

参数 hDev [IN]连接设备时返回的设备句柄。

szAppName [IN]应用名称。

szAdminPin [IN] 管理员 PIN。

dwAdminPinRetryCount [IN] 管理员 PIN 最大重试次数。

szUserPin [IN]用户 PIN。

dwUserPinRetryCount [IN]用户 PIN 最大重试次数。

dwCreateFileRights [IN]在该应用下创建文件和容器的权限,参见6.4.9权限类型。

为各种权限的或值。

phApplication [OUT]应用的句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:需要设备权限。

7.3.3 枚举应用​

原型 ULONG DEVAPI SKF_EnumApplication(DEVHANDLE hDev, LPSTR szAppName, ULONG *pulSize)

功能描述 枚举设备中存在的所有应用。

参数 hDev [IN]连接设备时返回的设备句柄。

szAppName [OUT]返回应用名称列表,如果该参数为空,将由 pulSize 返回所需要的内存空间大小。每个应用的名称以单个\0结束,以双\0表示列表的结束。

pulSize [IN,OUT]输入时表示应用名称的缓冲区长度,输出时返回 szAppName 所占用的空间大小。

返回值 SAR_OK: 成功。

其他: 错误码。

7.3.4 删除应用​

原型 ULONG DEVAPI SKF_DeleteApplication(DEVHANDLE hDev, LPSTR szAppName)

功能描述 删除指定的应用。

参数 hDev [IN]连接设备时返回的设备句柄。

szAppName [IN]应用名称。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:需要设备权限。

7.3.5 打开应用​

原型 ULONG DEVAPI SKF_OpenApplication(DEVHANDLE hDev, LPSTR szAppName, HAPPLICATION *phApplication)

功能描述 打开指定的应用。

参数 hDev [IN]连接设备时返回的设备句柄。

szAppName [IN]应用名称。

phApplication [OUT]应用的句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

7.3.6 关闭应用​

原型 ULONG DEVAPI SKF_CloseApplication(HAPPLICATION hApplication)

功能描述 关闭应用并释放应用句柄。

参数 hApplication [IN]应用句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

注:此函数不影响应用安全状态。

7.4 文件管理​

7.4.1 概述​

文件管理函数用以满足用户扩展开发的需要,包括创建文件、删除文件、枚举文件、获取文件信息、文件读写等操作。文件管理系列函数如表19所示。

表19 文件管理系列函数

函数名称功能
SKF_CreateFile创建文件
SKF_DeleteFile删除文件
SKF_EnumFiles枚举文件
SKF_GetFileInfo获取文件信息
SKF_ReadFile读文件
SKF_WriteFile写文件

文件管理函数可能返回的错误码见附录 A。

7.4.2 创建文件​

原型 ULONG DEVAPI SKF_CreateFile(HAPPLICATION hApplication, LPSTR szFileName, ULONG ulFileSize, ULONG ulReadRights, ULONG ulWriteRights)

功能描述 创建文件时要指定文件的名称、大小,以及文件的读写权限。

参数 hApplication [IN]应用句柄。

szFileName [IN]文件名称,长度不得大于32个字节。

ulFileSize [IN]文件大小。

ulReadRights [IN]文件读权限,参见 6.4.12 权限类型。可为各种权限的或值。

ulWriteRights [IN]文件写权限,参见6.4.12权限类型。可为各种权限的或值。

返回值 SAR_OK: 成功。

其他: 错误码。

注:创建文件需要应用指定的创建文件权限。

7.4.3 删除文件​

原型 ULONG DEVAPI SKF_DeleteFile(HAPPLICATION hApplication, LPSTR szFileName)

功能描述 删除指定文件:文件删除后,文件中写入的所有信息将丢失。

文件在设备中的占用的空间将被释放。

参数 hApplication [IN]要删除文件所在的应用句柄。

szFileName [IN]要删除文件的名称。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:删除一个文件应具有对该文件的创建权限。

7.4.4 枚举文件​

原型 ULONG DEVAPI SKF_EnumFiles(HAPPLICATION hApplication, LPSTR szFileList, ULONG *pulSize)

功能描述 枚举一个应用下存在的所有文件。

参数 hApplication [IN] 应用句柄。

szFileList [OUT]返回文件名称列表,该参数为空,由 pulSize 返回文件信息所需要的空间大小。每个文件名称以单个 \0 结束,以双 \0 表示列表的结束。

pulSize [IN,OUT]输入时表示数据缓冲区的大小,输出时表示实际文件名称列表的长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.4.5 获取文件属性​

原型 ULONG DEVAPI SKF_GetFileInfo(HAPPLICATION hApplication, LPSTR szFileName, FILEATTRIBUTE *pFileInfo)

功能描述 获取文件信息:获取应用文件的属性信息,例如文件的大小、权限等。

参数 hApplication [IN]文件所在应用的句柄。

szFileName [IN]文件名称。

pFileInfo [OUT] 文件信息,指向文件属性结构的指针。

返回值 SAR_OK: 成功。

其他: 错误码。

7.4.6 读文件​

原型 ULONG DEVAPI SKF_ReadFile(HAPPLICATION hApplication, LPSTR szFileName, ULONG ulOffset, ULONG ulSize, BYTE *pbOutData, ULONG *pulOutLen)

功能描述 读取文件内容。

参数 hApplication [IN] 应用句柄。

szFileName [IN] 文件名。

ulOffset [IN]文件读取偏移位置。

ulSize [IN]要读取的长度。

pbOutData [OUT]返回数据的缓冲区。

pulOutLen [IN,OUT]输入时表示给出的缓冲区大小;输出时表示实际读取返回的数据大小。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:须具备对该文件的读权限。

7.4.7 写文件​

原型 ULONG DEVAPI SKF_WriteFile(HAPPLICATION hApplication, LPSTR szFileName, ULONG ulOffset, BYTE *pbData, ULONG ulSize)

功能描述 写数据到文件中。

参数 hApplication [IN]应用句柄。

szFileName [IN]文件名。

ulOffset [IN]写入文件的偏移量。

pbData [IN]写入数据缓冲区。

ulSize [IN]写入数据的大小。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:须具备该文件的写权限。

7.5 容器管理​

7.5.1 概述​

本标准提供的应用管理用于满足各种不同应用的管理,包括创建、删除、枚举、打开和关闭容器的操作。容器管理系列函数如表20所示。

表20 容器管理系列函数

函数名称功能
SKF_CreateContainer创建容器
SKF_DeleteContainer删除容器
SKF_EnumContainer枚举容器
SKF_OpenContainer打开容器
SKF_CloseContainer关闭容器
SKF_GetContainerType获得容器类型
SKF_ImportCertificate导入数字证书
SKF_ExportCertificate导出数字证书

容器管理函数可能返回的错误码见附录A。

7.5.2 创建容器​

原型 ULONG DEVAPI SKF_CreateContainer(HAPPLICATION hApplication, LPSTR szContainerName, HCONTAINER *phContainer)

功能描述 在应用下建立指定名称的容器并返回容器句柄。

参数 hApplication [IN]应用句柄。

szContainerName [IN] ASCII 字符串,表示所建立容器的名称,容器名称的最大长度不能超过64字节。

phContainer [OUT]返回所建立容器的容器句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:需要用户权限。

7.5.3 删除容器​

原型 ULONG DEVAPI SKF_DeleteContainer(HAPPLICATION hApplication, LPSTR szContainerName)

功能描述 在应用下删除指定名称的容器并释放容器相关的资源。

参数 hApplication [IN]应用句柄。

szContainerName [IN] 指向删除容器的名称。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:需要用户权限。

7.5.4 打开容器​

原型 ULONG DEVAPI SKF_OpenContainer(HAPPLICATION hApplication, LPSTR szContainerName, HCONTAINER *phContainer)

功能描述 获取容器句柄。

参数 hApplication [IN]应用句柄。

szContainerName [IN] 容器的名称。

phContainer [OUT]返回所打开容器的句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

7.5.5 关闭容器​

原型 ULONG DEVAPI SKF_CloseContainer(HCONTAINER hContainer)

功能描述 关闭容器句柄,并释放容器句柄相关资源。

参数 hContainer [IN]容器句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

7.5.6 枚举容器​

原型 ULONG DEVAPI SKF_EnumContainer(HAPPLICATION hApplication, LPSTR szContainerName, ULONG *pulSize)

功能描述 枚举容器下所有容器并返回容器名称列表。

参数 hApplication [IN]应用句柄。

szContainerName [OUT]指向容器名称列表缓冲区,如果此参数为 NULL 时,pulSize 表示返回数据所需缓冲区的长度;如果此参数不为 NULL 时,返回容器名称列表,每个容器名以 \0 为结束,列表以双 \0 结束。

pulSize [IN,OUT]输入时表示 szContainerName 缓存区的长度,输出时表示容器名称列表的长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.5.7 获得容器类型​

原型 ULONG DEVAPI SKF_GetContainerType(HCONTAINER hContainer, ULONG *pulContainerType)

功能描述 获取容器的类型。

参数 hContainer [IN]容器句柄。

pulContainerType [OUT]获得的容器类型。指针指向的值为 0 表示未定、尚未分配类型或者为空容器,为 1 表示为 RSA 容器,为 2 表示为 SM2 容器。

返回值 SAR_OK: 成功。

其他: 错误码。

7.5.8 导入数字证书​

原型 ULONG DEVAPI SKF_ImportCertificate(HCONTAINER hContainer, BOOL bSignFlag, BYTE *pbCert, ULONG ulCertLen)

功能描述 向容器内导入数字证书。

参数 hContainer [IN]容器句柄。

bSignFlag [IN] TRUE 表示签名证书,FALSE 表示加密证书。

pbCert [IN]指向证书内容缓冲区。

ulCertLen [IN]证书长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.5.9 导出数字证书​

原型 ULONG DEVAPI SKF_ExportCertificate(HCONTAINER hContainer, BOOL bSignFlag, BYTE *pbCert, ULONG *pulCertLen)

功能描述 从容器内导出数字证书。

参数 hContainer [IN] 容器句柄。

bSignFlag [IN]TRUE 表示签名证书,FALSE 表示加密证书。

pbCert [OUT]指向证书内容缓冲区,如果此参数为 NULL 时,pulCertLen 表示返回数据所需缓冲区的长度;如果此参数不为 NULL 时,返回数字证书内容。

pulCertLen [IN/OUT]输入时表示pbCert 缓冲区的长度,输出时表示证书内容的长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6 密码服务​

7.6.1 概述​

密码服务函数提供对称算法运算、非对称算法运算、密码杂凑运算、密钥管理、消息鉴别码计算等功能。密码服务系列函数如表21 所示。

表21 密码服务系列函数

函数名称功能
SKF_GenRandom生成随机数
SKF_GenExtRSAKey生成外部 RSA 密钥对
SKF_GenRSAKeyPair生成 RSA 签名密钥对
SKF_ImportRSAKeyPair导入 RSA 加密密钥对
SKF_RSASignDataRSA 签名
SKF_RSAVerifyRSA 验签
SKF_RSAExportSessionKeyRSA 生成并导出会话密钥
SKF_ExtRSAPubKeyOperationRSA 外来公钥运算
SKF_ExtRSAPriKeyOperationRSA 外来私钥运算
SKF_GenECCKeyPair生成 ECC 签名密钥对
SKF_ImportECCKeyPair导入 ECC 加密密钥对
SKF_ECCSignDataECC 签名
SKF_ECCVerifyECC 验签
SKF_ECCExportSessionKeyECC 生成并导出会话密钥
SKF_ExtECCEncryptECC 外来公钥加密
SKF_ExtECCDecryptECC 外来私钥解密
SKF_ExtECCSignECC 外来私钥签名
SKF_ExtECCVerifyECC 外来公钥验签
SKF_GenerateAgreementDataWithECCECC 生成密钥协商参数并输出
SKF_GenerateKeyWithECCECC 计算会话密钥
SKF_GenerateAgreementDataAndKeyWithECCECC 产生协商数据并计算会话密钥
SKF_GenerateKeywithIKE计算 IKE 工作密钥
SKF_GenerateKeywithEPK_IKE计算 IKE 工作密钥并用外部公钥加密导出
SKF_GenerateKeywithIPSEC计算 IPSEC 会话密钥
SKF_GenerateKeywithEPK_IPSEC计算 IPSEC 会话密钥并用外部公钥加密导出
SKF_GenerateKeywithSSL计算 SSL 工作密钥
SKF_GenerateKeywithEPK_SSL计算 SSL 工作密钥并用外部公钥加密导出
SKF_ExportPublicKey导出公钥
SKF_ImportSessionKey导入会话密钥
SKF_SetSymmKey明文导入会话密钥
SKF_EncryptInit加密初始化
SKF_Encrypt单组数据加密
SKF_EncryptUpdate多组数据加密
SKF_EncryptFinal结束加密
SKF_DecryptInit解密初始化
SKF_Decrypt单组数据解密
SKF_DecryptUpdate多组数据解密
SKF_DecryptFinal结束解密
SKF_DigestInit密码杂凑初始化
SKF_Digest单组数据密码杂凑
SKF_DigestUpdate多组数据密码杂凑
SKF_DigestFinal结束密码杂凑
SKF_MacInit消息鉴别码运算初始化
SKF_Mac单组数据消息鉴别码运算
SKF_MacUpdate多组数据消息鉴别码运算
SKF_MacFinal结束消息鉴别码运算
SKF_CloseHandle关闭密码对象句柄

密码服务函数可能返回的错误码见附录 A。

7.6.2 生成随机数​

原型 ULONG DEVAPI SKF_GenRandom(DEVHANDLE hDev, BYTE *pbRandom, ULONG ulRandomLen)

功能描述 产生指定长度的随机数。

参数 hDev [IN] 设备句柄。

pbRandom [OUT] 返回的随机数。

ulRandomLen [IN]随机数长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.3 生成外部 RSA密钥对​

原型 ULONG DEVAPI SKF_GenExtRSAKey(DEVHANDLE hDev, ULONG ulBitsLen, RSAPRIVATEKEYBLOB *pBlob)

功能描述 由设备生成 RSA 密钥对并明文输出。

参数 hDev [IN]设备句柄。

ulBitsLen [IN]密钥模长。

pBlob [OUT] 返回的私钥数据结构。

返回值 SAR_OK: 成功。

其他: 错误码。

注:生成的私钥只用于输出,接口内不做保留和计算。

7.6.4 生成 RSA 签名密钥对​

原型 ULONG DEVAPI SKF_GenRSAKeyPair(HCONTAINER hContainer, ULONG ulBitsLen, RSAPUBLICKEYBLOB *pBlob)

功能描述 生成 RSA 签名密钥对并输出签名公钥。

参数 hContainer [IN]容器句柄。

ulBitsLen [IN]密钥模长。

pBlob [OUT]返回的RSA公钥数据结构。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:需要用户权限。

7.6.5 导入 RSA加密密钥对​

原型 ULONG DEVAPI SKF_ImportRSAKeyPair(HCONTAINER hContainer, ULONG ulSymAlgId, BYTE *pbWrappedKey, ULONG ulWrappedKeyLen, BYTE *pbEncryptedData, ULONG ulEncryptedDataLen)

功能描述 导入 RSA 加密公私钥对。

参数 hContainer [IN]容器句柄。

ulSymAlgId [IN]对称算法密钥标识。

pbWrappedKey [IN]使用该容器内签名公钥保护的对称算法密钥。

ulWrappedKeyLen [IN]保护的对称算法密钥长度。

pbEncryptedData [IN]对称算法密钥保护的 RSA 加密私钥。私钥的格式遵循 PKCS #1 v2.1:RSA Cryptography Standard 中的私钥格式定义。

ulEncryptedDataLen [IN]对称算法密钥保护的 RSA 加密公私钥对长度。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:需要用户权限。

7.6.6 RSA 签名​

原型 ULONG DEVAPI SKF_RSASignData(HCONTAINER hContainer, BYTE *pbData, ULONG ulDataLen, BYTE *pbSignature, ULONG *pulSignLen)

功能描述 使用 hContainer 指定容器的签名私钥,对指定数据 pbData 进行数字签名。签名后的结果存放到 pbSignature 缓冲区,设置 pulSignLen 为签名的长度。

参数 hContainer [IN] 用来签名的私钥所在容器句柄。

pbData [IN]被签名的数据。

ulDataLen [IN]签名数据长度,应不大于 RSA 密钥模长-11。

pbSignature [OUT]存放签名结果的缓冲区指针,如果值为 NULL,用于取得签名结果长度。

pulSignLen [IN,OUT] 输入时表示签名结果缓冲区大小,输出时表示签名结果长度。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:需要用户权限。

7.6.7 RSA 验签​

原型 ULONG DEVAPI SKF_RSAVerify(DEVHANDLE hDev, RSAPUBLICKEYBLOB *pRSAPubKeyBlob, BYTE *pbData, ULONG ulDataLen, BYTE *pbSignature, ULONG ulSignLen)

功能描述 验证 RSA 签名。用 pRSAPubKeyBlob 内的公钥值对待验签数据进行验签。

参数 hDev [IN]设备句柄。

pRSAPubKeyBlob [IN] RSA 公钥数据结构。

pbData [IN]待验证签名的数据。

ulDataLen [IN]数据长度,应不大于公钥模长-11。

pbSignature [IN]待验证的签名值。

ulSignLen [IN]签名值长度,应为公钥模长。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.8 RSA 生成并导出会话密钥​

原型 ULONG DEVAPI SKF_RSAExportSessionKey(HCONTAINER hContainer, ULONG ulAlgId, RSAPUBLICKEYBLOB *pPubKey, BYTE *pbData, ULONG *pulDataLen, HANDLE *phSessionKey)

功能描述 生成会话密钥并用外部 RSA 公钥加密输出。

参数 hContainer [IN] 容器句柄。

ulAlgId [IN]会话密钥算法标识。

pPubKey [IN]加密会话密钥的 RSA 公钥数据结构。

pbData [OUT]导出的加密会话密钥密文,按照 PKCS#1v1.5 要求封装。

pulDataLen [IN,OUT]输入时表示会话密钥密文数据缓冲区长度,输出时表示会话密钥密文的实际长度。

phSessionKey [OUT] 导出的密钥句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.9 RSA外来公钥运算​

原型 ULONG DEVAPI SKF_ExtRSAPubKeyOperation(DEVHANDLE hDev, RSAPUBLICKEYBLOB *pRSAPubKeyBlob, BYTE *pbInput, ULONG ulInputLen, BYTE *pbOutput, ULONG *pulOutputLen)

功能描述 使用外部传入的 RSA 公钥对输入数据做公钥运算并输出结果。

参数 hDev [IN]设备句柄。

pRSAPubKeyBlob [IN]RSA 公钥数据结构。

pbInput [IN]指向待运算的原始数据缓冲区。

ulInputLen [IN]待运算原始数据的长度,应为公钥模长。

pbOutput [OUT]指向 RSA 公钥运算结果缓冲区,如果该参数 NULL,则由 pulOutputLen 返回运算结果的实际长度。

pulOutputLen [IN,OUT] 输入时表示 pbOutput 缓冲区的长度,输出时表示 RSA 公钥运算结果的实际长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.10 RSA外来私钥运算​

原型 ULONG DEVAPI SKF_ExtRSAPriKeyOperation(DEVHANDLE hDev, RSAPRIVATEKEYBLOB *pRSAPriKeyBlob, BYTE *pbInput, ULONG ulInputLen, BYTE *pbOutput, ULONG *pulOutputLen)

功能描述 直接使用外部传入的 RSA 私钥对输入数据做私钥运算并输出结果。

参数 hDev [IN]设备句柄。

pRSAPriKeyBlob [IN] RSA 私钥数据结构。

pbInput [IN]指向待运算数据缓冲区。

ulInputLen [IN]待运算数据的长度,应为公钥模长。

pbOutput [OUT] RSA 私钥运算结果,如果该参数 NULL,则由 pulOutputLen 返回运算结果的实际长度。

pulOutputLen [IN,OUT] 输入时表示 pbOutput 缓冲区的长度,输出时表示 RSA 私钥运算结果的实际长度。

返回值 SAR_OK: 成功。

其他: 错误码。

注:本函数仅用于测试和调试,不建议用于实际的密码服务。

7.6.11 生成 ECC 签名密钥对​

原型 ULONG DEVAPI SKF_GenECCKeyPair(HCONTAINER hContainer, ULONG ulAlgId, ECCPUBLICKEYBLOB *pBlob)

功能描述 生成 ECC 签名密钥对并输出签名公钥。

参数 hContainer [IN]密钥容器句柄。

ulAlgId [IN]算法标识,只支持 SGD_SM2_1 算法。

pBlob [OUT]返回 ECC 公钥数据结构。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:需要用户权限。

7.6.12 导入ECC加密密钥对​

原型 ULONG DEVAPI SKF_ImportECCKeyPair(HCONTAINER hContainer, PENVELOPEDKEYBLOB pEnvelopedKeyBlob)

功能描述 导入 ECC 公私钥对。

参数 hContainer [IN]密钥容器句柄。

pEnvelopedKeyBlob [IN]受保护的加密密钥对。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:需要用户权限。

7.6.13 ECC 签名​

原型 ULONG DEVAPI SKF_ECCSignData(HCONTAINER hContainer, BYTE *pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature)

功能描述 ECC 数字签名。采用 ECC 算法和指定私钥 hKey,对指定数据 pbData 进行数字签名。签名后的结果存放到 pSignature 中。

参数 hContainer [IN]密钥容器句柄。

pbData [IN]待签名的数据。

ulDataLen [IN]待签名数据长度,应小于密钥模长。

pSignature [OUT]签名值。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:需要用户权限。

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

7.6.14 ECC 验签​

原型 ULONG DEVAPI SKF_ECCVerify(DEVHANDLE hDev, ECCPUBLICKEYBLOB *pECCPubKeyBlob, BYTE *pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature)

功能描述 用 ECC 公钥对数据进行验签。

参数 hDev [IN]设备句柄。

pECCPubKeyBlob [IN] ECC 公钥数据结构。

pbData [IN]待验证签名的数据。

ulDataLen [IN]数据长度。

pSignature [IN]待验证签名值。

返回值 SAR_OK: 成功。

其他: 错误码。

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

7.6.15 ECC生成并导出会话密钥​

原型 ULONG DEVAPI SKF_ECCExportSessionKey(HCONTAINER hContainer, ULONG ulAlgId, ECCPUBLICKEYBLOB *pPubKey, PECCCIPHERBLOB pData, HANDLE *phSessionKey)

功能描述 生成会话密钥并用外部公钥加密导出。

参数 hContainer [IN]容器句柄。

ulAlgId [IN]会话密钥算法标识。

pPubKey [IN]外部输入的公钥结构。

pData [OUT] 会话密钥密文。

phSessionKey [OUT]会话密钥句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.16 ECC外来公钥加密​

原型 ULONG DEVAPI SKF_ExtECCEncrypt(DEVHANDLE hDev, ECCPUBLICKEYBLOB *pECCPubKeyBlob, BYTE *pbPlainText, ULONG ulPlainTextLen, PECCCIPHERBLOB pCipherText)

功能描述 使用外部传入的 ECC 公钥对输入数据做加密运算并输出结果。

参数 hDev [IN] 设备句柄。

pECCPubKeyBlob [IN] ECC公钥数据结构。

pbPlainText [IN] 待加密的明文数据。

ulPlainTextLen [IN]待加密明文数据的长度。

pCipherText [OUT] 密文数据。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.17 ECC外来私钥解密​

原型 ULONG DEVAPI SKF_ExtECCDecrypt(DEVHANDLE hDev, ECCPRIVATEKEYBLOB *pECCPriKeyBlob, PECCCIPHERBLOB pCipherText, BYTE *pbPlainText, ULONG *pulPlainTextLen)

功能描述 使用外部传入的 ECC 私钥对输入数据做解密运算并输出结果。

参数 hDev [IN]设备句柄。

pECCPriKeyBlob [IN] ECC 私钥数据结构。

pCipherText [IN] 待解密的密文数据。

pbPlainText [OUT]返回明文数据,如果该参数为 NULL,则由 pulPlainTextLen 返回明文数据的实际长度。

pulPlainTextLen [IN,OUT] 输入时表示 pbPlainText 缓冲区的长度,输出时表示明文数据的实际长度。

返回值 SAR_OK: 成功。

其他: 错误码。

注:本函数仅用于测试和调试,不建议用于实际的密码服务。

7.6.18 ECC外来私钥签名​

原型 ULONG DEVAPI SKF_ExtECCSign(DEVHANDLE hDev, ECCPRIVATEKEYBLOB *pECCPriKeyBlob, BYTE *pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature)

功能描述 使用外部传入的 ECC 私钥对输入数据做签名运算并输出结果。

参数 hDev [IN]设备句柄。

pECCPriKeyBlob [IN] ECC 私钥数据结构。

pbData [IN]待签名数据。

ulDataLen [IN]待签名数据的长度。

pSignature [OUT] 签名值。

返回值 SAR_OK: 成功。

其他: 错误码。

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

注2:本函数仅用于测试和调试,不建议用于实际的密码服务。

7.6.19 ECC 外来公钥验签​

原型 ULONG DEVAPI SKF_ExtECCVerify(DEVHANDLE hDev, ECCPUBLICKEYBLOB *pECCPubKeyBlob, BYTE *pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature)

功能描述 外部使用传入的 ECC 公钥做签名验证。

参数 hDev [IN]设备句柄。

pECCPubKeyBlob [IN]ECC公钥数据结构。

pbData [IN]待验证数据。

ulDataLen [IN]待验证数据的长度。

pSignature [IN] 签名值。

返回值 SAR_OK: 成功。

其他: 错误码。

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

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

原型 ULONG DEVAPI SKF_GenerateAgreementDataWithECC(HCONTAINER hContainer, ULONG ulAlgId, ECCPUBLICKEYBLOB *pTempECCPubKeyBlob, BYTE *pbID, ULONG ulIDLen, HANDLE *phAgreementHandle)

功能描述 使用 ECC 密钥协商算法,为计算会话密钥而产生协商参数,返回临时 ECC 密钥对的公钥及协商句柄。

参数 hContainer [IN]容器句柄。

ulAlgId [IN]会话密钥算法标识。

pTempECCPubKeyBlob [OUT]发起方临时 ECC 公钥。

pbID [IN]发起方的 ID。

ulIDLen [IN]发起方 ID 的长度,不大于 32。

phAgreementHandle [OUT]返回的密钥协商句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

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

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

原型 ULONG DEVAPI SKF_GenerateAgreementDataAndKeyWithECC(HANDLE hContainer, ULONG ulAlgId, ECCPUBLICKEYBLOB *pSponsorECCPubKeyBlob, ECCPUBLICKEYBLOB *pSponsorTempECCPubKeyBlob, ECCPUBLICKEYBLOB *pTempECCPubKeyBlob, BYTE *pbID, ULONG ulIDLen, BYTE *pbSponsorID, ULONG ulSponsorIDLen, HANDLE *phKeyHandle)

功能描述 使用 ECC 密钥协商算法,产生协商参数并计算会话密钥,输出临时 ECC 密钥对公钥,并返回产生的密钥句柄。

参数 hContainer [IN]容器句柄。

ulAlgId [IN]会话密钥算法标识。

pSponsorECCPubKeyBlob [IN]发起方的 ECC公钥。

pSponsorTempECCPubKeyBlob [IN]发起方的临时 ECC 公钥。

pTempECCPubKeyBlob [OUT] 响应方的临时ECC公钥。

pbID [IN]响应方的ID。

ulIDLen [IN] 响应方 ID 的长度,不大于 32。

pbSponsorID [IN]发起方的 ID。

ulSponsorIDLen [IN]发起方 ID 的长度,不大于 32。

phKeyHandle [OUT]返回的对称算法密钥句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

注:本函数由响应方调用。

7.6.22 ECC计算会话密钥​

原型 ULONG DEVAPI SKF_GenerateKeyWithECC(HANDLE hAgreementHandle, ECCPUBLICKEYBLOB *pECCPubKeyBlob, ECCPUBLICKEYBLOB *pTempECCPubKeyBlob, BYTE *pbID, ULONG ulIDLen, HANDLE *phKeyHandle)

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

参数 hAgreementHandle [IN]密钥协商句柄。

pECCPubKeyBlob [IN]外部输入的响应方 ECC 公钥。

pTempECCPubKeyBlob [IN]外部输入的响应方临时 ECC 公钥。

pbID [IN]响应方的 ID。

ulIDLen [IN] 响应方 ID 的长度,不大于 32。

phKeyHandle [OUT]返回的密钥句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

注:协商的发起方获得响应方的协商参数后调用本函数,计算会话密钥。计算过程遵循 GB/T 35276。

7.6.23 计算 IKE 工作密钥​

原型

int SKF_GenerateKeywithIKE(
HANDLE hSessionHandle,
BYTE *pucSponsorNonce, UINT uiSponsorNonceLength,
BYTE *pucResponseNonce, UINT uiResponseNonceLength,
BYTE *pucSponsorCookie, UINT uiSponsorCookieLength,
BYTE *pucResponseCookie, UINT uiResponseCookieLength,
UINT uiPrfAlgID,
UINT uiKeyBitsD, HANDLE phKeyHandleD,
UINT uiKeyBitsA, HANDLE phKeyHandleA,
UINT uiKeyBitsE, HANDLE phKeyHandleE);

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

参数

参数方向说明
hSessionHandlein与设备建立的会话句柄
pucSponsorNoncein发起方 nonce 载荷主体
uiSponsorNonceLengthin发起方 nonce 载荷主体长度
pucResponseNoncein响应方 nonce 载荷主体
uiResponseNonceLengthin响应方 nonce 载荷主体长度
pucSponsorCookiein发起方 cookie
uiSponsorCookieLengthin发起方 cookie 长度
pucResponseCookiein响应方 cookie
uiResponseCookieLengthin响应方 cookie 长度
uiPrfAlgIDinPRF 算法标识
uiKeyBitsDin返回的 SKEYID_d 密钥长度
phKeyHandleDout返回的 SKEYID_d 密钥句柄
uiKeyBitsAin返回的 SKEYID_a 密钥长度
phKeyHandleAout返回的 SKEYID_a 密钥句柄
uiKeyBitsEin返回的 SKEYID_e 密钥长度
phKeyHandleEout返回的 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。

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

原型

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

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

参数

参数方向说明
hSessionHandlein与设备建立的会话句柄
pucSponsorNoncein发起方 nonce 载荷主体
uiSponsorNonceLengthin发起方 nonce 载荷主体长度
pucResponseNoncein响应方 nonce 载荷主体
uiResponseNonceLengthin响应方 nonce 载荷主体长度
pucSponsorCookiein发起方 cookie
uiSponsorCookieLengthin发起方 cookie 长度
pucResponseCookiein响应方 cookie
uiResponseCookieLengthin响应方 cookie 长度
uiPrfAlgIDinPRF 算法标识
uiEccAlgIDin外部 ECC 公钥的算法标识
pucPublicKeyin输入的外部 ECC 公钥结构
uiKeyBitsDin返回的 SKEYID_d 密钥长度
pucKeyDout缓冲区指针,用于存放返回的 SKEYID_d 密钥密文
phKeyHandleDout返回的 SKEYID_d 密钥句柄
uiKeyBitsAin返回的 SKEYID_a 密钥长度
pucKeyAout缓冲区指针,用于存放返回的 SKEYID_a 密钥密文
phKeyHandleAout返回的 SKEYID_a 密钥句柄
uiKeyBitsEin返回的 SKEYID_e 密钥长度
pucKeyEout缓冲区指针,用于存放返回的 SKEYID_e 密钥密文
phKeyHandleEout返回的 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。

7.6.25 计算 IPSEC 会话密钥​

原型

int SKF_GenerateKeywithIPSEC(
HANDLE hSessionHandle,
BYTE *pucProtocolID, UINT uiProtocolIDLength,
BYTE *pucSpi, UINT uiSpiLength,
BYTE *pucSponsorNonce, UINT uiSponsorNonceLength,
BYTE *pucResponseNonce, UINT uiResponseNonceLength,
HANDLE phKeyHandle, UINT uiPrfAlgID,
UINT uiKeyBitsEnc, HANDLE phKeyHandleEnc,
UINT uiKeyBitsMac, HANDLE phKeyHandleMac);

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

参数

参数方向说明
hSessionHandlein与设备建立的会话句柄
pucProtocolIDin协议 ID
uiProtocolIDLengthin协议 ID 长度
pucSpiin安全参数索引 SPI
uiSpiLengthin安全参数索引 SPI 长度
pucSponsorNoncein发起方 nonce 载荷主体
uiSponsorNonceLengthin发起方 nonce 载荷主体长度
pucResponseNoncein响应方 nonce 载荷主体
uiResponseNonceLengthin响应方 nonce 载荷主体长度
hKeyHandlein输入的 SKEYID_d 密钥句柄
uiPrfAlgIDinPRF 算法标识
uiKeyBitsEncin返回的加密密钥长度
phKeyHandleEncout返回的加密密钥句柄
uiKeyBitsMacin返回的杂凑密钥长度
phKeyHandleMacout返回的杂凑密钥句柄

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

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

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

原型

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

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

参数

参数方向说明
hSessionHandlein与设备建立的会话句柄
pucProtocolIDin协议 ID
uiProtocolIDLengthin协议 ID 长度
pucSpiin安全参数索引 SPI
uiSpiLengthin安全参数索引 SPI 长度
pucSponsorNoncein发起方 nonce 载荷主体
uiSponsorNonceLengthin发起方 nonce 载荷主体长度
pucResponseNoncein响应方 nonce 载荷主体
uiResponseNonceLengthin响应方 nonce 载荷主体长度
hKeyHandlein输入的 SKEYID_d 密钥句柄
uiPrfAlgIDinPRF 算法标识
uiEccAlgIDin外部 ECC 公钥的算法标识
pucPublicKeyin输入的外部 ECC 公钥结构
uiKeyBitsEncin返回的加密密钥长度
pucKeyEncout缓冲区指针,用于存放返回的加密密钥密文
phKeyHandleEncout返回的加密密钥句柄
uiKeyBitsMacin返回的杂凑密钥长度
pucKeyMacout缓冲区指针,用于存放返回的杂凑密钥密文
phKeyHandleMacout返回的杂凑密钥句柄

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

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

7.6.27 计算 SSL 工作密钥​

原型

int SKF_GenerateKeywithSSL(
HANDLE hSessionHandle,
BYTE *pucKeyPreMaster, UINT uiKeyPreMasterLength,
BYTE *pucClientRandom, UINT uiClientRandomLength,
BYTE *pucServerRandom, UINT uiServerRandomLength,
UINT uiPrfAlgID,
UINT uiKeyBitsClientMac, HANDLE *phKeyHandleClientMac,
UINT uiKeyBitsServerMac, HANDLE *phKeyHandleServerMac,
UINT uiKeyBitsClientEnc, HANDLE *phKeyHandleClientEnc,
UINT uiKeyBitsServerEnc, HANDLE *phKeyHandleServerEnc);

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

参数

参数方向说明
hSessionHandlein与设备建立的会话句柄
pucKeyPreMasterin预主密钥 pre_master_secret
uiKeyPreMasterLengthin预主密钥长度
pucClientRandomin客户端随机数
uiClientRandomLengthin客户端随机数长度
pucServerRandomin服务端随机数
uiServerRandomLengthin服务端随机数长度
uiPrfAlgIDinPRF 算法标识
uiKeyBitsClientMacin客户端杂凑密钥长度
phKeyHandleClientMacout客户端杂凑密钥句柄
uiKeyBitsServerMacin服务端杂凑密钥长度
phKeyHandleServerMacout服务端杂凑密钥句柄
uiKeyBitsClientEncin客户端加密密钥长度
phKeyHandleClientEncout客户端加密密钥句柄
uiKeyBitsServerEncin服务端加密密钥长度
phKeyHandleServerEncout服务端加密密钥句柄

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

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

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

原型

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

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

参数

参数方向说明
hSessionHandlein与设备建立的会话句柄
pucKeyPreMasterin预主密钥 pre_master_secret
uiKeyPreMasterLengthin预主密钥长度
pucClientRandomin客户端随机数
uiClientRandomLengthin客户端随机数长度
pucServerRandomin服务端随机数
uiServerRandomLengthin服务端随机数长度
uiPrfAlgIDinPRF 算法标识
uiEccAlgIDin外部 ECC 公钥的算法标识
pucPublicKeyin输入的外部 ECC 公钥结构
uiKeyBitsClientMacin客户端杂凑密钥长度
pucKeyClientMacout客户端杂凑密钥
phKeyHandleClientMacout客户端杂凑密钥句柄
uiKeyBitsServerMacin服务端杂凑密钥长度
pucKeyServerMacout服务端杂凑密钥
phKeyHandleServerMacout服务端杂凑密钥句柄
uiKeyBitsClientEncin客户端加密密钥长度
pucKeyClientEncout客户端加密密钥
phKeyHandleClientEncout客户端加密密钥句柄
uiKeyBitsServerEncin服务端加密密钥长度
pucKeyServerEncout服务端加密密钥
phKeyHandleServerEncout服务端加密密钥句柄

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

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

7.6.29 导出公钥​

原型 ULONG DEVAPI SKF_ExportPublicKey(HCONTAINER hContainer, BOOL bSignFlag, BYTE *pbBlob, ULONG *pulBlobLen)

功能描述 导出容器中的签名公钥或者加密公钥。

参数 hContainer [IN]密钥容器句柄。

bSignFlag [IN]TRUE 表示导出签名公钥,FALSE 表示导出加密公钥。

pbBlob [OUT] 指向 RSA 公钥结构(RSAPUBLICKEYBLOB)或者 ECC 公钥结构(ECCPUBLICKEYBLOB),如果此参数为 NULL 时,由 pulBlobLen 返回 pbBlob 的长度。

pulBlobLen [IN,OUT] 输入时表示 pbBlob 缓冲区的长度,输出时表示导出公钥结构的大小。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.30 导入会话密钥​

原型 ULONG DEVAPI SKF_ImportSessionKey(HCONTAINER hContainer, ULONG ulAlgId, BYTE *pbWrapedData, ULONG ulWrapedLen, HANDLE *phKey)

功能描述 导入会话密钥密文,使用容器中的加密私钥解密得到会话密钥。

参数 hContainer [IN]容器句柄。

ulAlgId [IN]会话密钥算法标识。

pbWrapedData [IN]要导入的会话密钥密文。当容器为 ECC 类型时,此参数为 ECCCIPHERBLOB 密文数据,当容器为 RSA 类型时,此参数为 RSA 公钥加密后的数据。

ulWrapedLen [IN]会话密钥密文长度。

phKey [OUT] 返回会话密钥句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

注:权限要求:需要用户权限。

7.6.31 明文导入会话密钥​

原型 ULONG DEVAPI SKF_SetSymmKey(DEVHANDLE hDev, BYTE *pbKey, ULONG ulAlgID, HANDLE *phKey)

功能描述 设置明文对称密钥,返回密钥句柄。

参数 hDev [IN]设备句柄。

pbKey [IN] 指向会话密钥值的缓冲区。

ulAlgID [IN]会话密钥算法标识。

phKey [OUT]返回会话密钥句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

注:本函数仅用于测试和调试,不建议用于实际的密码服务。

7.6.32 加密初始化​

原型 ULONG DEVAPI SKF_EncryptInit(HANDLE hKey, BLOCKCIPHERPARAM EncryptParam)

功能描述 数据加密初始化。设置数据加密的算法相关参数。

参数 hKey [IN]加密密钥句柄。

EncryptParam [IN]分组密码算法相关参数:初始向量、初始向量长度、填充方法、反馈值的位长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.33 单组数据加密​

原型 ULONG DEVAPI SKF_Encrypt(HANDLE hKey, BYTE *pbData, ULONG ulDataLen, BYTE *pbEncryptedData, ULONG *pulEncryptedLen)

功能描述 单一分组数据的加密操作。用指定加密密钥对指定数据进行加密,被加密的数据只包含一个分组,加密后的密文保存到指定的缓冲区中。SKF_Encrypt 只对单个分组数据进行加密,在调用 SKF_Encrypt 之前,应调用 SKF_EncryptInit 初始化加密操作。SKF_Encrypt 等价于先调用 SKF_EncryptUpdate 再调用 SKF_EncryptFinal。

参数 hKey [IN]加密密钥句柄。

pbData [IN]待加密数据。

ulDataLen [IN] 待加密数据长度。

pbEncryptedData [OUT]加密后的数据缓冲区指针,可以为 NULL,用于获得加密后数据长度。

pulEncryptedLen [IN,OUT] 输入时表示结果数据缓冲区长度,输出时表示结果数据实际长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.34 多组数据加密​

原型 ULONG DEVAPI SKF_EncryptUpdate(HANDLE hKey, BYTE *pbData, ULONG ulDataLen, BYTE *pbEncryptedData, ULONG *pulEncryptedLen)

功能描述 多个分组数据的加密操作。用指定加密密钥对指定数据进行加密,被加密的数据包含多个分组,加密后的密文保存到指定的缓冲区中。SKF_EncryptUpdate 对多个分组数据进行加密,在调用 SKF_EncryptUpdate 之前,应调用 SKF_EncryptInit 初始化加密操作;在调用 SKF_EncryptUpdate 之后,应调用 SKF_EncryptFinal 结束加密操作。

参数 hKey [IN]加密密钥句柄。

pbData [IN]待加密数据。

ulDataLen [IN]待加密数据长度。

pbEncryptedData [OUT]加密后的数据缓冲区指针。

pulEncryptedLen [OUT]返回加密后的数据长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.35 结束加密​

原型 ULONG DEVAPI SKF_EncryptFinal(HANDLE hKey, BYTE *pbEncryptedData, ULONG *ulEncryptedDataLen)

功能描述 结束多个分组数据的加密,返回剩余加密结果。先调用 SKF_EncryptInit 初始化加密操作,再调用 SKF_EncryptUpdate 对多个分组数据进行加密,最后调用 SKF_EncryptFinal 结束多个分组数据的加密。

参数 hKey [IN]加密密钥句柄。

pbEncryptedData [OUT]加密结果的缓冲区。

ulEncryptedDataLen [OUT] 加密结果的长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.36 解密初始化​

原型 ULONG DEVAPI SKF_DecryptInit(HANDLE hKey, BLOCKCIPHERPARAM DecryptParam)

功能描述 数据解密初始化,设置解密密钥相关参数。调用 SKF_DecryptInit 之后,可以调用 SKF_Decrypt 对单个分组数据进行解密,也可以多次调用 SKF_DecryptUpdate 之后再调用 SKF_DecryptFinal 完成对多个分组数据的解密。

参数 hKey [IN]解密密钥句柄。

DecryptParam [IN]分组密码算法相关参数:初始向量、初始向量长度、填充方法、反馈值的位长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.37 单组数据解密​

原型 ULONG DEVAPI SKF_Decrypt(HANDLE hKey, BYTE *pbEncryptedData, ULONG ulEncryptedLen, BYTE *pbData, ULONG *pulDataLen)

功能描述 单个分组数据的解密操作。用指定解密密钥对指定数据进行解密,被解密的数据只包含一个分组,解密后的明文保存到指定的缓冲区中。SKF_Decrypt 只对单个分组数据进行解密,在调用 SKF_Decrypt 之前,应调用 SKF_DecryptInit 初始化解密操作。SKF_Decrypt 等价于先调用 SKF_DecryptUpdate 再调用 SKF_DecryptFinal。

参数 hKey [IN]解密密钥句柄。

pbEncryptedData [IN]待解密数据。

ulEncryptedLen [IN]待解密数据长度。

pbData [OUT]指向解密后的数据缓冲区指针,当为 NULL 时可获得解密后的数据长度。

pulDataLen [IN,OUT] 输入时表示结果数据缓冲区长度,输出时表示结果数据实际长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.38 多组数据解密​

原型 ULONG DEVAPI SKF_DecryptUpdate(HANDLE hKey, BYTE *pbEncryptedData, ULONG ulEncryptedLen, BYTE *pbData, ULONG *pulDataLen)

功能描述 多个分组数据的解密操作。用指定解密密钥对指定数据进行解密,被解密的数据包含多个分组,解密后的明文保存到指定的缓冲区中。SKF_DecryptUpdate 对多个分组数据进行解密,在调用 SKF_DecryptUpdate 之前,应调用 SKF_DecryptInit 初始化解密操作;在调用 SKF_DecryptUpdate 之后,应调用 SKF_DecryptFinal 结束解密操作。

参数 hKey [IN]解密密钥句柄。

pbEncryptedData [IN]待解密数据。

ulEncryptedLen [IN] 待解密数据长度。

pbData [OUT]指向解密后的数据缓冲区指针。

pulDataLen [IN,OUT] 输入时表示结果数据缓冲区长度,输出时表示结果数据实际长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.39 结束解密​

原型 ULONG DEVAPI SKF_DecryptFinal(HANDLE hKey, BYTE *pbDecryptedData, ULONG *pulDecryptedDataLen)

功能描述 结束多个分组数据的解密。先调用 SKF_DecryptInit 初始化解密操作,再调用 SKF_DecryptUpdate 对多个分组数据进行解密,最后调用 SKF_DecryptFinal 结束多个分组数据的解密。

参数 hKey [IN]解密密钥句柄。

pbDecryptedData [OUT]指向解密结果的缓冲区,如果此参数为 NULL 时,由 pulDecryptedDataLen 返回解密结果的长度。

pulDecryptedDataLen [IN,OUT]输入时表示 pbDecryptedData 缓冲区的长度,输出时表示解密结果的长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.40 密码杂凑初始化​

原型 ULONG DEVAPI SKF_DigestInit(DEVHANDLE hDev, ULONG ulAlgID, ECCPUBLICKEYBLOB *pPubKey, BYTE *pucID, ULONG ulIDLen, HANDLE *phHash)

功能描述 初始化密码杂凑计算操作,指定计算密码杂凑的算法。

参数 hDev [IN]连接设备时返回的设备句柄。

ulAlgID [IN]密码杂凑算法标识。

pPubKey [IN]签名者公钥。当 ulAlgID 为 SGD_SM3 时有效。

pucID [IN]签名者的 ID 值,当 ulAlgID 为 SGD_SM3 时有效。

ulIDLen [IN]签名者 ID 的长度,当 ulAlgID 为 SGD_SM3 时有效。

phHash [OUT]密码杂凑对象句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

注:当 ulAlgID 为 SGD_SM3 且 ulIDLen 不为 0 的情况下 pPubKey、pucID 有效,执行 SM2 算法签名预处理 1 操作。

计算过程遵循 GB/T 35276。

7.6.41 单组数据密码杂凑​

原型 ULONG DEVAPI SKF_Digest(HANDLE hHash, BYTE *pbData, ULONG ulDataLen, BYTE *pbHashData, ULONG *pulHashLen)

功能描述 对单一分组的消息进行密码杂凑计算。调用 SKF_Digest 之前,应调用 SKF_DigestInit 初始化密码杂凑计算操作。SKF_Digest 等价于多次调用 SKF_DigestUpdate 之后再调用 SKF_DigestFinal。

参数 hHash [IN]密码杂凑对象句柄。

pbData [IN]指向消息数据的缓冲区。

ulDataLen [IN]消息数据的长度。

pbHashData [OUT]密码杂凑数据缓冲区指针,当此参数为 NULL 时,由 pulHashLen 返回密码杂凑结果的长度。

pulHashLen [IN,OUT]输入时表示结果数据缓冲区长度,输出时表示结果数据实际长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.42 多组数据密码杂凑​

原型 ULONG DEVAPI SKF_DigestUpdate(HANDLE hHash, BYTE *pbData, ULONG ulDataLen)

功能描述 对多个分组的消息进行密码杂凑计算。调用 SKF_DigestUpdate 之前,应调用 SKF_DigestInit 初始化密码杂凑计算操作;调用 SKF_DigestUpdate 之后,应调用 SKF_DigestFinal 结束密码杂凑计算操作。

参数 hHash [IN]密码杂凑对象句柄。

pbData [IN]指向消息数据的缓冲区。

ulDataLen [IN]消息数据的长度。

返回值 SAR_OK: 成功。

其他: 错误码。

7.6.43 结束密码杂凑​

原型 ULONG DEVAPI SKF_DigestFinal(HANDLE hHash, BYTE *pHashData, ULONG *pulHashLen)

功能描述 结束多个分组消息的密码杂凑计算操作,将密码杂凑结果保存到指定的缓冲区。

参数 hHash [IN]密码杂凑对象句柄。

pHashData [OUT]返回的密码杂凑结果缓冲区指针,如果此参数为 NULL 时,由 pulHashLen 返回杂凑结果的长度。

pulHashLen [IN,OUT] 输入时表示杂凑结果缓冲区的长度,输出时表示密码杂凑结果的长度。

返回值 SAR_OK: 成功。

其他: 错误码。

注:SKF_DigestFinal 应在调用 SKF_DigestUpdate 之后使用。

7.6.44 消息鉴别码运算初始化​

原型 ULONG DEVAPI SKF_MacInit(HANDLE hKey, BLOCKCIPHERPARAM *pMacParam, HANDLE *phMac)

功能描述 初始化消息鉴别码计算操作,设置计算消息鉴别码的所需参数,并返回消息鉴别码句柄。

参数 hKey [IN]计算消息鉴别码的密钥句柄。

pMacParam [IN]消息认证计算相关参数,包括初始向量、初始向量长度、填充方法等。

phMac [OUT]消息鉴别码对象句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

注:消息鉴别码计算采用分组加密算法的CBC模式,将加密结果的最后一块作为计算结果。待计算数据的长度应为分组加密算法块长的倍数,接口内部不作数据填充。

7.6.45 单组数据消息鉴别码运算​

原型 ULONG DEVAPI SKF_Mac(HANDLE hMac, BYTE *pbData, ULONG ulDataLen, BYTE *pbMacData, ULONG *pulMacLen)

功能描述 SKF_Mac 计算单一分组数据的消息鉴别码。

参数 hMac [IN]消息鉴别码句柄。

pbData [IN]指向待计算数据的缓冲区。

ulDataLen [IN]待计算数据的长度。

pbMacData [OUT]指向计算后的 Mac 结果,如果此参数为 NULL 时,由 pulMacLen 返回计算后 Mac 结果的长度。

pulMacLen [IN,OUT] 输入时表示 pbMacData 缓冲区的长度,输出时表示 Mac 结果的长度。

返回值 SAR_OK: 成功。

其他: 错误码。

注:调用 SKF_Mac 之前,应调用 SKF_MacInit 初始化消息鉴别码计算操作。SKF_Mac 等价于多次调用 SKF_MacUpdate 之后再调用 SKF_MacFinal。

7.6.46 多组数据消息鉴别码运算​

原型 ULONG DEVAPI SKF_MacUpdate(HANDLE hMac, BYTE *pbData, ULONG ulDataLen)

功能描述 计算多个分组数据的消息鉴别码。

参数 hMac [IN]消息鉴别码句柄。

pbData [IN]指向待计算数据的缓冲区。

plDataLen [IN]待计算数据的长度。

返回值 SAR_OK: 成功。

其他: 错误码。

注:调用 SKF_MacUpdate 之前,应调用 SKF_MacInit 初始化消息鉴别码计算操作;调用 SKF_MacUpdate 之后,应调用 SKF_MacFinal 结束多个分组数据的消息鉴别码计算操作。

7.6.47 结束消息鉴别码运算​

原型 ULONG DEVAPI SKF_MacFinal(HANDLE hMac, BYTE *pbMacData, ULONG *pulMacDataLen)

功能描述 结束多个分组数据的消息鉴别码计算操作。

参数 hMac [IN]消息鉴别码句柄。

pbMacData [OUT]指向消息鉴别码的缓冲区,当此参数为 NULL 时,由 pulMacDataLen 返回消息鉴别码返回的长度。

pulMacDataLen [OUT]调用时表示消息鉴别码缓冲区的最大长度,返回消息鉴别码的长度。

返回值 SAR_OK: 成功。

其他: 错误码。

注:SKF_MacFinal 应在 SKF_MacUpdate 之后调用。

7.6.48 关闭密码对象句柄​

原型 ULONG DEVAPI SKF_CloseHandle(HANDLE hHandle)

功能描述 关闭会话密钥、密码杂凑对象、消息鉴别码对象、ECC 密钥协商等句柄。

参数 hHandle [IN]要关闭的对象句柄。

返回值 SAR_OK: 成功。

其他: 错误码。

8 设备的安全要求​

8.1 设备使用阶段​

设备的使用分成两个阶段:

  1. a) 出厂阶段:设备出厂时,预置设备认证密钥,在此阶段除修改设备认证密钥及创建应用操作外,禁止其他操作。
  2. b) 应用阶段:已创建了应用的设备进入应用阶段。在此阶段,可进行所有操作。

8.2 权限管理​

8.2.1 权限分类​

权限分为设备权限、用户权限和管理员权限。

  1. a) 设备权限:通过设备认证后获得设备权限。
  2. b) 用户权限:用户 PIN 码验证通过后,获得用户权限,用户权限只作用于其所在的应用。
  3. c) 管理员权限:管理员 PIN 码验证通过后,获得管理员权限,管理员权限只作用于其所在的应用。

8.2.2 权限使用​

权限的使用遵循以下要求:

  1. a) 设备权限仅用于创建应用、删除应用和修改设备认证密钥;
  2. b) 创建和删除容器需要用户权限;
  3. c) 创建文件的权限在创建应用时指定;
  4. d) 文件的读写权限在创建文件时指定;
  5. e) 容器内私钥的使用需要用户权限;
  6. f) 用户 PIN 码和管理员 PIN 码均具有最大重试次数,在创建应用时设定。当验证 PIN 码错误次数达到最大重试次数后,PIN 码即锁死;
  7. g) 用户 PIN 码的解锁需要管理员权限;
  8. h) 用户 PIN 码的修改需要用户权限,管理员 PIN 码的修改需要管理员权限。

8.2.3 设备认证​

在设备内创建和删除应用之前,应成功完成设备认证。

设备认证使用分组密码算法和设备认证密钥进行。认证的流程如下:

  1. a) 被认证方调用 SKF_GenRandom 函数从设备获取 8 字节随机数 RND,并用 0x00 将其填充至密码算法的分块长度,组成数据块 D0;
  2. b) 被认证方对 D0 加密,得到加密结果 D1,并调用 SKF_DevAuth(),将 D1 发送至设备;
  3. c) 设备收到 D1 后,验证 D1 是否正确。正确则通过设备认证,否则设备认证失败。

8.2.4 PIN 码安全要求​

  1. a) PIN 码长度不少于 6 个字节;
  2. b) PIN 码在设备和本接口之间的传输过程中应采取保护措施,防止 PIN 码泄露;
  3. c) PIN 码在设备中应安全存储,不可从设备中导出。

8.3 密钥安全要求​

密钥应遵循以下安全要求:

  1. a) 设备内产生的随机数应为真随机数,应符合随机性检测的要求;
  2. b) 设备内产生的会话密钥应使用随机数;
  3. c) 设备内产生非对称密钥使用的素数应满足素性要求;
  4. d) 设备内的密钥应具备有效的密钥保护机制防止解剖、探测和读取;
  5. e) 设备内的密钥应按权限要求使用;
  6. f) 除公钥外的密钥不能以明文形式出现在设备外;
  7. g) 签名私钥应在设备中产生;
  8. h) 容器内的私钥不能以任何形式导出设备;
  9. i) 删除容器时应销毁该容器内所有的密钥。

8.4 设备抗攻击要求​

设备应具备抗侧信道、电压、频率、紫外线等攻击的能力。

附录 A(规范性附录)错误代码定义和说明​

错误代码定义和说明见表 A.1。

表A.1 错误代码定义和说明

宏描述预定义值说明
SAR_OK0x00000000成功
SAR_FAIL0x0A000001失败
SAR_UNKNOWNERR0x0A000002异常错误
SAR_NOTSUPPORTYETERR0x0A000003不支持的服务
SAR_FILEERR0x0A000004文件操作错误
SAR_INVALIDHANDLEERR0x0A000005无效的句柄
SAR_INVALIDPARAMERR0x0A00BBBB无效的参数
SAR_READFILEERR0x0A000007读文件错误
SAR_WRITEFILEERR0x0A000008写文件错误
SAR_NAMELENERR0x0A000009名称长度错误
SAR_KEYUSAGEERR0x0A00000A密钥用途错误
SAR_MODULUSLENERR0x0A00000B模的长度错误
SAR_NOTINITIALIZEERR0x0A00000C未初始化
SAR_OBJERR0x0A00000D对象错误
SAR_MEMORYERR0x0A00000E内存错误
SAR_TIMEOUTERR0x0A00000F超时
SAR_INDATALENERR0x0A000010输入数据长度错误
SAR_INDATAERR0x0A000011输入数据错误
SAR_GENRANDERR0x0A000012生成随机数错误
SAR_HASHOBJERR0x0A000013HASH 对象错
SAR_HASHERR0x0A000014HASH 运算错误
SAR_GENRSAKEYERR0x0A000015产生 RSA 密钥错
SAR_RSAMODULUSLENERR0x0A000016RSA 密钥模长错误
SAR_CSPIMPRTPUBKEYERR0x0A000017CSP 服务导入公钥错误
SAR_RSAENCERR0x0A000018RSA 加密错误
SAR_RSADECERR0x0A000019RSA 解密错误
SAR_HASHNOTEQUALERR0x0A00001AHASH 值不相等
SAR_KEYNOTFOUNTERR0x0A00001B密钥未发现
SAR_CERTNOTFOUNTERR0x0A00001C证书未发现
SAR_NOTEXPORTERR0x0A00001D对象未导出
SAR_DECRYPTPADERR0x0A00001E解密时做补丁错误
SAR_MACLENERR0x0A00001FMAC 长度错误
SAR_BUFFER_TOO_SMALL0x0A000020缓冲区不足
SAR_KEYINFOTYPEERR0x0A000021密钥类型错误
SAR_NOT_EVENTERR0x0A000022无事件错误
SAR_DEVICE_REMOVED0x0A000023设备已移除
SAR_PIN_INCORRECT0x0A000024PIN 不正确
SAR_PIN_LOCKED0x0A000025PIN 被锁死
SAR_PIN_INVALID0x0A000026PIN 无效
SAR_PIN_LEN_RANGE0x0A000027PIN 长度错误
SAR_USER_ALREADY_LOGGED_IN0x0A000028用户已经登录
SAR_USER_PIN_NOT_INITIALIZED0x0A000029没有初始化用户口令
SAR_USER_TYPE_INVALID0x0A00002APIN 类型错误
SAR_APPLICATION_NAME_INVALID0x0A00002B应用名称无效
SAR_APPLICATION_EXISTS0x0A00002C应用已经存在
SAR_USER_NOT_LOGGED_IN0x0A00002D用户没有登录
SAR_APPLICATION_NOT_EXISTS0x0A00002E应用不存在
SAR_FILE_ALREADY_EXIST0x0A00002F文件已经存在
SAR_NO_ROOM0x0A000030空间不足
SAR_FILE_NOT_EXIST0x0A000031文件不存在
SAR_REACH_MAX_CONTAINER_COUNT0x0A000032已达到最大可管理容器数