diff options
Diffstat (limited to 'depends/md5/md5wrapper.cpp')
| -rw-r--r-- | depends/md5/md5wrapper.cpp | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/depends/md5/md5wrapper.cpp b/depends/md5/md5wrapper.cpp new file mode 100644 index 00000000..e12b6578 --- /dev/null +++ b/depends/md5/md5wrapper.cpp @@ -0,0 +1,167 @@ +/* + * This is part of my wrapper-class to create + * a MD5 Hash from a string and a file. + * + * This code is completly free, you + * can copy it, modify it, or do + * what ever you want with it. + * + * Feb. 2005 + * Benjamin Grüdelbach + */ + +/* + * Changed unsigned long int types into uint32_t to make this work on 64bit systems. + * Sep. 5. 2009 + * Petr Mrázek + */ + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#define _CRT_SECURE_NO_WARNINGS +#endif + +//---------------------------------------------------------------------- +//basic includes +#include <fstream> +#include <iostream> +#include <errno.h> +#include <string.h> +//my includes +#include "md5wrapper.h" +#include "md5.h" + +//---------privates-------------------------- + +/* + * internal hash function, calling + * the basic methods from md5.h + */ +std::string md5wrapper::hashit(std::string text) +{ + MD5Context ctx; + + //init md5 + MD5Init(&ctx); + //update with our string + MD5Update(&ctx, + (unsigned char*)text.c_str(), + text.length()); + + //create the hash + unsigned char buff[16] = ""; + MD5Final((unsigned char*)buff,&ctx); + + //converte the hash to a string and return it + return convToString(buff); +} + +/* + * converts the numeric hash to + * a valid std::string. + * (based on Jim Howard's code; + * http://www.codeproject.com/cpp/cmd5.asp) + */ +std::string md5wrapper::convToString(unsigned char *bytes) +{ + char asciihash[33]; + + int p = 0; + for(int i=0; i<16; i++) + { + ::sprintf(&asciihash[p],"%02x",bytes[i]); + p += 2; + } + asciihash[32] = '\0'; + return std::string(asciihash); +} + +//---------publics-------------------------- + +//constructor +md5wrapper::md5wrapper() +{ +} + + +//destructor +md5wrapper::~md5wrapper() +{ +} + +/* + * creates a MD5 hash from + * "text" and returns it as + * string + */ +std::string md5wrapper::getHashFromString(std::string text) +{ + return this->hashit(text); +} + + +/* + * creates a MD5 hash from + * a file specified in "filename" and + * returns it as string + * (based on Ronald L. Rivest's code + * from RFC1321 "The MD5 Message-Digest Algorithm") + */ +std::string md5wrapper::getHashFromFile(std::string filename, uint32_t & length, char * first_kb) +{ + FILE *file; + MD5Context context; + + int len; + int saved = 0; + unsigned char buffer[1024], digest[16]; + + //open file + if ((file = fopen (filename.c_str(), "rb")) == NULL) + { + return "file unreadable."; + } + length = 0; + //init md5 + MD5Init (&context); + + //read the filecontent + while (1) + { + errno = 0; + len = fread (buffer, 1, 1024, file); + if(saved < 1024 && first_kb) + { + memcpy(first_kb + saved, buffer, std::min (len, 1024 - saved)); + saved += len; + } + length += len; + if(len != 1024) + { + int err = ferror(file); + //FIXME: check errno here. + if(err) + { + fclose(file); + return strerror(err); + } + if(feof(file)) + { + MD5Update (&context, buffer, len); + break; + } + } + MD5Update (&context, buffer, len); + } + + /* + generate hash, close the file and return the + hash as std::string + */ + MD5Final (digest, &context); + fclose (file); + return convToString(digest); + } + +/* + * EOF + */ |
