diff options
author | Remko Tronçon <git@el-tramo.be> | 2012-12-23 13:16:26 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2012-12-23 14:43:26 (GMT) |
commit | 491ddd570a752cf9bda85933bed0c6942e39b1f9 (patch) | |
tree | 10c25c1be8cc08d0497df1dccd56a10fbb30beee /3rdParty/Boost/src/boost/uuid/sha1.hpp | |
parent | da7d7a0ca71b80281aa9ff2526290b61ccb0cc60 (diff) | |
download | swift-491ddd570a752cf9bda85933bed0c6942e39b1f9.zip swift-491ddd570a752cf9bda85933bed0c6942e39b1f9.tar.bz2 |
Update Boost to 1.52.0.
Change-Id: I1e56bea2600bf2ed9c5b3aba8c4f9d2a0f350e77
Diffstat (limited to '3rdParty/Boost/src/boost/uuid/sha1.hpp')
-rw-r--r-- | 3rdParty/Boost/src/boost/uuid/sha1.hpp | 61 |
1 files changed, 42 insertions, 19 deletions
diff --git a/3rdParty/Boost/src/boost/uuid/sha1.hpp b/3rdParty/Boost/src/boost/uuid/sha1.hpp index b4a1344..e695e13 100644 --- a/3rdParty/Boost/src/boost/uuid/sha1.hpp +++ b/3rdParty/Boost/src/boost/uuid/sha1.hpp @@ -8,16 +8,18 @@ // Revision History // 29 May 2007 - Initial Revision // 25 Feb 2008 - moved to namespace boost::uuids::detail +// 10 Jan 2012 - can now handle the full size of messages (2^64 - 1 bits) // This is a byte oriented implementation -// Note: this implementation does not handle message longer than -// 2^32 bytes. #ifndef BOOST_UUID_SHA1_H #define BOOST_UUID_SHA1_H #include <boost/static_assert.hpp> +#include <stdexcept> +#include <boost/throw_exception.hpp> #include <cstddef> +#include <string> #ifdef BOOST_NO_STDC_NAMESPACE namespace std { @@ -54,6 +56,7 @@ public: private: void process_block(); + void process_byte_impl(unsigned char byte); private: unsigned int h_[5]; @@ -61,7 +64,8 @@ private: unsigned char block_[64]; std::size_t block_byte_index_; - std::size_t byte_count_; + std::size_t bit_count_low; + std::size_t bit_count_high; }; inline sha1::sha1() @@ -78,13 +82,34 @@ inline void sha1::reset() h_[4] = 0xC3D2E1F0; block_byte_index_ = 0; - byte_count_ = 0; + bit_count_low = 0; + bit_count_high = 0; } inline void sha1::process_byte(unsigned char byte) { + process_byte_impl(byte); + + // size_t max value = 0xFFFFFFFF + //if (bit_count_low + 8 >= 0x100000000) { // would overflow + //if (bit_count_low >= 0x100000000-8) { + if (bit_count_low < 0xFFFFFFF8) { + bit_count_low += 8; + } else { + bit_count_low = 0; + + if (bit_count_high <= 0xFFFFFFFE) { + ++bit_count_high; + } else { + BOOST_THROW_EXCEPTION(std::runtime_error("sha1 too many bytes")); + } + } +} + +inline void sha1::process_byte_impl(unsigned char byte) +{ block_[block_byte_index_++] = byte; - ++byte_count_; + if (block_byte_index_ == 64) { block_byte_index_ = 0; process_block(); @@ -160,10 +185,8 @@ inline void sha1::process_block() inline void sha1::get_digest(digest_type digest) { - std::size_t bit_count = byte_count_*8; - // append the bit '1' to the message - process_byte(0x80); + process_byte_impl(0x80); // append k bits '0', where k is the minimum number >= 0 // such that the resulting message length is congruent to 56 (mod 64) @@ -171,29 +194,29 @@ inline void sha1::get_digest(digest_type digest) if (block_byte_index_ > 56) { // finish this block while (block_byte_index_ != 0) { - process_byte(0); + process_byte_impl(0); } // one more block while (block_byte_index_ < 56) { - process_byte(0); + process_byte_impl(0); } } else { while (block_byte_index_ < 56) { - process_byte(0); + process_byte_impl(0); } } // append length of message (before pre-processing) // as a 64-bit big-endian integer - process_byte(0); - process_byte(0); - process_byte(0); - process_byte(0); - process_byte( static_cast<unsigned char>((bit_count>>24) & 0xFF)); - process_byte( static_cast<unsigned char>((bit_count>>16) & 0xFF)); - process_byte( static_cast<unsigned char>((bit_count>>8 ) & 0xFF)); - process_byte( static_cast<unsigned char>((bit_count) & 0xFF)); + process_byte_impl( static_cast<unsigned char>((bit_count_high>>24) & 0xFF) ); + process_byte_impl( static_cast<unsigned char>((bit_count_high>>16) & 0xFF) ); + process_byte_impl( static_cast<unsigned char>((bit_count_high>>8 ) & 0xFF) ); + process_byte_impl( static_cast<unsigned char>((bit_count_high) & 0xFF) ); + process_byte_impl( static_cast<unsigned char>((bit_count_low>>24) & 0xFF) ); + process_byte_impl( static_cast<unsigned char>((bit_count_low>>16) & 0xFF) ); + process_byte_impl( static_cast<unsigned char>((bit_count_low>>8 ) & 0xFF) ); + process_byte_impl( static_cast<unsigned char>((bit_count_low) & 0xFF) ); // get final digest digest[0] = h_[0]; |