summaryrefslogtreecommitdiffstats
path: root/vendor/crypto-bigint/src/boxed/uint/cmp.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:26:03 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:26:03 +0000
commit9918693037dce8aa4bb6f08741b6812923486c18 (patch)
tree21d2b40bec7e6a7ea664acee056eb3d08e15a1cf /vendor/crypto-bigint/src/boxed/uint/cmp.rs
parentReleasing progress-linux version 1.75.0+dfsg1-5~progress7.99u1. (diff)
downloadrustc-9918693037dce8aa4bb6f08741b6812923486c18.tar.xz
rustc-9918693037dce8aa4bb6f08741b6812923486c18.zip
Merging upstream version 1.76.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/crypto-bigint/src/boxed/uint/cmp.rs')
-rw-r--r--vendor/crypto-bigint/src/boxed/uint/cmp.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/vendor/crypto-bigint/src/boxed/uint/cmp.rs b/vendor/crypto-bigint/src/boxed/uint/cmp.rs
new file mode 100644
index 000000000..d850fc7d4
--- /dev/null
+++ b/vendor/crypto-bigint/src/boxed/uint/cmp.rs
@@ -0,0 +1,47 @@
+//! [`BoxedUint`] comparisons.
+//!
+//! By default these are all constant-time and use the `subtle` crate.
+
+use super::BoxedUint;
+use crate::Limb;
+use subtle::{Choice, ConstantTimeEq};
+
+impl ConstantTimeEq for BoxedUint {
+ #[inline]
+ fn ct_eq(&self, other: &Self) -> Choice {
+ let (shorter, longer) = Self::sort_by_precision(self, other);
+ let mut ret = Choice::from(1u8);
+
+ for i in 0..longer.limbs.len() {
+ let a = shorter.limbs.get(i).unwrap_or(&Limb::ZERO);
+ let b = longer.limbs.get(i).unwrap_or(&Limb::ZERO);
+ ret &= a.ct_eq(b);
+ }
+
+ ret
+ }
+}
+
+impl Eq for BoxedUint {}
+impl PartialEq for BoxedUint {
+ fn eq(&self, other: &Self) -> bool {
+ self.ct_eq(other).into()
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::BoxedUint;
+ use subtle::ConstantTimeEq;
+
+ #[test]
+ fn ct_eq() {
+ let a = BoxedUint::zero();
+ let b = BoxedUint::one();
+
+ assert!(bool::from(a.ct_eq(&a)));
+ assert!(!bool::from(a.ct_eq(&b)));
+ assert!(!bool::from(b.ct_eq(&a)));
+ assert!(bool::from(b.ct_eq(&b)));
+ }
+}