hash.hpp 1.7 KB

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