xref: /MusicPlayer2/MusicPlayer2/md5.h (revision bf0c3a3ac0c4e87e9e0b9d2966520f1cee37412e)
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