爱简收旧衣按件回收前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

532 lines
18 KiB

10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
  1. // js-md5 v0.8.3 (核心实现部分,已适配ESM)
  2. 'use strict';
  3. var INPUT_ERROR = 'input is invalid type';
  4. var FINALIZE_ERROR = 'finalize already called';
  5. var HEX_CHARS = '0123456789abcdef'.split('');
  6. var EXTRA = [128, 32768, 8388608, -2147483648];
  7. var SHIFT = [0, 8, 16, 24];
  8. var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer', 'base64'];
  9. var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
  10. var blocks = [], buffer8;
  11. var ARRAY_BUFFER = typeof ArrayBuffer !== 'undefined';
  12. if (ARRAY_BUFFER) {
  13. var buffer = new ArrayBuffer(68);
  14. buffer8 = new Uint8Array(buffer);
  15. blocks = new Uint32Array(buffer);
  16. }
  17. var isArray = Array.isArray;
  18. if (!isArray) {
  19. isArray = function (obj) {
  20. return Object.prototype.toString.call(obj) === '[object Array]';
  21. };
  22. }
  23. var isView = ArrayBuffer && ArrayBuffer.isView;
  24. if (ARRAY_BUFFER && !isView) {
  25. isView = function (obj) {
  26. return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
  27. };
  28. }
  29. // [message: string, isString: bool]
  30. var formatMessage = function (message) {
  31. var type = typeof message;
  32. if (type === 'string') {
  33. return [message, true];
  34. }
  35. if (type !== 'object' || message === null) {
  36. throw new Error(INPUT_ERROR);
  37. }
  38. if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
  39. return [new Uint8Array(message), false];
  40. }
  41. if (!isArray(message) && !(ARRAY_BUFFER && isView(message))) {
  42. throw new Error(INPUT_ERROR);
  43. }
  44. return [message, false];
  45. };
  46. var createOutputMethod = function (outputType) {
  47. return function (message) {
  48. return new Md5(true).update(message)[outputType]();
  49. };
  50. };
  51. var createMethod = function () {
  52. var method = createOutputMethod('hex');
  53. method.create = function () {
  54. return new Md5();
  55. };
  56. method.update = function (message) {
  57. return method.create().update(message);
  58. };
  59. for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
  60. var type = OUTPUT_TYPES[i];
  61. method[type] = createOutputMethod(type);
  62. }
  63. return method;
  64. };
  65. var createHmacOutputMethod = function (outputType) {
  66. return function (key, message) {
  67. return new HmacMd5(key, true).update(message)[outputType]();
  68. };
  69. };
  70. var createHmacMethod = function () {
  71. var method = createHmacOutputMethod('hex');
  72. method.create = function (key) {
  73. return new HmacMd5(key);
  74. };
  75. method.update = function (key, message) {
  76. return method.create(key).update(message);
  77. };
  78. for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
  79. var type = OUTPUT_TYPES[i];
  80. method[type] = createHmacOutputMethod(type);
  81. }
  82. return method;
  83. };
  84. function Md5(sharedMemory) {
  85. if (sharedMemory) {
  86. blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
  87. blocks[4] = blocks[5] = blocks[6] = blocks[7] =
  88. blocks[8] = blocks[9] = blocks[10] = blocks[11] =
  89. blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
  90. this.blocks = blocks;
  91. this.buffer8 = buffer8;
  92. } else {
  93. if (ARRAY_BUFFER) {
  94. var buffer = new ArrayBuffer(68);
  95. this.buffer8 = new Uint8Array(buffer);
  96. this.blocks = new Uint32Array(buffer);
  97. } else {
  98. this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
  99. }
  100. }
  101. this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
  102. this.finalized = this.hashed = false;
  103. this.first = true;
  104. }
  105. Md5.prototype.update = function (message) {
  106. if (this.finalized) {
  107. throw new Error(FINALIZE_ERROR);
  108. }
  109. var result = formatMessage(message);
  110. message = result[0];
  111. var isString = result[1];
  112. var code, index = 0, i, length = message.length, blocks = this.blocks;
  113. var buffer8 = this.buffer8;
  114. while (index < length) {
  115. if (this.hashed) {
  116. this.hashed = false;
  117. blocks[0] = blocks[16];
  118. blocks[16] = blocks[1] = blocks[2] = blocks[3] =
  119. blocks[4] = blocks[5] = blocks[6] = blocks[7] =
  120. blocks[8] = blocks[9] = blocks[10] = blocks[11] =
  121. blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
  122. }
  123. if (isString) {
  124. if (ARRAY_BUFFER) {
  125. for (i = this.start; index < length && i < 64; ++index) {
  126. code = message.charCodeAt(index);
  127. if (code < 0x80) {
  128. buffer8[i++] = code;
  129. } else if (code < 0x800) {
  130. buffer8[i++] = 0xc0 | (code >>> 6);
  131. buffer8[i++] = 0x80 | (code & 0x3f);
  132. } else if (code < 0xd800 || code >= 0xe000) {
  133. buffer8[i++] = 0xe0 | (code >>> 12);
  134. buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
  135. buffer8[i++] = 0x80 | (code & 0x3f);
  136. } else {
  137. code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
  138. buffer8[i++] = 0xf0 | (code >>> 18);
  139. buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);
  140. buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
  141. buffer8[i++] = 0x80 | (code & 0x3f);
  142. }
  143. }
  144. } else {
  145. for (i = this.start; index < length && i < 64; ++index) {
  146. code = message.charCodeAt(index);
  147. if (code < 0x80) {
  148. blocks[i >>> 2] |= code << SHIFT[i++ & 3];
  149. } else if (code < 0x800) {
  150. blocks[i >>> 2] |= (0xc0 | (code >>> 6)) << SHIFT[i++ & 3];
  151. blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
  152. } else if (code < 0xd800 || code >= 0xe000) {
  153. blocks[i >>> 2] |= (0xe0 | (code >>> 12)) << SHIFT[i++ & 3];
  154. blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];
  155. blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
  156. } else {
  157. code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
  158. blocks[i >>> 2] |= (0xf0 | (code >>> 18)) << SHIFT[i++ & 3];
  159. blocks[i >>> 2] |= (0x80 | ((code >>> 12) & 0x3f)) << SHIFT[i++ & 3];
  160. blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];
  161. blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
  162. }
  163. }
  164. }
  165. } else {
  166. if (ARRAY_BUFFER) {
  167. for (i = this.start; index < length && i < 64; ++index) {
  168. buffer8[i++] = message[index];
  169. }
  170. } else {
  171. for (i = this.start; index < length && i < 64; ++index) {
  172. blocks[i >>> 2] |= message[index] << SHIFT[i++ & 3];
  173. }
  174. }
  175. }
  176. this.lastByteIndex = i;
  177. this.bytes += i - this.start;
  178. if (i >= 64) {
  179. this.start = i - 64;
  180. this.hash();
  181. this.hashed = true;
  182. } else {
  183. this.start = i;
  184. }
  185. }
  186. if (this.bytes > 4294967295) {
  187. this.hBytes += this.bytes / 4294967296 << 0;
  188. this.bytes = this.bytes % 4294967296;
  189. }
  190. return this;
  191. };
  192. Md5.prototype.finalize = function () {
  193. if (this.finalized) {
  194. return;
  195. }
  196. this.finalized = true;
  197. var blocks = this.blocks, i = this.lastByteIndex;
  198. blocks[i >>> 2] |= EXTRA[i & 3];
  199. if (i >= 56) {
  200. if (!this.hashed) {
  201. this.hash();
  202. }
  203. blocks[0] = blocks[16];
  204. blocks[16] = blocks[1] = blocks[2] = blocks[3] =
  205. blocks[4] = blocks[5] = blocks[6] = blocks[7] =
  206. blocks[8] = blocks[9] = blocks[10] = blocks[11] =
  207. blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
  208. }
  209. blocks[14] = this.bytes << 3;
  210. blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
  211. this.hash();
  212. };
  213. Md5.prototype.hash = function () {
  214. var a, b, c, d, bc, da, blocks = this.blocks;
  215. if (this.first) {
  216. a = blocks[0] - 680876937;
  217. a = (a << 7 | a >>> 25) - 271733879 << 0;
  218. d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
  219. d = (d << 12 | d >>> 20) + a << 0;
  220. c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;
  221. c = (c << 17 | c >>> 15) + d << 0;
  222. b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;
  223. b = (b << 22 | b >>> 10) + c << 0;
  224. } else {
  225. a = this.h0;
  226. b = this.h1;
  227. c = this.h2;
  228. d = this.h3;
  229. a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;
  230. a = (a << 7 | a >>> 25) + b << 0;
  231. d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;
  232. d = (d << 12 | d >>> 20) + a << 0;
  233. c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;
  234. c = (c << 17 | c >>> 15) + d << 0;
  235. b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;
  236. b = (b << 22 | b >>> 10) + c << 0;
  237. }
  238. a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;
  239. a = (a << 7 | a >>> 25) + b << 0;
  240. d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;
  241. d = (d << 12 | d >>> 20) + a << 0;
  242. c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;
  243. c = (c << 17 | c >>> 15) + d << 0;
  244. b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;
  245. b = (b << 22 | b >>> 10) + c << 0;
  246. a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;
  247. a = (a << 7 | a >>> 25) + b << 0;
  248. d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;
  249. d = (d << 12 | d >>> 20) + a << 0;
  250. c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;
  251. c = (c << 17 | c >>> 15) + d << 0;
  252. b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;
  253. b = (b << 22 | b >>> 10) + c << 0;
  254. a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;
  255. a = (a << 7 | a >>> 25) + b << 0;
  256. d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;
  257. d = (d << 12 | d >>> 20) + a << 0;
  258. c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;
  259. c = (c << 17 | c >>> 15) + d << 0;
  260. b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;
  261. b = (b << 22 | b >>> 10) + c << 0;
  262. a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;
  263. a = (a << 5 | a >>> 27) + b << 0;
  264. d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;
  265. d = (d << 9 | d >>> 23) + a << 0;
  266. c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;
  267. c = (c << 14 | c >>> 18) + d << 0;
  268. b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;
  269. b = (b << 20 | b >>> 12) + c << 0;
  270. a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;
  271. a = (a << 5 | a >>> 27) + b << 0;
  272. d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;
  273. d = (d << 9 | d >>> 23) + a << 0;
  274. c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;
  275. c = (c << 14 | c >>> 18) + d << 0;
  276. b += (d ^ (c & (d ^ a))) + blocks[4] - 405537848;
  277. b = (b << 20 | b >>> 12) + c << 0;
  278. a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;
  279. a = (a << 5 | a >>> 27) + b << 0;
  280. d += (b ^ (a & (c ^ b))) + blocks[14] - 1019803690;
  281. d = (d << 9 | d >>> 23) + a << 0;
  282. c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;
  283. c = (c << 14 | c >>> 18) + d << 0;
  284. b += (d ^ (c & (d ^ a))) + blocks[8] + 1163531501;
  285. b = (b << 20 | b >>> 12) + c << 0;
  286. a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;
  287. a = (a << 5 | a >>> 27) + b << 0;
  288. d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;
  289. d = (d << 9 | d >>> 23) + a << 0;
  290. c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;
  291. c = (c << 14 | c >>> 18) + d << 0;
  292. b += (d ^ (c & (d ^ a))) + blocks[12] - 1926607734;
  293. b = (b << 20 | b >>> 12) + c << 0;
  294. bc = b ^ c;
  295. a += (bc ^ d) + blocks[5] - 378558;
  296. a = (a << 4 | a >>> 28) + b << 0;
  297. d += (bc ^ a) + blocks[8] - 2022574463;
  298. d = (d << 11 | d >>> 21) + a << 0;
  299. da = d ^ a;
  300. c += (da ^ b) + blocks[11] + 1839030562;
  301. c = (c << 16 | c >>> 16) + d << 0;
  302. b += (da ^ c) + blocks[14] - 35309556;
  303. b = (b << 23 | b >>> 9) + c << 0;
  304. bc = b ^ c;
  305. a += (bc ^ d) + blocks[1] - 1530992060;
  306. a = (a << 4 | a >>> 28) + b << 0;
  307. d += (bc ^ a) + blocks[4] + 1272893353;
  308. d = (d << 11 | d >>> 21) + a << 0;
  309. da = d ^ a;
  310. c += (da ^ b) + blocks[7] - 155497632;
  311. c = (c << 16 | c >>> 16) + d << 0;
  312. b += (da ^ c) + blocks[10] - 1094730640;
  313. b = (b << 23 | b >>> 9) + c << 0;
  314. bc = b ^ c;
  315. a += (bc ^ d) + blocks[13] + 681279174;
  316. a = (a << 4 | a >>> 28) + b << 0;
  317. d += (bc ^ a) + blocks[0] - 358537222;
  318. d = (d << 11 | d >>> 21) + a << 0;
  319. da = d ^ a;
  320. c += (da ^ b) + blocks[3] - 722521979;
  321. c = (c << 16 | c >>> 16) + d << 0;
  322. b += (da ^ c) + blocks[6] + 76029189;
  323. b = (b << 23 | b >>> 9) + c << 0;
  324. bc = b ^ c;
  325. a += (bc ^ d) + blocks[9] - 640364487;
  326. a = (a << 4 | a >>> 28) + b << 0;
  327. d += (bc ^ a) + blocks[12] - 421815835;
  328. d = (d << 11 | d >>> 21) + a << 0;
  329. da = d ^ a;
  330. c += (da ^ b) + blocks[15] + 530742520;
  331. c = (c << 16 | c >>> 16) + d << 0;
  332. b += (da ^ c) + blocks[2] - 995338651;
  333. b = (b << 23 | b >>> 9) + c << 0;
  334. a += (c ^ (b | ~d)) + blocks[0] - 198630844;
  335. a = (a << 6 | a >>> 26) + b << 0;
  336. d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
  337. d = (d << 10 | d >>> 22) + a << 0;
  338. c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
  339. c = (c << 15 | c >>> 17) + d << 0;
  340. b += (d ^ (c | ~a)) + blocks[5] - 57434055;
  341. b = (b << 21 | b >>> 11) + c << 0;
  342. a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
  343. a = (a << 6 | a >>> 26) + b << 0;
  344. d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
  345. d = (d << 10 | d >>> 22) + a << 0;
  346. c += (a ^ (d | ~b)) + blocks[10] - 1051523;
  347. c = (c << 15 | c >>> 17) + d << 0;
  348. b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
  349. b = (b << 21 | b >>> 11) + c << 0;
  350. a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
  351. a = (a << 6 | a >>> 26) + b << 0;
  352. d += (b ^ (a | ~c)) + blocks[15] - 30611744;
  353. d = (d << 10 | d >>> 22) + a << 0;
  354. c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
  355. c = (c << 15 | c >>> 17) + d << 0;
  356. b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
  357. b = (b << 21 | b >>> 11) + c << 0;
  358. a += (c ^ (b | ~d)) + blocks[4] - 145523070;
  359. a = (a << 6 | a >>> 26) + b << 0;
  360. d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
  361. d = (d << 10 | d >>> 22) + a << 0;
  362. c += (a ^ (d | ~b)) + blocks[2] + 718787259;
  363. c = (c << 15 | c >>> 17) + d << 0;
  364. b += (d ^ (c | ~a)) + blocks[9] - 343485551;
  365. b = (b << 21 | b >>> 11) + c << 0;
  366. if (this.first) {
  367. this.h0 = a + 1732584193 << 0;
  368. this.h1 = b - 271733879 << 0;
  369. this.h2 = c - 1732584194 << 0;
  370. this.h3 = d + 271733878 << 0;
  371. this.first = false;
  372. } else {
  373. this.h0 = this.h0 + a << 0;
  374. this.h1 = this.h1 + b << 0;
  375. this.h2 = this.h2 + c << 0;
  376. this.h3 = this.h3 + d << 0;
  377. }
  378. };
  379. Md5.prototype.hex = function () {
  380. this.finalize();
  381. var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
  382. return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
  383. HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
  384. HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
  385. HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
  386. HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
  387. HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
  388. HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
  389. HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
  390. HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
  391. HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
  392. HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
  393. HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
  394. HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
  395. HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
  396. HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
  397. HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];
  398. };
  399. Md5.prototype.toString = Md5.prototype.hex;
  400. Md5.prototype.digest = function () {
  401. this.finalize();
  402. var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
  403. return [
  404. h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,
  405. h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,
  406. h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,
  407. h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF
  408. ];
  409. };
  410. Md5.prototype.array = Md5.prototype.digest;
  411. Md5.prototype.arrayBuffer = function () {
  412. this.finalize();
  413. var buffer = new ArrayBuffer(16);
  414. var blocks = new Uint32Array(buffer);
  415. blocks[0] = this.h0;
  416. blocks[1] = this.h1;
  417. blocks[2] = this.h2;
  418. blocks[3] = this.h3;
  419. return buffer;
  420. };
  421. Md5.prototype.buffer = Md5.prototype.arrayBuffer;
  422. Md5.prototype.base64 = function () {
  423. var v1, v2, v3, base64Str = '', bytes = this.array();
  424. for (var i = 0; i < 15;) {
  425. v1 = bytes[i++];
  426. v2 = bytes[i++];
  427. v3 = bytes[i++];
  428. base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
  429. BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
  430. BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
  431. BASE64_ENCODE_CHAR[v3 & 63];
  432. }
  433. v1 = bytes[i];
  434. base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
  435. BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
  436. '==';
  437. return base64Str;
  438. };
  439. function HmacMd5(key, sharedMemory) {
  440. var i, result = formatMessage(key);
  441. key = result[0];
  442. if (result[1]) {
  443. var bytes = [], length = key.length, index = 0, code;
  444. for (i = 0; i < length; ++i) {
  445. code = key.charCodeAt(i);
  446. if (code < 0x80) {
  447. bytes[index++] = code;
  448. } else if (code < 0x800) {
  449. bytes[index++] = (0xc0 | (code >>> 6));
  450. bytes[index++] = (0x80 | (code & 0x3f));
  451. } else if (code < 0xd800 || code >= 0xe000) {
  452. bytes[index++] = (0xe0 | (code >>> 12));
  453. bytes[index++] = (0x80 | ((code >>> 6) & 0x3f));
  454. bytes[index++] = (0x80 | (code & 0x3f));
  455. } else {
  456. code = 0x10000 + (((code & 0x3ff) << 10) | (key.charCodeAt(++i) & 0x3ff));
  457. bytes[index++] = (0xf0 | (code >>> 18));
  458. bytes[index++] = (0x80 | ((code >>> 12) & 0x3f));
  459. bytes[index++] = (0x80 | ((code >>> 6) & 0x3f));
  460. bytes[index++] = (0x80 | (code & 0x3f));
  461. }
  462. }
  463. key = bytes;
  464. }
  465. if (key.length > 64) {
  466. key = (new Md5(true)).update(key).array();
  467. }
  468. var oKeyPad = [], iKeyPad = [];
  469. for (i = 0; i < 64; ++i) {
  470. var b = key[i] || 0;
  471. oKeyPad[i] = 0x5c ^ b;
  472. iKeyPad[i] = 0x36 ^ b;
  473. }
  474. Md5.call(this, sharedMemory);
  475. this.update(iKeyPad);
  476. this.oKeyPad = oKeyPad;
  477. this.inner = true;
  478. this.sharedMemory = sharedMemory;
  479. }
  480. HmacMd5.prototype = new Md5();
  481. HmacMd5.prototype.finalize = function () {
  482. Md5.prototype.finalize.call(this);
  483. if (this.inner) {
  484. this.inner = false;
  485. var innerHash = this.array();
  486. Md5.call(this, this.sharedMemory);
  487. this.update(this.oKeyPad);
  488. this.update(innerHash);
  489. Md5.prototype.finalize.call(this);
  490. }
  491. };
  492. var exports = createMethod();
  493. exports.md5 = exports;
  494. exports.hmac = createHmacMethod();
  495. export default exports;