快速开始
环境要求
- Rust 1.70+(rustup.rs)
- GCC / Clang(编译 C 示例)
- Linux x86_64 / Windows x64(WSL 同样支持)
编译动态库
# 克隆项目
git clone <repo-url>
cd 0018-sdk-mock
# Debug 版本(开发调试)
cargo build
# Release 版本(性能测试)
cargo build --release
输出文件:
| 平台 | 路径 |
|---|---|
| Linux | target/debug/libsdf_mock.so |
| Windows | target/debug/sdf_mock.dll |
配置文件
在可执行文件同目录(或当前工作目录)下放置:
config.toml(必须存在)
SDF_OpenDevice 启动时检测此文件,不存在则返回 SDR_CONFIGERR。
[log]
level = "info" # debug | info | warn | error | off
directory = "./" # 日志文件输出目录
mock_keys.toml(可选)
预置设备密钥,缺失时以空密钥配置启动(KEK/内部SM2密钥不可用)。
[device]
manufacturer = "MockDevice"
device_name = "SDF_MOCK_V1"
device_serial = "MOCK20250101"
[root_key]
value = "0123456789ABCDEF0123456789ABCDEF" # SM4 128位,32个十六进制字符
[[kek_keys]]
index = 1
value = "FEDCBA9876543210FEDCBA9876543210"
[[sign_keys]]
index = 1
private_key = "3945208F7B2144B13F36E38AC6D39F95..." # 64个十六进制字符
public_key = "04BB34D0B28F49ABAFAD1AEE5E44B489..." # 130个十六进制字符(04||x||y)
[[enc_keys]]
index = 1
private_key = "56B96C94AF649D75F1738B4A2A0E563D..."
public_key = "04C0D5E3A2B1F49876543210FEDCBA98..."
注意:所有密钥值均为无空格、无
0x 前缀的十六进制字符串。私钥 64 字符(32字节),公钥 130 字符(65字节,必须以 04 开头)。
C 程序集成
步骤一:复制头文件
cp sdf.h /path/to/your/project/
步骤二:编写代码
#include "sdf.h"
#include <stdio.h>
int main() {
void *hDevice = NULL, *hSession = NULL;
int ret;
// 打开设备(需要 config.toml 存在)
ret = SDF_OpenDevice(&hDevice);
if (ret != SDR_OK) {
fprintf(stderr, "SDF_OpenDevice 失败: 0x%08X\n", ret);
return 1;
}
// 创建会话
SDF_OpenSession(hDevice, &hSession);
// SM3 哈希示例
unsigned char hash[32];
unsigned int hash_len;
SDF_HashInit(hSession, SGD_SM3, NULL, NULL, 0);
SDF_HashUpdate(hSession, (const unsigned char*)"hello", 5);
SDF_HashFinal(hSession, hash, &hash_len);
// 清理
SDF_CloseSession(hSession);
SDF_CloseDevice(hDevice);
return 0;
}
步骤三:编译链接
# Linux
gcc -o myapp myapp.c \
-I/path/to/sdf-mock \
-L/path/to/sdf-mock/target/debug \
-lsdf_mock \
-Wl,-rpath,/path/to/sdf-mock/target/debug
# 或使用绝对路径避免 rpath
LD_LIBRARY_PATH=/path/to/target/debug ./myapp
Rust 项目集成
在 Cargo.toml 中添加:
[dependencies]
sdf-mock = { path = "/path/to/0018-sdk-mock" }
use sdf_mock::sdf_impl::device::*;
use sdf_mock::sdf_impl::hash::*;
use sdf_mock::types::alg_id;
fn main() {
assert_eq!(sdf_open_device(), 0);
let mut session = 0u32;
sdf_open_session(&mut session);
sdf_hash_init(session, alg_id::SGD_SM3, None, b"");
sdf_hash_update(session, b"hello");
let mut hash = [0u8; 32];
sdf_hash_final(session, &mut hash);
println!("SM3: {:02x?}", &hash[..8]);
sdf_close_session(session);
sdf_close_device();
}
运行内置 C 示例
cd examples/c_caller
# 编译(自动触发 cargo build)
make
# 运行(config.toml 和 mock_keys.toml 已在此目录)
./demo
预期输出(部分):
=== GM/T 0018 Mock SDK Demo ===
--- 1. 设备初始化 ---
[OK] SDF_OpenDevice
[OK] SDF_OpenSession
--- 4. SM3 哈希 ---
[OK] SDF_HashInit / HashUpdate / HashFinal
SM3(msg) [32 bytes]: AF49F1E2...
--- 5. SM2 签名与验签 ---
[OK] SDF_ExternalSign_ECC
[OK] SDF_ExternalVerify_ECC
--- 7. SM4-CBC 加密/解密 ---
[OK] SDF_Encrypt (SM4-CBC)
[OK] SDF_Decrypt (SM4-CBC)
环境变量
| 变量 | 说明 | 示例 |
|---|---|---|
SDF_MOCK_CONFIG_DIR |
指定配置文件目录,优先于可执行文件目录和当前目录 | export SDF_MOCK_CONFIG_DIR=/etc/sdf-mock |
RUST_LOG |
控制日志输出级别(仅影响 stderr 输出) | RUST_LOG=debug ./demo |