以下知识点会帮助您更好的理解本文中提到的一些具体细节。
- 测试驱动开发理念
golang开发库:
- ginkgo
- text/template
- temp dir
- gexec
- 等等...
- 参与国密项目组周会。
- 我们近期会考虑开放github issue来供大家认领。
- 动手实践。
约定定义 | 说明 | 备注 |
---|---|---|
BCCSP | Blockchain Cryptographic Service Provider 区块链密码服务提供者 | 通过BCCSP切换加载密码算法 |
SW | Software 软算法 | 在以前定义中这个代表软算法 |
PKCS11 | Public-Key Cryptography Standards 11 公钥加密标准11 | PKCS#11标准定义了与密码令牌(如硬件安全模块(HSM)和智能卡)的独立于平台的API |
GMSW | GUOMI Software 国密软算法 | 国密算法/国家商用密码算法:SM2/SM3/SM4等 |
SDF | 密码设备应用接口规范 | 参考国密规范GMT0018 |
说明:在使用sm2/sm3/sm4定义时候,建议不必使用gmsm2这种描述
现在方案请参考Fabric2.0.0国密改造代码分析
使用最新Fabric2.2.0 LTS版本进行“硬”方式先进行改造:
- 支持国密算法
- 支持x509国密算法证书
- 支持国密SSL/TLS 双证书模式(待定)
- 支持SDF改造(待定)
- 暂时不考虑兼容,第二阶段进行
- ”硬改“方案进行cli级别测试覆盖
我们会遵从测试驱动开发的理念来进行fabric本体的国密改造。 因此我们会首先生成国密的测试案例,之后再将测试案例全部通过。
目前Fabric测试的代码中,所有的测试用到的加密学有关证书均为Hard Code的代码或文件,基于ECDSA,在现有基础上为了使得测试案例覆盖国密,我们需要将这部分Hard Code的代码或文件调整为动态生成。 实现在每个测试集中生成临时文件的案例,范围Fabric所有测试集合。(单元测试和集成测试)
-
动态生成测试文件改造
-
动态生成ECDSA,国密测试证书
参考案例: 您可以在这里找到一个动态生成ecdsa密钥的案例。 您可以在这里找到如何在ginkgo框架中的
before
,after
配合临时文件(temp
)来
为了更好的支持国密以及移除Fabric自身代码中的TODO item,我们正在将bccsp以及Fabric设计签名的部分从当前逻辑: hash下沉涉及两部分:
- 将hash256()再次封装 将hash256()封装在新加hash()方法中,然后Fabric业务代码使用hash256()将替换成hash(), 最好在hash()根据需要进行不同sha256\sm3\sha512替换
摘要 = hash(正文)
签名(摘要)
目前 David已经提供了部分实现,参考, 我们正在招募志愿者协助实现这个改动。
- 国密签名特殊性 目前fabric中签名sign(hash)入参是hash值,但是国密签名需要在签名sign(data)在sign方法中再进行hash计算,为了保持一致性,需要将现在fabric中sign(hash)改为sign(data)
func 新接口(正文){
摘要 = sha256(正文)
return ecdsa.sign(摘要)
}
func 新接口(正文){
摘要 = sm3 (正文)
return sm2.sign(摘要)
}
针对上面问题未来还有一个解决方法:fabric下bccsp会结构回进行调整,bccsp提供算法密码服务提供者使用rpc进行整体替换,进而间接解决了上述问题
在完成了国密测试集的改造(或者说对测试集进行国密改造)与接口改造工作后。我们就需要进行国密版本的bccsp实现以通过所有的国密测试场景。完成测试驱动开发的过程。
- 现阶段改造目标
目前BCCSP现有支持模式SW和PKCS11, 国密改造计划支持SW对应的国密算法GMSW模式:对接三个不同密码基础库(甚至更多), 支持PKCS11对应国密标准SDF接口。
BCCSP {
SW: --> golang crypto
PKCS11: --> hsm(PKCS11 api)
GMSW: --> {
tjfoc-gm
ccs-gm
pku-gm
...
}
SDF: --> HSM(SDF API) //GMT 0018-2012 密码设备应用接口规范 //
}
SDF将使用三未信安密码机产品SDK进行适配调试
- 长期目标 针对现在设计不足,未来将会使用rpc方案,将整个替换BCCSP GMSW对接不同国密算法基础库方式:rpc(待定)
rpc {
bccspa:
bccspb:
bccspc:
....
}
- 理论上讲,对于tls双证书的改造,也是遵循测试驱动开发流程并包含在上述开发过程中的。
- 为TLS双证书添加测试集合,这里的测试集合需添加在集成测试范围内。
- 实现TLS双证书库的替换,以通过测试案例。
TWGC已实现已实现国密版GRPC, 定期支持新版本。
- SDF参考规范GMT 0018-2012 密码设备应用接口规范 - 三未信安密码机产品SDK //自己实现sdk中不能使用私有库源码,可以放so - 实现方式:GO SDF SDK --> C SDK //GO SDF SDK新建仓库
将会使用rpc方案进行改造实现
实现属于自己的class替换?
- java gateway项目也需要我们实现一份
- sdk-java测试目前手写的,因此我们需要一份手写的测试集
- twgc-sdk-java fork的ci貌似没触发。以及我们貌似要开一个项目做我们自己的java-sdk的实现?
Crypto: https://github.com/Hyperledger-TWGC/java-gm.git
Netty使用aliyun开源Java gm-jsse库替换openssl, gm-jsse已经实现套件ECC-SM4-SM3(e013)
Netty openssl替换成国密版openssl(国密版)
1、Fisco-bcos通过netty-sm-ssl-context在java中调用国密tls,或许java sdk的国密改造可以利用netty-sm-ssl-context。 https://mvnrepository.com/artifact/org.fisco-bcos/netty-sm-ssl-context
2、聚龙链
待定
待定,参考基础https://github.com/Hyperledger-TWGC/node-gm
暂定针对某个版本“硬改” 关于https国密支持: Fabric-ca Https支持参考国密版本net库net-go-gm
关于Cfssl证书调用底层库
https://github.com/Hyperledger-TWGC/fabric-gm-wiki/wiki/11%E6%9C%8820%E6%97%A5%E4%BC%9A%E8%AE%AE%E8%AE%B0%E5%BD%95 Jay: 先写UAT(/integration)测试(作为最高标准),作为一个标准的测试文档,然后通过测试驱动开发, Jay:breakdown,1.bccsp 2. align to new interface 3. 新接口可以接入国密 Paul,Jay:提PR:动态生成test data
https://github.com/Hyperledger-TWGC/fabric-gm-wiki/wiki/12%E6%9C%8804%E6%97%A5%E4%BC%9A%E8%AE%AE%E8%AE%B0%E5%BD%95 fabric本体改造路线:哈希下沉,bccsp,test