Private Function LShIft(lValue, iShIftBits)
If iShIftBits = 0 Then
LShIft = lValue
Exit Function
ElseIf iShIftBits = 31 Then
If lValue And 1 Then
LShIft = &H80000000
Else
LShIft = 0
End If
Exit Function
ElseIf iShIftBits < 0 Or iShIftBits > 31 Then
Err.Raise 6
End If
If (lValue And m_l2Power(31 - iShIftBits)) Then
LShIft = ((lValue And m_lOnBits(31 - (iShIftBits + 1))) * m_l2Power(iShIftBits)) Or &H80000000
Else
LShIft = ((lValue And m_lOnBits(31 - iShIftBits)) * m_l2Power(iShIftBits))
End If
End Function
Private Function RShIft(lValue, iShIftBits)
If iShIftBits = 0 Then
RShIft = lValue
Exit Function
ElseIf iShIftBits = 31 Then
If lValue And &H80000000 Then
RShIft = 1
Else
RShIft = 0
End If
Exit Function
ElseIf iShIftBits < 0 Or iShIftBits > 31 Then
Err.Raise 6
End If
RShIft = (lValue And &H7FFFFFFE) \ m_l2Power(iShIftBits)
If (lValue And &H80000000) Then
RShIft = (RShIft Or (&H40000000 \ m_l2Power(iShIftBits - 1)))
End If
End Function
Private Function RotateLeft(lValue, iShIftBits)
RotateLeft = LShIft(lValue, iShIftBits) Or RShIft(lValue, (32 - iShIftBits))
End Function
Private Function AddUnsigned(lX, lY)
Dim lX4
Dim lY4
Dim lX8
Dim lY8
Dim lResult
lX8 = lX And &H80000000
lY8 = lY And &H80000000
lX4 = lX And &H40000000
lY4 = lY And &H40000000
lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF)
If lX4 And lY4 Then
lResult = lResult Xor &H80000000 Xor lX8 Xor lY8
ElseIf lX4 Or lY4 Then
If lResult And &H40000000 Then
lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8
Else
lResult = lResult Xor &H40000000 Xor lX8 Xor lY8
End If
Else
lResult = lResult Xor lX8 Xor lY8
End If
AddUnsigned = lResult
End Function
Private Function md5_F(x, y, z)
md5_F = (x And y) Or ((Not x) And z)
End Function
Private Function md5_G(x, y, z)
md5_G = (x And z) Or (y And (Not z))
End Function
Private Function md5_H(x, y, z)
md5_H = (x Xor y Xor z)
End Function
Private Function md5_I(x, y, z)
md5_I = (y Xor (x Or (Not z)))
End Function
Private Sub md5_FF(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub md5_GG(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub md5_HH(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub md5_II(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Function ConvertToWordArray(sMessage)
Dim lMessageLength
Dim lNumberOfWords
Dim lWordArray()
Dim lBytePosition
Dim lByteCount
Dim lWordCount
Private Function WordToHex(lValue)
Dim lByte
Dim lCount
For lCount = 0 To 3
lByte = RShIft(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1)
WordToHex = WordToHex & Right("0" & Hex(lByte), 2)
Next
End Function