GM/T 0012-2012 可信密码模块接口规范:国密可信计算的底层互操作基石

标准规范 · 2026-09-01

概述

在国密可信计算体系中,可信密码模块(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)是一种特殊的密码模块,具备以下特征:

  • 根信任:内置密码学安全根,能够建立系统信任链
  • 身份认证:模块自身拥有唯一身份标识
  • 安全存储:能够安全存储密钥和敏感数据
  • 可信计算:支持度量、报告等可信计算核心功能
与通用密码模块(如 GM/T 0028 定义的密码模块)相比,TCM 的特殊之处在于它被集成到可信计算平台上,承担"信任根"的角色。

与 TPM 的对比

对比维度TPM(国际)TCM(国密)
标准依据TCG TPM 2.0GM/T 0012-2012
密码算法RSA/ECC/AES/SHASM2/SM3/SM4
平台通用计算平台国产可信计算平台
信任根基于 NIST 算法基于国密算法
应用场景国际通用国内等保/密评
需要注意的是,GM/T 0012-2012 发布时,国内的 TCM 与 TCG 的 TPM 概念相近但不完全相同。国密场景下,TCM 更强调对国密算法的原生支持。

标准链条

GM/T 0012 在国密可信计算标准体系中的位置:

核心接口架构

接口分层

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 规定了严格的初始化序列:

  • 模块初始化:加载密码模块,验证模块身份
  • 身份认证:验证调用方身份,建立安全通道
  • 环境检测:检测运行环境是否安全(防篡改、防侧信道)
  • 资源分配:分配密码运算所需的内存和资源
CODE
应用层 → Init() → 模块身份验证 → 安全检查 → 就绪状态
                    ↓
              失败 → 错误码返回(如:模块已被篡改)

关键设计原则是"安全优先"——任何初始化失败都应立即进入安全状态,禁止降级运行。

错误码体系

GM/T 0012 定义了完整的错误码体系,常见的包括:

错误码含义典型原因
0x00成功—
0x01参数错误输入参数格式不正确
0x02密钥错误密钥不存在或已失效
0x03权限错误调用方无权限执行该操作
0x04模块错误模块内部状态异常
0x05安全错误检测到安全威胁(如防篡改触发)
0x06资源不足内存或计算资源不足
其中,安全错误(0x05)是最关键的错误类型——一旦触发,模块可能进入安全状态,甚至清除所有敏感数据。

密码操作接口详解

SM2 非对称密码接口

SM2 是国密标准中的核心非对称算法,GM/T 0012 规定了以下接口:

#### 签名操作

C
// 伪代码: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 是签名分量
  • 签名过程中使用的随机数必须来自安全随机数源
#### 验签操作

C
// 伪代码:SM2 验签
int Verify(
    KeyHandle hKey,           // SM2 公钥句柄
    const byte* Message,       // 原始消息
    size_t MessageLen,         // 消息长度
    const byte* Signature,     // 待验证签名
    size_t SignatureLen        // 签名长度
);

验签成功后返回 0,失败返回相应错误码。注意验签不返回"真/假",而是通过返回值区分成功与失败。

SM3 杂凑接口

C
// 伪代码:SM3 杂凑
int Hash(
    const byte* Message,       // 待杂凑消息
    size_t MessageLen,         // 消息长度
    byte* Digest,              // 输出杂凑值(32 字节)
    size_t* DigestLen          // 输出杂凑长度(应为 32)
);

SM3 输出固定为 256 位(32 字节),与 SHA-256 等长。接口要求调用方提供足够大的缓冲区。

SM4 对称密码接口

注意:GM/T 0012 规定 SM4 采用 ECB 模式作为基础操作模式。实际应用中如需其他模式(如 CBC、CTR),应在上层封装实现。

安全服务接口

随机数生成

密码模块必须提供符合 GM/T 0005-2012《随机性检测规范》的安全随机数生成服务:

C
// 伪代码:安全随机数生成
int GetRandom(
    byte* Random,              // 输出随机数缓冲区
    size_t RandomLen           // 请求的随机数长度
);

随机数质量必须通过 GM/T 0005 定义的统计测试(如 NIST SP 800-22 测试套件)。模块应使用硬件熵源或经过验证的软件熵源。

种子更新

为了增强随机数的不可预测性,密码模块提供种子更新服务:

C
// 伪代码:种子更新
int Seed(
    const byte* InputData,     // 输入种子数据
    size_t InputDataLen        // 种子数据长度
);

调用方可以将外部环境噪声(如键盘中断时间、网络包到达时间)作为种子输入,增强随机数的熵。

密钥管理接口

密钥生成

C
// 伪代码:密钥生成
int GenKey(
    AlgorithmId Algorithm,     // 算法标识(SM2/SM4)
    KeyAttrs KeyParams,        // 密钥参数(如 SM4 密钥长度)
    KeyHandle* hKey            // 输出的密钥句柄
);

对于 SM2,密钥参数包括曲线标识(必须使用 GM/T 0044.1 定义的曲线);对于 SM4,密钥参数包括密钥长度(固定为 128 位)。

密钥导入与导出

安全约束:

  • 密钥导出操作必须经过授权验证
  • 导出的密钥数据应通过安全通道传输
  • 敏感密钥(如根密钥)可能禁止导出

密钥销毁

C
// 伪代码:密钥销毁
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 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 密码模块安全技术要求