1bf0c3a3aSlifegpc #pragma once 2bf0c3a3aSlifegpc #include <stdio.h> 3bf0c3a3aSlifegpc #include <stdint.h> 4bf0c3a3aSlifegpc #include <string.h> 5bf0c3a3aSlifegpc #include <stdlib.h> 6bf0c3a3aSlifegpc #include "Common.h" 7bf0c3a3aSlifegpc 8bf0c3a3aSlifegpc typedef struct { 9*9b620a10Slifegpc uint32_t state[4]; // Current accumulation of hash 10*9b620a10Slifegpc uint32_t temp[64]; 11*9b620a10Slifegpc uint8_t buffer[128]; // Input to be used in the next step 12*9b620a10Slifegpc uint16_t bufferLength; 13*9b620a10Slifegpc size_t bytesHashed; 14bf0c3a3aSlifegpc uint8_t digest[16]; // Result of algorithm 15bf0c3a3aSlifegpc }MD5Context; 16bf0c3a3aSlifegpc 17bf0c3a3aSlifegpc void md5Init(MD5Context* ctx); 18bf0c3a3aSlifegpc void md5Update(MD5Context* ctx, uint8_t* input, size_t input_len); 19bf0c3a3aSlifegpc void md5Finalize(MD5Context* ctx); 20bf0c3a3aSlifegpc 21bf0c3a3aSlifegpc uint32_t rotateLeft(uint32_t x, uint32_t n); 22bf0c3a3aSlifegpc 23bf0c3a3aSlifegpc class MD5 { 24bf0c3a3aSlifegpc public: 25bf0c3a3aSlifegpc MD5(); 26bf0c3a3aSlifegpc std::string Digest(); 27bf0c3a3aSlifegpc void Finalize(); 28bf0c3a3aSlifegpc std::string HexDigest(); 29bf0c3a3aSlifegpc void Update(std::string data); 30*9b620a10Slifegpc void Update(std::wstring data, CodeType code = CodeType::UTF8_NO_BOM, bool* char_cannot_convert = nullptr); 31bf0c3a3aSlifegpc private: 32bf0c3a3aSlifegpc MD5Context ctx; 33bf0c3a3aSlifegpc bool m_finalized; 34bf0c3a3aSlifegpc }; 35