SKF密码设备

GmSSL通过ENGINE机制支持密码硬件。鉴于《智能IC卡及智能密码钥匙密码应用接口规范》标准中公布了访问国密硬件的C语言API (下面简称SKF API),GmSSL通过ENGINE机制访问支持国密SKF API的国产密码硬件。

一个SKF API设备中可以包含一个或多个应用(Application),每个应用可以包含一个获多个容器(Container),每个容器中可以存放两对分别用于加密和签名的密钥对,以及两个相应的证书或证书链。每一个容器只能为ECC或RSA一种类型,一个容器中不能混用ECC密钥和RSA密钥。因此,在SKF API中提供公钥密码计算的接口通过Container Handle来引用公钥,容器的特性使得应用无需区分签名密钥和加密密钥,SKF API的实现会自动从容器中选择对应类型的密钥。

在使用公钥及访问容器时,应用需要进行两级认证,第一级为设备认证,第二级应用认证。设备认证需要全设备唯一的设备认证密钥,设备认证密钥是固定长度的对称密钥。访问某个具体的应用需要提供该应用的专有口令进行认证,认证的口令是可变长度的口令字符串。

GmSSL对设备认证规范做如下规定:

  1. 设备认证密钥固定为16字节
  2. 设备认证密码算法固定为SMS4 (SGD_SM4_ECB)。
  3. 设备发出的挑战数据是在调用SKF_DevAuth()之前,最后一次通过SKF_GenRandom()获取的16字节随机输出。
  4. 设备的响应数据为采用SMS4加密加密该16字节随机值后的密文

GmSSL对需要进行设备认证的场景做如下规定:

  1. SKF API的实现必须支持SKF_SetSymmKey()
  2. SKF_SetSymmKey()SKF_EncryptInit/Update/Final()等对称加密功能无需设备认证和应用认证
  3. 访问容器时需要进行两级认证

由于我们目前没有可以用于测试的在Linux/Mac上支持SKF API的硬件设备,因此GmSSL包含了一个SKF API的软件Dummy实现用于完成编译。GmSSL还提供了一个独立的测试程序,用于测试目标硬件是否满足GmSSL的规范和功能要求。