Batch #1868 merged MD5State (fn_20414..fn_20417; fn_20416 byte-identical) as Source/Utility/Md5.cpp and registered it in data/compile.json, but the server repo had core.ignorecase=true: `git add Source/Utility/Md5.cpp` resolved to the tracked Source/Utility/MD5.cpp and the new file never reached the commit. It stayed in the server working tree, untracked, and main referenced a unit that did not exist. Md5.cpp and MD5.cpp cannot both live on a case-insensitive filesystem, so the unit is committed under the distinct name of its header, Md5State.cpp, and data/compile.json follows. The server now forces core.ignorecase=false, checks that every written file reaches the index under its own path before committing, and rejects submissions whose paths differ from main (or from each other) only by letter case.
172 lines
5.6 KiB
C++
172 lines
5.6 KiB
C++
#include "Utility/Md5State.h"
|
|
|
|
#include <cstring>
|
|
|
|
// GLOBAL: gl_24504
|
|
static const unsigned char g_md5Padding[64] = {0x80};
|
|
|
|
#define MD5_ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
|
|
#define MD5_F(x, y, z) (((x) & (y)) | (~(x) & (z)))
|
|
#define MD5_G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
|
|
#define MD5_H(x, y, z) ((x) ^ (y) ^ (z))
|
|
#define MD5_I(x, y, z) ((y) ^ ((x) | ~(z)))
|
|
#define MD5_SET(f, a, b, c, d, k, s, Ti) \
|
|
t = (a) + f((b), (c), (d)) + X[k] + (Ti); \
|
|
(a) = MD5_ROTATE_LEFT(t, s) + (b)
|
|
|
|
// OFFSET: 0x00C7E440
|
|
// FUNCTION: fn_20414
|
|
void MD5State::Append(const unsigned char* data, int nbytes) {
|
|
const unsigned char* p = data;
|
|
int left = nbytes;
|
|
int offset = (this->count[0] >> 3) & 63;
|
|
std::uint32_t nbits = static_cast<std::uint32_t>(nbytes << 3);
|
|
|
|
if (nbytes <= 0) {
|
|
return;
|
|
}
|
|
|
|
this->count[1] += nbytes >> 29;
|
|
this->count[0] += nbits;
|
|
if (this->count[0] < nbits) {
|
|
this->count[1]++;
|
|
}
|
|
|
|
if (offset) {
|
|
int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
|
|
|
|
std::memcpy(this->buf + offset, p, copy);
|
|
if (offset + copy < 64) {
|
|
return;
|
|
}
|
|
p += copy;
|
|
left -= copy;
|
|
this->Process(this->buf);
|
|
}
|
|
|
|
for (; left >= 64; p += 64, left -= 64) {
|
|
this->Process(p);
|
|
}
|
|
|
|
if (left) {
|
|
std::memcpy(this->buf, p, left);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00C7E530
|
|
// FUNCTION: fn_20415
|
|
void MD5State::Finish(unsigned char* digest) {
|
|
unsigned char data[8];
|
|
int i;
|
|
|
|
for (i = 0; i < 8; ++i) {
|
|
data[i] = static_cast<unsigned char>(this->count[i >> 2] >> ((i & 3) << 3));
|
|
}
|
|
this->Append(g_md5Padding, ((55 - (this->count[0] >> 3)) & 63) + 1);
|
|
this->Append(data, 8);
|
|
for (i = 0; i < 16; ++i) {
|
|
digest[i] = static_cast<unsigned char>(this->abcd[i >> 2] >> ((i & 3) << 3));
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00C7E690
|
|
// FUNCTION: fn_20416
|
|
void MD5State::Init() {
|
|
this->count[0] = this->count[1] = 0;
|
|
this->abcd[0] = 0x67452301;
|
|
this->abcd[1] = 0xEFCDAB89;
|
|
this->abcd[2] = 0x98BADCFE;
|
|
this->abcd[3] = 0x10325476;
|
|
}
|
|
|
|
// OFFSET: 0x00C7E6C0
|
|
// FUNCTION: fn_20417
|
|
void MD5State::Process(const unsigned char* data) {
|
|
std::uint32_t a = this->abcd[0];
|
|
std::uint32_t b = this->abcd[1];
|
|
std::uint32_t c = this->abcd[2];
|
|
std::uint32_t d = this->abcd[3];
|
|
std::uint32_t t;
|
|
std::uint32_t xbuf[16];
|
|
const std::uint32_t* X;
|
|
|
|
if (!(reinterpret_cast<std::uintptr_t>(data) & 3)) {
|
|
X = reinterpret_cast<const std::uint32_t*>(data);
|
|
} else {
|
|
std::memcpy(xbuf, data, 64);
|
|
X = xbuf;
|
|
}
|
|
|
|
MD5_SET(MD5_F, a, b, c, d, 0, 7, 0xD76AA478);
|
|
MD5_SET(MD5_F, d, a, b, c, 1, 12, 0xE8C7B756);
|
|
MD5_SET(MD5_F, c, d, a, b, 2, 17, 0x242070DB);
|
|
MD5_SET(MD5_F, b, c, d, a, 3, 22, 0xC1BDCEEE);
|
|
MD5_SET(MD5_F, a, b, c, d, 4, 7, 0xF57C0FAF);
|
|
MD5_SET(MD5_F, d, a, b, c, 5, 12, 0x4787C62A);
|
|
MD5_SET(MD5_F, c, d, a, b, 6, 17, 0xA8304613);
|
|
MD5_SET(MD5_F, b, c, d, a, 7, 22, 0xFD469501);
|
|
MD5_SET(MD5_F, a, b, c, d, 8, 7, 0x698098D8);
|
|
MD5_SET(MD5_F, d, a, b, c, 9, 12, 0x8B44F7AF);
|
|
MD5_SET(MD5_F, c, d, a, b, 10, 17, 0xFFFF5BB1);
|
|
MD5_SET(MD5_F, b, c, d, a, 11, 22, 0x895CD7BE);
|
|
MD5_SET(MD5_F, a, b, c, d, 12, 7, 0x6B901122);
|
|
MD5_SET(MD5_F, d, a, b, c, 13, 12, 0xFD987193);
|
|
MD5_SET(MD5_F, c, d, a, b, 14, 17, 0xA679438E);
|
|
MD5_SET(MD5_F, b, c, d, a, 15, 22, 0x49B40821);
|
|
|
|
MD5_SET(MD5_G, a, b, c, d, 1, 5, 0xF61E2562);
|
|
MD5_SET(MD5_G, d, a, b, c, 6, 9, 0xC040B340);
|
|
MD5_SET(MD5_G, c, d, a, b, 11, 14, 0x265E5A51);
|
|
MD5_SET(MD5_G, b, c, d, a, 0, 20, 0xE9B6C7AA);
|
|
MD5_SET(MD5_G, a, b, c, d, 5, 5, 0xD62F105D);
|
|
MD5_SET(MD5_G, d, a, b, c, 10, 9, 0x02441453);
|
|
MD5_SET(MD5_G, c, d, a, b, 15, 14, 0xD8A1E681);
|
|
MD5_SET(MD5_G, b, c, d, a, 4, 20, 0xE7D3FBC8);
|
|
MD5_SET(MD5_G, a, b, c, d, 9, 5, 0x21E1CDE6);
|
|
MD5_SET(MD5_G, d, a, b, c, 14, 9, 0xC33707D6);
|
|
MD5_SET(MD5_G, c, d, a, b, 3, 14, 0xF4D50D87);
|
|
MD5_SET(MD5_G, b, c, d, a, 8, 20, 0x455A14ED);
|
|
MD5_SET(MD5_G, a, b, c, d, 13, 5, 0xA9E3E905);
|
|
MD5_SET(MD5_G, d, a, b, c, 2, 9, 0xFCEFA3F8);
|
|
MD5_SET(MD5_G, c, d, a, b, 7, 14, 0x676F02D9);
|
|
MD5_SET(MD5_G, b, c, d, a, 12, 20, 0x8D2A4C8A);
|
|
|
|
MD5_SET(MD5_H, a, b, c, d, 5, 4, 0xFFFA3942);
|
|
MD5_SET(MD5_H, d, a, b, c, 8, 11, 0x8771F681);
|
|
MD5_SET(MD5_H, c, d, a, b, 11, 16, 0x6D9D6122);
|
|
MD5_SET(MD5_H, b, c, d, a, 14, 23, 0xFDE5380C);
|
|
MD5_SET(MD5_H, a, b, c, d, 1, 4, 0xA4BEEA44);
|
|
MD5_SET(MD5_H, d, a, b, c, 4, 11, 0x4BDECFA9);
|
|
MD5_SET(MD5_H, c, d, a, b, 7, 16, 0xF6BB4B60);
|
|
MD5_SET(MD5_H, b, c, d, a, 10, 23, 0xBEBFBC70);
|
|
MD5_SET(MD5_H, a, b, c, d, 13, 4, 0x289B7EC6);
|
|
MD5_SET(MD5_H, d, a, b, c, 0, 11, 0xEAA127FA);
|
|
MD5_SET(MD5_H, c, d, a, b, 3, 16, 0xD4EF3085);
|
|
MD5_SET(MD5_H, b, c, d, a, 6, 23, 0x04881D05);
|
|
MD5_SET(MD5_H, a, b, c, d, 9, 4, 0xD9D4D039);
|
|
MD5_SET(MD5_H, d, a, b, c, 12, 11, 0xE6DB99E5);
|
|
MD5_SET(MD5_H, c, d, a, b, 15, 16, 0x1FA27CF8);
|
|
MD5_SET(MD5_H, b, c, d, a, 2, 23, 0xC4AC5665);
|
|
|
|
MD5_SET(MD5_I, a, b, c, d, 0, 6, 0xF4292244);
|
|
MD5_SET(MD5_I, d, a, b, c, 7, 10, 0x432AFF97);
|
|
MD5_SET(MD5_I, c, d, a, b, 14, 15, 0xAB9423A7);
|
|
MD5_SET(MD5_I, b, c, d, a, 5, 21, 0xFC93A039);
|
|
MD5_SET(MD5_I, a, b, c, d, 12, 6, 0x655B59C3);
|
|
MD5_SET(MD5_I, d, a, b, c, 3, 10, 0x8F0CCC92);
|
|
MD5_SET(MD5_I, c, d, a, b, 10, 15, 0xFFEFF47D);
|
|
MD5_SET(MD5_I, b, c, d, a, 1, 21, 0x85845DD1);
|
|
MD5_SET(MD5_I, a, b, c, d, 8, 6, 0x6FA87E4F);
|
|
MD5_SET(MD5_I, d, a, b, c, 15, 10, 0xFE2CE6E0);
|
|
MD5_SET(MD5_I, c, d, a, b, 6, 15, 0xA3014314);
|
|
MD5_SET(MD5_I, b, c, d, a, 13, 21, 0x4E0811A1);
|
|
MD5_SET(MD5_I, a, b, c, d, 4, 6, 0xF7537E82);
|
|
MD5_SET(MD5_I, d, a, b, c, 11, 10, 0xBD3AF235);
|
|
MD5_SET(MD5_I, c, d, a, b, 2, 15, 0x2AD7D2BB);
|
|
MD5_SET(MD5_I, b, c, d, a, 9, 21, 0xEB86D391);
|
|
|
|
this->abcd[0] += a;
|
|
this->abcd[1] += b;
|
|
this->abcd[2] += c;
|
|
this->abcd[3] += d;
|
|
}
|