MD5/Implementation: Difference between revisions

Content added Content deleted
(→‎{{header|Scala}}: delete the incorrect version, add a port of Java code in Scala.)
(Replace deprecated functions)
Line 5,683: Line 5,683:
const array integer: k is createMd5Table;
const array integer: k is createMd5Table;
var integer: length is 0;
var integer: length is 0;
var integer: chunkIndex is 0;
var integer: wordIndex is 1;
var integer: index is 0;
var integer: index is 0;
var array bin32: m is 16 times bin32.value;
var array bin32: m is 16 times bin32.value;
Line 5,704: Line 5,704:
message &:= "\0;" mult 63 - (length + 8) mod 64;
message &:= "\0;" mult 63 - (length + 8) mod 64;
# Append length of message (before pre-processing), in bits, as 64-bit little-endian integer.
# Append length of message (before pre-processing), in bits, as 64-bit little-endian integer.
message &:= int64AsEightBytesLe(8 * length);
message &:= bytes(8 * length, UNSIGNED, LE, 8);


# Process the message in successive 512-bit chunks:
# Process the message in successive 512-bit chunks:
for chunkIndex range 1 to length(message) step 64 do
while wordIndex <= length(message) do
# Break chunk into sixteen 32-bit little-endian words.
# Break chunk into sixteen 32-bit little-endian words.
for index range 1 to 16 do
for index range 1 to 16 do
m[index] := bin32(bytes2Int(message[chunkIndex + 4 * pred(index) len 4], UNSIGNED, LE));
m[index] := bin32(bytes2Int(message[wordIndex fixLen 4], UNSIGNED, LE));
wordIndex +:= 4;
end for;
end for;


Line 5,724: Line 5,725:
elsif index <= 32 then
elsif index <= 32 then
f := c >< (d & (b >< c));
f := c >< (d & (b >< c));
g := (5 * index - 4) mod 16 + 1;
g := succ((5 * index - 4) mod 16);
elsif index <= 48 then
elsif index <= 48 then
f := b >< c >< d;
f := b >< c >< d;
g := (3 * index + 2) mod 16 + 1;
g := succ((3 * index + 2) mod 16);
else
else
f := c >< (b | (bin32(16#ffffffff) >< d));
f := c >< (b | (bin32(16#ffffffff) >< d));
g := (7 * pred(index)) mod 16 + 1;
g := succ((7 * pred(index)) mod 16);
end if;
end if;


Line 5,747: Line 5,748:
c0 +:= ord(c);
c0 +:= ord(c);
d0 +:= ord(d);
d0 +:= ord(d);
end for;
end while;


# Produce the final hash value:
# Produce the final hash value:
digest := int32AsFourBytesLe(a0) &
digest := bytes(a0 mod 16#100000000, UNSIGNED, LE, 4) &
int32AsFourBytesLe(b0) &
bytes(b0 mod 16#100000000, UNSIGNED, LE, 4) &
int32AsFourBytesLe(c0) &
bytes(c0 mod 16#100000000, UNSIGNED, LE, 4) &
int32AsFourBytesLe(d0);
bytes(d0 mod 16#100000000, UNSIGNED, LE, 4);
end func;
end func;