配置说明

概述

skf-mock 通过 TOML 配置文件 mock_keys.toml 模拟真实 USB Key 的设备信息、应用、容器、密钥对和证书。配置文件可选,缺失时使用内置默认值(不报错),但加密相关功能需配置后才能使用。

查找顺序

skf-mock 按以下顺序查找配置文件(从高到低):

优先级方式说明
1环境变量 SKF_MOCK_CONFIG指定配置文件绝对路径或相对路径
2当前工作目录 ./mock_keys.toml启动进程时 shell 的 pwd
3内置默认值空应用、空容器,不报错

[device] 设备信息

配置 Mock 设备的基本信息,将在 SKF_GetDevInfo 中返回。

[device]
name         = "MockSKFDevice"      # 设备名称,SKF_ConnectDev 需要匹配
manufacturer = "Mock Manufacturer"  # 厂商名
serial       = "MOCK-SKF-001"       # 序列号
label        = "Test Token"         # 用户标签

[[applications]] 应用配置

每个应用独立配置 PIN 和容器。可以配置多个应用。

[[applications]]
name            = "MyApp"       # 应用名称
admin_pin       = "11111111"    # 管理员 PIN
user_pin        = "22222222"    # 用户 PIN
admin_pin_retry = 6             # 管理员 PIN 最大重试次数
user_pin_retry  = 6             # 用户 PIN 最大重试次数
PIN 验证规则:PIN 错误时返回 SAR_PIN_INCORRECT 并递减重试计数;重试次数归零后返回 SAR_PIN_LOCKED。重启进程后重试计数重置(Mock 不持久化)。

[[applications.containers]] 容器与密钥对

每个容器包含签名密钥对、加密密钥对和对应证书。SM2 密钥使用十六进制字符串表示。

  [[applications.containers]]
  name = "MyContainer"

  # ── 签名密钥对(SGD_SM2_1)──
  sign_private_key  = "cc54df687d98e2cac86786f469f04c69b280f19a0eccf8bdf15bfeab778cada0"
  sign_public_key_x = "28a446e687b7a4c27e2c4d7a8c9f3b2a1e5d6c7b8a9f0e1d2c3b4a5f6e7d8c9a"
  sign_public_key_y = "3b2a1e5d6c7b8a9f0e1d2c3b4a5f6e7d8c9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c"
  sign_cert = """
  MIIB...(base64 DER 格式证书,支持换行)
  """

  # ── 加密密钥对(SGD_SM2_3)──
  enc_private_key  = "..."
  enc_public_key_x = "..."
  enc_public_key_y = "..."
  enc_cert = """..."""
密钥格式约定:
  • 私钥:32 字节 hex(64 字符)
  • 公钥坐标 x/y:各 32 字节 hex(64 字符)
  • 证书:DER 格式,base64 编码,支持多行字符串("""...""")

证书格式示例

sign_cert = """
MIICBTCCAaugAwIBAgIJALVY9GVU3bT7MAoGCCqBHM9VAYN1MGQxCzAJBgNVBAYT
AkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdCZWlqaW5nMQ8wDQYDVQQK
DAZNb2NrQ0ExDjAMBgNVBAsMBURldlBrMRAwDgYDVQQDDAdNb2NrVXNlcjAeFw0y
... (省略中间行)
"""

证书从 GmSSL 或其他国密 CA 工具导出的 PEM 去除头尾后可直接使用。

完整示例

# mock_keys.toml — 完整示例

[device]
name         = "MockSKFDevice"
manufacturer = "Mock Manufacturer"
serial       = "MOCK-SKF-001"
label        = "Test Token"

# ─── 应用 1:业务应用 ───
[[applications]]
name            = "BusinessApp"
admin_pin       = "11111111"
user_pin        = "22222222"
admin_pin_retry = 6
user_pin_retry  = 6

  [[applications.containers]]
  name = "SignContainer"
  sign_private_key  = "cc54df687d98e2cac86786f469f04c69b280f19a0eccf8bdf15bfeab778cada0"
  sign_public_key_x = "28a446e687b7a4c27e2c4d7a8c9f3b2a1e5d6c7b8a9f0e1d2c3b4a5f6e7d8c9a"
  sign_public_key_y = "3b2a1e5d6c7b8a9f0e1d2c3b4a5f6e7d8c9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c"

  [[applications.containers]]
  name = "EncContainer"
  enc_private_key  = "aa11bb22cc33dd44ee55ff66001122334455667788990011223344556677aabb"
  enc_public_key_x = "11223344556677889900aabbccddeeff00112233445566778899aabbccddeeff"
  enc_public_key_y = "ffeeddccbbaa00998877665544332211ffeeddccbbaa0099887766554433221100"

# ─── 应用 2:测试应用 ───
[[applications]]
name            = "TestApp"
admin_pin       = "88888888"
user_pin        = "12345678"
admin_pin_retry = 10
user_pin_retry  = 10

相关环境变量

变量说明示例
SKF_MOCK_CONFIG 指定配置文件路径 /etc/skf/mock_keys.toml
RUST_LOG 日志级别 debug / info
⚠️ 安全警告:配置文件中的示例密钥为公开测试值,严禁用于生产环境。skf-mock 仅供开发和测试使用。