PageRenderTime 49ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/src/php/strings/md5.js

https://github.com/andriuspetrauskis/phpjs
JavaScript | 241 lines | 211 code | 18 blank | 12 comment | 9 complexity | e5f79e856aa7a8b033076e839a5208c0 MD5 | raw file
  1. module.exports = function md5 (str) {
  2. // discuss at: http://locutus.io/php/md5/
  3. // original by: Webtoolkit.info (http://www.webtoolkit.info/)
  4. // improved by: Michael White (http://getsprink.com)
  5. // improved by: Jack
  6. // improved by: Kevin van Zonneveld (http://kvz.io)
  7. // input by: Brett Zamir (http://brett-zamir.me)
  8. // bugfixed by: Kevin van Zonneveld (http://kvz.io)
  9. // note 1: Keep in mind that in accordance with PHP, the whole string is buffered and then
  10. // note 1: hashed. If available, we'd recommend using Node's native crypto modules directly
  11. // note 1: in a steaming fashion for faster and more efficient hashing
  12. // example 1: md5('Kevin van Zonneveld')
  13. // returns 1: '6e658d4bfcb59cc13f96c14450ac40b9'
  14. var hash
  15. try {
  16. var crypto = require('crypto')
  17. var md5sum = crypto.createHash('md5')
  18. md5sum.update(str)
  19. hash = md5sum.digest('hex')
  20. } catch (e) {
  21. hash = undefined
  22. }
  23. if (hash !== undefined) {
  24. return hash
  25. }
  26. var utf8Encode = require('../xml/utf8_encode')
  27. var xl
  28. var _rotateLeft = function (lValue, iShiftBits) {
  29. return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits))
  30. }
  31. var _addUnsigned = function (lX, lY) {
  32. var lX4, lY4, lX8, lY8, lResult
  33. lX8 = (lX & 0x80000000)
  34. lY8 = (lY & 0x80000000)
  35. lX4 = (lX & 0x40000000)
  36. lY4 = (lY & 0x40000000)
  37. lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF)
  38. if (lX4 & lY4) {
  39. return (lResult ^ 0x80000000 ^ lX8 ^ lY8)
  40. }
  41. if (lX4 | lY4) {
  42. if (lResult & 0x40000000) {
  43. return (lResult ^ 0xC0000000 ^ lX8 ^ lY8)
  44. } else {
  45. return (lResult ^ 0x40000000 ^ lX8 ^ lY8)
  46. }
  47. } else {
  48. return (lResult ^ lX8 ^ lY8)
  49. }
  50. }
  51. var _F = function (x, y, z) {
  52. return (x & y) | ((~x) & z)
  53. }
  54. var _G = function (x, y, z) {
  55. return (x & z) | (y & (~z))
  56. }
  57. var _H = function (x, y, z) {
  58. return (x ^ y ^ z)
  59. }
  60. var _I = function (x, y, z) {
  61. return (y ^ (x | (~z)))
  62. }
  63. var _FF = function (a, b, c, d, x, s, ac) {
  64. a = _addUnsigned(a, _addUnsigned(_addUnsigned(_F(b, c, d), x), ac))
  65. return _addUnsigned(_rotateLeft(a, s), b)
  66. }
  67. var _GG = function (a, b, c, d, x, s, ac) {
  68. a = _addUnsigned(a, _addUnsigned(_addUnsigned(_G(b, c, d), x), ac))
  69. return _addUnsigned(_rotateLeft(a, s), b)
  70. }
  71. var _HH = function (a, b, c, d, x, s, ac) {
  72. a = _addUnsigned(a, _addUnsigned(_addUnsigned(_H(b, c, d), x), ac))
  73. return _addUnsigned(_rotateLeft(a, s), b)
  74. }
  75. var _II = function (a, b, c, d, x, s, ac) {
  76. a = _addUnsigned(a, _addUnsigned(_addUnsigned(_I(b, c, d), x), ac))
  77. return _addUnsigned(_rotateLeft(a, s), b)
  78. }
  79. var _convertToWordArray = function (str) {
  80. var lWordCount
  81. var lMessageLength = str.length
  82. var lNumberOfWordsTemp1 = lMessageLength + 8
  83. var lNumberOfWordsTemp2 = (lNumberOfWordsTemp1 - (lNumberOfWordsTemp1 % 64)) / 64
  84. var lNumberOfWords = (lNumberOfWordsTemp2 + 1) * 16
  85. var lWordArray = new Array(lNumberOfWords - 1)
  86. var lBytePosition = 0
  87. var lByteCount = 0
  88. while (lByteCount < lMessageLength) {
  89. lWordCount = (lByteCount - (lByteCount % 4)) / 4
  90. lBytePosition = (lByteCount % 4) * 8
  91. lWordArray[lWordCount] = (lWordArray[lWordCount] |
  92. (str.charCodeAt(lByteCount) << lBytePosition))
  93. lByteCount++
  94. }
  95. lWordCount = (lByteCount - (lByteCount % 4)) / 4
  96. lBytePosition = (lByteCount % 4) * 8
  97. lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition)
  98. lWordArray[lNumberOfWords - 2] = lMessageLength << 3
  99. lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29
  100. return lWordArray
  101. }
  102. var _wordToHex = function (lValue) {
  103. var wordToHexValue = ''
  104. var wordToHexValueTemp = ''
  105. var lByte
  106. var lCount
  107. for (lCount = 0; lCount <= 3; lCount++) {
  108. lByte = (lValue >>> (lCount * 8)) & 255
  109. wordToHexValueTemp = '0' + lByte.toString(16)
  110. wordToHexValue = wordToHexValue + wordToHexValueTemp.substr(wordToHexValueTemp.length - 2, 2)
  111. }
  112. return wordToHexValue
  113. }
  114. var x = []
  115. var k
  116. var AA
  117. var BB
  118. var CC
  119. var DD
  120. var a
  121. var b
  122. var c
  123. var d
  124. var S11 = 7
  125. var S12 = 12
  126. var S13 = 17
  127. var S14 = 22
  128. var S21 = 5
  129. var S22 = 9
  130. var S23 = 14
  131. var S24 = 20
  132. var S31 = 4
  133. var S32 = 11
  134. var S33 = 16
  135. var S34 = 23
  136. var S41 = 6
  137. var S42 = 10
  138. var S43 = 15
  139. var S44 = 21
  140. str = utf8Encode(str)
  141. x = _convertToWordArray(str)
  142. a = 0x67452301
  143. b = 0xEFCDAB89
  144. c = 0x98BADCFE
  145. d = 0x10325476
  146. xl = x.length
  147. for (k = 0; k < xl; k += 16) {
  148. AA = a
  149. BB = b
  150. CC = c
  151. DD = d
  152. a = _FF(a, b, c, d, x[k + 0], S11, 0xD76AA478)
  153. d = _FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756)
  154. c = _FF(c, d, a, b, x[k + 2], S13, 0x242070DB)
  155. b = _FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE)
  156. a = _FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF)
  157. d = _FF(d, a, b, c, x[k + 5], S12, 0x4787C62A)
  158. c = _FF(c, d, a, b, x[k + 6], S13, 0xA8304613)
  159. b = _FF(b, c, d, a, x[k + 7], S14, 0xFD469501)
  160. a = _FF(a, b, c, d, x[k + 8], S11, 0x698098D8)
  161. d = _FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF)
  162. c = _FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1)
  163. b = _FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE)
  164. a = _FF(a, b, c, d, x[k + 12], S11, 0x6B901122)
  165. d = _FF(d, a, b, c, x[k + 13], S12, 0xFD987193)
  166. c = _FF(c, d, a, b, x[k + 14], S13, 0xA679438E)
  167. b = _FF(b, c, d, a, x[k + 15], S14, 0x49B40821)
  168. a = _GG(a, b, c, d, x[k + 1], S21, 0xF61E2562)
  169. d = _GG(d, a, b, c, x[k + 6], S22, 0xC040B340)
  170. c = _GG(c, d, a, b, x[k + 11], S23, 0x265E5A51)
  171. b = _GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA)
  172. a = _GG(a, b, c, d, x[k + 5], S21, 0xD62F105D)
  173. d = _GG(d, a, b, c, x[k + 10], S22, 0x2441453)
  174. c = _GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681)
  175. b = _GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8)
  176. a = _GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6)
  177. d = _GG(d, a, b, c, x[k + 14], S22, 0xC33707D6)
  178. c = _GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87)
  179. b = _GG(b, c, d, a, x[k + 8], S24, 0x455A14ED)
  180. a = _GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905)
  181. d = _GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8)
  182. c = _GG(c, d, a, b, x[k + 7], S23, 0x676F02D9)
  183. b = _GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A)
  184. a = _HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942)
  185. d = _HH(d, a, b, c, x[k + 8], S32, 0x8771F681)
  186. c = _HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122)
  187. b = _HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C)
  188. a = _HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44)
  189. d = _HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9)
  190. c = _HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60)
  191. b = _HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70)
  192. a = _HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6)
  193. d = _HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA)
  194. c = _HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085)
  195. b = _HH(b, c, d, a, x[k + 6], S34, 0x4881D05)
  196. a = _HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039)
  197. d = _HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5)
  198. c = _HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8)
  199. b = _HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665)
  200. a = _II(a, b, c, d, x[k + 0], S41, 0xF4292244)
  201. d = _II(d, a, b, c, x[k + 7], S42, 0x432AFF97)
  202. c = _II(c, d, a, b, x[k + 14], S43, 0xAB9423A7)
  203. b = _II(b, c, d, a, x[k + 5], S44, 0xFC93A039)
  204. a = _II(a, b, c, d, x[k + 12], S41, 0x655B59C3)
  205. d = _II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92)
  206. c = _II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D)
  207. b = _II(b, c, d, a, x[k + 1], S44, 0x85845DD1)
  208. a = _II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F)
  209. d = _II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0)
  210. c = _II(c, d, a, b, x[k + 6], S43, 0xA3014314)
  211. b = _II(b, c, d, a, x[k + 13], S44, 0x4E0811A1)
  212. a = _II(a, b, c, d, x[k + 4], S41, 0xF7537E82)
  213. d = _II(d, a, b, c, x[k + 11], S42, 0xBD3AF235)
  214. c = _II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB)
  215. b = _II(b, c, d, a, x[k + 9], S44, 0xEB86D391)
  216. a = _addUnsigned(a, AA)
  217. b = _addUnsigned(b, BB)
  218. c = _addUnsigned(c, CC)
  219. d = _addUnsigned(d, DD)
  220. }
  221. var temp = _wordToHex(a) + _wordToHex(b) + _wordToHex(c) + _wordToHex(d)
  222. return temp.toLowerCase()
  223. }