提升 OpenSSL 性能

目录

摘要
OpenSSL 概述
      什么是 SSL/TLS
      什么是 OpenSSL
      OpenSSL 1.0.2 加密改进的目的
OpenSSL 1.0.2 的关键部分
      函数拼接
      将多缓冲应用于 OpenSSL
系统配置与实验设置
      速度测试
性能
      AES 结果
      公共密钥加密结果
      拼接结果
      多缓冲结果
作者
撰稿人
结论
参考资料

 

摘要 


SSL/TLS 协议涉及两个计算密集型加密阶段:会话初始化和批量数据传输。 OpenSSL 1.0.2 推出了一套完善的加密函数增强功能,比如不同模式的 AES、SHA1、SHA256、SHA512 散列函数(面向批量数据传输),以及 RSA、DSA 和 ECC 等公共密钥密码(面向会话初始化)。 这类优化主要面向以 32 位和 64 位模式运行的英特尔® 酷睿™ 处理器和英特尔® 凌动™ 处理器。

OpenSSL [1] 是一种领先的开源实施方法,主要针对加密函数和要求使用 SSL/TLS [2] 协议的应用的 go-to 资源库。 本文结果主要面向常用于 SSL/TLS 会话初始化/握手和批量数据传输阶段的加密函数而提供。

 

OpenSSL 概述 


什么是 SSL/TLS 

TLS(传输层安全性) [2] 及其前身 SSL(安全套接层)是用于提供安全网络通信的加密协议。

该协议支持应用通过网络进行通信,同时防止信息被窃听和篡改。即第三方无法读取传输内容,也无法在接收端检测不到的情况下修改传输内容。

协议运行过程包含两个阶段。 第一个阶段是会话初始化。 服务器和客户端通过协商,选择适用于加密与验证的密码套件,以及共享密钥。 第二个阶段是传输批量数据。 协议采用数据包加密方法以确保第三方无法读取数据包的内容。 他们根据数据的加密散列表使用消息验证代码 (MAC),以确保数据在传输过程中不被修改。

在会话初始化阶段,客户端必须在生成共享密钥之前采用公共密钥加密方法向服务器传送私人消息。 最常用的公共密钥加密方法是基于模幂运算的 RAS。 模幂运算是一种计算密集型运算,占据了绝大多数的会话初始化周期。 模幂运算实施速度越快,会话初始化成本越低。

在 SSL 下,传输的批量数据被分成若干个最大为 16KB 的记录(面向 SSLv3 和 TLSv1)。

SSL Computations of Cipher and MAC

图 1: Cipher 和 MAC 的 SSL 运算

添加标头后,使用加密散列函数通过标头和数据对消息验证代码 (MAC) 进行计算。 MAC 附加在消息末端,这样消息就填充完毕。 除标头外,其他内容均通过选定的密码进行加密。

这里的关键是所有批量数据缓冲都适用两种算法:加密和验证。 在许多情况下,这两种算法可以拼接 [3] 在一起,以提升整体性能。 许多密码套件(比如 GCM)定义了加密+验证组合模式;在这种情况下,拼接运算会变得更加简单。

什么是 OpenSSL 

OpenSSL [1] 是一种针对 SSL 和 TLS 协议的开源实施方法,广泛用于许多应用和大型企业。

对于这些企业来说,OpenSSL 实施过程中最具吸引力的部分是服务器(每秒)可处理的连接数量,因为这直接代表了需用于服务客户群的服务器数量。 这种最大限度地增加连接数量的方法旨在最大限度地降低每次连接的成本,这可通过最大限度地降低会话初始化和会话数据传输的成本来实现。

OpenSSL 1.0.2 加密改进的目的 

某些针对加密优化的 OpenSSL 项目旨在:

  1. 扩展 OpenSSL 软件架构以支持多缓冲处理技术,从而发挥处理器中 SIMD 架构的最大性能。
  2. 使用高度优化的拼接算法提供市场领先的 SSL/TLS 性能。
  3. 扩展加密空间内的 SIMD 利用率(例如基于英特尔® 流式单指令多数据扩展(英特尔® SSE) 的 SHA2 实施)。
  4. 将英特尔® 高级矢量扩展指令集 2(英特尔® AVX2)用于多种加密算法(比如 RSA 和 SHA)。
  5. 在任何情况下都可使用新指令 MULX、ADCX、ADOX、RORX 和 RDSEED 发挥算法的最大性能。
  6. SSL/TLS 有效负载处理性能权衡应偏向低于约 1400 字节的有效负载。
  7. 将所有功能集成于 OpenSSL 1.0.x 及未来的 1.1.x 代码行,以确保使用现有 OpenSSL 接口的应用能够自动使用这些功能,无需进行其他初始化。

 

OpenSSL 1.0.2 的关键部分 


OpenSSL 1.0.2 中的部分关键加密优化包括:

  • 多缓冲 [4] 支持 AES [128|256] CBC 加密
  • 多缓冲支持 [SHA-1|SHA-256] 利用架构特性 [英特尔 SSE | 英特尔 AVX | 英特尔 AVX2-BMI2]
  • 单缓冲支持“拼接” AES [128|256] CBC [SHA-1|SHA-256] 利用架构特性 [英特尔 SSE | 英特尔AVX | 英特尔 AVX2]
    • AES-128-CBC-Encrypt-SHA-1-AVX2-BMI2
    • AES-256-CBC-Encrypt-SHA-1-AVX2-BMI2
    • AES-128-CBC-Encrypt-SHA-256-SSE
    • AES-256-CBC-Encrypt-SHA-256-SSE
    • AES-128-CBC-Encrypt-SHA-256-AVX
    • AES-256-CBC-Encrypt-SHA-256-AVX
    • AES-128-CBC-Encrypt-SHA-256-AVX2-BMI2
    • AES-256-CBC-Encrypt-SHA-256-AVX2-BMI2
  • 单缓冲支持“拼接” AES [128|256] GCM
  • 单缓冲 SHA-1 性能增强功能利用英特尔 AVX2 和 BMI2
  • 单缓冲 SHA-2 套件 SHA[224|256|384|512] 性能增强功能利用 [英特尔 SSE | 英特尔 AVX | 英特尔 AVX2-BMI2] [5]
  • RSA 和 DSA(密钥大小 >= 1024) 支持使用 [传统 | MULX | ADCX – ADOX] 指令 [6]
  • ECC – ECDH 和 ECDSA [MULX | ADCX – ADOX]
  • 英特尔® 安全散列算法扩展指令集(英特尔® SHA 扩展指令集)新指令 [7]

RSA/DSA/ECC 主要针对会话初始化阶段。 其他的旨在提升批量数据传输阶段的性能。 多缓冲实施可实现最大程度的加速,但目前仅面向加密流任务而设计。

通过函数拼接实施的算法对的选择以目前及未来最常用的密码套件为基础。 在无法采用函数拼接的场景下,对单个加密和验证函数进行优化。

函数拼接 

函数拼接技术用于优化通常以组合形式,但有序运行的两种算法,并精巧地将运算拼接在一起,以最大限度地利用计算资源。 这部分内容仅粗略介绍拼接技术。 更多详情请见 [3]。

函数拼接以超精细的方式交错传送每种算法的指令,以确保两种算法能够同时执行。 其优势在于,(由于数据相关性或指令延迟)执行某种算法时处于闲置状态的执行单元可用来执行另一种算法的指令,反之亦然 [3]。

将多缓冲应用于 OpenSSL  

多缓冲 [4] 是一种面向加密算法(比如散列和加密)能够高效、并行处理多个独立数据缓冲的方法。 同时处理多个缓冲可显著提升性能 — 无论是在代码能够利用 SIMD(英特尔 SSE 英特尔 AVX)指令(比如英特尔 SHA 扩展指令集)的情况下,还是在无法利用(例如使用英特尔® 高级加密标准新指令(英特尔® AES-NI)进行 AES CBC 加密)的情况下。

Multi-Buffer Processing

Multi-Buffer Processing

图 2: 多缓冲处理

多缓冲通常需要采用调度器,后者能够以最低的性能开销处理多个大小不同的数据缓冲,为此我们已找到了很好的解决方法。 然而,将多缓冲应用于 OpenSSL 时,我们的主要挑战和关键问题是如何将多缓冲集成于以串行方式设计的同步应用/框架。 为此,我们在加密期间将记录分成更小但大小相等的子记录。 但这种方法不适用于解密流。

 

系统配置和测试设置 


本部分提供的性能结果是基于三路英特尔酷睿处理器和双路英特尔凌动处理器的测量结果。 系统包括:

  1. 英特尔® 酷睿™ i7-3770 处理器 @ 3.4 GHz        (代号 “Ivy Bridge (IVB)”)
  2. 英特尔® 酷睿™ i5-4250U 处理器 @ 1.30 GHz     (代号 “Haswell (HSW)”)
  3. 英特尔® 酷睿™ i5-5200U 处理器 @ 2.20 GHz     (代号 “Broadwell (BDW)”)
  4. 英特尔® 凌动™ 处理器 N450 @ 1.66GHz          (代号 “Bonnell (BNL)”)
  5. 英特尔® 凌动™ 处理器 N2810 @ 2.00GHz         (代号 “Silvermont (SLM)”)

对于这三路英特尔酷睿处理器,这些测试运行于单个内核,且英特尔® 睿频加速技术关闭,而英特尔® 超线程技术(英特尔® HT 技术)开启。 请注意,英特尔酷睿 i5-5200U 处理器默认为以“省电”模式启动,并以 800 MHz 的速度运行这些测试。 不过所有测试结果均以周期形式提供,以准确呈现微体系架构的功能,并消除所有频率差异。

速度测试 

针对性能测试运行 OpenSSL ‘速度’基准测试。 部分示例命令行为:

./bin/64/openssl speed -evp aes-128-gcm

./bin/64/openssl speed -decrypt -evp aes-128-gcm

./bin/64/openssl speed -evp aes-128-cbc-hmac-sha1

./bin/64/openssl speed -decrypt -evp aes-128-cbc-hmac-sha1

./bin/64/openssl speed -mb -evp aes-128-cbc-hmac-sha1

请注意,“-mb” 切换为新命令,并已完成添加,以便运行多缓冲性能测试。

 

性能 


性能结果已经过标准化处理,在大多数情况下可转化成被处理数据的'每字节周期' (CPB) 。 CPB 是衡量加密算法效率的标准指标。

下图展示了针对 32 位和 64 位代码的性能。

注:性能测试和等级评定均使用特定的计算机系统和/或组件进行测量,这些测试反映了英特尔产品的大致性能。 任何系统硬件、软件的设计或配置的不同均可能影响实际性能。 购买者应进行多方咨询,以评估他们考虑购买的系统或组件的性能。 如欲了解有关性能测试和英特尔产品性能的更多信息,请访问: http://www.intel.com/performance/resources/benchmark_limitations.htm

AES 结果: 

AES Encrypt (Intel® Core™ processors)

图 3: AES 加密(英特尔® 酷睿™ 处理器)

IBV 至 HSW 的 AES-CBC 加密性能提升得益于 AESENC[LAST] 和 AESDEC[LAST] 指令中 1 周期的延迟降低。

IBV 至 HSW 的 AES-GCM 性能提升得益于英特尔 AVX 和 PCLMULQDQ 微体系架构的增强,而从 HSW 至 BDW 的性能提升则得益于 PCLMULQDQ 微体系架构的进一步增强。

AES Decrypt (Intel® Core™ processors)

图 4: AES 解密(英特尔® 酷睿™ 处理器)

大多数常见 AES 解密模式受制于吞吐量,而非延迟。 我们实施并行 AES-CBC 解密一次性处理 6 个数据块。

AES Encrypt (Intel® Atom™ processors)

图 5: AES 加密(英特尔® 凌动™ 处理器)

SLM 引入了 AES 和 PCLMULQDQ 指令,大大提高了 CBC 和 GCM 模式的速度。

AES Decrypt (Intel® Atom™ processors)

图 6: AES 解密(英特尔® 凌动™ 处理器)

公共密钥加密结果 

Public Key Cryptography (Intel® Core™ processors)

图 7: 公共密钥加密(英特尔® 酷睿™ 处理器)

基于 RAS 实现 IVB 提升主要得益于算法优化。

HSW RSA2048 属于个例,因为其性能提升得益于英特尔 AVX2 的实施。 其他性能提升则得益于标量代码调优/算法增强。

在 BDW 上添加 MULX/ADOX/ADCX(LIA 指令)后,通过 HSW 实现了显著的性能提升。

我们将通用代码添加至 Montgomery 相乘函数,因此它能够跨所有 RSA 大小、DSA、DH 和 ECDH 进行扩展。

Public Key Encryption 32-bit

Public Key Encryption 64-bit

图 8: 公共密钥加密(英特尔® 凌动™ 处理器)

基于 SLM 时,得益于乱序执行,实现了架构标量增强。

拼接结果 

AES-CBC-HMAC-SHA (Encrypt) Cycles/Byte

图 9: AES-CBC-HMAC-SHA (加密)周期/字节

AES-CBC-HMAC-SHA (Decrypt) Cycles/Byte

图 10: AES-CBC-HMAC-SHA (解密)周期/字节

IVB 至 HSW 性能提升主要得益于使用英特尔 AXV2 代码。

在解密情况下,AES 指令延迟增强并未实现性能提升,这是因为结果受到了 SHA 的约束。

由于扩展的寄存器组,拼接密码仅用于 64 位增强。 In v1.0.1 拼接密码仅支持解密。

多缓冲结果 

Multi-Buffer AES-CBC-HMAC-SHA (Encrypt) Cycles/Byte

图 11: 多缓冲 AES-CBC-HMAC-SHA (加密)周期/字节

Multi-Buffer Speedup over Stitched

图 12: 通过拼接实现多缓冲加速

 

作者 


Vinodh Gopal、Sean Gulley 和 Wajdi Feghali 是数据中心事业部的架构师,主要关注领域为与加密和压缩相关的软硬件特性。

Ilya Albrekht 和 Dan Zimmerman 是应用工程师,主要针对加密项目和资源库开展性能优化工作。

撰稿人 


感谢 OpenSSL 软件基金会的 Andy Polyakov 和 Steve Marquess,以及英特尔 Max Locktyukhin、John Mechalas 和 Shay Gueron 对本文所作出的贡献。

结论 


本文论述了 OpenSSL 1.0.2 关于提升加密性能的目的以及所具备的主要特性。 充分利用处理器的架构特性(比如 SIMD 和新指令),并结合创新型软件技术(比如函数拼接和多缓冲),可显著提升性能(例如,将多缓冲性能提升 3 倍)。

参考资料 


[1] OpenSSL: http://www.openssl.org/

[2] TLS 协议 http://www.ietf.org/rfc/rfc2246.txt

[3] 通过函数拼接在英特尔® 架构处理器上快速进行加密计算 http://www.intel.com/content/www/cn/zh/intelligent-systems/wireless-infrastructure/cryptographic-computation-architecture-function-stitching-paper.html

[4] 并行处理多个缓冲以提升英特尔® 架构处理器的性能 - http://www.intel.com/content/www/cn/zh/communications/communications-ia-multi-buffer-paper.html

[5] 基于英特尔® 架构处理器的快速 SHA-256 实施 - http://www.intel.com/content/www/us/en/intelligent-systems/intel-technology/sha-256-implementations-paper.html

[6] 新指令支持英特尔® 架构处理器执行大型整数算法

http://www.intel.com/content/www/us-en/intelligent-systems/intel-technology/ia-large-integer-arithmetic-paper.html

[7] 英特尔® SHA 扩展指令集新指令支持英特尔® 架构处理器执行安全散列算法

https://software.intel.com/zh-cn/articles/intel-sha-extensions 

有关编译器优化的更完整信息,请参阅优化通知