28#ifndef PICOSHA2_BUFFER_SIZE_FOR_INPUT_ITERATOR
29# define PICOSHA2_BUFFER_SIZE_FOR_INPUT_ITERATOR \
55 return x & 0xffffffff;
59 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
60 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
61 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
62 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
63 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
64 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
65 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
66 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
67 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
68 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
69 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2};
83 return (x & y) ^ ((~x) & z);
88 return (x & y) ^ (x & z) ^ (y & z);
123template <
typename RaIter1,
typename RaIter2>
126 assert(first + 64 == last);
127 static_cast<void>(last);
129 std::fill(w, w + 64,
word_t(0));
130 for (std::size_t i = 0; i < 16; ++i)
137 for (std::size_t i = 16; i < 64; ++i)
143 word_t a = *message_digest;
144 word_t b = *(message_digest + 1);
145 word_t c = *(message_digest + 2);
146 word_t d = *(message_digest + 3);
147 word_t e = *(message_digest + 4);
148 word_t f = *(message_digest + 5);
149 word_t g = *(message_digest + 6);
150 word_t h = *(message_digest + 7);
152 for (std::size_t i = 0; i < 64; ++i)
165 *message_digest += a;
166 *(message_digest + 1) += b;
167 *(message_digest + 2) += c;
168 *(message_digest + 3) += d;
169 *(message_digest + 4) += e;
170 *(message_digest + 5) += f;
171 *(message_digest + 6) += g;
172 *(message_digest + 7) += h;
173 for (std::size_t i = 0; i < 8; ++i)
175 *(message_digest + i) =
mask_32bit(*(message_digest + i));
181template <
typename InIter>
184 os.setf(std::ios::hex, std::ios::basefield);
185 while (first != last)
189 os << static_cast<unsigned int>(*first);
192 os.setf(std::ios::dec, std::ios::basefield);
195template <
typename InIter>
198 std::ostringstream oss;
200 hex_str.assign(oss.str());
203template <
typename InContainer>
209template <
typename InIter>
217template <
typename InContainer>
236 std::fill(data_length_digits_, data_length_digits_ + 4,
word_t(0));
241 template <
typename RaIter>
244 add_to_data_length(
static_cast<word_t>(std::distance(first, last)));
245 std::copy(first, last, std::back_inserter(buffer_));
247 for (; i + 64 <= buffer_.size(); i += 64)
251 buffer_.erase(buffer_.begin(), buffer_.begin() + i);
257 std::fill(temp, temp + 64,
byte_t(0));
258 std::size_t remains = buffer_.size();
259 std::copy(buffer_.begin(), buffer_.end(), temp);
260 assert(remains < 64);
272 temp[remains] = 0x80;
276 std::fill(temp + remains + 1, temp + 64,
byte_t(0));
278 std::fill(temp, temp + 64 - 4,
byte_t(0));
282 std::fill(temp + remains + 1, temp + 64 - 4,
byte_t(0));
285 write_data_bit_length(&(temp[56]));
289 template <
typename OutIter>
292 for (
const word_t *iter = h_; iter != h_ + 8; ++iter)
294 for (std::size_t i = 0; i < 4 && first != last; ++i)
303 void add_to_data_length(
word_t n)
306 data_length_digits_[0] += n;
307 for (std::size_t i = 0; i < 4; ++i)
309 data_length_digits_[i] += carry;
310 if (data_length_digits_[i] >= 65536u)
312 carry = data_length_digits_[i] >> 16;
313 data_length_digits_[i] &= 65535u;
321 void write_data_bit_length(
byte_t *begin)
323 word_t data_bit_length_digits[4];
325 data_length_digits_, data_length_digits_ + 4, data_bit_length_digits);
329 for (std::size_t i = 0; i < 4; ++i)
331 word_t before_val = data_bit_length_digits[i];
332 data_bit_length_digits[i] <<= 3;
333 data_bit_length_digits[i] |= carry;
334 data_bit_length_digits[i] &= 65535u;
335 carry = (before_val >> (16 - 3)) & 65535u;
339 for (
int i = 3; i >= 0; --i)
341 (*begin++) =
static_cast<byte_t>(data_bit_length_digits[i] >> 8);
342 (*begin++) =
static_cast<byte_t>(data_bit_length_digits[i]);
345 std::vector<byte_t> buffer_;
346 word_t data_length_digits_[4];
367template <
typename RaIter,
typename OutIter>
383template <
typename InputIter,
typename OutIter>
392 std::vector<byte_t> buffer(buffer_size);
395 while (first != last)
397 int size = buffer_size;
398 for (
int i = 0; i != buffer_size; ++i, ++first)
407 hasher.
process(buffer.begin(), buffer.begin() + size);
414template <
typename InIter,
typename OutIter>
428 typename std::iterator_traits<InIter>::iterator_category());
431template <
typename InIter,
typename OutContainer>
432void hash256(InIter first, InIter last, OutContainer &dst)
434 hash256(first, last, dst.begin(), dst.end());
437template <
typename InContainer,
typename OutIter>
438void hash256(
const InContainer &src, OutIter first, OutIter last)
440 hash256(src.begin(), src.end(), first, last);
443template <
typename InContainer,
typename OutContainer>
444void hash256(
const InContainer &src, OutContainer &dst)
446 hash256(src.begin(), src.end(), dst.begin(), dst.end());
449template <
typename InIter>
454 std::ostringstream oss;
456 hex_str.assign(oss.str());
459template <
typename InIter>
472template <
typename InContainer>
478template <
typename InContainer>
483template <
typename OutIter>
484void hash256(std::ifstream &f, OutIter first, OutIter last)
487 std::istreambuf_iterator<char>(f),
488 std::istreambuf_iterator<char>(),
Definition picosha2.h:226
void finish()
Definition picosha2.h:254
void process(RaIter first, RaIter last)
Definition picosha2.h:242
void get_hash_bytes(OutIter first, OutIter last) const
Definition picosha2.h:290
void init()
Definition picosha2.h:233
hash256_one_by_one()
Definition picosha2.h:228
void hash256_block(RaIter1 message_digest, RaIter2 first, RaIter2 last)
Definition picosha2.h:124
byte_t mask_8bit(byte_t x)
Definition picosha2.h:48
word_t ssig0(word_t x)
Definition picosha2.h:113
word_t maj(word_t x, word_t y, word_t z)
Definition picosha2.h:86
word_t bsig0(word_t x)
Definition picosha2.h:97
word_t ssig1(word_t x)
Definition picosha2.h:118
word_t ch(word_t x, word_t y, word_t z)
Definition picosha2.h:81
word_t rotr(word_t x, std::size_t n)
Definition picosha2.h:91
word_t bsig1(word_t x)
Definition picosha2.h:102
word_t shr(word_t x, std::size_t n)
Definition picosha2.h:107
word_t mask_32bit(word_t x)
Definition picosha2.h:53
const word_t add_constant[64]
Definition picosha2.h:58
const word_t initial_message_digest[8]
Definition picosha2.h:71
Definition picosha2.h:366
void hash256_impl(RaIter first, RaIter last, OutIter first2, OutIter last2, int, std::random_access_iterator_tag)
Definition picosha2.h:368
void hash256(InIter first, InIter last, OutIter first2, OutIter last2, int buffer_size=PICOSHA2_BUFFER_SIZE_FOR_INPUT_ITERATOR)
Definition picosha2.h:415
void bytes_to_hex_string(InIter first, InIter last, std::string &hex_str)
Definition picosha2.h:196
void get_hash_hex_string(const hash256_one_by_one &hasher, std::string &hex_str)
Definition picosha2.h:351
unsigned char byte_t
Definition picosha2.h:42
unsigned long word_t
Definition picosha2.h:41
void hash256_hex_string(InIter first, InIter last, std::string &hex_str)
Definition picosha2.h:450
static const size_t k_digest_size
Definition picosha2.h:44
void output_hex(InIter first, InIter last, std::ostream &os)
Definition picosha2.h:182
#define PICOSHA2_BUFFER_SIZE_FOR_INPUT_ITERATOR
Definition picosha2.h:29
Definition iterator_tags.h:37