summaryrefslogtreecommitdiffstats
path: root/vendor/crypto-bigint/src/boxed/uint/add.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:47:55 +0000
commit2aadc03ef15cb5ca5cc2af8a7c08e070742f0ac4 (patch)
tree033cc839730fda84ff08db877037977be94e5e3a /vendor/crypto-bigint/src/boxed/uint/add.rs
parentInitial commit. (diff)
downloadcargo-upstream.tar.xz
cargo-upstream.zip
Adding upstream version 0.70.1+ds1.upstream/0.70.1+ds1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/crypto-bigint/src/boxed/uint/add.rs')
-rw-r--r--vendor/crypto-bigint/src/boxed/uint/add.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/vendor/crypto-bigint/src/boxed/uint/add.rs b/vendor/crypto-bigint/src/boxed/uint/add.rs
new file mode 100644
index 0000000..b6cedc7
--- /dev/null
+++ b/vendor/crypto-bigint/src/boxed/uint/add.rs
@@ -0,0 +1,62 @@
+//! [`BoxedUint`] addition operations.
+
+use crate::{BoxedUint, CheckedAdd, Limb, Zero};
+use subtle::CtOption;
+
+impl BoxedUint {
+ /// Computes `a + b + carry`, returning the result along with the new carry.
+ #[inline(always)]
+ pub fn adc(&self, rhs: &Self, carry: Limb) -> (Self, Limb) {
+ Self::chain(self, rhs, carry, |a, b, c| a.adc(b, c))
+ }
+
+ /// Perform wrapping addition, discarding overflow.
+ pub fn wrapping_add(&self, rhs: &Self) -> Self {
+ self.adc(rhs, Limb::ZERO).0
+ }
+}
+
+impl CheckedAdd<&BoxedUint> for BoxedUint {
+ type Output = Self;
+
+ fn checked_add(&self, rhs: &Self) -> CtOption<Self> {
+ let (result, carry) = self.adc(rhs, Limb::ZERO);
+ CtOption::new(result, carry.is_zero())
+ }
+}
+
+#[cfg(test)]
+#[allow(clippy::unwrap_used)]
+mod tests {
+ use super::{BoxedUint, CheckedAdd, Limb};
+
+ #[test]
+ fn adc_no_carry() {
+ let (res, carry) = BoxedUint::zero().adc(&BoxedUint::one(), Limb::ZERO);
+ assert_eq!(res, BoxedUint::one());
+ assert_eq!(carry, Limb::ZERO);
+ }
+
+ #[test]
+ fn adc_with_carry() {
+ let (res, carry) = BoxedUint::max(Limb::BITS)
+ .unwrap()
+ .adc(&BoxedUint::one(), Limb::ZERO);
+ assert_eq!(res, BoxedUint::zero());
+ assert_eq!(carry, Limb::ONE);
+ }
+
+ #[test]
+ fn checked_add_ok() {
+ let result = BoxedUint::zero().checked_add(&BoxedUint::one());
+ assert_eq!(result.unwrap(), BoxedUint::one());
+ }
+
+ #[test]
+ fn checked_add_overflow() {
+ let result = BoxedUint::max(Limb::BITS)
+ .unwrap()
+ .checked_add(&BoxedUint::one());
+ assert!(!bool::from(result.is_some()));
+ }
+}