商密软件栈 SIG 目标:基于Anolis Linux,在整个系统软件层面(包括硬件,固件,bootloader,内核以及 OS)实现以商密算法为主的全软件栈商密操作系统,结束一直以来商密软件生态碎片化的状况,在技术方面打造社区和生态,在资质合规方面致力于为行业提供基于商密的操作系统信息安全标准。
01 SIG 近况摘要
本月分别合入 Linux 内核上游和 Anolis 内核主线 commit 22个,代码量 6000 多行,包括性能优化,更多的国密场景支持,以及 Bugfix 等。
在保证兼容性的同时,也为 OpenSSL 1.1.1 版本支持完整的 SM2 签名和验签能力,会在即将发布的 Anolis 8.8 中默认集成。
Linux 原生文件系统加密子系统 fscrypt,支持使用 SM4 XTS/CTS 算法加密文件和目录。
持续补齐 Linux 内核 Arm64 架构下的国密性能优化,涉及 SM3 以及 SM4 的诸多加密模式,包括 XTS/CTS/CMAC/GCM/CCM 等,Linux 内核上游也同步得到了支持,可以充分发挥出倚天的性能优势。
商密 SIG 的重点项目 Tongsuo,成功获得商用密码产品认证,这是全球首个获得该认证的开源项目,感谢蚂蚁团队对此项目的支持,点击这里了解详细信息 。
02 SIG 月度详细进展
1、国密 SM3/4 算法性能优化
以下的优化全部针对 Arm64 架构,已在龙蜥内核 cloud-kernel 5.10 中得到支持,同时优化 patch 也都贡献到了 Linux 内核上游。
以下各项的数据均是在倚天 710 的环境下,使用内核 tcrypt 模块测试得到的数据,数据经过了表格化处理,单位是 Mbyte/s。
-
支持了 SM3 的 NEON 指令集优化,相比于软件实现,性能提升约 11%,下表是软件实现 sm3-generic,NEON 优化和 Crypto Extension 优化的性能数据,其中横坐标是块大小:
update-size | 16 64 256 1024 2048 4096 8192
---------------+--------------------------------------------------------
sm3-generic | 185.24 221.28 301.26 307.43 300.83 308.82 308.91
sm3-neon | 171.81 220.20 322.94 339.28 334.09 343.61 343.87
sm3-ce | 227.48 333.48 502.62 527.87 520.45 534.91 535.40
-
基于 SM4 的 MAC 算法,支持了 CE 指令集的优化,性能提升约 85%,以下是优化前后的性能对比数据:
优化前:
update-size | 16 64 256 1024 2048 4096 8192
---------------+--------------------------------------------------------
cmac(sm4-ce) | 293.33 403.69 503.76 527.78 531.10 535.46 535.81
xcbc(sm4-ce) | 292.83 402.50 504.02 529.08 529.87 536.55 538.24
cbcmac(sm4-ce) | 318.42 415.79 497.12 515.05 523.15 521.19 523.01
优化后:
update-size | 16 64 256 1024 2048 4096 8192
---------------+--------------------------------------------------------
cmac-sm4-ce | 371.99 675.28 903.56 971.65 980.57 990.40 991.04
xcbc-sm4-ce | 372.11 674.55 903.47 971.61 980.96 990.42 991.10
cbcmac-sm4-ce | 371.63 675.33 903.23 972.07 981.42 990.93 991.45
-
SM4 算法的 CTS/XTS 模式,支持了 CE 指令集优化,CTS 是 CBC 模式的一个变种,通过密文窃取技术支持加密任意长度的数据(CBC 只支持 16 字节对齐的数据大小),主要用于文件名路径的加密,XTS 模式在非变长的磁盘加密和文件加密中应用广泛,以下是优化前后的性能对比数据:
优化前:
block-size | 16 64 128 256 1024 1420 4096
------------+--------------------------------------------------------------
CTS-CBC enc | 286.09 297.17 457.97 627.75 868.58 900.80 957.69
CTS-CBC dec | 286.67 285.63 538.35 947.08 2241.03 2577.32 3391.14
XTS enc | 117.17 430.56 732.92 1134.98 2007.03 2136.23 2347.20
XTS dec | 116.89 429.02 733.40 1132.96 2006.13 2130.50 2347.92
优化后:
block-size | 16 64 128 256 1024 1420 4096
------------+--------------------------------------------------------------
CTS-CBC enc | 288.19 428.80 593.57 741.04 911.73 931.80 950.00
CTS-CBC dec | 292.22 468.99 838.23 1380.76 2741.17 3036.42 3409.62
XTS enc | 224.68 798.91 1248.08 1714.60 2413.73 2467.84 2612.62
XTS dec | 229.85 791.34 1237.79 1720.00 2413.30 2473.84 2611.95
-
SM4 CCM/GCM 模式支持使用 CE 指令集优化,CCM 和 GCM 是带认证的 AEAD 算法,是 TLS 1.3 协议中非常主流的算法模式,这也为 TLS 协议支持国密提供了性能保证。
CCM 模式是计算明文的 CBCMAC 认证码,通过并行加解密操作和计算 CBCMAC 认证码来达到优化的目的。GCM 模式是对密文计算 GHASH,因此加密时是先执行加密操作再计算 GHASH,通过同步加密四路的输入来实现优化,解密时可以并行执行解密操作和计算 GHASH,但受 Arm64 SIMD 寄存器限制,只能同时处理三路的输入,即便如此,解密的性能还是高于加密性能。
以下是优化前后的性能对比数据,测试环境同上,其中 mb 是内核使用 multi buffer 时的数据,优化前 CCM 的 driver 是 rfc4309(ccm_base(ctr-sm4-ce,cbcmac-sm4-ce)),GCM 的 driver 是 gcm_base(ctr-sm4-ce,ghash-generic):
优化前:
block-size | 16 64 256 512 1024 1420 4096 8192
-----------+---------------------------------------------------------------------
CCM enc | 35.07 125.40 336.47 468.17 581.97 619.18 712.56 736.01
CCM dec | 34.87 124.40 335.08 466.75 581.04 618.81 712.25 735.89
CCM mb enc | 34.71 123.96 333.92 465.39 579.91 617.49 711.45 734.92
CCM mb dec | 34.42 122.80 331.02 462.81 578.28 616.42 709.88 734.19
GCM enc | 25.24 64.65 104.66 116.69 123.81 125.12 129.67 130.62
GCM dec | 25.40 64.80 104.74 116.70 123.81 125.21 129.68 130.59
GCM mb enc | 24.95 64.06 104.20 116.38 123.55 124.97 129.63 130.61
GCM mb dec | 24.92 64.00 104.13 116.34 123.55 124.98 129.56 130.48
优化后:
block-size | 16 64 256 512 1024 1420 4096 8192
-----------+---------------------------------------------------------------------
CCM enc | 77.12 249.82 569.94 725.17 839.27 867.71 952.87 969.89
CCM dec | 75.90 247.26 566.29 722.12 836.90 865.95 951.74 968.57
CCM mb enc | 75.98 245.25 562.91 718.99 834.76 864.70 950.17 967.90
CCM mb dec | 75.06 243.78 560.58 717.13 833.68 862.70 949.35 967.11
GCM enc | 108.62 397.18 971.60 1283.92 1522.77 1513.39 1777.00 1806.96
GCM dec | 116.36 398.14 1004.27 1319.11 1624.21 1635.43 1932.54 1974.20
GCM mb enc | 107.13 391.79 962.05 1274.94 1514.76 1508.57 1769.07 1801.58
GCM mb dec | 113.40 389.36 988.51 1307.68 1619.10 1631.55 1931.70 1970.86
2、文件加密支持使用 SM4 算法
fscrypt 是运行在内核文件系统层面的加密库,需要嵌入到真正的文件系统中来提供文件的加密功能,目前 ext4、f2fs、ubifs 已支持 fscrypt。fscrypt 的特点是不同的文件可以使用不同的密钥,同一文件系统上也允许有加密和非加密的文件,这对于多用户非常有用。
fscrypt 除了文件名,不加密其它的文件系统元数据。fscrypt 通过 API 与用户态交互,主要包括注册密钥和配置加密策略,用户则通过用户态命令行工具 fscryptctl 来完成交互。文件加密被是国密一个重要的场景,因此我们为 fscrypt 和 fscryptctl 提供了国密的支持,SM4 XTS 模式用于加密文件内容,SM4 CTS 模式用于加密文件名。
3、Anolis 8.8 将原生支持国密
一直以来,OpenSSL 1.1.1 都是国密的一个遗憾,也是一个痛点,这个版本的 SM2 签名验签能力是有缺陷的,也不支持国密标准的 Za 值。但这个版本又是主流的发行版所使用的版本,也包括 Anolis 8 系列的系统。鉴于以上原因,龙蜥在保证兼容的前提下,在系统默认原生的 OpenSSL 1.1.1 版本上支持了完整的 SM2 签名能力,解决了上述的问题,该特性也会随着下一个版本的 Anolis 8 系统的发布而带给用户。
03 SIG 长期规划
全栈商密算法涉及到众多的上下游组件、团队、外部合作伙伴、上游社区,要尽可能团结其它团队的力量,消除不必要的重复开发,扩大推广和影响力,成为商密事实标准。
全栈商密算法要求先具备从 boot 到业务运行环节各安全链路上所需的商密算法,再针对各组件做针对性的优化,在社区版本扩大影响力后,也让未来商业版相比社区版本带来差异化优势。
协助 BabaSSL 申请国密资质,为应用系统提供必要的合规属性,也为有此需求的用户可以迁移到这个系统上来,增加用户的使用黏性,这也是一个主要的竞争优势。
规划支持的商密算法场景:
-
IMA 场景下使用商密算法替代国际算法
-
内核模块签名认证流程的商密化支持
-
Web 场景下的 RFC 8998 协议支持,即 TLS v1.3 协议中支持使用商密算法套件
-
使用商密算法支持 luks、dm-crypt 场景
-
SecureBoot 中使用商密算法替换国际算法
-
内核 SM4 算法的指令集加速实现
-
coreutils 支持 sm3sum 工具
-
WireGuard 场景国密化支持
-
SM2 优化,类似于 NIST,主要优化点是 SM2 所用曲线的快速取模算法
-
积极参与 OpenSSL 3.0.0 dev 开发,加速 release
-
coreboot 等未来可能替代 UEFI 的固件支持 SM 系统算法
-
gpg 支持使用商密算法
-
libssh 支持使用商密算法
04 SIG 整体支持情况
当前相关的主要开源软件栈对国密的支持情况以及社区回馈统计:
当前商密软件栈的纵向指令集优化情况及性能提升:
-
性能提升数据是相比于纯软件实现的数据
-
x86 架构的测试环境是 Intel i5-6200U 2.30GHz
-
Arm 架构的测试环境是 T-Head Yitian-710 2.75 GHz
-
✅ 表示由 OpenAnolis 开发并已经贡献到开源软件中的特性
-
“WIP”表示由 OpenAnolis 开发中的、或是开源软件正在进行 review 的特性
-
“Y”表示开源软件已经支持且不是由 OpenAnolis 开发的
-
❌ 表示开源软件尚未支持
-
“-”表示开源软件无需支持
更多详情内容见商密软件栈 SIG(openanolis.cn/sig/crypto),欢迎各位感兴趣的开发者加入共建。
—— 完 ——