digest.monkey2 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. Namespace std.digest
  2. 'Thanks to mx2 user Jesse for converting the original bmx code by bmx user Yan!
  3. Private
  4. Function Hex:String(val:UInt)
  5. Local hex:=("00000000"+stringio.ULongToString(val,16)).Right(8)
  6. Return hex
  7. End Function
  8. Function Rol:UInt(val:UInt, shift:Int)
  9. Return (val Shl shift) | (val Shr (32 - shift))
  10. End Function
  11. Function Ror:UInt(val:UInt, shift:Int)
  12. Return (val Shr shift) | (val Shl (32 - shift))
  13. End Function
  14. 'Todo: should this be an operator?
  15. Function UShr:UInt(val:UInt, shift:Int)
  16. Return val Shr shift
  17. End
  18. Function LEHex:String(val:UInt)
  19. Local out:String = Hex(val)
  20. Return out.Slice(6,8) + out.Slice(4,6) + out.Slice(2,4) + out.Slice(0,2)
  21. End Function
  22. Public
  23. Function MD5:String( in:String )
  24. Local h0:Int = $67452301, h1:Int = $EFCDAB89, h2:Int = $98BADCFE, h3:Int = $10325476
  25. Local r:Int[] = New Int[](
  26. 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
  27. 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
  28. 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
  29. 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21)
  30. Local k:Int[] = New Int[](
  31. $D76AA478, $E8C7B756, $242070DB, $C1BDCEEE, $F57C0FAF, $4787C62A,
  32. $A8304613, $FD469501, $698098D8, $8B44F7AF, $FFFF5BB1, $895CD7BE,
  33. $6B901122, $FD987193, $A679438E, $49B40821, $F61E2562, $C040B340,
  34. $265E5A51, $E9B6C7AA, $D62F105D, $02441453, $D8A1E681, $E7D3FBC8,
  35. $21E1CDE6, $C33707D6, $F4D50D87, $455A14ED, $A9E3E905, $FCEFA3F8,
  36. $676F02D9, $8D2A4C8A, $FFFA3942, $8771F681, $6D9D6122, $FDE5380C,
  37. $A4BEEA44, $4BDECFA9, $F6BB4B60, $BEBFBC70, $289B7EC6, $EAA127FA,
  38. $D4EF3085, $04881D05, $D9D4D039, $E6DB99E5, $1FA27CF8, $C4AC5665,
  39. $F4292244, $432AFF97, $AB9423A7, $FC93A039, $655B59C3, $8F0CCC92,
  40. $FFEFF47D, $85845DD1, $6FA87E4F, $FE2CE6E0, $A3014314, $4E0811A1,
  41. $F7537E82, $BD3AF235, $2AD7D2BB, $EB86D391)
  42. Local intCount:Int = (((in.Length + 8) Shr 6) + 1) Shl 4
  43. Local data:Int[] = New Int[intCount]
  44. For Local c:Int=0 Until in.Length
  45. data[c Shr 2] = data[c Shr 2] | ((in[c] & $FF) Shl ((c & 3) Shl 3))
  46. Next
  47. data[in.Length Shr 2] = data[in.Length Shr 2] | ($80 Shl ((in.Length & 3) Shl 3))
  48. data[data.Length - 2] = (Long(in.Length) * 8) & $FFFFFFFF
  49. data[data.Length - 1] = (Long(in.Length) * 8) Shr 32
  50. For Local chunkStart:Int=0 Until intCount Step 16
  51. Local a:Int = h0, b:Int = h1, c:Int = h2, d:Int = h3
  52. For Local i:Int=0 To 15
  53. Local f:Int = d ~ (b & (c ~ d))
  54. Local t:Int = d
  55. d = c ; c = b
  56. b = Rol((a + f + k[i] + data[chunkStart + i]), r[i]) + b
  57. a = t
  58. Next
  59. For Local i:Int=16 To 31
  60. Local f:Int = c ~ (d & (b ~ c))
  61. Local t:Int = d
  62. d = c ; c = b
  63. b = Rol((a + f + k[i] + data[chunkStart + (((5 * i) + 1) & 15)]), r[i]) + b
  64. a = t
  65. Next
  66. For Local i:Int=32 To 47
  67. Local f:Int = b ~ c ~ d
  68. Local t:Int = d
  69. d = c ; c = b
  70. b = Rol((a + f + k[i] + data[chunkStart + (((3 * i) + 5) & 15)]), r[i]) + b
  71. a = t
  72. Next
  73. For Local i:Int=48 To 63
  74. Local f:Int = c ~ (b | ~d)
  75. Local t:Int = d
  76. d = c ; c = b
  77. b = Rol((a + f + k[i] + data[chunkStart + ((7 * i) & 15)]), r[i]) + b
  78. a = t
  79. Next
  80. h0 += a
  81. h1 += b
  82. h2 += c
  83. h3 += d
  84. Next
  85. Return (LEHex(h0) + LEHex(h1) + LEHex(h2) + LEHex(h3)).ToLower()
  86. End
  87. Function SHA1:String( in:String )
  88. Local h0:Int = $67452301, h1:Int = $EFCDAB89, h2:Int = $98BADCFE, h3:Int = $10325476, h4:Int = $C3D2E1F0
  89. Local intCount:Int = (((in.Length + 8) Shr 6) + 1) Shl 4
  90. Local data:Int[] = New Int[intCount]
  91. For Local c:Int=0 Until in.Length
  92. data[c Shr 2] = (data[c Shr 2] Shl 8) | (in[c] & $FF)
  93. Next
  94. data[in.Length Shr 2] = ((data[in.Length Shr 2] Shl 8) | $80) Shl ((3 - (in.Length & 3)) Shl 3)
  95. data[data.Length - 2] = (Long(in.Length) * 8) Shr 32
  96. data[data.Length - 1] = (Long(in.Length) * 8) & $FFFFFFFF
  97. For Local chunkStart:Int=0 Until intCount Step 16
  98. Local a:Int = h0, b:Int = h1, c:Int = h2, d:Int = h3, e:Int = h4
  99. Local w := data.Slice(chunkStart,chunkStart+16).Resize(80)
  100. For Local i:Int=16 To 79
  101. w[i] = Rol(w[i - 3] ~ w[i - 8] ~ w[i - 14] ~ w[i - 16], 1)
  102. Next
  103. For Local i:Int=0 To 19
  104. Local t:Int = Rol(a, 5) + (d ~ (b & (c ~ d))) + e + $5A827999 + w[i]
  105. e = d ; d = c
  106. c = Rol(b, 30)
  107. b = a ; a = t
  108. Next
  109. For Local i:Int=20 To 39
  110. Local t:Int = Rol(a, 5) + (b ~ c ~ d) + e + $6ED9EBA1 + w[i]
  111. e = d ; d = c
  112. c = Rol(b, 30)
  113. b = a ; a = t
  114. Next
  115. For Local i:Int=40 To 59
  116. Local t:Int = Rol(a, 5) + ((b & c) | (d & (b | c))) + e + $8F1BBCDC + w[i]
  117. e = d ; d = c
  118. c = Rol(b, 30)
  119. b = a ; a = t
  120. Next
  121. For Local i:Int=60 To 79
  122. Local t:Int = Rol(a, 5) + (b ~ c ~ d) + e + $CA62C1D6 + w[i]
  123. e = d ; d = c
  124. c = Rol(b, 30)
  125. b = a ; a = t
  126. Next
  127. h0 += a
  128. h1 += b
  129. h2 += c
  130. h3 += d
  131. h4 += e
  132. Next
  133. Return (Hex(h0) + Hex(h1) + Hex(h2) + Hex(h3) + Hex(h4)).ToLower()
  134. End
  135. Function SHA256:String( in:String )
  136. Local h0:Int = $6A09E667, h1:Int = $BB67AE85, h2:Int = $3C6EF372, h3:Int = $A54FF53A
  137. Local h4:Int = $510E527F, h5:Int = $9B05688C, h6:Int = $1F83D9AB, h7:Int = $5BE0CD19
  138. Local k:Int[] = New Int[](
  139. $428A2F98, $71374491, $B5C0FBCF, $E9B5DBA5, $3956C25B, $59F111F1,
  140. $923F82A4, $AB1C5ED5, $D807AA98, $12835B01, $243185BE, $550C7DC3,
  141. $72BE5D74, $80DEB1FE, $9BDC06A7, $C19BF174, $E49B69C1, $EFBE4786,
  142. $0FC19DC6, $240CA1CC, $2DE92C6F, $4A7484AA, $5CB0A9DC, $76F988DA,
  143. $983E5152, $A831C66D, $B00327C8, $BF597FC7, $C6E00BF3, $D5A79147,
  144. $06CA6351, $14292967, $27B70A85, $2E1B2138, $4D2C6DFC, $53380D13,
  145. $650A7354, $766A0ABB, $81C2C92E, $92722C85, $A2BFE8A1, $A81A664B,
  146. $C24B8B70, $C76C51A3, $D192E819, $D6990624, $F40E3585, $106AA070,
  147. $19A4C116, $1E376C08, $2748774C, $34B0BCB5, $391C0CB3, $4ED8AA4A,
  148. $5B9CCA4F, $682E6FF3, $748F82EE, $78A5636F, $84C87814, $8CC70208,
  149. $90BEFFFA, $A4506CEB, $BEF9A3F7, $C67178F2)
  150. Local intCount:Int = (((in.Length + 8) Shr 6) + 1) Shl 4
  151. Local data:Int[] = New Int[intCount]
  152. For Local c:Int=0 Until in.Length
  153. data[c Shr 2] = (data[c Shr 2] Shl 8) | (in[c] & $FF)
  154. Next
  155. data[in.Length Shr 2] = ((data[in.Length Shr 2] Shl 8) | $80) Shl ((3 - (in.Length & 3)) Shl 3)
  156. data[data.Length - 2] = (Long(in.Length) * 8) Shr 32
  157. data[data.Length - 1] = (Long(in.Length) * 8) & $FFFFFFFF
  158. For Local chunkStart:Int=0 Until intCount Step 16
  159. Local a:Int = h0, b:Int = h1, c:Int = h2, d:Int = h3, e:Int = h4, f:Int = h5, g:Int = h6, h:Int = h7
  160. Local w:=data.Slice(chunkStart,chunkStart+16).Resize(64)
  161. For Local i:Int=16 To 63
  162. w[i] = w[i - 16] + (Ror(w[i - 15], 7) ~ Ror(w[i - 15], 18) ~ ( UShr(w[i - 15],3) ))+
  163. w[i - 7] + (Ror(w[i - 2], 17) ~ Ror(w[i - 2], 19) ~ ( UShr(w[i - 2],10) ))
  164. Next
  165. For Local i:Int=0 To 63
  166. Local t0:Int = (Ror(a, 2) ~ Ror(a, 13) ~ Ror(a, 22)) + ((a & b) | (b & c) | (c & a))
  167. Local t1:Int = h + (Ror(e, 6) ~ Ror(e, 11) ~ Ror(e, 25)) + ((e & f) | (~e & g)) + k[i] + w[i]
  168. h = g ; g = f ; f = e ; e = d + t1
  169. d = c ; c = b ; b = a ; a = t0 + t1
  170. Next
  171. h0 += a ; h1 += b ; h2 += c ; h3 += d
  172. h4 += e ; h5 += f ; h6 += g ; h7 += h
  173. Next
  174. Return (Hex(h0) + Hex(h1) + Hex(h2) + Hex(h3) + Hex(h4) + Hex(h5) + Hex(h6) + Hex(h7)).ToLower()
  175. End