GM/T 0016-2012

SKF Mock SDK

无需 USB Key 硬件,在任意开发环境中调用标准 SKF 接口
纯 Rust 实现 · 标准 C ABI · 国密算法全覆盖

SM2 SM3 SM4 Rust cdylib mPlugin

核心特性

📋

完整 SKF 接口

覆盖 GM/T 0016-2012 标准的设备管理、应用/容器管理、PIN 验证、证书/文件管理、密码运算,共 50+ 个导出函数。

🔑

国密算法支持

SM2(签名/加密/密钥对导出)、SM3(单次/增量哈希、Z 值计算)、SM4(ECB/CBC + PKCS7 填充),基于 libsmx 纯软件实现。

🔌

标准 C ABI

输出 .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 验证、签名验签均有错误码保护

1
SKF_ConnectDev
加载配置
连接设备
→
2
SKF_OpenApplication
打开应用
加载容器列表
→
3
SKF_VerifyPIN
验证用户 PIN
获取操作权限
→
4
SKF_OpenContainer
打开容器
访问密钥对
→
5
密码运算
签名 / 加解密
SM2/SM3/SM4
→
6
CloseContainer → CloseApplication → DisConnectDev
清理资源

代码示例

/* 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✓ 支持
SM4ECB(含 PKCS7 填充)SGD_SM4_ECB = 0x00000401✓ 支持
SM4CBC(含 PKCS7 填充)SGD_SM4_CBC = 0x00000402✓ 支持
SM4MAC (CBC-MAC)—⚠ Stub
RSA签名 / 加密 / 密钥对—⚠ Stub
说明:GM/T 0016 SKF 的 SM2 算法标识值与 GM/T 0018 SDF 不同。mPlugin JS 层使用 SGD_SM2_1 和 SGD_SM2_3。