1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
// SPDX-License-Identifier: Apache-2.0
// Copyright 2023, 2026 SUSE LLC
// Author: Nicolai Stange <nstange@suse.de>
//! Constant-time comparisons of [`usize`] values.
//!
//! Lengths, indices and bit positions are usually not sensitive. However,
//! some, like shift distances or the positions of a multiprecision integer's
//! least or most significant set bit, can be derived from secret values. The
//! primitives here compare such [`usize`] values without branching on them
//! and return the result as a [`LimbChoice`], suitable for subsequent
//! branchless selections, e.g. with [`LimbChoice::select_usize()`].
use ;
use asm;
/// Hide a [`usize`] value from the optimizer.
///
/// Returns `v` unmodified, but prevents the compiler from reasoning about the
/// value and, in particular, from converting subsequent branchless
/// computations on it back into conditional branches. Unlike
/// [`core::hint::black_box()`], which writes to and reads from memory, this
/// keeps the value in a register.
///
/// # Arguments
///
/// * `v` - The value to hide.
/// Test a [`usize`] for being non-zero in constant time.
///
/// Returns one if `v` is non-zero and zero otherwise.
///
/// Runs in constant time, independent of the argument value. See
/// [`ct_is_zero_usize()`] for the negated test.
///
/// # Arguments
///
/// * `v` - The value to test.
/// Test a [`usize`] for being zero in constant time.
///
/// Returns one if `v` is zero and zero otherwise.
///
/// Runs in constant time, independent of the argument value. See
/// [`ct_is_nonzero_usize()`] for the negated test.
///
/// # Arguments
///
/// * `v` - The value to test.
pub
/// Compare two [`usize`] values for `==` in constant time.
///
/// Returns a [`LimbChoice`] representing `true` if `v0` is equal to `v1` and
/// `false` otherwise.
///
/// Runs in constant time, independent of the argument values.
///
/// # Arguments
///
/// * `v0` - The first operand.
/// * `v1` - The second operand.
/// Subtract two [`usize`] values in constant time.
///
/// Returns a pair of the borrow, either zero or one, the latter if and only if
/// `v1` is greater than `v0`, and the difference *`v0` - `v1`* modulo
/// *2<sup>[`usize::BITS`]</sup>*.
///
/// Runs in constant time, independent of the argument values.
///
/// # Arguments
///
/// * `v0` - The minuend.
/// * `v1` - The subtrahend.
/// Compare two [`usize`] values for `<` in constant time.
///
/// Returns a [`LimbChoice`] representing `true` if `v0` is less than `v1` and
/// `false` otherwise.
///
/// Runs in constant time, independent of the argument values.
///
/// # Arguments
///
/// * `v0` - The first operand.
/// * `v1` - The second operand.
/// Compare two [`usize`] values for `<=` in constant time.
///
/// Returns a [`LimbChoice`] representing `true` if `v0` is
/// less than or equal to `v1` and `false` otherwise.
///
/// Runs in constant time, independent of the argument values.
///
/// # Arguments
///
/// * `v0` - The first operand.
/// * `v1` - The second operand.
/// Compare two [`usize`] values for `>` in constant time.
///
/// Returns a [`LimbChoice`] representing `true` if `v0` is greater than
/// `v1` and `false` otherwise.
///
/// Runs in constant time, independent of the argument values.
///
/// # Arguments
///
/// * `v0` - The first operand.
/// * `v1` - The second operand.
/// Compare two [`usize`] values for `>=` in constant time.
///
/// Returns a [`LimbChoice`] representing `true` if `v0` is
/// greater than or equal to `v1` and `false` otherwise.
///
/// Runs in constant time, independent of the argument values.
///
/// # Arguments
///
/// * `v0` - The first operand.
/// * `v1` - The second operand.