4个稳定版本
2.3.0 | 2023年3月24日 |
---|---|
2.2.0 | 2022年3月12日 |
2.0.0 | 2021年4月17日 |
1.0.0 | 2021年3月9日 |
#187 in 嵌入式开发
2,003 每月下载量
在 4 crates 中使用
38KB
586 行
aligned-cmov
cmov
是 条件移动 的缩写。这是一种条件操作,它接受一个源值、一个目标值和一个布尔值,如果标志为真,则用源值覆盖目标值。CMOV
是一个x86 CPU指令的名称,它为此操作两个寄存器。
CMOV
主要在加密代码中很有趣,因为 CMOV
不会被任何x86硬件“预测”,即使在移动的条件值应该是秘密的情况下,也符合英特尔常量时间编码原则。
此功能是ORAM的关键构建块。ORAM需要在大型(约4k大小的)内存块上反复执行许多条件移动操作。如果做得不好,这可能会成为性能瓶颈。安全要求是这些操作不应被CPU预测,并且应以“侧信道抵抗”的方式进行 -- 在SGX威胁模型中,攻击者不应该能够观察到是否发生了移动,以及它是否发生在enclave内部。
此crate提供了一个名为 CMov
的trait,旨在实现此操作,并提供在几个简单数据类型上。
由于 mc-oblivious
的作用域仅限于支持SGX中的 Intel x86-64,在较新的(>= skylake)CPU上,我们提供了内联汇编,为关心的数据类型执行最佳操作。
与 subtle
的比较
subtle crate 是同一类别中最明显的其他crate。
此crate基于subtle,但它引入了一个新的trait用于条件赋值
pub trait CMov {
fn cmov(&mut self, condition: subtle::Choice, src: &self);
}
我们选择不使用subtle::ConditionallySelectable
,因为这个特性以需要复制的API定义其功能。
fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self;
由于我们需要执行非常大的值的CMOV,这样实现会在栈上创建大量的额外副本。即使在发布模式下消除了这些副本,在调试模式下也不会消除,而我们通常在本地迭代时在调试模式下进行测试。在调试模式下加快速度可以使我们获得更好的测试覆盖率,而不会损害迭代时间。
此外,从美学角度来看,我们认为CMov
API更好,因为它更自然地与硬件的实际工作方式相匹配,这使得推理性能变得更容易。
我们与subtle的另一个主要区别是,subtle不使用汇编,基于稳定版Rust,并且是可移植的。对于我们的目的,我们只关心相对较新的支持SGX的x86-64目标,并且我们不介意使用夜间编译器。我们特别想使用汇编来提高速度。
此外,使用汇编可能会提高安全性,因为编译器明确承诺不会修改或内省“volatile”内联汇编块。但是,引入到llvm中的未来的优化传递原则上可能启用优化,使得“rust timing shield”和subtle中的间接引用不再起作用。因此,在这里代码的可移植性和正确的汇编生成之间存在一些权衡。
尽管如此,我们仍然依赖于subtle来提供需要作为cmov参数的“屏蔽布尔”类型。
未来方向
从长远来看,在subtle crate本身中获得这样的功能可能很理想。
例如,rust-crypto aes
crate在其Cargo.toml中使用平台检测,在编译时选择
- aes的可移植实现(
aes-soft
) - 使用x86 aesni指令的aes硬件加速实现(
aesni
)
如果rust内联汇编得到稳定,我们可以想象subtle
有一个使用特定于平台的汇编的版本用于x86
,而基于软件的版本是后备。然后像在这个crate中的代码可以属于那里。
不过,subtle维护者可能不希望维护与subtle相关的aligned-cmov
代码,因为除了oblivious RAM之外,实际上没有其他应用需要“快速4096字节的条件移动”。据我所知,没有其他密码学原语需要这个。由于subtle现在由许多密码学实现依赖,添加这种功能可能是范围蔓延,而且不清楚是否希望在许多其他密码学库的依赖树中包含这些额外的东西。
参考文献
常量时间代码和侧信道抵抗
- 英特尔关于减轻密码学实现的计时侧信道的指南
- Tim McLean的Rust-timing-shield
- isis agora lovecruft的subtle
- Chandler Carruth在Spectre上的讲解
为密码学实现使用AVX指令
- Samuel Neves和Jean-Philippe Aumasson的在AVX、AVX2和XOP上实现BLAKE
- Henry DeValence在curve25519-dalek的AVX512后端上的讲解
- David Wong在在密码学中使用SIMD指令上的讲解
x86-64汇编
- 费利克斯·克劳蒂埃的 x86-64指令参考。另请参阅他指向官方英特尔文档的链接。
- 英特尔 x86-64内联函数指南
- Agner Fog的 指令表计时(特别是关于skylake CPU的。)
依赖关系
~310KB