PLSSVM - Parallel Least Squares Support Vector Machine  2.0.0
A Least Squares Support Vector Machine implementation using different backends.
sha256.hpp
Go to the documentation of this file.
1 
12 #ifndef PLSSVM_DETAIL_SHA256_HPP_
13 #define PLSSVM_DETAIL_SHA256_HPP_
14 #pragma once
15 
16 #include <array> // std::array
17 #include <cstdint> // std::uint32_t
18 #include <string> // std::string
19 #include <type_traits> // std::enable_if_t, std::is_unsigned_v
20 
21 namespace plssvm::detail {
22 
27 class sha256 {
28  public:
34  [[nodiscard]] std::string operator()(std::string input) const;
35 
36  private:
43  template <typename T, std::enable_if_t<std::is_unsigned_v<T>, bool> = true>
44  static void unpack(const T x, unsigned char *str) {
45  for (std::size_t i = 0; i < sizeof(T); ++i) {
46  str[i] = static_cast<unsigned char>(x >> ((sizeof(T) - i - 1) * 8));
47  }
48  }
54  static void pack32(const unsigned char *str, std::uint32_t &x);
62  [[nodiscard]] static std::uint32_t rotr32(std::uint32_t value, unsigned int count);
63 
65  static constexpr std::uint32_t DIGEST_SIZE = 256 / 8;
67  static constexpr std::uint32_t CHUNK_SIZE = 512 / 8;
68 
73  static constexpr std::array<std::uint32_t, 64> k_{
74  // clang-format off
75  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
76  0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
77  0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
78  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
79  0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
80  0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
81  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
82  0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
83  // clang-format on
84  };
85 };
86 
87 } // namespace plssvm::detail
88 
89 #endif // PLSSVM_DETAIL_SHA256_HPP_
A hashing struct used for sha256 hashing.
Definition: sha256.hpp:27
static std::uint32_t rotr32(std::uint32_t value, unsigned int count)
Rotate the bits in value @ count times to the right.
static constexpr std::array< std::uint32_t, 64 > k_
Array of the sha256 round constants.
Definition: sha256.hpp:73
std::string operator()(std::string input) const
Calculate the sha256 hash for the input string.
static void pack32(const unsigned char *str, std::uint32_t &x)
Pack four byte of the str into the 32-bit unsigned integer x.
static constexpr std::uint32_t CHUNK_SIZE
NUmber of bytes processed in one round (chunk).
Definition: sha256.hpp:67
static constexpr std::uint32_t DIGEST_SIZE
Number of bytes in the resulting digest.
Definition: sha256.hpp:65
static void unpack(const T x, unsigned char *str)
Unpack the bits of x into the str.
Definition: sha256.hpp:44
Namespace containing implementation details. Should not directly be used by users.
Definition: csvm.hpp:27