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: |
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 &:= |
message &:= bytes(8 * length, UNSIGNED, LE, 8); |
||
# Process the message in successive 512-bit chunks: |
# Process the message in successive 512-bit chunks: |
||
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[ |
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 |
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 |
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 |
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 |
end while; |
||
# Produce the final hash value: |
# Produce the final hash value: |
||
digest := |
digest := bytes(a0 mod 16#100000000, UNSIGNED, LE, 4) & |
||
bytes(b0 mod 16#100000000, UNSIGNED, LE, 4) & |
|||
bytes(c0 mod 16#100000000, UNSIGNED, LE, 4) & |
|||
bytes(d0 mod 16#100000000, UNSIGNED, LE, 4); |
|||
end func; |
end func; |
||