summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2025-05-25 12:40:43 +0200
committerGitHub <noreply@github.com>2025-05-25 12:40:43 +0200
commit18a78a9bab79d32298041bea7d442a0f9acdf61a (patch)
treef8e340d26a499bbef539e294e4e8f7c64a894443
parent776086fa1cfefdb3cf957793dfd950bdd39a7546 (diff)
parentbb77d619670ba19f0c27fc92780f54a9975872b5 (diff)
Merge pull request #13647 from jordan-woyak/sha1-avoid-memcpy
Crypto/SHA1: Re-add memcpy avoiding optimization to BlockContext::Update.
-rw-r--r--Source/Core/Common/Crypto/SHA1.cpp28
1 files changed, 23 insertions, 5 deletions
diff --git a/Source/Core/Common/Crypto/SHA1.cpp b/Source/Core/Common/Crypto/SHA1.cpp
index d092f2a897..2ebfd7a4c8 100644
--- a/Source/Core/Common/Crypto/SHA1.cpp
+++ b/Source/Core/Common/Crypto/SHA1.cpp
@@ -72,20 +72,38 @@ protected:
{
m_msg_length += len;
- size_t count_to_fill_block = m_block.size() - m_block_position;
-
- while (len >= count_to_fill_block)
+ // Block has some partial data. Copy msg into it.
+ if (m_block_position != 0)
{
+ const size_t count_to_fill_block = m_block.size() - m_block_position;
+
+ // Not enough to fill block.
+ if (len < count_to_fill_block)
+ {
+ std::copy_n(msg, len, m_block.data() + m_block_position);
+
+ m_block_position += len;
+ return;
+ }
+
std::copy_n(msg, count_to_fill_block, m_block.data() + m_block_position);
ProcessBlock(m_block.data());
msg += count_to_fill_block;
len -= count_to_fill_block;
-
m_block_position = 0;
- count_to_fill_block = m_block.size();
}
+ // Our block is empty. We can process msg blocks directly, avoiding unnecessary copies.
+ while (len >= m_block.size())
+ {
+ ProcessBlock(msg);
+
+ msg += m_block.size();
+ len -= m_block.size();
+ }
+
+ // Copy any remaining partial data into block.
std::copy_n(msg, len, m_block.data() + m_block_position);
m_block_position += len;
}