RosettaCodeData/Task/MD4/EasyLang/md4.easy
2026-04-30 12:34:36 -04:00

128 lines
3.4 KiB
Text

func u32 x .
return bitand x 0xFFFFFFFF
.
func rol x s .
left = u32 bitshift x s
right = bitshift u32 x -(32 - s)
return bitor left right
.
func F x y z .
return bitor (bitand x y) (bitand bitnot x z)
.
func G x y z .
return bitor (bitor (bitand x y) (bitand x z)) (bitand y z)
.
func H x y z .
return bitxor (bitxor x y) z
.
func le32 b0 b1 b2 b3 .
return b0 + 256 * b1 + 65536 * b2 + 65536 * 256 * b3
.
func$ word2hex w .
for k = 0 to 3
h = w mod 256
for c in [ h div 16 h mod 16 ]
c += 48
if c >= 58 : c += 39
hex$ &= strchar c
.
w = w div 256
.
return hex$
.
func[] str2bytes s$ .
for ch$ in strchars s$ : out[] &= strcode ch$
return out[]
.
proc md4pad &data[] .
len8 = len data[] * 8
data[] &= 0x80
while len data[] mod 64 <> 56 : data[] &= 0x00
for i = 1 to 8
data[] &= len8 mod 256
len8 = len8 div 256
.
.
proc md4block &A &B &C &D blk[] .
for i = 0 to 15
b0 = blk[i * 4 + 1]
b1 = blk[i * 4 + 2]
b2 = blk[i * 4 + 3]
b3 = blk[i * 4 + 4]
x[] &= le32 b0 b1 b2 b3
.
a = A ; b = B ; c = C ; d = D
#
a = rol (a + F b c d + x[1]) 3
d = rol (d + F a b c + x[2]) 7
c = rol (c + F d a b + x[3]) 11
b = rol (b + F c d a + x[4]) 19
a = rol (a + F b c d + x[5]) 3
d = rol (d + F a b c + x[6]) 7
c = rol (c + F d a b + x[7]) 11
b = rol (b + F c d a + x[8]) 19
a = rol (a + F b c d + x[9]) 3
d = rol (d + F a b c + x[10]) 7
c = rol (c + F d a b + x[11]) 11
b = rol (b + F c d a + x[12]) 19
a = rol (a + F b c d + x[13]) 3
d = rol (d + F a b c + x[14]) 7
c = rol (c + F d a b + x[15]) 11
b = rol (b + F c d a + x[16]) 19
#
K2 = 0x5A827999
a = rol (a + G b c d + x[1] + K2) 3
d = rol (d + G a b c + x[5] + K2) 5
c = rol (c + G d a b + x[9] + K2) 9
b = rol (b + G c d a + x[13] + K2) 13
a = rol (a + G b c d + x[2] + K2) 3
d = rol (d + G a b c + x[6] + K2) 5
c = rol (c + G d a b + x[10] + K2) 9
b = rol (b + G c d a + x[14] + K2) 13
a = rol (a + G b c d + x[3] + K2) 3
d = rol (d + G a b c + x[7] + K2) 5
c = rol (c + G d a b + x[11] + K2) 9
b = rol (b + G c d a + x[15] + K2) 13
a = rol (a + G b c d + x[4] + K2) 3
d = rol (d + G a b c + x[8] + K2) 5
c = rol (c + G d a b + x[12] + K2) 9
b = rol (b + G c d a + x[16] + K2) 13
#
K3 = 0x6ED9EBA1
a = rol (a + H b c d + x[1] + K3) 3
d = rol (d + H a b c + x[9] + K3) 9
c = rol (c + H d a b + x[5] + K3) 11
b = rol (b + H c d a + x[13] + K3) 15
a = rol (a + H b c d + x[3] + K3) 3
d = rol (d + H a b c + x[11] + K3) 9
c = rol (c + H d a b + x[7] + K3) 11
b = rol (b + H c d a + x[15] + K3) 15
a = rol (a + H b c d + x[2] + K3) 3
d = rol (d + H a b c + x[10] + K3) 9
c = rol (c + H d a b + x[6] + K3) 11
b = rol (b + H c d a + x[14] + K3) 15
a = rol (a + H b c d + x[4] + K3) 3
d = rol (d + H a b c + x[12] + K3) 9
c = rol (c + H d a b + x[8] + K3) 11
b = rol (b + H c d a + x[16] + K3) 15
A = u32 (A + a)
B = u32 (B + b)
C = u32 (C + c)
D = u32 (D + d)
.
func$ md4 s$ .
A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476
data[] = str2bytes s$
md4pad data[]
for b = 0 to len data[] / 64 - 1
blk[] = [ ]
for i = 1 to 64 : blk[] &= data[b * 64 + i]
md4block A B C D blk[]
.
digest$ = word2hex A & word2hex B & word2hex C & word2hex D
return digest$
.
print md4 "Rosetta Code"