-
Notifications
You must be signed in to change notification settings - Fork 67
SM2性能优化(续)
Sun Yimin edited this page May 23, 2024
·
21 revisions
这篇文章接续SM2实现及优化,着重当前实现,我说过目前纯golang实现通过fiat-crypto生成代码,大家可以参考POC项目sm2fiat。
- 通过fiat-crypto生成SM2曲线参数P的域运算(使用Montgomery算法),主要是加、减、乘、平方。
- 通过addchain生成优化的求逆运算。
- 通过代码模板,生成SM2曲线点运算,主要是点加、倍点和点标量乘法,其中点加是完全加法,意思是就算两个点相同,也能得到正确结果,具体请参考Complete addition formulas for prime order elliptic curves, §A.2。这里也用代码模板,一是因为本来就要通过addchain生成优化的生成求平方跟算法,另外一个也就是和Go语言保持一致(Go语言因为有多条曲线,所以用代码模板,保持代码的一致性和正确性)。
通过代码生成方式,保证算法实现的正确性、一致性。有尝试自己编写SM2曲线纯Go语言优化实现的同学应该体会很深。
总体而言,和以前实现相比,变化不大。
- 基点标量乘法查找表生成,没有重新写生成方法,延用以前的实现,可以参考gen_p256_table.go。
- 调整了点标量乘法的窗口大小,具体请参考sm2 point scalar multiple ASM implementation issue: final p256PointAddAsm's input maybe equal
- 使用MULX优化, 可以参考这个提交 https://github.com/emmansun/gmsm/commit/a0c4a389b8ceea6cbad3ede4eef011b26482b2ad
- AVX2优化,这里只是SELECT、MOVE等优化,不涉及计算。
- 使用NEON指令实现SELECT、MOVE操作,请参考https://github.com/emmansun/gmsm/discussions/134
- 改用
bigmod
代替big.Int
,请参考use bigmod and sm2ec instead of math/big and crypto/elliptic等。 - 优化签名算法,减少求逆操作。请参考https://github.com/emmansun/gmsm/issues/190
- 优化加解密性能