diff --git a/Home.md b/Home.md index efd179a..b50b67f 100644 --- a/Home.md +++ b/Home.md @@ -8,9 +8,9 @@ 我保留了那些如何求取那些常量和预计算的函数在p256.go中而没有删除,供后来者参考。期间,也和ALI KMS作了集成测试,主要是SM2本地加密,ALI KMS解密; ALI KMS签名,本地验签。 - 这个实现的性能,据我测试,在amd64下大概是elliptic.CurveParams默认实现性能的**5**倍。对于这个性能,我还是不甚满意,所以开始学习Golang中NIST P256的特定优化实现,但是这里面有GO ASM,我从来没有接触过。经过一段时间的学习,开始跃跃欲试,我只有amd64,所以从amd64下手,有了32位generic实现的改造经验,本以为会比较顺利,还是从替换曲线参数开始: + 这个实现的性能,据我测试,在amd64下大概是elliptic.CurveParams默认实现性能的**5**倍。对于这个性能,我还是不甚满意,所以开始学习Golang中NIST P256的特定优化实现,但是这里面有GO ASM,我从来没有接触过。经过一段时间的学习,开始跃跃欲试,我只有amd64,所以从amd64下手,还是从替换曲线参数开始: * 首先,替换掉p256_asm.go和p256_asm_amd64.s中的常量,这一步还是比较顺利,毕竟有一定经验了。 - * 接着,就是要修改p256_asm_amd64.s中的实现了,主要是蒙哥马利约简,模P的和模N的实现,原本的实现都是基于NIST P256的参数P和N进行优化的,改造起来困难挺大,为了验证结果,对每个主要的asm实现方法都写了测试,保证正确性。 + * 接着,就是要修改p256_asm_amd64.s中的实现了,主要是蒙哥马利约简,模P的和模N的实现,原本的实现都是基于NIST P256的参数P和N进行优化的,改造起来困难挺大,为了验证结果,对每个主要的asm实现方法都写了测试,保证正确性。本以为有了32位generic实现的改造经验会比较顺利,实际情况是在这一步反反复复,几度曾想放弃。说老实话,到目前为止,我也不是能认清p256_asm_amd64.s中用到的所有Golang ASM的命令。 * p256_asm.go中p256Inverse的改造,因为有经验,比较顺利。 * 然后,测试两个多倍点算法ScalarMult/ScalarBaseMult的正确性,通过和elliptic.CurveParams默认实现结果比较来鉴定。到此,sm2的加解密已经可以验证了! * 最后,修改实现`(curve p256Curve) Inverse(k *big.Int) *big.Int`,这个是第一次改造,费了点功夫,这个方法以及CombinedMult方法在签名和验签中有用,能提高性能。