--Message
--Digester
--MD4
--( public:
--( <#string> CoMD4Digest (<#string>)
--(
--( abstract:
--( Fast lingo implementation of the MD4 algorithm.
--( Implementation by Joni Huhmarniemi (21/2/2004).
--( © 1991-2, RSA Data Security, Inc.
--( public )-- -- -- -- -- -- -- -- -- -- -- -- --//
--( Returns the hex representation of string's MD4.
--( i:<#string>
--( o: -
--( r:<#string>
on CoMD4Digest(a_sInput)
-- Convert string to list of little-endian words...
t_iLen = length(a_sInput) * 8
t_iCnt = (t_iLen + 64) / 512 * 16 + 16
-- Create list, fill with zeros...
x = []
x.SetAt(t_iCnt, 0)
t_fArr = [1, 256, 65536, 16777216]
i = 0
j = 0
repeat while i < t_iLen
j = j + 1
t_iNext = i / 32 + 1
t_iTemp = bitAnd(charToNum(char (i / 8 + 1) of a_sInput), 255) * t_fArr[j]
x[t_iNext] = bitOr(x[t_iNext], t_iTemp)
i = i + 8
j = j mod 4
end repeat
-- Append padding...
t_iNext = t_iLen / 32 + 1
x[t_iNext] = bitOr(x[t_iNext], 128 * t_fArr[j + 1])
x[(t_iLen + 64) / 512 * 16 + 15] = t_iLen
-- Actual algorithm starts here...
a = 1732584193
b = -271733879
c = -1732584194
d = 271733878
i = 1
t_iWrap = the maxInteger + 1
t_iCount = x.count + 1
repeat while i < t_iCount
olda = a
oldb = b
oldc = c
oldd = d
-- Round(1) --
n = bitOr(bitAnd(b, c), bitAnd(bitNot(b), d)) + a + x[i]
if(n < 0) then
a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
else
a = bitOr(n * 8, n / 536870912)
end if
n = bitOr(bitAnd(a, b), bitAnd(bitNot(a), c)) + d + x[i + 1]
if(n < 0) then
d = bitOr(n * 128, bitOr((n + t_iWrap) / 33554432, 64))
else
d = bitOr(n * 128, n / 33554432)
end if
n = bitOr(bitAnd(d, a), bitAnd(bitNot(d), b)) + c + x[i + 2]
if(n < 0) then
c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
else
c = bitOr(n * 2048, n / 2097152)
end if
n = bitOr(bitAnd(c, d), bitAnd(bitNot(c), a)) + b + x[i + 3]
if(n < 0) then
b = bitOr(n * 524288, bitOr((n + t_iWrap) / 8192, 262144))
else
b = bitOr(n * 524288, n / 8192)
end if
n = bitOr(bitAnd(b, c), bitAnd(bitNot(b), d)) + a + x[i + 4]
if(n < 0) then
a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
else
a = bitOr(n * 8, n / 536870912)
end if
n = bitOr(bitAnd(a, b), bitAnd(bitNot(a), c)) + d + x[i + 5]
if(n < 0) then
d = bitOr(n * 128, bitOr((n + t_iWrap) / 33554432, 64))
else
d = bitOr(n * 128, n / 33554432)
end if
n = bitOr(bitAnd(d, a), bitAnd(bitNot(d), b)) + c + x[i + 6]
if(n < 0) then
c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
else
c = bitOr(n * 2048, n / 2097152)
end if
n = bitOr(bitAnd(c, d), bitAnd(bitNot(c), a)) + b + x[i + 7]
if(n < 0) then
b = bitOr(n * 524288, bitOr((n + t_iWrap) / 8192, 262144))
else
b = bitOr(n * 524288, n / 8192)
end if
n = bitOr(bitAnd(b, c), bitAnd(bitNot(b), d)) + a + x[i + 8]
if(n < 0) then
a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
else
a = bitOr(n * 8, n / 536870912)
end if
n = bitOr(bitAnd(a, b), bitAnd(bitNot(a), c)) + d + x[i + 9]
if(n < 0) then
d = bitOr(n * 128, bitOr((n + t_iWrap) / 33554432, 64))
else
d = bitOr(n * 128, n / 33554432)
end if
n = bitOr(bitAnd(d, a), bitAnd(bitNot(d), b)) + c + x[i + 10]
if(n < 0) then
c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
else
c = bitOr(n * 2048, n / 2097152)
end if
n = bitOr(bitAnd(c, d), bitAnd(bitNot(c), a)) + b + x[i + 11]
if(n < 0) then
b = bitOr(n * 524288, bitOr((n + t_iWrap) / 8192, 262144))
else
b = bitOr(n * 524288, n / 8192)
end if
n = bitOr(bitAnd(b, c), bitAnd(bitNot(b), d)) + a + x[i + 12]
if(n < 0) then
a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
else
a = bitOr(n * 8, n / 536870912)
end if
n = bitOr(bitAnd(a, b), bitAnd(bitNot(a), c)) + d + x[i + 13]
if(n < 0) then
d = bitOr(n * 128, bitOr((n + t_iWrap) / 33554432, 64))
else
d = bitOr(n * 128, n / 33554432)
end if
n = bitOr(bitAnd(d, a), bitAnd(bitNot(d), b)) + c + x[i + 14]
if(n < 0) then
c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
else
c = bitOr(n * 2048, n / 2097152)
end if
n = bitOr(bitAnd(c, d), bitAnd(bitNot(c), a)) + b + x[i + 15]
if(n < 0) then
b = bitOr(n * 524288, bitOr((n + t_iWrap) / 8192, 262144))
else
b = bitOr(n * 524288, n / 8192)
end if
-- Round(2) --
n = bitOr(bitOr(bitAnd(b, c), bitAnd(b, d)), bitAnd(c, d)) + a + x[i] + 1518500249
if(n < 0) then
a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
else
a = bitOr(n * 8, n / 536870912)
end if
n = bitOr(bitOr(bitAnd(a, b), bitAnd(a, c)), bitAnd(b, c)) + d + x[i + 4] + 1518500249
if(n < 0) then
d = bitOr(n * 32, bitOr((n + t_iWrap) / 134217728, 16))
else
d = bitOr(n * 32, n / 134217728)
end if
n = bitOr(bitOr(bitAnd(d, a), bitAnd(d, b)), bitAnd(a, b)) + c + x[i + 8] + 1518500249
if(n < 0) then
c = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
else
c = bitOr(n * 512, n / 8388608)
end if
n = bitOr(bitOr(bitAnd(c, d), bitAnd(c, a)), bitAnd(d, a)) + b + x[i + 12] + 1518500249
if(n < 0) then
b = bitOr(n * 8192, bitOr((n + t_iWrap) / 524288, 4096))
else
b = bitOr(n * 8192, n / 524288)
end if
n = bitOr(bitOr(bitAnd(b, c), bitAnd(b, d)), bitAnd(c, d)) + a + x[i + 1] + 1518500249
if(n < 0) then
a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
else
a = bitOr(n * 8, n / 536870912)
end if
n = bitOr(bitOr(bitAnd(a, b), bitAnd(a, c)), bitAnd(b, c)) + d + x[i + 5] + 1518500249
if(n < 0) then
d = bitOr(n * 32, bitOr((n + t_iWrap) / 134217728, 16))
else
d = bitOr(n * 32, n / 134217728)
end if
n = bitOr(bitOr(bitAnd(d, a), bitAnd(d, b)), bitAnd(a, b)) + c + x[i + 9] + 1518500249
if(n < 0) then
c = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
else
c = bitOr(n * 512, n / 8388608)
end if
n = bitOr(bitOr(bitAnd(c, d), bitAnd(c, a)), bitAnd(d, a)) + b + x[i + 13] + 1518500249
if(n < 0) then
b = bitOr(n * 8192, bitOr((n + t_iWrap) / 524288, 4096))
else
b = bitOr(n * 8192, n / 524288)
end if
n = bitOr(bitOr(bitAnd(b, c), bitAnd(b, d)), bitAnd(c, d)) + a + x[i + 2] + 1518500249
if(n < 0) then
a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
else
a = bitOr(n * 8, n / 536870912)
end if
n = bitOr(bitOr(bitAnd(a, b), bitAnd(a, c)), bitAnd(b, c)) + d + x[i + 6] + 1518500249
if(n < 0) then
d = bitOr(n * 32, bitOr((n + t_iWrap) / 134217728, 16))
else
d = bitOr(n * 32, n / 134217728)
end if
n = bitOr(bitOr(bitAnd(d, a), bitAnd(d, b)), bitAnd(a, b)) + c + x[i + 10] + 1518500249
if(n < 0) then
c = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
else
c = bitOr(n * 512, n / 8388608)
end if
n = bitOr(bitOr(bitAnd(c, d), bitAnd(c, a)), bitAnd(d, a)) + b + x[i + 14] + 1518500249
if(n < 0) then
b = bitOr(n * 8192, bitOr((n + t_iWrap) / 524288, 4096))
else
b = bitOr(n * 8192, n / 524288)
end if
n = bitOr(bitOr(bitAnd(b, c), bitAnd(b, d)), bitAnd(c, d)) + a + x[i + 3] + 1518500249
if(n < 0) then
a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
else
a = bitOr(n * 8, n / 536870912)
end if
n = bitOr(bitOr(bitAnd(a, b), bitAnd(a, c)), bitAnd(b, c)) + d + x[i + 7] + 1518500249
if(n < 0) then
d = bitOr(n * 32, bitOr((n + t_iWrap) / 134217728, 16))
else
d = bitOr(n * 32, n / 134217728)
end if
n = bitOr(bitOr(bitAnd(d, a), bitAnd(d, b)), bitAnd(a, b)) + c + x[i + 11] + 1518500249
if(n < 0) then
c = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
else
c = bitOr(n * 512, n / 8388608)
end if
n = bitOr(bitOr(bitAnd(c, d), bitAnd(c, a)), bitAnd(d, a)) + b + x[i + 15] + 1518500249
if(n < 0) then
b = bitOr(n * 8192, bitOr((n + t_iWrap) / 524288, 4096))
else
b = bitOr(n * 8192, n / 524288)
end if
-- Round(3) --
n = bitXor(bitXor(b, c), d) + a + x[i] + 1859775393
if(n < 0) then
a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
else
a = bitOr(n * 8, n / 536870912)
end if
n = bitXor(bitXor(a, b), c) + d + x[i + 8] + 1859775393
if(n < 0) then
d = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
else
d = bitOr(n * 512, n / 8388608)
end if
n = bitXor(bitXor(d, a), b) + c + x[i + 4] + 1859775393
if(n < 0) then
c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
else
c = bitOr(n * 2048, n / 2097152)
end if
n = bitXor(bitXor(c, d), a) + b + x[i + 12] + 1859775393
if(n < 0) then
b = bitOr(n * 32768, bitOr((n + t_iWrap) / 131072, 16384))
else
b = bitOr(n * 32768, n / 131072)
end if
n = bitXor(bitXor(b, c), d) + a + x[i + 2] + 1859775393
if(n < 0) then
a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
else
a = bitOr(n * 8, n / 536870912)
end if
n = bitXor(bitXor(a, b), c) + d + x[i + 10] + 1859775393
if(n < 0) then
d = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
else
d = bitOr(n * 512, n / 8388608)
end if
n = bitXor(bitXor(d, a), b) + c + x[i + 6] + 1859775393
if(n < 0) then
c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
else
c = bitOr(n * 2048, n / 2097152)
end if
n = bitXor(bitXor(c, d), a) + b + x[i + 14] + 1859775393
if(n < 0) then
b = bitOr(n * 32768, bitOr((n + t_iWrap) / 131072, 16384))
else
b = bitOr(n * 32768, n / 131072)
end if
n = bitXor(bitXor(b, c), d) + a + x[i + 1] + 1859775393
if(n < 0) then
a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
else
a = bitOr(n * 8, n / 536870912)
end if
n = bitXor(bitXor(a, b), c) + d + x[i + 9] + 1859775393
if(n < 0) then
d = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
else
d = bitOr(n * 512, n / 8388608)
end if
n = bitXor(bitXor(d, a), b) + c + x[i + 5] + 1859775393
if(n < 0) then
c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
else
c = bitOr(n * 2048, n / 2097152)
end if
n = bitXor(bitXor(c, d), a) + b + x[i + 13] + 1859775393
if(n < 0) then
b = bitOr(n * 32768, bitOr((n + t_iWrap) / 131072, 16384))
else
b = bitOr(n * 32768, n / 131072)
end if
n = bitXor(bitXor(b, c), d) + a + x[i + 3] + 1859775393
if(n < 0) then
a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
else
a = bitOr(n * 8, n / 536870912)
end if
n = bitXor(bitXor(a, b), c) + d + x[i + 11] + 1859775393
if(n < 0) then
d = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
else
d = bitOr(n * 512, n / 8388608)
end if
n = bitXor(bitXor(d, a), b) + c + x[i + 7] + 1859775393
if(n < 0) then
c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
else
c = bitOr(n * 2048, n / 2097152)
end if
n = bitXor(bitXor(c, d), a) + b + x[i + 15] + 1859775393
if(n < 0) then
b = bitOr(n * 32768, bitOr((n + t_iWrap) / 131072, 16384))
else
b = bitOr(n * 32768, n / 131072)
end if
a = a + olda
b = b + oldb
c = c + oldc
d = d + oldd
i = i + 16
end repeat
-- Construct 32 byte 'little-endian' hex string...
t_sHex = "0123456789abcdef"
t_iArr = [a, b, c, d]
t_sOut = EMPTY
repeat with i in t_iArr
if(i > 0) then
repeat with n = 1 to 4
j = i mod 16
i = i / 16
k = i mod 16
i = i / 16
put char (k + 1) of t_sHex after t_sOut
put char (j + 1) of t_sHex after t_sOut
end repeat
else
i = bitNot(i)
repeat with n = 1 to 4
j = i mod 16
i = i / 16
k = i mod 16
i = i / 16
put char (16 - k) of t_sHex after t_sOut
put char (16 - j) of t_sHex after t_sOut
end repeat
end if
end repeat
return(t_sOut)
end
--( end )-- -- -- -- -- -- -- -- -- -- -- -- -- --//