Destroyed 支持国密硬件密码设备 (markdown)

Zhi Guan
2017-02-13 18:03:16 +08:00
parent 3e897481b7
commit 7a8c4e6651

@@ -1,42 +0,0 @@
在下述情况下应用可能需要访问USB Key、PCI密码卡和密码机等密码硬件
* 处于安全的目的,应用希望在密码硬件中存储私钥并完成私钥相关的计算。
* 私钥通过密码硬件分发且不能导出硬件,如国密标准中的签名私钥。
* 密码算法仅通过硬件提供如SM1和SSF33分组密码。
* 密码硬件具有密码算法加速能力可以降低CPU的负载。
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的规范和功能要求。
## 工作计划
- [ ] 测试国密硬件SDK支持的最新的Ubuntu Server AMD64 LTS版本。
- [ ] 测试国密硬件SDK附带的测试程序是否能够通过。
- [ ] 测试国密硬件的管理员工具以及SM2、RSA密钥的生成或导入。
- [ ] 测试国密硬件的SM2、RSA和GmSSL的兼容性。
- [ ] 测试国密硬件的SM3、SM4、SM4-CBC和GmSSL的兼容性。
- [ ] 通过SKF API的SM2实现EC签名接口。
- [ ] 实现`EVP_sm1_cbc``EVP_ssf33_cbc`模块。