93 const unsigned int SHA256::sha256_k[64] = {
94 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
95 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
96 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
97 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
98 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
99 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
100 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
101 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
102 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
103 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
104 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
105 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
106 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
107 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
108 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
109 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
124 checksum.
update( source );
131 checksum.
update( source );
138 std::ostringstream result;
139 for (
size_t i = 0; i < digest.size(); ++i) {
140 result << std::hex << std::setfill(
'0') << std::setw(8);
141 result << static_cast<int>( digest[i] );
157 bool const all_hex = std::all_of( hex.begin(), hex.end(), [](
char c ){
158 return std::isxdigit( c );
160 if( hex.size() != 64 || ! all_hex ) {
161 throw std::runtime_error(
"Invalid SHA256 hex string." );
166 for (
size_t i = 0; i < result.size(); ++i) {
171 std::string
const sub = hex.substr( 8*i, 8 );
173 auto const res = strtoul( sub.c_str(), &endptr, 16 );
175 throw std::runtime_error(
"Invalid SHA256 hex string: \"" + hex +
"\"" );
177 result[i] =
static_cast<uint32_t
>(res);
212 update( s.c_str(), s.size() );
222 size_t cnt = is.gcount();
235 auto const* in_uchar =
reinterpret_cast<unsigned char const*
>( input );
236 update_( in_uchar,
length);
247 unsigned int block_nb;
251 len_b = (tot_len_ + len_) << 3;
252 pm_len = block_nb << 6;
253 memset(block_ + len_, 0, pm_len - len_);
255 SHA2_UNPACK32(len_b, block_ + pm_len - 4);
256 transform_(block_, block_nb);
265 auto const result = digest_;
274 void SHA256::reset_()
276 digest_[0] = 0x6a09e667;
277 digest_[1] = 0xbb67ae85;
278 digest_[2] = 0x3c6ef372;
279 digest_[3] = 0xa54ff53a;
280 digest_[4] = 0x510e527f;
281 digest_[5] = 0x9b05688c;
282 digest_[6] = 0x1f83d9ab;
283 digest_[7] = 0x5be0cd19;
288 void SHA256::update_(
unsigned char const* message,
size_t len )
290 unsigned int block_nb;
291 unsigned int new_len, rem_len, tmp_len;
292 const unsigned char *shifted_message;
294 rem_len = len < tmp_len ? len : tmp_len;
295 memcpy( &block_[len_], message, rem_len );
300 new_len = len - rem_len;
302 shifted_message = message + rem_len;
303 transform_( block_, 1);
304 transform_(shifted_message, block_nb);
306 memcpy( block_, &shifted_message[block_nb << 6], rem_len);
308 tot_len_ += (block_nb + 1) << 6;
311 void SHA256::transform_(
unsigned char const* message,
unsigned int block_nb )
316 const unsigned char *sub_block;
319 for (i = 0; i < (int) block_nb; i++) {
320 sub_block = message + (i << 6);
321 for (j = 0; j < 16; j++) {
322 w[j] = SHA2_PACK32(&sub_block[j << 2]);
324 for (j = 16; j < 64; j++) {
325 w[j] = SHA256_F4(w[j - 2]) + w[j - 7] + SHA256_F3(w[j - 15]) + w[j - 16];
327 for (j = 0; j < 8; j++) {
330 for (j = 0; j < 64; j++) {
331 t1 = wv[7] + SHA256_F2(wv[4]) + SHA2_CH(wv[4], wv[5], wv[6])
332 + sha256_k[j] + w[j];
333 t2 = SHA256_F1(wv[0]) + SHA2_MAJ(wv[0], wv[1], wv[2]);
343 for (j = 0; j < 8; j++) {