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