#ifndef HASH_HPP #define HASH_HPP #include #include #include #include #include #include #include #include inline std::uint64_t reverse(std::uint64_t value){ return (value & 0x00000000000000FFULL) << 56 | (value & 0x000000000000FF00ULL) << 40 | (value & 0x0000000000FF0000ULL) << 24 | (value & 0x00000000FF000000ULL) << 8 | (value & 0x000000FF00000000ULL) >> 8 | (value & 0x0000FF0000000000ULL) >> 24 | (value & 0x00FF000000000000ULL) >> 40 | (value & 0xFF00000000000000ULL) >> 56; } void sha256_(std::uint64_t* dest, const std::vector& input); void sha512_(std::uint64_t* dest, const std::vector& input); void hash_checksum(std::uint64_t* dest, const std::vector& input); template BigInt sha256(ForwardIterator begin, ForwardIterator end){ std::array ret; std::vector::value_type> rcopy(end - begin); std::copy(begin, end, rcopy.begin()); std::size_t bytes = (end - begin) * sizeof(*begin); std::vector kak(bytes); std::memcpy(kak.data(), (char*)rcopy.data(), bytes); sha256_(ret.data(), kak); for(std::uint64_t& x : ret)x = reverse(x); return BigInt(ret.begin(), ret.end()); } template BigInt sha512(ForwardIterator begin, ForwardIterator end){ std::array ret; std::vector::value_type> rcopy(end - begin); std::copy(begin, end, rcopy.begin()); std::size_t bytes = (end - begin) * sizeof(*begin); std::vector kak(bytes); std::memcpy(kak.data(), (char*)rcopy.data(), bytes); sha512_(ret.data(), kak); for(std::uint64_t& x : ret)x = reverse(x); return BigInt(ret.begin(), ret.end()); } template BigInt sha512(const Iterable& arg){ return sha512(arg.begin(), arg.end()); } template BigInt sha256(const Iterable& arg){ return sha256(arg.begin(), arg.end()); } #endif