配置说明

SDF Mock SDK 使用两个独立的配置文件:config.toml 控制日志行为,mock_keys.toml 预置密钥数据。

配置文件搜索顺序

两个配置文件按以下优先级依次查找(找到即停止):

  1. 环境变量SDF_MOCK_CONFIG_DIR 指定的目录(仅 mock_keys.toml)
  2. 可执行文件目录:调用方 .exe/demo 所在目录
  3. 当前工作目录:进程启动时的 CWD
推荐将两个配置文件与可执行文件放在同一目录,这样无论从哪里启动程序都能正确加载。

config.toml

SDF_OpenDevice 启动时必须能找到此文件,否则返回 SDR_CONFIGERR。当前只有 [log] 段生效。

# 日志配置
[log]
# 日志级别:debug | info | warn | error | off
# 推荐:开发调试用 debug,集成测试用 info,生产用 warn
level = "info"

# 日志文件输出目录(相对或绝对路径)
# 日志文件名为 sdf_mock.log
directory = "./"
字段类型默认值说明
log.levelstringinfo日志级别,从详细到静默:debug > info > warn > error > off
log.directorystring./日志文件目录,目录不存在时使用 stderr 输出

mock_keys.toml

可选。提供预置密钥,使 SDF_GenerateKeyWithKEKSDF_InternalSign_ECC 等内部密钥相关接口可用。缺失时使用空配置,所有密钥须在运行时动态生成。

[device] 段

[device]
manufacturer  = "MyCompany"    # 厂商名称,最多 40 字节
device_name   = "SDF_MOCK_V1" # 设备名称,最多 16 字节
device_serial = "SN20250101"  # 序列号,最多 16 字节
firmware_version = "1.0.0"    # 固件版本(仅描述性字段)

[root_key] 段

[root_key]
# SM4 128位根密钥,32个十六进制字符(16字节)
value = "0123456789ABCDEF0123456789ABCDEF"

[[kek_keys]] 段(可多个)

[[kek_keys]]
index = 1           # 索引,从 1 开始,不可重复
algorithm = "SM4"   # 固定为 SM4
value = "FEDCBA9876543210FEDCBA9876543210"  # 32个十六进制字符

[[kek_keys]]
index = 2
algorithm = "SM4"
value = "0011223344556677889900AABBCCDDEE"

[[sign_keys]] 段(可多个)

[[sign_keys]]
index = 1
# SM2 私钥:64个十六进制字符(32字节)
private_key = "3945208F7B2144B13F36E38AC6D39F95889393692860B51A42FB81EF4DF7C5B8"
# SM2 公钥:130个十六进制字符(65字节,以 04 开头)
public_key  = "04BB34D0B28F49ABAFAD1AEE5E44B489B730B8B2A2CB6CC068C8B9DABE7C1F0D0809DBAAD5D932A64D5FF9C5C4B5E3B2CE1DB05E3F7B2F16EAEF87AAA6E9B07C0A"

[[enc_keys]] 段(可多个)

[[enc_keys]]
index = 1
private_key = "56B96C94AF649D75F1738B4A2A0E563D39B1D488E3B9C42D2E7E7C6E5CF2D3B7"
public_key  = "04C0D5E3A2B1F49876543210FEDCBA9876543210FEDCBA9876543210FEDCBA98760102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20"

密钥格式规范

密钥类型长度十六进制字符数备注
SM4 密钥16 字节32 字符KEK、根密钥
SM2 私钥32 字节64 字符大端字节序
SM2 公钥65 字节130 字符非压缩格式,必须以 04 开头
常见错误:私钥或公钥十六进制字符数不符合规范时,SDF_OpenDevice 会静默使用空配置(所有内部密钥操作返回 SDR_KEYINDEX)。请用计数器验证字符数:echo -n "YOUR_KEY" | wc -c

完整配置示例

# GM/T 0018 Mock SDK 密钥配置文件

[device]
manufacturer  = "MockDevice"
device_name   = "SDF_MOCK_V1"
device_serial = "MOCK20250101"
firmware_version = "1.0.0"

[root_key]
value = "0123456789ABCDEF0123456789ABCDEF"

[[kek_keys]]
index = 1
algorithm = "SM4"
value = "FEDCBA9876543210FEDCBA9876543210"

[[kek_keys]]
index = 2
algorithm = "SM4"
value = "0011223344556677889900AABBCCDDEE"

[[sign_keys]]
index = 1
private_key = "3945208F7B2144B13F36E38AC6D39F95889393692860B51A42FB81EF4DF7C5B8"
public_key  = "04BB34D0B28F49ABAFAD1AEE5E44B489B730B8B2A2CB6CC068C8B9DABE7C1F0D0809DBAAD5D932A64D5FF9C5C4B5E3B2CE1DB05E3F7B2F16EAEF87AAA6E9B07C0A"

[[enc_keys]]
index = 1
private_key = "56B96C94AF649D75F1738B4A2A0E563D39B1D488E3B9C42D2E7E7C6E5CF2D3B7"
public_key  = "04C0D5E3A2B1F49876543210FEDCBA9876543210FEDCBA9876543210FEDCBA98760102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20"

常见问题

SDF_OpenDevice 返回 SDR_CONFIGERR

找不到 config.toml。检查:

SDF_GenerateKeyWithKEK 返回 SDR_KEYINDEX

指定的 KEK 索引不存在。检查:

密钥加载后 KEK=0

mock_keys.toml 存在但解析失败(通常是密钥格式错误)。检查:

# 验证私钥字符数(应为 64)
echo -n "YOUR_PRIVATE_KEY_HEX" | wc -c

# 验证公钥字符数(应为 130)
echo -n "YOUR_PUBLIC_KEY_HEX" | wc -c