78 #define __STDC_FORMAT_MACROS
97 "<inttypes.h> did not provide a definition of `SCNx32`, " \
98 "which we hence define here as `lx`" \
109 const unsigned int SHA256::sha256_k[64] = {
110 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
111 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
112 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
113 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
114 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
115 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
116 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
117 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
118 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
119 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
120 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
121 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
122 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
123 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
124 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
125 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
140 checksum.
update( source );
147 checksum.
update( source );
154 std::ostringstream result;
155 for (
size_t i = 0; i < digest.size(); ++i) {
156 result << std::hex << std::setfill(
'0') << std::setw(8);
157 result << static_cast<int>( digest[i] );
173 bool const all_hex = std::all_of( hex.begin(), hex.end(), [](
char c ){
174 return std::isxdigit( c );
176 if( hex.size() != 64 || ! all_hex ) {
177 throw std::runtime_error(
"Invalid SHA256 hex string." );
193 for (
size_t i = 0; i < result.size(); ++i) {
195 auto const n = sscanf( &hex[ 8 * i ],
"%8" SCNx32, &(result[i]) );
197 throw std::runtime_error(
"Invalid SHA256 hex string." );
233 update( s.c_str(), s.size() );
243 size_t cnt = is.gcount();
256 auto const* in_uchar =
reinterpret_cast<unsigned char const*
>( input );
257 update_( in_uchar,
length);
268 unsigned int block_nb;
272 len_b = (tot_len_ + len_) << 3;
273 pm_len = block_nb << 6;
274 memset(block_ + len_, 0, pm_len - len_);
276 SHA2_UNPACK32(len_b, block_ + pm_len - 4);
277 transform_(block_, block_nb);
286 auto const result = digest_;
295 void SHA256::reset_()
297 digest_[0] = 0x6a09e667;
298 digest_[1] = 0xbb67ae85;
299 digest_[2] = 0x3c6ef372;
300 digest_[3] = 0xa54ff53a;
301 digest_[4] = 0x510e527f;
302 digest_[5] = 0x9b05688c;
303 digest_[6] = 0x1f83d9ab;
304 digest_[7] = 0x5be0cd19;
309 void SHA256::update_(
unsigned char const* message,
size_t len )
311 unsigned int block_nb;
312 unsigned int new_len, rem_len, tmp_len;
313 const unsigned char *shifted_message;
315 rem_len = len < tmp_len ? len : tmp_len;
316 memcpy( &block_[len_], message, rem_len );
321 new_len = len - rem_len;
323 shifted_message = message + rem_len;
324 transform_( block_, 1);
325 transform_(shifted_message, block_nb);
327 memcpy( block_, &shifted_message[block_nb << 6], rem_len);
329 tot_len_ += (block_nb + 1) << 6;
332 void SHA256::transform_(
unsigned char const* message,
unsigned int block_nb )
337 const unsigned char *sub_block;
340 for (i = 0; i < (int) block_nb; i++) {
341 sub_block = message + (i << 6);
342 for (j = 0; j < 16; j++) {
343 w[j] = SHA2_PACK32(&sub_block[j << 2]);
345 for (j = 16; j < 64; j++) {
346 w[j] = SHA256_F4(w[j - 2]) + w[j - 7] + SHA256_F3(w[j - 15]) + w[j - 16];
348 for (j = 0; j < 8; j++) {
351 for (j = 0; j < 64; j++) {
352 t1 = wv[7] + SHA256_F2(wv[4]) + SHA2_CH(wv[4], wv[5], wv[6])
353 + sha256_k[j] + w[j];
354 t2 = SHA256_F1(wv[0]) + SHA2_MAJ(wv[0], wv[1], wv[2]);
364 for (j = 0; j < 8; j++) {