mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-02 04:38:16 +00:00
core/crypto/_fiat: Hedge against LLVM cleverness
Recent LLVM is getting smart to the point where the optimizer can change a traditional constant-time conditional swap into a pointer swap. Ensure that this does not happen by force-disabling optimization. Additionally, disable inlining the relevant routines such that manual inspection in optimized builds is still reasonably easy to do.
This commit is contained in:
@@ -9,14 +9,16 @@ package fiat
|
|||||||
u1 :: distinct u8
|
u1 :: distinct u8
|
||||||
i1 :: distinct i8
|
i1 :: distinct i8
|
||||||
|
|
||||||
cmovznz_u64 :: #force_inline proc "contextless" (arg1: u1, arg2, arg3: u64) -> (out1: u64) {
|
@(optimization_mode="none")
|
||||||
|
cmovznz_u64 :: proc "contextless" (arg1: u1, arg2, arg3: u64) -> (out1: u64) {
|
||||||
x1 := (u64(arg1) * 0xffffffffffffffff)
|
x1 := (u64(arg1) * 0xffffffffffffffff)
|
||||||
x2 := ((x1 & arg3) | ((~x1) & arg2))
|
x2 := ((x1 & arg3) | ((~x1) & arg2))
|
||||||
out1 = x2
|
out1 = x2
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
cmovznz_u32 :: #force_inline proc "contextless" (arg1: u1, arg2, arg3: u32) -> (out1: u32) {
|
@(optimization_mode="none")
|
||||||
|
cmovznz_u32 :: proc "contextless" (arg1: u1, arg2, arg3: u32) -> (out1: u32) {
|
||||||
x1 := (u32(arg1) * 0xffffffff)
|
x1 := (u32(arg1) * 0xffffffff)
|
||||||
x2 := ((x1 & arg3) | ((~x1) & arg2))
|
x2 := ((x1 & arg3) | ((~x1) & arg2))
|
||||||
out1 = x2
|
out1 = x2
|
||||||
|
|||||||
@@ -305,7 +305,8 @@ fe_opp :: proc "contextless" (out1: ^Loose_Field_Element, arg1: ^Tight_Field_Ele
|
|||||||
out1[4] = x5
|
out1[4] = x5
|
||||||
}
|
}
|
||||||
|
|
||||||
fe_cond_assign :: proc "contextless" (out1, arg1: ^Tight_Field_Element, arg2: int) {
|
@(optimization_mode="none")
|
||||||
|
fe_cond_assign :: #force_no_inline proc "contextless" (out1, arg1: ^Tight_Field_Element, arg2: int) {
|
||||||
x1 := fiat.cmovznz_u64(fiat.u1(arg2), out1[0], arg1[0])
|
x1 := fiat.cmovznz_u64(fiat.u1(arg2), out1[0], arg1[0])
|
||||||
x2 := fiat.cmovznz_u64(fiat.u1(arg2), out1[1], arg1[1])
|
x2 := fiat.cmovznz_u64(fiat.u1(arg2), out1[1], arg1[1])
|
||||||
x3 := fiat.cmovznz_u64(fiat.u1(arg2), out1[2], arg1[2])
|
x3 := fiat.cmovznz_u64(fiat.u1(arg2), out1[2], arg1[2])
|
||||||
@@ -596,7 +597,8 @@ fe_set :: proc "contextless" (out1, arg1: ^Tight_Field_Element) {
|
|||||||
out1[4] = x5
|
out1[4] = x5
|
||||||
}
|
}
|
||||||
|
|
||||||
fe_cond_swap :: proc "contextless" (out1, out2: ^Tight_Field_Element, arg1: int) {
|
@(optimization_mode="none")
|
||||||
|
fe_cond_swap :: #force_no_inline proc "contextless" (out1, out2: ^Tight_Field_Element, arg1: int) {
|
||||||
mask := -u64(arg1)
|
mask := -u64(arg1)
|
||||||
x := (out1[0] ~ out2[0]) & mask
|
x := (out1[0] ~ out2[0]) & mask
|
||||||
x1, y1 := out1[0] ~ x, out2[0] ~ x
|
x1, y1 := out1[0] ~ x, out2[0] ~ x
|
||||||
|
|||||||
@@ -201,7 +201,8 @@ fe_opp :: proc "contextless" (out1: ^Loose_Field_Element, arg1: ^Tight_Field_Ele
|
|||||||
out1[2] = x3
|
out1[2] = x3
|
||||||
}
|
}
|
||||||
|
|
||||||
fe_cond_assign :: proc "contextless" (out1, arg1: ^Tight_Field_Element, arg2: bool) {
|
@(optimization_mode="none")
|
||||||
|
fe_cond_assign :: #force_no_inline proc "contextless" (out1, arg1: ^Tight_Field_Element, arg2: bool) {
|
||||||
x1 := fiat.cmovznz_u64(fiat.u1(arg2), out1[0], arg1[0])
|
x1 := fiat.cmovznz_u64(fiat.u1(arg2), out1[0], arg1[0])
|
||||||
x2 := fiat.cmovznz_u64(fiat.u1(arg2), out1[1], arg1[1])
|
x2 := fiat.cmovznz_u64(fiat.u1(arg2), out1[1], arg1[1])
|
||||||
x3 := fiat.cmovznz_u64(fiat.u1(arg2), out1[2], arg1[2])
|
x3 := fiat.cmovznz_u64(fiat.u1(arg2), out1[2], arg1[2])
|
||||||
@@ -342,7 +343,8 @@ fe_set :: #force_inline proc "contextless" (out1, arg1: ^Tight_Field_Element) {
|
|||||||
out1[2] = x3
|
out1[2] = x3
|
||||||
}
|
}
|
||||||
|
|
||||||
fe_cond_swap :: proc "contextless" (out1, out2: ^Tight_Field_Element, arg1: bool) {
|
@(optimization_mode="none")
|
||||||
|
fe_cond_swap :: #force_no_inline proc "contextless" (out1, out2: ^Tight_Field_Element, arg1: bool) {
|
||||||
mask := -u64(arg1)
|
mask := -u64(arg1)
|
||||||
x := (out1[0] ~ out2[0]) & mask
|
x := (out1[0] ~ out2[0]) & mask
|
||||||
x1, y1 := out1[0] ~ x, out2[0] ~ x
|
x1, y1 := out1[0] ~ x, out2[0] ~ x
|
||||||
|
|||||||
Reference in New Issue
Block a user