vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- An MD5 mplementation in Lua, requires bitlib
-- Written by Jean-Claude Wippler
-- 10/02/2001 jcw@equi4.com
-- Original source available at http://www.equi4.com/md5/md5calc.lua

-- Transformed for use in GroupCalendar by John Stephen

gGroupCalendarMD5 =
{
};

function GroupCalendarMD5_Initialize()
        gGroupCalendarMD5.Mask32 = tonumber("ffffffff", 16);
        gGroupCalendarMD5.Consts = {};
        
        local   vConstants =
        {
                "d76aa478", "e8c7b756", "242070db", "c1bdceee",
                "f57c0faf", "4787c62a", "a8304613", "fd469501",
                "698098d8", "8b44f7af", "ffff5bb1", "895cd7be",
                "6b901122", "fd987193", "a679438e", "49b40821",
                
                "f61e2562", "c040b340", "265e5a51", "e9b6c7aa",
                "d62f105d", "02441453", "d8a1e681", "e7d3fbc8",
                "21e1cde6", "c33707d6", "f4d50d87", "455a14ed",
                "a9e3e905", "fcefa3f8", "676f02d9", "8d2a4c8a",
                
                "fffa3942", "8771f681", "6d9d6122", "fde5380c",
                "a4beea44", "4bdecfa9", "f6bb4b60", "bebfbc70",
                "289b7ec6", "eaa127fa", "d4ef3085", "04881d05",
                "d9d4d039", "e6db99e5", "1fa27cf8", "c4ac5665",
                
                "f4292244", "432aff97", "ab9423a7", "fc93a039",
                "655b59c3", "8f0ccc92", "ffeff47d", "85845dd1",
                "6fa87e4f", "fe2ce6e0", "a3014314", "4e0811a1",
                "f7537e82", "bd3af235", "2ad7d2bb", "eb86d391",
                
                "67452301", "efcdab89", "98badcfe", "10325476",
        };
        
        for vIndex, vConstStr in vConstants do
                gGroupCalendarMD5.Consts[vIndex] = tonumber(vConstStr, 16);
        end
end

function GroupCalendarMD5_f(x, y, z)
        return bit.bor(bit.band(x, y), bit.band(-x - 1, z));
end

function GroupCalendarMD5_g(x, y, z)
        return bit.bor(bit.band(x, z), bit.band(y, -z - 1));
end

function GroupCalendarMD5_h(x, y, z)
        return bit.bxor(x, bit.bxor(y, z));
end

function GroupCalendarMD5_i(x, y, z)
        return bit.bxor(y, bit.bor(x, -z - 1));
end

function GroupCalendarMD5_z(f,a,b,c,d,x,s,ac)
        a = bit.band(a + f(b, c, d) + x + ac, gGroupCalendarMD5.Mask32);
        
        -- be *very* careful that left shift does not cause rounding!
        
        return bit.bor(bit.lshift(bit.band(a, bit.rshift(gGroupCalendarMD5.Mask32, s)), s), bit.rshift(a, 32 - s)) + b;
end

function GroupCalendarMD5_Transform(A,B,C,D,X)
        local a, b, c, d = A, B, C, D;
        local t = gGroupCalendarMD5.Consts;
        
        -- Round 1
        
        a=GroupCalendarMD5_z(GroupCalendarMD5_f,a,b,c,d,X[ 1], 7,t[ 1])
        d=GroupCalendarMD5_z(GroupCalendarMD5_f,d,a,b,c,X[ 2],12,t[ 2])
        c=GroupCalendarMD5_z(GroupCalendarMD5_f,c,d,a,b,X[ 3],17,t[ 3])
        b=GroupCalendarMD5_z(GroupCalendarMD5_f,b,c,d,a,X[ 4],22,t[ 4])
        a=GroupCalendarMD5_z(GroupCalendarMD5_f,a,b,c,d,X[ 5], 7,t[ 5])
        d=GroupCalendarMD5_z(GroupCalendarMD5_f,d,a,b,c,X[ 6],12,t[ 6])
        c=GroupCalendarMD5_z(GroupCalendarMD5_f,c,d,a,b,X[ 7],17,t[ 7])
        b=GroupCalendarMD5_z(GroupCalendarMD5_f,b,c,d,a,X[ 8],22,t[ 8])
        a=GroupCalendarMD5_z(GroupCalendarMD5_f,a,b,c,d,X[ 9], 7,t[ 9])
        d=GroupCalendarMD5_z(GroupCalendarMD5_f,d,a,b,c,X[10],12,t[10])
        c=GroupCalendarMD5_z(GroupCalendarMD5_f,c,d,a,b,X[11],17,t[11])
        b=GroupCalendarMD5_z(GroupCalendarMD5_f,b,c,d,a,X[12],22,t[12])
        a=GroupCalendarMD5_z(GroupCalendarMD5_f,a,b,c,d,X[13], 7,t[13])
        d=GroupCalendarMD5_z(GroupCalendarMD5_f,d,a,b,c,X[14],12,t[14])
        c=GroupCalendarMD5_z(GroupCalendarMD5_f,c,d,a,b,X[15],17,t[15])
        b=GroupCalendarMD5_z(GroupCalendarMD5_f,b,c,d,a,X[16],22,t[16])
        
        -- Round 2
        
        a=GroupCalendarMD5_z(GroupCalendarMD5_g,a,b,c,d,X[ 2], 5,t[17])
        d=GroupCalendarMD5_z(GroupCalendarMD5_g,d,a,b,c,X[ 7], 9,t[18])
        c=GroupCalendarMD5_z(GroupCalendarMD5_g,c,d,a,b,X[12],14,t[19])
        b=GroupCalendarMD5_z(GroupCalendarMD5_g,b,c,d,a,X[ 1],20,t[20])
        a=GroupCalendarMD5_z(GroupCalendarMD5_g,a,b,c,d,X[ 6], 5,t[21])
        d=GroupCalendarMD5_z(GroupCalendarMD5_g,d,a,b,c,X[11], 9,t[22])
        c=GroupCalendarMD5_z(GroupCalendarMD5_g,c,d,a,b,X[16],14,t[23])
        b=GroupCalendarMD5_z(GroupCalendarMD5_g,b,c,d,a,X[ 5],20,t[24])
        a=GroupCalendarMD5_z(GroupCalendarMD5_g,a,b,c,d,X[10], 5,t[25])
        d=GroupCalendarMD5_z(GroupCalendarMD5_g,d,a,b,c,X[15], 9,t[26])
        c=GroupCalendarMD5_z(GroupCalendarMD5_g,c,d,a,b,X[ 4],14,t[27])
        b=GroupCalendarMD5_z(GroupCalendarMD5_g,b,c,d,a,X[ 9],20,t[28])
        a=GroupCalendarMD5_z(GroupCalendarMD5_g,a,b,c,d,X[14], 5,t[29])
        d=GroupCalendarMD5_z(GroupCalendarMD5_g,d,a,b,c,X[ 3], 9,t[30])
        c=GroupCalendarMD5_z(GroupCalendarMD5_g,c,d,a,b,X[ 8],14,t[31])
        b=GroupCalendarMD5_z(GroupCalendarMD5_g,b,c,d,a,X[13],20,t[32])
        
        -- Round 3
        
        a=GroupCalendarMD5_z(GroupCalendarMD5_h,a,b,c,d,X[ 6], 4,t[33])
        d=GroupCalendarMD5_z(GroupCalendarMD5_h,d,a,b,c,X[ 9],11,t[34])
        c=GroupCalendarMD5_z(GroupCalendarMD5_h,c,d,a,b,X[12],16,t[35])
        b=GroupCalendarMD5_z(GroupCalendarMD5_h,b,c,d,a,X[15],23,t[36])
        a=GroupCalendarMD5_z(GroupCalendarMD5_h,a,b,c,d,X[ 2], 4,t[37])
        d=GroupCalendarMD5_z(GroupCalendarMD5_h,d,a,b,c,X[ 5],11,t[38])
        c=GroupCalendarMD5_z(GroupCalendarMD5_h,c,d,a,b,X[ 8],16,t[39])
        b=GroupCalendarMD5_z(GroupCalendarMD5_h,b,c,d,a,X[11],23,t[40])
        a=GroupCalendarMD5_z(GroupCalendarMD5_h,a,b,c,d,X[14], 4,t[41])
        d=GroupCalendarMD5_z(GroupCalendarMD5_h,d,a,b,c,X[ 1],11,t[42])
        c=GroupCalendarMD5_z(GroupCalendarMD5_h,c,d,a,b,X[ 4],16,t[43])
        b=GroupCalendarMD5_z(GroupCalendarMD5_h,b,c,d,a,X[ 7],23,t[44])
        a=GroupCalendarMD5_z(GroupCalendarMD5_h,a,b,c,d,X[10], 4,t[45])
        d=GroupCalendarMD5_z(GroupCalendarMD5_h,d,a,b,c,X[13],11,t[46])
        c=GroupCalendarMD5_z(GroupCalendarMD5_h,c,d,a,b,X[16],16,t[47])
        b=GroupCalendarMD5_z(GroupCalendarMD5_h,b,c,d,a,X[ 3],23,t[48])
        
        -- Round 4
        
        a=GroupCalendarMD5_z(GroupCalendarMD5_i,a,b,c,d,X[ 1], 6,t[49])
        d=GroupCalendarMD5_z(GroupCalendarMD5_i,d,a,b,c,X[ 8],10,t[50])
        c=GroupCalendarMD5_z(GroupCalendarMD5_i,c,d,a,b,X[15],15,t[51])
        b=GroupCalendarMD5_z(GroupCalendarMD5_i,b,c,d,a,X[ 6],21,t[52])
        a=GroupCalendarMD5_z(GroupCalendarMD5_i,a,b,c,d,X[13], 6,t[53])
        d=GroupCalendarMD5_z(GroupCalendarMD5_i,d,a,b,c,X[ 4],10,t[54])
        c=GroupCalendarMD5_z(GroupCalendarMD5_i,c,d,a,b,X[11],15,t[55])
        b=GroupCalendarMD5_z(GroupCalendarMD5_i,b,c,d,a,X[ 2],21,t[56])
        a=GroupCalendarMD5_z(GroupCalendarMD5_i,a,b,c,d,X[ 9], 6,t[57])
        d=GroupCalendarMD5_z(GroupCalendarMD5_i,d,a,b,c,X[16],10,t[58])
        c=GroupCalendarMD5_z(GroupCalendarMD5_i,c,d,a,b,X[ 7],15,t[59])
        b=GroupCalendarMD5_z(GroupCalendarMD5_i,b,c,d,a,X[14],21,t[60])
        a=GroupCalendarMD5_z(GroupCalendarMD5_i,a,b,c,d,X[ 5], 6,t[61])
        d=GroupCalendarMD5_z(GroupCalendarMD5_i,d,a,b,c,X[12],10,t[62])
        c=GroupCalendarMD5_z(GroupCalendarMD5_i,c,d,a,b,X[ 3],15,t[63])
        b=GroupCalendarMD5_z(GroupCalendarMD5_i,b,c,d,a,X[10],21,t[64])

        return A+a,B+b,C+c,D+d
end

function GroupCalendarMD5_Calc(s)
        local msgLen=strlen(s)
        local padLen=56-bit.mod(msgLen,64)

        if bit.mod(msgLen,64)>56 then padLen=padLen+64 end

        if padLen==0 then padLen=64 end

        s = s..strchar(128)..strrep(strchar(0),padLen-1)
        s = s..GroupCalendar_LEToString(8*msgLen)..GroupCalendar_LEToString(0)
        
        local a, b, c, d = gGroupCalendarMD5.Consts[65], gGroupCalendarMD5.Consts[66], gGroupCalendarMD5.Consts[67], gGroupCalendarMD5.Consts[68];
 
        for i = 1, strlen(s), 64 do
                local X = GroupCalendar_SliceStringToLEs(strsub(s, i, i + 63));
                a, b, c, d = GroupCalendarMD5_Transform(a, b, c, d, X);
        end
        
        local swap = function (w) return GroupCalendar_StringToBE4(GroupCalendar_LEToString(w)) end
        
        return format("%08x%08x%08x%08x", swap(a), swap(b), swap(c), swap(d));
end

-- convert little-endian 32-bit int to a 4-char string

function GroupCalendar_LEToString(i)
        i = math.floor(i);
        
        local f = function (s) return strchar(bit.band(bit.rshift(i,s),255)) end
        
        return f(0)..f(8)..f(16)..f(24)
end

-- convert raw string to big-endian int

function GroupCalendar_StringToBE4(str)
        return 256 * (256 * (256 * strbyte(str, 1) + strbyte(str, 2)) + strbyte(str, 3)) + strbyte(str, 4);
end

-- cut up a string in little-endian ints of given size

function GroupCalendar_SliceStringToLEs(s)
        local r = {};
        local o = 1;
        
        for i = 1, 16 do
                local   str = strsub(s, o, o + 3);
                r[i] = 256 * (256 * (256 * strbyte(str, 4) + strbyte(str, 3)) + strbyte(str, 2)) + strbyte(str, 1);
                o = o + 4;
        end
        
        return r;
end

function GroupCalendarMD5_Verify()
        s0 = 'message digest'
        s1 = 'abcdefghijklmnopqrstuvwxyz'
        s2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
        s3 = '12345678901234567890123456789012345678901234567890123456789012345678901234567890'
        
        if GroupCalendarMD5_Calc('') ~= 'd41d8cd98f00b204e9800998ecf8427e' then
                Calendar_ErrorMessage("GroupCalendarMD5: Test 1 failed");
                return;
        end
        
        if GroupCalendarMD5_Calc('a') ~= '0cc175b9c0f1b6a831c399e269772661' then
                Calendar_ErrorMessage("GroupCalendarMD5: Test 2 failed");
                return;
        end
        
        if GroupCalendarMD5_Calc('abc') ~= '900150983cd24fb0d6963f7d28e17f72' then
                Calendar_ErrorMessage("GroupCalendarMD5: Test 3 failed");
                return;
        end
        
        if GroupCalendarMD5_Calc(s0) ~= 'f96b697d7cb7938d525a2f31aaf161d0' then
                Calendar_ErrorMessage("GroupCalendarMD5: Test 4 failed");
                return;
        end
        
        if GroupCalendarMD5_Calc(s1) ~= 'c3fcd3d76192e4007dfb496cca67e13b' then
                Calendar_ErrorMessage("GroupCalendarMD5: Test 5 failed");
                return;
        end
        
        if GroupCalendarMD5_Calc(s2) ~= 'd174ab98d277d9f5a5611c2c9f419d9f' then
                Calendar_ErrorMessage("GroupCalendarMD5: Test 6 failed");
                return;
        end
        
        if GroupCalendarMD5_Calc(s3) ~= '57edf4a22be3c955ac49da2e2107b67a' then
                Calendar_ErrorMessage("GroupCalendarMD5: Test 7 failed");
                return;
        end
        
        Calendar_DebugMessage("GroupCalendarMD5: All tests passed");
end

function GroupCalendarMD5_CheckPerformance()
        if 1 then 
                sizes={10,50,100,500,1000,5000,10000}
                
                for i=1,getn(sizes) do
                        local s=strrep(' ',sizes[i])
                        debugprofilestart();
                        
                        for j=1,10 do
                                GroupCalendarMD5_Calc(s)
                        end
                        
                        local elapsed = math.floor(debugprofilestop() / 10);
                        
                        Calendar_DebugMessage(format('%6d bytes: %4d ms', sizes[i], elapsed))
                end
        end
end