mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:37:35 +00:00
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.
This commit is contained in:
parent
e0cf40518c
commit
2843dce498
2 changed files with 9 additions and 1 deletions
|
@ -39,7 +39,7 @@ UnsignedBigInteger UnsignedBigInteger::add(const UnsignedBigInteger& other)
|
||||||
u32 word_addition_result = shorter->m_words[i] + longer->m_words[i];
|
u32 word_addition_result = shorter->m_words[i] + longer->m_words[i];
|
||||||
u8 carry_out = 0;
|
u8 carry_out = 0;
|
||||||
// if there was a carry, the result will be smaller than any of the operands
|
// 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;
|
carry_out = 1;
|
||||||
}
|
}
|
||||||
if (carry) {
|
if (carry) {
|
||||||
|
|
|
@ -843,6 +843,14 @@ void bigint_addition_edgecases()
|
||||||
FAIL(Incorrect Result);
|
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()
|
void bigint_subtraction()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue