快速开始

环境要求

编译动态库

# 克隆项目
git clone <repo-url>
cd 0018-sdk-mock

# Debug 版本(开发调试)
cargo build

# Release 版本(性能测试)
cargo build --release

输出文件:

平台路径
Linuxtarget/debug/libsdf_mock.so
Windowstarget/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