mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 08:57:34 +00:00
LibCrypto: Fix Hash::MD5's movability
Because MD5 stored a "Bytes {}" wrapper to its internal data buffer, it was not actually movable. However, its use in several parts of the system (such as HashManager) assumed it was, leading to crashes. Fixes #8135
This commit is contained in:
parent
f29036dc98
commit
b205c9814a
2 changed files with 4 additions and 9 deletions
|
@ -58,9 +58,10 @@ void MD5::update(const u8* input, size_t length)
|
||||||
m_count[1] += (u32)length >> 29;
|
m_count[1] += (u32)length >> 29;
|
||||||
|
|
||||||
auto part_length = 64 - index;
|
auto part_length = 64 - index;
|
||||||
|
auto buffer = Bytes { m_data_buffer, sizeof(m_data_buffer) };
|
||||||
if (length >= part_length) {
|
if (length >= part_length) {
|
||||||
m_buffer.overwrite(index, input, part_length);
|
buffer.overwrite(index, input, part_length);
|
||||||
transform(m_buffer.data());
|
transform(buffer.data());
|
||||||
|
|
||||||
for (offset = part_length; offset + 63 < length; offset += 64)
|
for (offset = part_length; offset + 63 < length; offset += 64)
|
||||||
transform(&input[offset]);
|
transform(&input[offset]);
|
||||||
|
@ -69,7 +70,7 @@ void MD5::update(const u8* input, size_t length)
|
||||||
}
|
}
|
||||||
|
|
||||||
VERIFY(length < part_length || length - offset <= 64);
|
VERIFY(length < part_length || length - offset <= 64);
|
||||||
m_buffer.overwrite(index, &input[offset], length - offset);
|
buffer.overwrite(index, &input[offset], length - offset);
|
||||||
}
|
}
|
||||||
MD5::DigestType MD5::digest()
|
MD5::DigestType MD5::digest()
|
||||||
{
|
{
|
||||||
|
|
|
@ -57,11 +57,6 @@ class MD5 final : public HashFunction<512, MD5Digest> {
|
||||||
public:
|
public:
|
||||||
using HashFunction::update;
|
using HashFunction::update;
|
||||||
|
|
||||||
MD5()
|
|
||||||
{
|
|
||||||
m_buffer = Bytes { m_data_buffer, sizeof(m_data_buffer) };
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void update(const u8*, size_t) override;
|
virtual void update(const u8*, size_t) override;
|
||||||
virtual DigestType digest() override;
|
virtual DigestType digest() override;
|
||||||
virtual DigestType peek() override;
|
virtual DigestType peek() override;
|
||||||
|
@ -98,7 +93,6 @@ private:
|
||||||
|
|
||||||
u32 m_A { MD5Constants::init_A }, m_B { MD5Constants::init_B }, m_C { MD5Constants::init_C }, m_D { MD5Constants::init_D };
|
u32 m_A { MD5Constants::init_A }, m_B { MD5Constants::init_B }, m_C { MD5Constants::init_C }, m_D { MD5Constants::init_D };
|
||||||
u32 m_count[2] { 0, 0 };
|
u32 m_count[2] { 0, 0 };
|
||||||
Bytes m_buffer;
|
|
||||||
|
|
||||||
u8 m_data_buffer[64] {};
|
u8 m_data_buffer[64] {};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue