1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 05:27:46 +00:00

LibCrypto: Fix subtracting two negative SignedBigIntegers

Currently, we get the following results

    -1 - -2 = -1
    -2 - -1 =  1

Correct would be:

    -1 - -2 =  1
    -2 - -1 = -1

This was already attempted to be fixed in 7ed8970, but that change was
incorrect. This directly translates to LibJS BigInts having the same
incorrect behavior - it even was tested.
This commit is contained in:
Linus Groh 2021-11-16 09:17:55 +00:00
parent 014840eeca
commit 58c6a156bf
3 changed files with 17 additions and 4 deletions

View file

@ -109,11 +109,15 @@ FLATTEN SignedBigInteger SignedBigInteger::minus(const SignedBigInteger& other)
// -x - -y = y - x
if (m_unsigned_data < other.m_unsigned_data) {
// The result will be positive.
return SignedBigInteger { other.m_unsigned_data.minus(m_unsigned_data), true };
return SignedBigInteger { other.m_unsigned_data.minus(m_unsigned_data) };
}
// The result will be either zero, or negative.
// y - x = - (x - y)
return SignedBigInteger { m_unsigned_data.minus(other.m_unsigned_data) };
if (m_unsigned_data > other.m_unsigned_data) {
// The result will be negative.
return SignedBigInteger { m_unsigned_data.minus(other.m_unsigned_data), true };
}
// Both operands have the same magnitude, the result is positive zero.
return SignedBigInteger { 0 };
}
FLATTEN SignedBigInteger SignedBigInteger::plus(const UnsignedBigInteger& other) const