微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

要求编译器发出无分支/恒定时间代码

如何解决要求编译器发出无分支/恒定时间代码

在密码学中,任何依赖于秘密数据(例如私钥)的代码都必须在恒定时间内执行以避免side-channel timing attacks

目前最流行的架构(x86-64 和 ARM AArch64)都支持某些类型的条件执行指令,例如:

即使没有这样的指令,也有techniques to convert a piece of code into a branchless version性能可能会受到影响,但在这种情况下,这不是主要目标 - 在恒定时间内运行才是。

因此,原则上应该可以编写无分支代码,例如C/C++,并且确实可以看到 gcc/clang 经常会在打开优化的情况下发出无分支代码(在 gcc 中甚至有一个特定的标志:-fif-conversion2)。然而,这似乎是一个优化决定,如果编译器认为无分支的性能会更差(例如,如果“then”和“else”子句执行大量计算,超过了在发生以下情况时刷新管道的成本)错误预测的分支),那么我假设编译器会发出常规代码

如果恒定时间是一个不可协商的目标,则可能会被迫使用上述一些技巧来生成无分支代码,从而使代码不太清晰。此外,性能通常是次要且非常重要的目标,因此开发人员必须希望编译器能够推断无分支代码背后的预期操作并发出有效的指令序列,通常使用上述指令。这可能需要在查看程序集输出时一遍又一遍地重写代码,直到魔法咒语满足编译器——这可能会因编译器而异,或者当新版本出现时。

总的来说,这对双方来说都是一个糟糕的情况:编译器编写者必须从混淆的代码中推断出意图,将其转换为更简单的指令序列;而开发人员必须编写这种混淆的代码,因为无法保证简单、清晰的代码实际上会在恒定时间内运行。

把这变成一个问题:如果某段代码必须在恒定时间内(或根本不)发出,是否有编译器标志或编译指示将强制代码这样发出,即使编译器预测性能比分支版本差,或者如果不可能则中止编译?开发人员将能够编写清晰的代码,同时为编译器提供清晰且易于分析的代码。我知道这可能是一个依赖于语言和编译器的问题,所以无论是 gcc 还是 clang,我都会对 C 或 C++ 的答案感到满意。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。