diff options
| author | JosJuice <josjuice@gmail.com> | 2025-05-25 12:40:43 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-25 12:40:43 +0200 |
| commit | 18a78a9bab79d32298041bea7d442a0f9acdf61a (patch) | |
| tree | f8e340d26a499bbef539e294e4e8f7c64a894443 /Source/Core/Common/Crypto/SHA1.cpp | |
| parent | 776086fa1cfefdb3cf957793dfd950bdd39a7546 (diff) | |
| parent | bb77d619670ba19f0c27fc92780f54a9975872b5 (diff) | |
Merge pull request #13647 from jordan-woyak/sha1-avoid-memcpy
Crypto/SHA1: Re-add memcpy avoiding optimization to BlockContext::Update.
Diffstat (limited to 'Source/Core/Common/Crypto/SHA1.cpp')
| -rw-r--r-- | Source/Core/Common/Crypto/SHA1.cpp | 28 |
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; } |
