File tree Expand file tree Collapse file tree 2 files changed +14
-16
lines changed
curve25519-dalek/src/backend/serial Expand file tree Collapse file tree 2 files changed +14
-16
lines changed Original file line number Diff line number Diff line change 12
12
13
13
use core:: fmt:: Debug ;
14
14
use core:: ops:: { Index , IndexMut } ;
15
- use subtle:: BlackBox ;
15
+ use subtle:: { Choice , ConditionallySelectable } ;
16
16
17
17
#[ cfg( feature = "zeroize" ) ]
18
18
use zeroize:: Zeroize ;
@@ -187,23 +187,22 @@ impl Scalar29 {
187
187
/// Compute `a - b` (mod l).
188
188
pub fn sub ( a : & Scalar29 , b : & Scalar29 ) -> Scalar29 {
189
189
let mut difference = Scalar29 :: ZERO ;
190
- let mask = BlackBox :: new ( ( 1u32 << 29 ) - 1 ) ;
190
+ let mask = ( 1u32 << 29 ) - 1 ;
191
191
192
192
// a - b
193
193
let mut borrow: u32 = 0 ;
194
194
for i in 0 ..9 {
195
195
borrow = a[ i] . wrapping_sub ( b[ i] + ( borrow >> 31 ) ) ;
196
- difference[ i] = borrow & mask. get ( ) ;
196
+ difference[ i] = borrow & mask;
197
197
}
198
198
199
199
// conditionally add l if the difference is negative
200
- let underflow_mask = BlackBox :: new ( ( ( borrow >> 31 ) ^ 1 ) . wrapping_sub ( 1 ) ) ;
201
200
let mut carry: u32 = 0 ;
202
201
for i in 0 ..9 {
203
- // SECURITY: `BlackBox` prevents LLVM from inserting a `jns` conditional on x86(_64)
204
- // which can be used to bypass this section when `underflow_mask` is zero.
205
- carry = ( carry >> 29 ) + difference[ i] + ( constants :: L [ i ] & underflow_mask . get ( ) ) ;
206
- difference[ i] = carry & mask. get ( ) ;
202
+ let underflow = Choice :: from ( ( borrow >> 31 ) as u8 ) ;
203
+ let addend = u32 :: conditional_select ( & 0 , & constants :: L [ i ] , underflow ) ;
204
+ carry = ( carry >> 29 ) + difference[ i] + addend ;
205
+ difference[ i] = carry & mask;
207
206
}
208
207
209
208
difference
Original file line number Diff line number Diff line change 13
13
14
14
use core:: fmt:: Debug ;
15
15
use core:: ops:: { Index , IndexMut } ;
16
- use subtle:: BlackBox ;
16
+ use subtle:: { Choice , ConditionallySelectable } ;
17
17
18
18
#[ cfg( feature = "zeroize" ) ]
19
19
use zeroize:: Zeroize ;
@@ -176,23 +176,22 @@ impl Scalar52 {
176
176
/// Compute `a - b` (mod l)
177
177
pub fn sub ( a : & Scalar52 , b : & Scalar52 ) -> Scalar52 {
178
178
let mut difference = Scalar52 :: ZERO ;
179
- let mask = BlackBox :: new ( ( 1u64 << 52 ) - 1 ) ;
179
+ let mask = ( 1u64 << 52 ) - 1 ;
180
180
181
181
// a - b
182
182
let mut borrow: u64 = 0 ;
183
183
for i in 0 ..5 {
184
184
borrow = a[ i] . wrapping_sub ( b[ i] + ( borrow >> 63 ) ) ;
185
- difference[ i] = borrow & mask. get ( ) ;
185
+ difference[ i] = borrow & mask;
186
186
}
187
187
188
188
// conditionally add l if the difference is negative
189
- let underflow_mask = BlackBox :: new ( ( ( borrow >> 63 ) ^ 1 ) . wrapping_sub ( 1 ) ) ;
190
189
let mut carry: u64 = 0 ;
191
190
for i in 0 ..5 {
192
- // SECURITY: `BlackBox` prevents LLVM from inserting a `jns` conditional on x86(_64)
193
- // which can be used to bypass this section when `underflow_mask` is zero.
194
- carry = ( carry >> 52 ) + difference[ i] + ( constants :: L [ i ] & underflow_mask . get ( ) ) ;
195
- difference[ i] = carry & mask. get ( ) ;
191
+ let underflow = Choice :: from ( ( borrow >> 63 ) as u8 ) ;
192
+ let addend = u64 :: conditional_select ( & 0 , & constants :: L [ i ] , underflow ) ;
193
+ carry = ( carry >> 52 ) + difference[ i] + addend ;
194
+ difference[ i] = carry & mask;
196
195
}
197
196
198
197
difference
You can’t perform that action at this time.
0 commit comments