接口文档

所有函数返回 ULONG(即 unsigned long),成功返回 SAR_OK (0),失败返回对应错误码。句柄类型均为 void*(HANDLE)。

0016-skf-mock 不附带 skf.h 头文件。C 调用方可通过 dlopen/dlsym 动态加载,或参考 GM/T 0016-2012 规范自行声明函数原型。Rust 调用方可直接引用 skf_mock::ffi 模块。

设备管理

ULONG SKF_EnumDev(BOOL bPresent, LPSTR szNameList, ULONG *pulSize)

枚举当前连接的所有设备名称(两阶段查询模式)。

ULONG SKF_ConnectDev(LPSTR szName, HANDLE *phDev)

连接指定设备,返回设备句柄。Mock 实现中会加载 mock_keys.toml 配置。

参数方向说明
szName输入设备名称字符串(必须与配置中一致)
phDev输出设备句柄
ULONG SKF_DisConnectDev(HANDLE hDev)

断开设备连接,释放所有关联资源。

ULONG SKF_GetDevInfo(HANDLE hDev, DEVINFO *pDevInfo)

获取设备信息(厂商、型号、序列号、算法支持等)。

ULONG SKF_GetDevState(LPSTR szDevName, ULONG *pulDevState)

查询设备状态(存在/不存在)。

应用与 PIN 管理

ULONG SKF_EnumApplication(HANDLE hDev, LPSTR szAppName, ULONG *pulSize)

枚举设备中所有应用名称(两阶段查询模式)。

ULONG SKF_OpenApplication(HANDLE hDev, LPSTR szAppName, HANDLE *phApp)

打开指定应用,返回应用句柄(基址 0x1001)。

ULONG SKF_CloseApplication(HANDLE hApp)

关闭应用。

ULONG SKF_VerifyPIN(HANDLE hApp, ULONG ulPINType, LPSTR szPIN, ULONG *pulRetryCount)

验证 PIN 码。成功后获得对容器和密钥的访问权限。

参数方向说明
ulPINType输入0=管理员 PIN,1=用户 PIN
szPIN输入PIN 字符串
pulRetryCount输出剩余重试次数(PIN 错误时)
ULONG SKF_ChangePIN(HANDLE hApp, ULONG ulPINType, LPSTR szOldPin, LPSTR szNewPin, ULONG *pulRetryCount)

修改 PIN 码。

ULONG SKF_GetPINInfo(HANDLE hApp, ULONG ulPINType, ULONG *pulMaxRetryCount, ULONG *pulRemainRetryCount, BOOL *pbDefaultPin)

查询 PIN 配置信息。

容器管理

ULONG SKF_EnumContainer(HANDLE hApp, LPSTR szContainerName, ULONG *pulSize)

枚举应用下的所有容器(两阶段查询模式)。

ULONG SKF_OpenContainer(HANDLE hApp, LPSTR szContainerName, HANDLE *phContainer)

打开容器,返回容器句柄(基址 0x2001)。容器内存储签名密钥对、加密密钥对和对应证书。

ULONG SKF_CloseContainer(HANDLE hContainer)

关闭容器。

SM2 非对称运算

ULONG SKF_GenECCKeyPair(HANDLE hContainer, ULONG ulAlgId, ECCPUBLICKEYBLOB *pBlob)

在容器内生成 SM2 密钥对。算法标识:SGD_SM2_1(签名)/ SGD_SM2_3(加密)。

ULONG SKF_ECCSignData(HANDLE hContainer, BYTE *pbData, ULONG ulDataLen, ECCSIGNATUREBLOB *pSignature)

使用容器内签名私钥对数据进行 SM2 签名。输入已是哈希后的 32 字节,或按规范传入 Z||M 的哈希。

ULONG SKF_ECCVerify(HANDLE hDev, ECCPUBLICKEYBLOB *pECCPubKeyBlob, BYTE *pbData, ULONG ulDataLen, ECCSIGNATUREBLOB *pSignature)

使用外部公钥验证 SM2 签名。

ULONG SKF_ExtECCEncrypt(HANDLE hDev, ECCPUBLICKEYBLOB *pECCPubKeyBlob, BYTE *pbPlainText, ULONG ulPlainTextLen, ECCCIPHERBLOB *pCipherText)

使用外部公钥进行 SM2 加密。

ULONG SKF_ExtECCDecrypt(HANDLE hContainer, ECCCIPHERBLOB *pCipher, BYTE *pbPlain, ULONG *pulPlainLen)

使用容器内加密私钥进行 SM2 解密。

ULONG SKF_ExportPublicKey(HANDLE hContainer, BOOL bSignFlag, BYTE *pbBlob, ULONG *pulBlobLen)

导出容器内签名公钥或加密公钥(ECCPUBLICKEYBLOB 格式)。

SM4 对称运算

ULONG SKF_SetSymmKey(HANDLE hDev, BYTE *pbKey, ULONG ulAlgID, HANDLE *phKey)

导入对称密钥,返回密钥句柄(基址 0x3001)。

ULONG SKF_EncryptInit(HANDLE hKey, BLOCKCIPHERPARAM EncryptParam)

初始化加密运算。BLOCKCIPHERPARAM.PaddingType = 1 启用 PKCS7 填充。

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

单组 SM4 加密(ECB/CBC)。

ULONG SKF_DecryptInit(HANDLE hKey, BLOCKCIPHERPARAM DecryptParam)

初始化解密运算。

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

单组 SM4 解密。

SM3 哈希运算

ULONG SKF_DigestInit(HANDLE hDev, ULONG ulAlgID, ECCPUBLICKEYBLOB *pPubKey, BYTE *pucID, ULONG ulIDLen, HANDLE *phHash)

初始化哈希运算,返回哈希句柄(基址 0x4001)。若传入公钥,会自动计算 Z = SM3(entlen||uid||curve_params||pubkey) 并写入缓冲头部(用于 SM2 签名前的预哈希)。

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

单组哈希:一次性完成 Update + Final。

ULONG SKF_DigestUpdate(HANDLE hHash, BYTE *pbData, ULONG ulDataLen)

追加哈希数据。

ULONG SKF_DigestFinal(HANDLE hHash, BYTE *pHashData, ULONG *pulHashLen)

完成哈希计算,输出 32 字节 SM3 摘要。

证书管理

ULONG SKF_ImportCertificate(HANDLE hContainer, BOOL bSignFlag, BYTE *pbCert, ULONG ulCertLen)

向容器导入证书(DER 格式)。

ULONG SKF_ExportCertificate(HANDLE hContainer, BOOL bSignFlag, BYTE *pbCert, ULONG *pulCertLen)

从容器导出证书。

错误码列表

常量值含义
SAR_OK0x00000000成功
SAR_FAIL0x0A000001一般失败(含设备未连接)
SAR_UNKNOWNERR0x0A000002未知错误
SAR_NOTSUPPORTYETERR0x0A000003不支持(RSA/MAC 等 Stub)
SAR_FILEERR0x0A000004文件错误
SAR_INVALIDHANDLEERR0x0A000005句柄无效
SAR_INVALIDPARAMERR0x0A000006参数无效(空指针等)
SAR_READFILEERR0x0A000007读文件错误
SAR_WRITEFILEERR0x0A000008写文件错误
SAR_NOTINITIALIZEERR0x0A00000C未调用 EncryptInit/DecryptInit
SAR_INDATALENERR0x0A000011输出缓冲太小(两阶段查询模式)
SAR_PIN_INCORRECT0x0A000029PIN 错误
SAR_PIN_LOCKED0x0A00002APIN 锁定
SAR_KEYNOTFOUNDERR0x0A00001B容器内无对应密钥对