diff options
Diffstat (limited to 'twrpDigest.cpp')
-rw-r--r-- | twrpDigest.cpp | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/twrpDigest.cpp b/twrpDigest.cpp new file mode 100644 index 000000000..a9ba20a38 --- /dev/null +++ b/twrpDigest.cpp @@ -0,0 +1,161 @@ +/* + Copyright 2012 to 2016 bigbiff/Dees_Troy TeamWin + This file is part of TWRP/TeamWin Recovery Project. + + TWRP is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + TWRP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with TWRP. If not, see <http://www.gnu.org/licenses/>. +*/ + +extern "C" +{ + #include "digest/md5.h" + #include "libcrecovery/common.h" +} + +#include <vector> +#include <string> +#include <sstream> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/wait.h> +#include <string.h> +#include <libgen.h> +#include <errno.h> +#include <fcntl.h> +#include <fstream> +#include <sys/mman.h> +#include "twcommon.h" +#include "data.hpp" +#include "variables.h" +#include "twrp-functions.hpp" +#include "twrpDigest.hpp" +#include "set_metadata.h" +#include "gui/gui.hpp" + +using namespace std; + +void twrpDigest::setfn(const string& fn) { + md5fn = fn; +} + +void twrpDigest::initMD5(void) { + MD5Init(&md5c); + md5string = ""; +} + +int twrpDigest::updateMD5stream(unsigned char* stream, int len) { + if (md5fn.empty()) { + MD5Update(&md5c, stream, len); + } + else { + return -1; + } + return 0; +} + +void twrpDigest::finalizeMD5stream() { + MD5Final(md5sum, &md5c); +} + +string twrpDigest::createMD5string() { + int i; + char hex[3]; + + for (i = 0; i < 16; ++i) { + snprintf(hex, 3, "%02x", md5sum[i]); + md5string += hex; + } + if (!md5fn.empty()) { + md5string += " "; + md5string += basename((char*) md5fn.c_str()); + md5string += + "\n"; + } + return md5string; +} + +int twrpDigest::computeMD5(void) { + string line; + FILE *file; + int len; + unsigned char buf[1024]; + initMD5(); + file = fopen(md5fn.c_str(), "rb"); + if (file == NULL) + return MD5_NOT_FOUND; + while ((len = fread(buf, 1, sizeof(buf), file)) > 0) { + MD5Update(&md5c, buf, len); + } + fclose(file); + MD5Final(md5sum, &md5c); + return 0; +} + +int twrpDigest::write_md5digest(void) { + string md5file, md5str; + md5file = md5fn + ".md5"; + + md5str = createMD5string(); + TWFunc::write_file(md5file, md5str); + tw_set_default_metadata(md5file.c_str()); + LOGINFO("MD5 for %s: %s\n", md5fn.c_str(), md5str.c_str()); + return 0; +} + +int twrpDigest::read_md5digest(void) { + size_t i = 0; + bool foundMd5File = false; + string md5file = ""; + vector<string> md5ext; + md5ext.push_back(".md5"); + md5ext.push_back(".md5sum"); + + while (i < md5ext.size()) { + md5file = md5fn + md5ext[i]; + if (TWFunc::Path_Exists(md5file)) { + foundMd5File = true; + break; + } + i++; + } + + if (!foundMd5File) + return MD5_NOT_FOUND; + if (TWFunc::read_file(md5file, line) != 0) + return MD5_FILE_UNREADABLE; + + return 0; +} + +int twrpDigest::verify_md5digest(void) { + string buf; + char hex[3]; + int i, ret; + string md5str; + + ret = read_md5digest(); + if (ret != 0) + return ret; + stringstream ss(line); + vector<string> tokens; + while (ss >> buf) + tokens.push_back(buf); + computeMD5(); + for (i = 0; i < 16; ++i) { + snprintf(hex, 3, "%02x", md5sum[i]); + md5str += hex; + } + if (tokens.empty() || tokens.at(0) != md5str) + return MD5_MATCH_FAIL; + + return MD5_OK; +} |