覆盖 GM/T 0016-2012 标准的设备管理、应用/容器管理、PIN 验证、证书/文件管理、密码运算,共 50+ 个导出函数。
SM2(签名/加密/密钥对导出)、SM3(单次/增量哈希、Z 值计算)、SM4(ECB/CBC + PKCS7 填充),基于 libsmx 纯软件实现。
输出 .so/.dll 动态库,extern "C" 导出,与任意 C/C++ 项目直接集成,可作为 mPlugin 底层 SKF DLL 使用。
严格遵循 SKF 规范的 设备 → 应用 → 容器 层次结构,支持多应用、多容器、PIN 管理、应用文件存储。
通过 mock_keys.toml 预置应用、容器、SM2 签名/加密密钥对、证书,模拟真实 USB Key 的存储行为。
无需真实 USB Key、智能密码钥匙等硬件设备,在 CI/CD 流水线、容器环境、开发机中开箱即用。
严格遵循 GM/T 0016 规定的三级句柄层次,PIN 验证、签名验签均有错误码保护
/* skf-mock 作为动态库加载(dlopen / LoadLibrary)*/
#include <stdio.h>
#include <dlfcn.h>
typedef unsigned long ULONG;
typedef void* HANDLE;
int main() {
void *lib = dlopen("./libskf_mock.so", RTLD_LAZY);
/* 1. 连接设备 */
ULONG (*SKF_ConnectDev)(const char*, HANDLE*);
SKF_ConnectDev = dlsym(lib, "SKF_ConnectDev");
HANDLE hDev = NULL;
SKF_ConnectDev("MockSKFDevice", &hDev);
/* 2. 打开应用 + 验证 PIN */
ULONG (*SKF_OpenApplication)(HANDLE, const char*, HANDLE*);
ULONG (*SKF_VerifyPIN)(HANDLE, ULONG, const char*, ULONG*);
HANDLE hApp = NULL;
dlsym(lib, "SKF_OpenApplication"); // ... 调用
/* 3. 打开容器 + SM2 签名 */
// SKF_OpenContainer → SKF_ECCSignData → SKF_ECCVerify
/* 4. 清理 */
// SKF_CloseContainer → SKF_CloseApplication → SKF_DisConnectDev
dlclose(lib);
return 0;
}
| 算法 | 模式/用途 | 标识常量 | 状态 |
|---|---|---|---|
| SM2 | 数字签名 (ECCSignData / ExtECCSign) | SGD_SM2_1 = 0x00020100 | ✓ 支持 |
| SM2 | 密钥交换 | SGD_SM2_2 = 0x00020200 | ⚠ Stub |
| SM2 | 公钥加密 (ExtECCEncrypt) | SGD_SM2_3 = 0x00020400 | ✓ 支持 |
| SM3 | 单次/增量哈希、Z 值计算 | SGD_SM3 = 0x00000001 | ✓ 支持 |
| SM4 | ECB(含 PKCS7 填充) | SGD_SM4_ECB = 0x00000401 | ✓ 支持 |
| SM4 | CBC(含 PKCS7 填充) | SGD_SM4_CBC = 0x00000402 | ✓ 支持 |
| SM4 | MAC (CBC-MAC) | — | ⚠ Stub |
| RSA | 签名 / 加密 / 密钥对 | — | ⚠ Stub |
SGD_SM2_1 和 SGD_SM2_3。