'MD5: Option Public Use "CoreHashLibrary" '********************************************************* '* Copyright (c) 2008 Tom O'Neil '* See disclaimer/Copyright information in CoreHashLibrary.lss '* '* This library has two classes: MD5(text) and HMAC_MD5(key,text) '* depending on the hash you wish to create. '* '* Each class has toHex,toStr, and toB64 public functions for output '* '********************************************************* Class MD5 As HashHelper Private text As String Sub New(text1 As String) text = text1 End Sub Private Function Hash (m,len1 As Long) As Variant Dim h0 As Long, h1 As Long, h2 As Long, h3 As Long, h4 As Long Dim a As Long, b As Long, c As Long, d As Long, e As Long Dim temp As Long Dim l As Integer, n As Integer,y As Integer Dim length As Integer Dim block As Integer, t As Long ' Padding m If (Ubound(m) < 31) Then Redim x(31 - Ubound(m) - 1) m = Arrayappend(m,x) End If m(RShift(len1,5)) = m(RShift(len1,5)) Or LShift(&h80,( len1 Mod 32)) m(LShift(RShift(len1 + 64,9),4) + 14) = len1 h0 = &H67452301 '** 1732584193 in decimal h1 = &HEFCDAB89 '** -271733879 in decimal h2 = &H98BADCFE '** -1732584194 in decimal h3 = &H10325476 '** 271733878 in decimal length = 0 For y = 0 To Ubound(m) If m(y) > 0 Then length = y End If Next For block = 0 To length Step 16 a = h0 b = h1 c = h2 d = h3 a = md5_ff(a, b, c, d, Clng(m(block+ 0)), 7 , -680876936) d = md5_ff(d, a, b, c, Clng(m(block+ 1)), 12, -389564586) c = md5_ff(c, d, a, b, Clng(m(block+ 2)), 17, 606105819) b = md5_ff(b, c, d, a, Clng(m(block+ 3)), 22, -1044525330) a = md5_ff(a, b, c, d, Clng(m(block+ 4)), 7 , -176418897) d = md5_ff(d, a, b, c, Clng(m(block+ 5)), 12, 1200080426) c = md5_ff(c, d, a, b, Clng(m(block+ 6)), 17, -1473231341) b = md5_ff(b, c, d, a, Clng(m(block+ 7)), 22, -45705983) a = md5_ff(a, b, c, d, Clng(m(block+ 8)), 7 , 1770035416) d = md5_ff(d, a, b, c, Clng(m(block+ 9)), 12, -1958414417) c = md5_ff(c, d, a, b, Clng(m(block+10)), 17, -42063) b = md5_ff(b, c, d, a, Clng(m(block+11)), 22, -1990404162) a = md5_ff(a, b, c, d, Clng(m(block+12)), 7 , 1804603682) d = md5_ff(d, a, b, c, Clng(m(block+13)), 12, -40341101) c = md5_ff(c, d, a, b, Clng(m(block+14)), 17, -1502002290) b = md5_ff(b, c, d, a, Clng(m(block+15)), 22, 1236535329) a = md5_gg(a, b, c, d, Clng(m(block+ 1)), 5 , -165796510) d = md5_gg(d, a, b, c, Clng(m(block+ 6)), 9 , -1069501632) c = md5_gg(c, d, a, b, Clng(m(block+11)), 14, 643717713) b = md5_gg(b, c, d, a, Clng(m(block+ 0)), 20, -373897302) a = md5_gg(a, b, c, d, Clng(m(block+ 5)), 5 , -701558691) d = md5_gg(d, a, b, c, Clng(m(block+10)), 9 , 38016083) c = md5_gg(c, d, a, b, Clng(m(block+15)), 14, -660478335) b = md5_gg(b, c, d, a, Clng(m(block+ 4)), 20, -405537848) a = md5_gg(a, b, c, d, Clng(m(block+ 9)), 5 , 568446438) d = md5_gg(d, a, b, c, Clng(m(block+14)), 9 , -1019803690) c = md5_gg(c, d, a, b, Clng(m(block+ 3)), 14, -187363961) b = md5_gg(b, c, d, a, Clng(m(block+ 8)), 20, 1163531501) a = md5_gg(a, b, c, d, Clng(m(block+13)), 5 , -1444681467) d = md5_gg(d, a, b, c, Clng(m(block+ 2)), 9 , -51403784) c = md5_gg(c, d, a, b, Clng(m(block+ 7)), 14, 1735328473) b = md5_gg(b, c, d, a, Clng(m(block+12)), 20, -1926607734) a = md5_hh(a, b, c, d, Clng(m(block+ 5)), 4 , -378558) d = md5_hh(d, a, b, c, Clng(m(block+ 8)), 11, -2022574463) c = md5_hh(c, d, a, b, Clng(m(block+11)), 16, 1839030562) b = md5_hh(b, c, d, a, Clng(m(block+14)), 23, -35309556) a = md5_hh(a, b, c, d, Clng(m(block+ 1)), 4 , -1530992060) d = md5_hh(d, a, b, c, Clng(m(block+ 4)), 11, 1272893353) c = md5_hh(c, d, a, b, Clng(m(block+ 7)), 16, -155497632) b = md5_hh(b, c, d, a, Clng(m(block+10)), 23, -1094730640) a = md5_hh(a, b, c, d, Clng(m(block+13)), 4 , 681279174) d = md5_hh(d, a, b, c, Clng(m(block+ 0)), 11, -358537222) c = md5_hh(c, d, a, b, Clng(m(block+ 3)), 16, -722521979) b = md5_hh(b, c, d, a, Clng(m(block+ 6)), 23, 76029189) a = md5_hh(a, b, c, d, Clng(m(block+ 9)), 4 , -640364487) d = md5_hh(d, a, b, c, Clng(m(block+12)), 11, -421815835) c = md5_hh(c, d, a, b, Clng(m(block+15)), 16, 530742520) b = md5_hh(b, c, d, a, Clng(m(block+ 2)), 23, -995338651) a = md5_ii(a, b, c, d, Clng(m(block+ 0)), 6 , -198630844) d = md5_ii(d, a, b, c, Clng(m(block+ 7)), 10, 1126891415) c = md5_ii(c, d, a, b, Clng(m(block+14)), 15, -1416354905) b = md5_ii(b, c, d, a, Clng(m(block+ 5)), 21, -57434055) a = md5_ii(a, b, c, d, Clng(m(block+12)), 6 , 1700485571) d = md5_ii(d, a, b, c, Clng(m(block+ 3)), 10, -1894986606) c = md5_ii(c, d, a, b, Clng(m(block+10)), 15, -1051523) b = md5_ii(b, c, d, a, Clng(m(block+ 1)), 21, -2054922799) a = md5_ii(a, b, c, d, Clng(m(block+ 8)), 6 , 1873313359) d = md5_ii(d, a, b, c, Clng(m(block+15)), 10, -30611744) c = md5_ii(c, d, a, b, Clng(m(block+ 6)), 15, -1560198380) b = md5_ii(b, c, d, a, Clng(m(block+13)), 21, 1309151649) a = md5_ii(a, b, c, d, Clng(m(block+ 4)), 6 , -145523070) d = md5_ii(d, a, b, c, Clng(m(block+11)), 10, -1120210379) c = md5_ii(c, d, a, b, Clng(m(block+ 2)), 15, 718787259) b = md5_ii(b, c, d, a, Clng(m(block+ 9)), 21, -343485551) h0 = add32(h0, a) h1 = add32(h1, b) h2 = add32(h2, c) h3 = add32(h3, d) Next Dim returnArray(3) returnArray(0) = h0 returnArray(1) = h1 returnArray(2) = h2 returnArray(3) = h3 Hash = returnArray End Function Private Function md5_cmn(q As Long, a As Long, b As Long, x As Long, s As Integer , t As Long) As Long md5_cmn = add32(rol(add32(add32(a, q), add32(x, t)), s),b) End Function Private Function md5_ff (a As Long, b As Long, c As Long, d As Long, x As Long, s As Integer, t As Long) As Long md5_ff = md5_cmn((b And c) Or (( Not b) And d), a, b, x, s, t) End Function Private Function md5_gg(a As Long, b As Long, c As Long, d As Long, x As Long, s As Integer, t As Long) As Long md5_gg = md5_cmn((b And d) Or (c And ( Not d)), a, b, x, s, t) End Function Private Function md5_hh(a As Long, b As Long, c As Long, d As Long, x As Long, s As Integer, t As Long) As Long md5_hh = md5_cmn((b Xor c Xor d), a, b, x, s, t) End Function Private Function md5_ii(a As Long, b As Long, c As Long, d As Long, x As Long, s As Integer, t As Long) As Long md5_ii = md5_cmn(c Xor (b Or ( Not d)), a, b, x, s, t) End Function Function toB64() As String toB64 = binl2b64(Hash(pad_l(text),Len(text)*chrsz)) End Function Function toHEX() As String toHEX = binl2hex(Hash(pad_l(text),Len(text)*chrsz)) End Function Function toSTR() As String toSTR = binl2str(Hash(pad_l(text),Len(text)*chrsz)) End Function End Class Class HMAC_MD5 As MD5 Private key As String Sub New(key1 As String,text1 As String) , MD5(text1) key = key1 End Sub Private Function core_HMAC() As Variant Dim x As Integer Dim y As Integer Dim returnval As Variant Dim firstHash As Variant Dim bkey As Variant bkey = pad_l(key) If (Ubound(bkey) > 15) Then bkey = hash(bkey,Len(key) * chrsz) End If Dim ipad(15) Dim opad(15) For y=0 To 15 ipad(y) = &h36363636 opad(y) = &h5C5C5C5C Next For x = 0 To 15 ipad(x) = ipad(x) Xor bkey(x) opad(x) = opad(x) Xor bkey(x) Next firstHash = Hash(Arrayappend(ipad,pad_l(text)),512 + Len(text) * chrsz) returnval = Hash(Arrayappend(opad,firstHash), 512 + 128) core_HMAC = returnval End Function Function toB64() As String toB64 = binl2b64(core_HMAC()) End Function Function toHEX() As String toHEX = binl2hex(core_HMAC()) End Function Function toSTR() As String toSTR = binl2str(core_HMAC()) End Function End Class