/*
        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"
}

/* verify_md5digest return codes */
enum {
	MD5_MATCH_FAIL = -2, // -2: md5 did not match
	MD5_NOT_FOUND,       // -1: no md5 file found
	MD5_OK,              //  0: md5 matches
	MD5_FILE_UNREADABLE  //  1: md5 file unreadable
};

using namespace std;

class twrpDigest
{
public:
	void setfn(const string& fn);
	int computeMD5(void);
	int verify_md5digest(void);
	int write_md5digest(void);
	int updateMD5stream(unsigned char* stream, int len);
	void finalizeMD5stream(void);
	string createMD5string(void);
	void initMD5(void);

private:
	int read_md5digest(void);
	struct MD5Context md5c;
	string md5fn;
	string line;
	unsigned char md5sum[MD5LENGTH];
	string md5string;
};
