diff options
author | Sebastian Holtermann <sebholt@xwmw.org> | 2016-08-10 09:30:06 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2016-08-10 17:21:32 (GMT) |
commit | 3a5f609cbb4ae63fca1eb87918767a4296d16e5f (patch) | |
tree | 9903bda16d8811eee65e9610cddf16b0f2dfaf6a /Source/cmCryptoHash.cxx | |
parent | f582dba6664e5ea814f3b33c71ae4d83db17b996 (diff) | |
download | CMake-3a5f609cbb4ae63fca1eb87918767a4296d16e5f.zip CMake-3a5f609cbb4ae63fca1eb87918767a4296d16e5f.tar.gz CMake-3a5f609cbb4ae63fca1eb87918767a4296d16e5f.tar.bz2 |
cmCryptoHash: New ByteHash methods that return a byte vector
Diffstat (limited to 'Source/cmCryptoHash.cxx')
-rw-r--r-- | Source/cmCryptoHash.cxx | 66 |
1 files changed, 40 insertions, 26 deletions
diff --git a/Source/cmCryptoHash.cxx b/Source/cmCryptoHash.cxx index 8d96421..9bd07a3 100644 --- a/Source/cmCryptoHash.cxx +++ b/Source/cmCryptoHash.cxx @@ -65,43 +65,57 @@ std::string cmCryptoHash::ByteHashToString( return res; } -std::string cmCryptoHash::HashString(const std::string& input) +std::vector<unsigned char> cmCryptoHash::ByteHashString( + const std::string& input) { this->Initialize(); this->Append(reinterpret_cast<unsigned char const*>(input.c_str()), static_cast<int>(input.size())); - return ByteHashToString(this->Finalize()); + return this->Finalize(); } -std::string cmCryptoHash::HashFile(const std::string& file) +std::vector<unsigned char> cmCryptoHash::ByteHashFile(const std::string& file) { cmsys::ifstream fin(file.c_str(), std::ios::in | std::ios::binary); - if (!fin) { - return ""; + if (fin) { + this->Initialize(); + { + // Should be efficient enough on most system: + cm_sha2_uint64_t buffer[512]; + char* buffer_c = reinterpret_cast<char*>(buffer); + unsigned char const* buffer_uc = + reinterpret_cast<unsigned char const*>(buffer); + // This copy loop is very sensitive on certain platforms with + // slightly broken stream libraries (like HPUX). Normally, it is + // incorrect to not check the error condition on the fin.read() + // before using the data, but the fin.gcount() will be zero if an + // error occurred. Therefore, the loop should be safe everywhere. + while (fin) { + fin.read(buffer_c, sizeof(buffer)); + if (int gcount = static_cast<int>(fin.gcount())) { + this->Append(buffer_uc, gcount); + } + } + } + if (fin.eof()) { + // Success + return this->Finalize(); + } + // Finalize anyway + this->Finalize(); } + // Return without success + return std::vector<unsigned char>(); +} - this->Initialize(); +std::string cmCryptoHash::HashString(const std::string& input) +{ + return ByteHashToString(this->ByteHashString(input)); +} - // Should be efficient enough on most system: - cm_sha2_uint64_t buffer[512]; - char* buffer_c = reinterpret_cast<char*>(buffer); - unsigned char const* buffer_uc = - reinterpret_cast<unsigned char const*>(buffer); - // This copy loop is very sensitive on certain platforms with - // slightly broken stream libraries (like HPUX). Normally, it is - // incorrect to not check the error condition on the fin.read() - // before using the data, but the fin.gcount() will be zero if an - // error occurred. Therefore, the loop should be safe everywhere. - while (fin) { - fin.read(buffer_c, sizeof(buffer)); - if (int gcount = static_cast<int>(fin.gcount())) { - this->Append(buffer_uc, gcount); - } - } - if (fin.eof()) { - return ByteHashToString(this->Finalize()); - } - return ""; +std::string cmCryptoHash::HashFile(const std::string& file) +{ + return ByteHashToString(this->ByteHashFile(file)); } cmCryptoHashMD5::cmCryptoHashMD5() |