Переглянути джерело

LibCrypto: Fix a bug in big int addition

There was a bug when dealing with a carry when the addition
result for the current word was UINT32_MAX.

This commit also adds a regression test for the bug.
Itamar 5 роки тому
батько
коміт
2843dce498

+ 1 - 1
Libraries/LibCrypto/BigInt/UnsignedBigInteger.cpp

@@ -39,7 +39,7 @@ UnsignedBigInteger UnsignedBigInteger::add(const UnsignedBigInteger& other)
         u32 word_addition_result = shorter->m_words[i] + longer->m_words[i];
         u8 carry_out = 0;
         // if there was a carry, the result will be smaller than any of the operands
-        if (word_addition_result < shorter->m_words[i]) {
+        if (word_addition_result + carry < shorter->m_words[i]) {
             carry_out = 1;
         }
         if (carry) {

+ 8 - 0
Userland/test-crypto.cpp

@@ -843,6 +843,14 @@ void bigint_addition_edgecases()
             FAIL(Incorrect Result);
         }
     }
+    {
+        I_TEST((BigInteger | Borrow with zero));
+        Crypto::UnsignedBigInteger num1({ UINT32_MAX - 3, UINT32_MAX });
+        Crypto::UnsignedBigInteger num2({ UINT32_MAX - 2, 0 });
+        if (num1.add(num2).words() == Vector<u32> { 4294967289, 0, 1 }) {
+            PASS;
+        } else {
+            FAIL(Incorrect Result);
 }
 
 void bigint_subtraction()