Keep md5 inside simgear and use single encodeHex implementation.

This commit is contained in:
Thomas Geymayer 2014-06-18 18:07:42 +02:00
parent e06f9462ab
commit c144c3562c
4 changed files with 47 additions and 24 deletions

View File

@ -27,6 +27,7 @@
#include "strutils.hxx"
#include <simgear/debug/logstream.hxx>
#include <simgear/package/md5.h>
using std::string;
using std::vector;
@ -401,8 +402,32 @@ std::string convertWindowsLocal8BitToUtf8(const std::string& a)
#endif
}
//------------------------------------------------------------------------------
std::string md5(const unsigned char* data, size_t num)
{
SG_MD5_CTX md5_ctx;
SG_MD5Init(&md5_ctx);
SG_MD5Update(&md5_ctx, data, num);
unsigned char digest[MD5_DIGEST_LENGTH];
SG_MD5Final(digest, &md5_ctx);
return encodeHex(digest, MD5_DIGEST_LENGTH);
}
//------------------------------------------------------------------------------
std::string md5(const char* data, size_t num)
{
return md5(reinterpret_cast<const unsigned char*>(data), num);
}
//------------------------------------------------------------------------------
std::string md5(const std::string& str)
{
return md5(reinterpret_cast<const unsigned char*>(str.c_str()), str.size());
}
//------------------------------------------------------------------------------
static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
@ -482,28 +507,24 @@ void decodeBase64(const std::string& encoded_string, std::vector<unsigned char>&
}
}
//------------------------------------------------------------------------------
const char hexChar[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
std::string encodeHex(const std::string& bytes)
{
std::string hex;
size_t count = bytes.size();
for (unsigned int i=0; i<count;++i) {
unsigned char c = bytes[i];
hex.push_back(hexChar[c >> 4]);
hex.push_back(hexChar[c & 0x0f]);
}
return hex;
return encodeHex(
reinterpret_cast<const unsigned char*>(bytes.c_str()),
bytes.size()
);
}
std::string encodeHex(const unsigned char* rawBytes, unsigned int length)
{
std::string hex;
std::string hex(length * 2, '\0');
for (unsigned int i=0; i<length;++i) {
unsigned char c = *rawBytes++;
hex.push_back(hexChar[c >> 4]);
hex.push_back(hexChar[c & 0x0f]);
hex[i * 2] = hexChar[c >> 4];
hex[i * 2 + 1] = hexChar[c & 0x0f];
}
return hex;

View File

@ -176,6 +176,13 @@ namespace simgear {
WCharVec convertUtf8ToWString(const std::string& a);
#endif
/**
* Get md5 hash of raw data.
*/
std::string md5(const unsigned char* data, size_t num);
std::string md5(const char* data, size_t num);
std::string md5(const std::string& str);
/**
* convert base-64 encoded data to raw bytes (possibly with embedded
* NULs). Throws an exception if input data is not base64, or is

View File

@ -7,7 +7,6 @@ set(HEADERS
Install.hxx
Root.hxx
Delegate.hxx
md5.h # TODO expose somehow more elegant (eg. a function accepting a string)
)
set(SOURCES
@ -16,7 +15,7 @@ set(SOURCES
Install.cxx
Root.cxx
# internal helpers
md5.c
md5.h md5.c
ioapi.c ioapi_mem.c ioapi.h
unzip.h unzip.c
)

View File

@ -30,6 +30,7 @@
#include <simgear/io/HTTPRequest.hxx>
#include <simgear/io/HTTPClient.hxx>
#include <simgear/misc/sg_dir.hxx>
#include <simgear/misc/strutils.hxx>
extern "C" {
void fill_memory_filefunc (zlib_filefunc_def*);
@ -91,17 +92,12 @@ protected:
unsigned char digest[MD5_DIGEST_LENGTH];
SG_MD5Final(digest, &m_md5);
// convert final sum to hex
const char hexChar[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
std::stringstream hexMd5;
for (int i=0; i<MD5_DIGEST_LENGTH;++i) {
hexMd5 << hexChar[digest[i] >> 4];
hexMd5 << hexChar[digest[i] & 0x0f];
}
if (hexMd5.str() != m_owner->package()->md5()) {
std::string const hex_md5 =
strutils::encodeHex(digest, MD5_DIGEST_LENGTH);
if (hex_md5 != m_owner->package()->md5()) {
SG_LOG(SG_GENERAL, SG_ALERT, "md5 verification failed:\n"
<< "\t" << hexMd5.str() << "\n\t"
<< "\t" << hex_md5 << "\n\t"
<< m_owner->package()->md5() << "\n\t"
<< "downloading from:" << url());
doFailure(Delegate::FAIL_CHECKSUM);