GM/T 0012-2012 可信密码模块接口规范:国密可信计算的底层互操作基石
概述
在国密可信计算体系中,可信密码模块(Trusted Cryptography Module, TCM)是承载密码运算能力的核心组件。它既可以是硬件安全芯片,也可以是运行在可信执行环境中的密码服务进程。TCM 通过标准化接口向应用层提供密码服务——而这个接口标准就是 GM/T 0012-2012《可信计算可信密码模块接口规范》。
该标准于 2012 年首次发布,规定了可信密码模块与应用之间的接口要求,包括初始化、密码操作、安全服务等核心功能接口。它与 GM/T 0011-2023(可信密码支撑平台功能与接口规范)、GM/T 0013-2012(符合性检测规范)共同构成了国密可信计算的完整标准链条。
标准定位:GM/T 0012 定义的是"模块→应用"的接口层,GM/T 0011 定义的是"平台→应用"的服务层。两者分工不同,但相互协作——GM/T 0011 的上层接口最终会调用 GM/T 0012 定义的底层密码模块接口。
标准背景与可信计算生态
什么是可信密码模块
可信密码模块(TCM)是一种特殊的密码模块,具备以下特征:
- 根信任:内置密码学安全根,能够建立系统信任链
- 身份认证:模块自身拥有唯一身份标识
- 安全存储:能够安全存储密钥和敏感数据
- 可信计算:支持度量、报告等可信计算核心功能
与 TPM 的对比
| 对比维度 | TPM(国际) | TCM(国密) |
|---|---|---|
| 标准依据 | TCG TPM 2.0 | GM/T 0012-2012 |
| 密码算法 | RSA/ECC/AES/SHA | SM2/SM3/SM4 |
| 平台 | 通用计算平台 | 国产可信计算平台 |
| 信任根 | 基于 NIST 算法 | 基于国密算法 |
| 应用场景 | 国际通用 | 国内等保/密评 |
标准链条
GM/T 0012 在国密可信计算标准体系中的位置:
┌─────────────────────────────────────────────────────┐
│ GM/T 0011-2023(可信密码支撑平台) │
│ 定义平台层 API,为应用层提供统一服务 │
└──────────────────────────┬──────────────────────────┘
│ 调用
┌──────────────────────────▼──────────────────────────┐
│ GM/T 0012-2012(可信密码模块接口) │
│ 定义密码模块层 API,实现具体的密码操作 │
└──────────────────────────┬──────────────────────────┘
│ 执行
┌──────────────────────────▼──────────────────────────┐
│ 可信密码模块(TCM) │
│ 实际执行 SM2/SM3/SM4 等密码运算的硬件/软件 │
└─────────────────────────────────────────────────────┘核心接口架构
接口分层
GM/T 0012 将密码模块的接口分为以下几个层次:
| 接口层 | 功能 | 主要操作 |
|---|---|---|
| 初始化接口 | 模块启动、资源分配 | Init()、Shutdown() |
| 随机数接口 | 安全随机数生成 | GetRandom() |
| 对称密码接口 | SM4 加密解密 | Encrypt()、Decrypt() |
| 非对称密码接口 | SM2 签名验签、加密解密 | Sign()、Verify()、Encrypt()、Decrypt() |
| 杂凑接口 | SM3 哈希计算 | Hash() |
| MAC 接口 | HMAC-SM3 消息认证 | MAC() |
| 密钥管理接口 | 密钥生成、导入、导出 | GenKey()、ImportKey()、ExportKey() |
| 安全服务接口 | 随机数产生、种子更新 | Random()、Seed() |
初始化流程
密码模块的初始化是整个接口的起点,GM/T 0012 规定了严格的初始化序列:
- 模块初始化:加载密码模块,验证模块身份
- 身份认证:验证调用方身份,建立安全通道
- 环境检测:检测运行环境是否安全(防篡改、防侧信道)
- 资源分配:分配密码运算所需的内存和资源
应用层 → Init() → 模块身份验证 → 安全检查 → 就绪状态
↓
失败 → 错误码返回(如:模块已被篡改)关键设计原则是"安全优先"——任何初始化失败都应立即进入安全状态,禁止降级运行。
错误码体系
GM/T 0012 定义了完整的错误码体系,常见的包括:
| 错误码 | 含义 | 典型原因 |
|---|---|---|
| 0x00 | 成功 | — |
| 0x01 | 参数错误 | 输入参数格式不正确 |
| 0x02 | 密钥错误 | 密钥不存在或已失效 |
| 0x03 | 权限错误 | 调用方无权限执行该操作 |
| 0x04 | 模块错误 | 模块内部状态异常 |
| 0x05 | 安全错误 | 检测到安全威胁(如防篡改触发) |
| 0x06 | 资源不足 | 内存或计算资源不足 |
密码操作接口详解
SM2 非对称密码接口
SM2 是国密标准中的核心非对称算法,GM/T 0012 规定了以下接口:
#### 签名操作
// 伪代码:SM2 签名
int Sign(
KeyHandle hKey, // SM2 私钥句柄
const byte* Message, // 待签名消息
size_t MessageLen, // 消息长度
byte* Signature, // 输出签名(C1||R||S 格式)
size_t* SignatureLen // 输出签名长度
);关键要点:
- 签名前需计算 ZA 值(标识符杂凑),ZA = SM3(ENTL‖ID‖a‖b‖xG‖yG‖xA‖yA)
- 输出格式为
C1‖R‖S,其中 C1 是随机点,R 和 S 是签名分量 - 签名过程中使用的随机数必须来自安全随机数源
// 伪代码:SM2 验签
int Verify(
KeyHandle hKey, // SM2 公钥句柄
const byte* Message, // 原始消息
size_t MessageLen, // 消息长度
const byte* Signature, // 待验证签名
size_t SignatureLen // 签名长度
);验签成功后返回 0,失败返回相应错误码。注意验签不返回"真/假",而是通过返回值区分成功与失败。
SM3 杂凑接口
// 伪代码:SM3 杂凑
int Hash(
const byte* Message, // 待杂凑消息
size_t MessageLen, // 消息长度
byte* Digest, // 输出杂凑值(32 字节)
size_t* DigestLen // 输出杂凑长度(应为 32)
);SM3 输出固定为 256 位(32 字节),与 SHA-256 等长。接口要求调用方提供足够大的缓冲区。
SM4 对称密码接口
// 伪代码:SM4 加密
int Encrypt(
KeyHandle hKey, // SM4 密钥句柄
const byte* Plaintext, // 明文字节串
size_t PlaintextLen, // 明文长度(须为 16 的倍数)
byte* Ciphertext, // 输出密文
size_t* CiphertextLen // 输出密文长度
);
// 伪代码:SM4 解密
int Decrypt(
KeyHandle hKey, // SM4 密钥句柄
const byte* Ciphertext, // 密文字节串
size_t CiphertextLen, // 密文长度
byte* Plaintext, // 输出明文
size_t* PlaintextLen // 输出明文长度
);注意:GM/T 0012 规定 SM4 采用 ECB 模式作为基础操作模式。实际应用中如需其他模式(如 CBC、CTR),应在上层封装实现。
安全服务接口
随机数生成
密码模块必须提供符合 GM/T 0005-2012《随机性检测规范》的安全随机数生成服务:
// 伪代码:安全随机数生成
int GetRandom(
byte* Random, // 输出随机数缓冲区
size_t RandomLen // 请求的随机数长度
);随机数质量必须通过 GM/T 0005 定义的统计测试(如 NIST SP 800-22 测试套件)。模块应使用硬件熵源或经过验证的软件熵源。
种子更新
为了增强随机数的不可预测性,密码模块提供种子更新服务:
// 伪代码:种子更新
int Seed(
const byte* InputData, // 输入种子数据
size_t InputDataLen // 种子数据长度
);调用方可以将外部环境噪声(如键盘中断时间、网络包到达时间)作为种子输入,增强随机数的熵。
密钥管理接口
密钥生成
// 伪代码:密钥生成
int GenKey(
AlgorithmId Algorithm, // 算法标识(SM2/SM4)
KeyAttrs KeyParams, // 密钥参数(如 SM4 密钥长度)
KeyHandle* hKey // 输出的密钥句柄
);对于 SM2,密钥参数包括曲线标识(必须使用 GM/T 0044.1 定义的曲线);对于 SM4,密钥参数包括密钥长度(固定为 128 位)。
密钥导入与导出
// 伪代码:密钥导入
int ImportKey(
AlgorithmId Algorithm, // 算法标识
const byte* KeyData, // 密钥数据
size_t KeyDataLen, // 密钥数据长度
KeyHandle* hKey // 输出的密钥句柄
);
// 伪代码:密钥导出
int ExportKey(
KeyHandle hKey, // 密钥句柄
byte* KeyData, // 输出密钥数据
size_t* KeyDataLen // 输出密钥数据长度
);安全约束:
- 密钥导出操作必须经过授权验证
- 导出的密钥数据应通过安全通道传输
- 敏感密钥(如根密钥)可能禁止导出
密钥销毁
// 伪代码:密钥销毁
int DestroyKey(
KeyHandle hKey // 要销毁的密钥句柄
);密钥销毁后,对应的密钥材料应从模块中彻底清除,无法恢复。
与 GM/T 0011 的协作关系
GM/T 0012 和 GM/T 0011 是两个不同层次的接口规范,它们的关系如下:
| 维度 | GM/T 0012(模块接口) | GM/T 0011(平台接口) |
|---|---|---|
| 层级 | 底层密码模块层 | 上层密码支撑平台层 |
| 目标用户 | 驱动开发者、密码模块厂商 | 应用开发者 |
| 抽象程度 | 低(直接操作密码模块) | 高(通过平台 API 调用) |
| 覆盖范围 | 单个密码模块 | 整个可信计算平台 |
| 典型调用者 | 操作系统、驱动程序 | 应用程序 |
- 应用程序调用 GM/T 0011 的平台接口
- 平台层将请求路由到对应的密码模块
- 密码模块通过 GM/T 0012 定义的接口执行具体密码操作
- 结果沿原路径返回给应用程序
合规影响与实施要点
密评相关要求
在商用密码应用安全性评估(密评)中,GM/T 0012 的合规性检查要点包括:
- 接口合规:密码模块的接口是否符合 GM/T 0012 定义
- 算法合规:是否只使用国密算法(SM2/SM3/SM4),未混用国际算法
- 安全启动:密码模块是否正确执行了安全启动流程
- 密钥保护:密钥是否正确存储和销毁,未以明文形式暴露在内存中
实施注意事项
- 版本兼容:GM/T 0012-2012 是 2012 年发布的版本,后续可能有修订。实施时应确认当前生效的版本
- 错误处理:实现时应严格遵循错误码定义,不要自行扩展错误码
- 安全优先:任何异常情况都应优先进入安全状态,而不是继续运行
- 性能优化:密码操作接口应避免不必要的内存拷贝,提高吞吐量
与 GB/T 39786 的关系
GB/T 39786-2021《信息系统密码应用基本要求》在第三级要求中明确提到了可信密码模块的使用:
"应采用密码技术保障通信过程中数据的机密性和完整性,……关键设备和密码产品应通过国家密码管理部门的认证。"GM/T 0012 正是满足这一要求的接口标准之一。实施时应确保密码模块的接口符合 GM/T 0012 定义,并通过相关认证。
相关标准与参考
| 标准编号 | 标准名称 | 关联关系 |
|---|---|---|
| GM/T 0011-2023 | 可信计算 可信密码支撑平台功能与接口规范 | 上层平台接口,调用 GM/T 0012 |
| GM/T 0013-2012 | 可信计算可信密码模块符合性检测规范 | 检测 GM/T 0012 实现是否符合要求 |
| GM/T 0005-2012 | 随机性检测规范 | 定义密码模块随机数的质量检测方法 |
| GM/T 0028-2014 | 密码模块安全技术要求 | 通用密码模块安全要求,TCM 也需满足 |
| GB/T 39786-2021 | 信息系统密码应用基本要求 | 密评合规的最终依据 |
总结
GM/T 0012-2012《可信计算可信密码模块接口规范》是国密可信计算体系中的关键接口标准。它定义了可信密码模块与应用层之间的标准接口,涵盖了初始化、密码操作(SM2/SM3/SM4)、密钥管理、安全服务等核心功能。
与 GM/T 0011 的协作构成了完整的分层架构:GM/T 0011 提供面向应用的统一接口,GM/T 0012 提供面向密码模块的实现接口。这种分层设计既保证了接口的统一性,又提供了实现的灵活性。
对于实施者而言,理解 GM/T 0012 的核心价值在于:
- 知道密码模块应该提供哪些标准接口
- 理解与上层平台(GM/T 0011)的协作关系
- 掌握密评中对密码模块接口的检查要点
参考实践:可信计算与密码支撑平台:GM/T 0011-2023 架构解读 | GM/T 0028-2014 密码模块安全技术要求