这是基于Golang的国密测试套件,用于测试国密SM2实现库或KMS服务,并验证其与tjfoc-gm库v1.4.0的兼容性。
测试对象分为2种:KMS、国密算法库中的SM2非对称密钥。
- KMS(Key Management Service)是密钥管理服务,由服务提供商提供密钥的计算、存储服务,开发者通过调用其api完成密钥的生成、删除、加解密、签名验签等操作。 一般情况下,对于非对称密钥(SM2),开发者无法获取私钥,使用服务商提供的KeyID作为密钥的标识;同时,开发者可以获取公钥,将公钥正确解析后,直接用于加密、验签。
- 国密算法库是对国密算法的实现,可以是源代码或链接库的形式,完全在本地运行。
简言之,二者差异在于:
- KMS无法获取私钥,仅有KeyID;算法库可以直接使用私钥
- KMS在密钥生成、签名、解密时是远程计算;算法库全部是本地计算
-
密钥、签名的编码格式可能不同 比方说,对于公钥,有的库可能通用的编码规则,如ASN1编码;有的可能使用自己的编码方式或不进行任何编码,如把byte格式的X值和Y值直接拼接。这使得所需的公钥的解析方式不同。
-
存在使用公钥直接加密、验签的场景 在对现有系统进行国密化改造时,原有的加密方案可能依赖于可解析的公钥、私钥。一个改动较少的方案是,仅改造涉及私钥的部分,包括密钥生成、签名、解密的操作;而通过公钥就可进行的操作,包括验签、加密,在可以解析公钥的情况下就不需要额外的改造。
- 密钥生成
- 加密再解密
- 签名再验签
- 公钥pem互相读写
- tjfoc加密,测试库再解密
- 测试库签名,tjfoc再验签
- 测试框架
- 测试示例
- 密钥生成
- 加密再解密
- 签名再验签
- 公钥pem互相读写
- 私钥pem互相读写
- tjfoc加密,测试库再解密
- 测试库加密,tjfoc解密
- 测试库签名,tjfoc再验签
- tjfoc签名,测试库再验签
- 包装需要测试的库,实现
kms/sm2_test/sm2.go
中的全部2个接口。可参考example_tjfoc_kms.go
,该文件为tjfoc库模拟的kms。 - 替换
sm2_test.go
中的initKms
函数,将CreateKeyAdapter
替换为返回封装的待测试kms对Sm2KMS
接口的实现。 - 运行
sm2_test.go
,查看测试结果。
- 包装需要测试的库,实现
implement/sm2_test/sm2.go
中的全部3个接口。可参考example_tjfoc_implement.go
,该文件为对tjfoc库的包装。 - 替换
sm2_test.go
中的initImpl
函数,将KeyCreator
替换为封装的待测试库对Sm2Creator
接口的实现。 - 运行
sm2_test.go
,查看测试结果。
- 目前的兼容性测试是以tjfoc库为基准的,可改造为任意2库的测试,以适应更多场景。
- 目前的测试方法为clone本代码库后进行添加/更改,改造为在其他代码库import进去,再传递接口的实现。
- 在1的基础上,定期生成多个库两两之间的兼容测试结果,反馈社区和作者。