|
@@ -4,6 +4,7 @@
|
|
#include <vector>
|
|
#include <vector>
|
|
#include <array>
|
|
#include <array>
|
|
#include <string>
|
|
#include <string>
|
|
|
|
+#include <iterator>
|
|
#include <cstdlib>
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
#include <cstring>
|
|
#include <crypt/BigInt64.hpp>
|
|
#include <crypt/BigInt64.hpp>
|
|
@@ -19,9 +20,11 @@ void hash_checksum(std::uint64_t* dest, const std::vector<char>& input);
|
|
template<typename ForwardIterator>
|
|
template<typename ForwardIterator>
|
|
BigInt sha256(ForwardIterator begin, ForwardIterator end){
|
|
BigInt sha256(ForwardIterator begin, ForwardIterator end){
|
|
std::array<std::uint64_t, 4> ret;
|
|
std::array<std::uint64_t, 4> ret;
|
|
|
|
+ std::vector<typename std::iterator_traits<ForwardIterator>::value_type> rcopy(end - begin);
|
|
|
|
+ std::copy(begin, end, rcopy.begin());
|
|
std::size_t bytes = (end - begin) * sizeof(*begin);
|
|
std::size_t bytes = (end - begin) * sizeof(*begin);
|
|
std::vector<char> kak(bytes);
|
|
std::vector<char> kak(bytes);
|
|
- std::memcpy(kak.data(), (char*)&(*begin), bytes);
|
|
|
|
|
|
+ std::memcpy(kak.data(), (char*)rcopy.data(), bytes);
|
|
sha256_(ret.data(), kak);
|
|
sha256_(ret.data(), kak);
|
|
for(std::uint64_t& x : ret)x = reverse(x);
|
|
for(std::uint64_t& x : ret)x = reverse(x);
|
|
return BigInt(ret.begin(), ret.end());
|
|
return BigInt(ret.begin(), ret.end());
|
|
@@ -29,9 +32,11 @@ BigInt sha256(ForwardIterator begin, ForwardIterator end){
|
|
template<typename ForwardIterator>
|
|
template<typename ForwardIterator>
|
|
BigInt sha512(ForwardIterator begin, ForwardIterator end){
|
|
BigInt sha512(ForwardIterator begin, ForwardIterator end){
|
|
std::array<std::uint64_t, 8> ret;
|
|
std::array<std::uint64_t, 8> ret;
|
|
|
|
+ std::vector<typename std::iterator_traits<ForwardIterator>::value_type> rcopy(end - begin);
|
|
|
|
+ std::copy(begin, end, rcopy.begin());
|
|
std::size_t bytes = (end - begin) * sizeof(*begin);
|
|
std::size_t bytes = (end - begin) * sizeof(*begin);
|
|
std::vector<char> kak(bytes);
|
|
std::vector<char> kak(bytes);
|
|
- std::memcpy(kak.data(), (char*)&(*begin), bytes);
|
|
|
|
|
|
+ std::memcpy(kak.data(), (char*)rcopy.data(), bytes);
|
|
sha512_(ret.data(), kak);
|
|
sha512_(ret.data(), kak);
|
|
for(std::uint64_t& x : ret)x = reverse(x);
|
|
for(std::uint64_t& x : ret)x = reverse(x);
|
|
return BigInt(ret.begin(), ret.end());
|
|
return BigInt(ret.begin(), ret.end());
|