summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/util/hashing.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/util/hashing.cpp')
-rw-r--r--src/lib/util/hashing.cpp98
1 files changed, 54 insertions, 44 deletions
diff --git a/src/lib/util/hashing.cpp b/src/lib/util/hashing.cpp
index 62447c7b6c0..3410389fdc8 100644
--- a/src/lib/util/hashing.cpp
+++ b/src/lib/util/hashing.cpp
@@ -9,12 +9,14 @@
***************************************************************************/
#include "hashing.h"
+
#include "strformat.h"
#include "eminline.h"
#include <zlib.h>
+#include <algorithm>
#include <iomanip>
#include <sstream>
@@ -42,7 +44,7 @@ constexpr int char_to_hex(char c)
}
-inline uint32_t sha1_b(uint32_t *data, unsigned i)
+inline uint32_t sha1_b(uint32_t *data, unsigned i) noexcept
{
uint32_t r = data[(i + 13) & 15U];
r ^= data[(i + 8) & 15U];
@@ -53,37 +55,37 @@ inline uint32_t sha1_b(uint32_t *data, unsigned i)
return r;
}
-inline void sha1_r0(const uint32_t *data, std::array<uint32_t, 5> &d, unsigned i)
+inline void sha1_r0(const uint32_t *data, std::array<uint32_t, 5> &d, unsigned i) noexcept
{
d[i % 5] = d[i % 5] + ((d[(i + 3) % 5] & (d[(i + 2) % 5] ^ d[(i + 1) % 5])) ^ d[(i + 1) % 5]) + data[i] + 0x5a827999U + rotl_32(d[(i + 4) % 5], 5);
d[(i + 3) % 5] = rotl_32(d[(i + 3) % 5], 30);
}
-inline void sha1_r1(uint32_t *data, std::array<uint32_t, 5> &d, unsigned i)
+inline void sha1_r1(uint32_t *data, std::array<uint32_t, 5> &d, unsigned i) noexcept
{
d[i % 5] = d[i % 5] + ((d[(i + 3) % 5] & (d[(i + 2) % 5] ^ d[(i + 1) % 5])) ^ d[(i + 1) % 5])+ sha1_b(data, i) + 0x5a827999U + rotl_32(d[(i + 4) % 5], 5);
d[(i + 3) % 5] = rotl_32(d[(i + 3) % 5], 30);
}
-inline void sha1_r2(uint32_t *data, std::array<uint32_t, 5> &d, unsigned i)
+inline void sha1_r2(uint32_t *data, std::array<uint32_t, 5> &d, unsigned i) noexcept
{
d[i % 5] = d[i % 5] + (d[(i + 3) % 5] ^ d[(i + 2) % 5] ^ d[(i + 1) % 5]) + sha1_b(data, i) + 0x6ed9eba1U + rotl_32(d[(i + 4) % 5], 5);
d[(i + 3) % 5] = rotl_32(d[(i + 3) % 5], 30);
}
-inline void sha1_r3(uint32_t *data, std::array<uint32_t, 5> &d, unsigned i)
+inline void sha1_r3(uint32_t *data, std::array<uint32_t, 5> &d, unsigned i) noexcept
{
d[i % 5] = d[i % 5] + (((d[(i + 3) % 5] | d[(i + 2) % 5]) & d[(i + 1) % 5]) | (d[(i + 3) % 5] & d[(i + 2) % 5])) + sha1_b(data, i) + 0x8f1bbcdcU + rotl_32(d[(i + 4) % 5], 5);
d[(i + 3) % 5] = rotl_32(d[(i + 3) % 5], 30);
}
-inline void sha1_r4(uint32_t *data, std::array<uint32_t, 5> &d, unsigned i)
+inline void sha1_r4(uint32_t *data, std::array<uint32_t, 5> &d, unsigned i) noexcept
{
d[i % 5] = d[i % 5] + (d[(i + 3) % 5] ^ d[(i + 2) % 5] ^ d[(i + 1) % 5]) + sha1_b(data, i) + 0xca62c1d6U + rotl_32(d[(i + 4) % 5], 5);
d[(i + 3) % 5] = rotl_32(d[(i + 3) % 5], 30);
}
-inline void sha1_process(std::array<uint32_t, 5> &st, uint32_t *data)
+inline void sha1_process(std::array<uint32_t, 5> &st, uint32_t *data) noexcept
{
std::array<uint32_t, 5> d = st;
unsigned i = 0U;
@@ -125,18 +127,18 @@ const sum16_t sum16_t::null = { 0 };
// from_string - convert from a string
//-------------------------------------------------
-bool sha1_t::from_string(std::string_view string)
+bool sha1_t::from_string(std::string_view string) noexcept
{
// must be at least long enough to hold everything
- memset(m_raw, 0, sizeof(m_raw));
+ std::fill(std::begin(m_raw), std::end(m_raw), 0);
if (string.length() < 2 * sizeof(m_raw))
return false;
// iterate through our raw buffer
- for (auto & elem : m_raw)
+ for (auto &elem : m_raw)
{
- int upper = char_to_hex(string[0]);
- int lower = char_to_hex(string[1]);
+ int const upper = char_to_hex(string[0]);
+ int const lower = char_to_hex(string[1]);
if (upper == -1 || lower == -1)
return false;
elem = (upper << 4) | lower;
@@ -152,12 +154,16 @@ bool sha1_t::from_string(std::string_view string)
std::string sha1_t::as_string() const
{
- std::ostringstream buffer;
- buffer.fill('0');
- buffer << std::hex;
- for (auto & elem : m_raw)
- buffer << std::setw(2) << unsigned(elem);
- return buffer.str();
+ std::string result(2 * std::size(m_raw), ' ');
+ auto it = result.begin();
+ for (auto const &elem : m_raw)
+ {
+ auto const upper = elem >> 4;
+ auto const lower = elem & 0x0f;
+ *it++ = ((10 > upper) ? '0' : ('a' - 10)) + upper;
+ *it++ = ((10 > lower) ? '0' : ('a' - 10)) + lower;
+ }
+ return result;
}
@@ -165,7 +171,7 @@ std::string sha1_t::as_string() const
// reset - prepare to digest a block of data
//-------------------------------------------------
-void sha1_creator::reset()
+void sha1_creator::reset() noexcept
{
m_cnt = 0U;
m_st[0] = 0xc3d2e1f0U;
@@ -180,7 +186,7 @@ void sha1_creator::reset()
// append - digest a block of data
//-------------------------------------------------
-void sha1_creator::append(const void *data, uint32_t length)
+void sha1_creator::append(const void *data, uint32_t length) noexcept
{
#ifdef LSB_FIRST
constexpr unsigned swizzle = 3U;
@@ -215,7 +221,7 @@ void sha1_creator::append(const void *data, uint32_t length)
// finish - compute final hash
//-------------------------------------------------
-sha1_t sha1_creator::finish()
+sha1_t sha1_creator::finish() noexcept
{
const unsigned padlen = 64U - (63U & ((unsigned(m_cnt) >> 3) + 8U));
uint8_t padbuf[64];
@@ -243,18 +249,18 @@ sha1_t sha1_creator::finish()
// from_string - convert from a string
//-------------------------------------------------
-bool md5_t::from_string(std::string_view string)
+bool md5_t::from_string(std::string_view string) noexcept
{
// must be at least long enough to hold everything
- memset(m_raw, 0, sizeof(m_raw));
+ std::fill(std::begin(m_raw), std::end(m_raw), 0);
if (string.length() < 2 * sizeof(m_raw))
return false;
// iterate through our raw buffer
- for (auto & elem : m_raw)
+ for (auto &elem : m_raw)
{
- int upper = char_to_hex(string[0]);
- int lower = char_to_hex(string[1]);
+ int const upper = char_to_hex(string[0]);
+ int const lower = char_to_hex(string[1]);
if (upper == -1 || lower == -1)
return false;
elem = (upper << 4) | lower;
@@ -270,12 +276,16 @@ bool md5_t::from_string(std::string_view string)
std::string md5_t::as_string() const
{
- std::ostringstream buffer;
- buffer.fill('0');
- buffer << std::hex;
- for (auto & elem : m_raw)
- buffer << std::setw(2) << unsigned(elem);
- return buffer.str();
+ std::string result(2 * std::size(m_raw), ' ');
+ auto it = result.begin();
+ for (auto const &elem : m_raw)
+ {
+ auto const upper = elem >> 4;
+ auto const lower = elem & 0x0f;
+ *it++ = ((10 > upper) ? '0' : ('a' - 10)) + upper;
+ *it++ = ((10 > lower) ? '0' : ('a' - 10)) + lower;
+ }
+ return result;
}
@@ -288,18 +298,18 @@ std::string md5_t::as_string() const
// from_string - convert from a string
//-------------------------------------------------
-bool crc32_t::from_string(std::string_view string)
+bool crc32_t::from_string(std::string_view string) noexcept
{
// must be at least long enough to hold everything
m_raw = 0;
- if (string.length() < 2 * sizeof(m_raw))
+ if (string.length() < (2 * sizeof(m_raw)))
return false;
// iterate through our raw buffer
m_raw = 0;
for (int bytenum = 0; bytenum < sizeof(m_raw) * 2; bytenum++)
{
- int nibble = char_to_hex(string[0]);
+ int const nibble = char_to_hex(string[0]);
if (nibble == -1)
return false;
m_raw = (m_raw << 4) | nibble;
@@ -324,7 +334,7 @@ std::string crc32_t::as_string() const
// the currently-accumulated value
//-------------------------------------------------
-void crc32_creator::append(const void *data, uint32_t length)
+void crc32_creator::append(const void *data, uint32_t length) noexcept
{
m_accum.m_raw = crc32(m_accum, reinterpret_cast<const Bytef *>(data), length);
}
@@ -339,18 +349,18 @@ void crc32_creator::append(const void *data, uint32_t length)
// from_string - convert from a string
//-------------------------------------------------
-bool crc16_t::from_string(std::string_view string)
+bool crc16_t::from_string(std::string_view string) noexcept
{
// must be at least long enough to hold everything
m_raw = 0;
- if (string.length() < 2 * sizeof(m_raw))
+ if (string.length() < (2 * sizeof(m_raw)))
return false;
// iterate through our raw buffer
m_raw = 0;
for (int bytenum = 0; bytenum < sizeof(m_raw) * 2; bytenum++)
{
- int nibble = char_to_hex(string[0]);
+ int const nibble = char_to_hex(string[0]);
if (nibble == -1)
return false;
m_raw = (m_raw << 4) | nibble;
@@ -385,7 +395,7 @@ std::string crc16_t::as_string() const
* @param length The length.
*/
-void crc16_creator::append(const void *data, uint32_t length)
+void crc16_creator::append(const void *data, uint32_t length) noexcept
{
static const uint16_t s_table[256] =
{
@@ -442,18 +452,18 @@ void crc16_creator::append(const void *data, uint32_t length)
// from_string - convert from a string
//-------------------------------------------------
-bool sum16_t::from_string(std::string_view string)
+bool sum16_t::from_string(std::string_view string) noexcept
{
// must be at least long enough to hold everything
m_raw = 0;
- if (string.length() < 2 * sizeof(m_raw))
+ if (string.length() < (2 * sizeof(m_raw)))
return false;
// iterate through our raw buffer
m_raw = 0;
for (int bytenum = 0; bytenum < sizeof(m_raw) * 2; bytenum++)
{
- int nibble = char_to_hex(string[0]);
+ int const nibble = char_to_hex(string[0]);
if (nibble == -1)
return false;
m_raw = (m_raw << 4) | nibble;
@@ -488,7 +498,7 @@ std::string sum16_t::as_string() const
* @param length The length.
*/
-void sum16_creator::append(const void *data, uint32_t length)
+void sum16_creator::append(const void *data, uint32_t length) noexcept
{
const auto *src = reinterpret_cast<const uint8_t *>(data);