public sub md5init()
bytecounter = 0
state(1) = unsignedtolong(1732584193#)
state(2) = unsignedtolong(4023233417#)
state(3) = unsignedtolong(2562383102#)
state(4) = unsignedtolong(271733878#)
end sub
'
' md5 final
'
public sub md5final()
dim dblbits as double
dim padding(72) as byte
dim lngbytesbuffered as long
padding(0) = &h80
dblbits = bytecounter * 8
' pad out
lngbytesbuffered = bytecounter mod 64
if lngbytesbuffered <= 56 then
md5update 56 - lngbytesbuffered, padding
else
md5update 120 - bytecounter, padding
end if
padding(0) = unsignedtolong(dblbits) and &hff&
padding(1) = unsignedtolong(dblbits) \ 256 and &hff&
padding(2) = unsignedtolong(dblbits) \ 65536 and &hff&
padding(3) = unsignedtolong(dblbits) \ 16777216 and &hff&
padding(4) = 0
padding(5) = 0
padding(6) = 0
padding(7) = 0
md5update 8, padding
end sub
'
' break up input stream into 64 byte chunks
'
public sub md5update(inputlen as long, inputbuffer() as byte)
dim ii as integer
dim i as integer
dim j as integer
dim k as integer
dim lngbufferedbytes as long
dim lngbufferremaining as long
dim lngrem as long
lngbufferedbytes = bytecounter mod 64
lngbufferremaining = 64 - lngbufferedbytes
bytecounter = bytecounter + inputlen
' use up old buffer results first
if inputlen >= lngbufferremaining then
for ii = 0 to lngbufferremaining - 1
bytebuffer(lngbufferedbytes + ii) = inputbuffer(ii)
next ii
md5transform bytebuffer
lngrem = (inputlen) mod 64
' the transfer is a multiple of 64 lets do some transformations
for i = lngbufferremaining to inputlen - ii - lngrem step 64
for j = 0 to 63
bytebuffer(j) = inputbuffer(i + j)
next j
md5transform bytebuffer
next i
lngbufferedbytes = 0
else
i = 0
end if
' buffer any remaining input
for k = 0 to inputlen - i - 1
bytebuffer(lngbufferedbytes + k) = inputbuffer(i + k)
next k
end sub
'
' md5 transform
'
private sub md5transform(buffer() as byte)
dim x(16) as long
dim a as long
dim b as long
dim c as long
dim d as long
a = state(1)
b = state(2)
c = state(3)
d = state(4)
decode 64, x, buffer
' round 1
ff a, b, c, d, x(0), s11, -680876936
ff d, a, b, c, x(1), s12, -389564586
ff c, d, a, b, x(2), s13, 606105819
ff b, c, d, a, x(3), s14, -1044525330
ff a, b, c, d, x(4), s11, -176418897
ff d, a, b, c, x(5), s12, 1200080426
ff c, d, a, b, x(6), s13, -1473231341
ff b, c, d, a, x(7), s14, -45705983