hash.hpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #ifndef HASH_HPP
  2. #define HASH_HPP
  3. #include <cstdint>
  4. #include <vector>
  5. #include <array>
  6. #include <string>
  7. #include <iterator>
  8. #include <cstdlib>
  9. #include <cstring>
  10. #include <crypt/BigInt64.hpp>
  11. inline std::uint64_t reverse(std::uint64_t value){
  12. return (value & 0x00000000000000FFULL) << 56 | (value & 0x000000000000FF00ULL) << 40 |
  13. (value & 0x0000000000FF0000ULL) << 24 | (value & 0x00000000FF000000ULL) << 8 |
  14. (value & 0x000000FF00000000ULL) >> 8 | (value & 0x0000FF0000000000ULL) >> 24 |
  15. (value & 0x00FF000000000000ULL) >> 40 | (value & 0xFF00000000000000ULL) >> 56;
  16. }
  17. void sha256_(std::uint64_t* dest, const std::vector<char>& input);
  18. void sha512_(std::uint64_t* dest, const std::vector<char>& input);
  19. void hash_checksum(std::uint64_t* dest, const std::vector<char>& input);
  20. template<typename ForwardIterator>
  21. BigInt sha256(ForwardIterator begin, ForwardIterator end){
  22. std::array<std::uint64_t, 4> ret;
  23. std::vector<typename std::iterator_traits<ForwardIterator>::value_type> rcopy(end - begin);
  24. std::copy(begin, end, rcopy.begin());
  25. std::size_t bytes = (end - begin) * sizeof(*begin);
  26. std::vector<char> kak(bytes);
  27. std::memcpy(kak.data(), (char*)rcopy.data(), bytes);
  28. sha256_(ret.data(), kak);
  29. for(std::uint64_t& x : ret)x = reverse(x);
  30. return BigInt(ret.begin(), ret.end());
  31. }
  32. template<typename ForwardIterator>
  33. BigInt sha512(ForwardIterator begin, ForwardIterator end){
  34. std::array<std::uint64_t, 8> ret;
  35. std::vector<typename std::iterator_traits<ForwardIterator>::value_type> rcopy(end - begin);
  36. std::copy(begin, end, rcopy.begin());
  37. std::size_t bytes = (end - begin) * sizeof(*begin);
  38. std::vector<char> kak(bytes);
  39. std::memcpy(kak.data(), (char*)rcopy.data(), bytes);
  40. sha512_(ret.data(), kak);
  41. for(std::uint64_t& x : ret)x = reverse(x);
  42. return BigInt(ret.begin(), ret.end());
  43. }
  44. template<typename Iterable>
  45. BigInt sha512(const Iterable& arg){
  46. return sha512(arg.begin(), arg.end());
  47. }
  48. template<typename Iterable>
  49. BigInt sha256(const Iterable& arg){
  50. return sha256(arg.begin(), arg.end());
  51. }
  52. #endif