File tree Expand file tree Collapse file tree 1 file changed +9
-1
lines changed
curve25519-dalek/src/backend/serial/u32 Expand file tree Collapse file tree 1 file changed +9
-1
lines changed Original file line number Diff line number Diff line change @@ -185,6 +185,14 @@ impl Scalar29 {
185
185
186
186
/// Compute `a - b` (mod l).
187
187
pub fn sub ( a : & Scalar29 , b : & Scalar29 ) -> Scalar29 {
188
+ // Optimization barrier to prevent compiler from inserting branch instructions
189
+ // TODO(tarcieri): find a better home (or abstraction) for this
190
+ fn black_box ( value : u32 ) -> u32 {
191
+ // SAFETY: `u32` is a simple integer `Copy` type and `value` lives on the stack so
192
+ // a pointer to it will be valid.
193
+ unsafe { core:: ptr:: read_volatile ( & value) }
194
+ }
195
+
188
196
let mut difference = Scalar29 :: ZERO ;
189
197
let mask = ( 1u32 << 29 ) - 1 ;
190
198
@@ -199,7 +207,7 @@ impl Scalar29 {
199
207
let underflow_mask = ( ( borrow >> 31 ) ^ 1 ) . wrapping_sub ( 1 ) ;
200
208
let mut carry: u32 = 0 ;
201
209
for i in 0 ..9 {
202
- carry = ( carry >> 29 ) + difference[ i] + ( constants:: L [ i] & underflow_mask) ;
210
+ carry = ( carry >> 29 ) + difference[ i] + ( constants:: L [ i] & black_box ( underflow_mask) ) ;
203
211
difference[ i] = carry & mask;
204
212
}
205
213
You can’t perform that action at this time.
0 commit comments