#intrinsics #constant-time #conditional #cpu #move #instructions #branch

no-std cmov

在x86/x86_64和AArch64上提供CMOV指令系列的包装器,这些指令是保证以常时间执行且不会被编译器重写为分支的CPU内嵌函数。

5个不稳定版本

0.3.1 2023年10月14日
0.3.0 2023年4月3日
0.2.0 2023年2月26日
0.1.1 2022年3月2日
0.0.0 2022年2月11日

#2589 in 密码学

每月23次下载
用于 lockstitch

Apache-2.0 OR MIT

23KB
462

RustCrypto: CMOV (条件移动)

Crate Docs Build Status Apache 2.0/MIT Licensed MSRV

保证以常时间执行且不会被编译器重写为分支的CPU内嵌函数。

在x86/x86_64上提供CMOV指令系列的包装器,在AArch64上提供CSEL指令的包装器,同时还提供了其他CPU架构的可移植回退实现。

文档

关于

条件移动内嵌函数提供预测,允许在不使用分支指令的情况下选择一个或多个值,从而使得选择与值的关系为常时间,且不受可能由分支预测或其他推测执行特性引入的时间或其他微架构旁路的影响。

英特尔已确认所有现有的CPU都以常时间执行CMOV指令系列,并且这一特性也将适用于未来的英特尔CPU。

此crate提供了使用Rust 1.59中稳定的内联汇编实现的CMOV/CSEL指令的包装器。这意味着实现是一个黑盒,不会被例如LLVM针对特定架构的降低等操作重写。

支持的目标架构

此crate在以下CPU架构上使用内联汇编提供保证的常时间操作:

  • x86 (CMOVZ, CMOVNZ)
  • x86_64 (CMOVZ, CMOVNZ)
  • aarch64 (CSEL)

在其他目标架构上,将使用基于位运算的“尽力而为”的可移植回退实现。然而,我们无法保证此实现生成无分支的代码。

可以将常量时间的保证扩展到其他CPU架构。如果您对此感兴趣,请提出一个有关您希望的目标CPU架构的问题。

最低支持的Rust版本

Rust 1.60 或更高版本。

将来,我们保留修改MSRV(即MSRV不在此crate的SemVer保证范围内)的权利,但是当我们这样做时,将伴随次要版本的升级。

许可证

许可协议为以下之一

任选其一。

贡献

除非您明确声明,否则,您有意提交以包含在您的工作中的任何贡献,如Apache-2.0许可证所定义,应按上述方式双重许可,不附加任何额外条款或条件。

无运行时依赖