calculator.worker.fileId.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. /**
  2. * Created by xianjun on 2014/12/15.
  3. */
  4. importScripts('crypto-min.js');
  5. // Auxiliary functions
  6. function FF(a, b, c, d, x, s, t) {
  7. var n = a + (b & c | ~b & d) + (x >>> 0) + t;
  8. return ((n << s) | (n >>> (32 - s))) + b;
  9. }
  10. function GG(a, b, c, d, x, s, t) {
  11. var n = a + (b & d | c & ~d) + (x >>> 0) + t;
  12. return ((n << s) | (n >>> (32 - s))) + b;
  13. }
  14. function HH(a, b, c, d, x, s, t) {
  15. var n = a + (b ^ c ^ d) + (x >>> 0) + t;
  16. return ((n << s) | (n >>> (32 - s))) + b;
  17. }
  18. function II(a, b, c, d, x, s, t) {
  19. var n = a + (c ^ (b | ~d)) + (x >>> 0) + t;
  20. return ((n << s) | (n >>> (32 - s))) + b;
  21. }
  22. function md5(m, hash) {
  23. var a = hash[0], b = hash[1], c = hash[2], d = hash[3];
  24. for (var i = 0; i < m.length; i += 16) {
  25. var aa = a, bb = b, cc = c, dd = d;
  26. a = FF(a, b, c, d, m[i + 0], 7, -680876936);
  27. d = FF(d, a, b, c, m[i + 1], 12, -389564586);
  28. c = FF(c, d, a, b, m[i + 2], 17, 606105819);
  29. b = FF(b, c, d, a, m[i + 3], 22, -1044525330);
  30. a = FF(a, b, c, d, m[i + 4], 7, -176418897);
  31. d = FF(d, a, b, c, m[i + 5], 12, 1200080426);
  32. c = FF(c, d, a, b, m[i + 6], 17, -1473231341);
  33. b = FF(b, c, d, a, m[i + 7], 22, -45705983);
  34. a = FF(a, b, c, d, m[i + 8], 7, 1770035416);
  35. d = FF(d, a, b, c, m[i + 9], 12, -1958414417);
  36. c = FF(c, d, a, b, m[i + 10], 17, -42063);
  37. b = FF(b, c, d, a, m[i + 11], 22, -1990404162);
  38. a = FF(a, b, c, d, m[i + 12], 7, 1804603682);
  39. d = FF(d, a, b, c, m[i + 13], 12, -40341101);
  40. c = FF(c, d, a, b, m[i + 14], 17, -1502002290);
  41. b = FF(b, c, d, a, m[i + 15], 22, 1236535329);
  42. a = GG(a, b, c, d, m[i + 1], 5, -165796510);
  43. d = GG(d, a, b, c, m[i + 6], 9, -1069501632);
  44. c = GG(c, d, a, b, m[i + 11], 14, 643717713);
  45. b = GG(b, c, d, a, m[i + 0], 20, -373897302);
  46. a = GG(a, b, c, d, m[i + 5], 5, -701558691);
  47. d = GG(d, a, b, c, m[i + 10], 9, 38016083);
  48. c = GG(c, d, a, b, m[i + 15], 14, -660478335);
  49. b = GG(b, c, d, a, m[i + 4], 20, -405537848);
  50. a = GG(a, b, c, d, m[i + 9], 5, 568446438);
  51. d = GG(d, a, b, c, m[i + 14], 9, -1019803690);
  52. c = GG(c, d, a, b, m[i + 3], 14, -187363961);
  53. b = GG(b, c, d, a, m[i + 8], 20, 1163531501);
  54. a = GG(a, b, c, d, m[i + 13], 5, -1444681467);
  55. d = GG(d, a, b, c, m[i + 2], 9, -51403784);
  56. c = GG(c, d, a, b, m[i + 7], 14, 1735328473);
  57. b = GG(b, c, d, a, m[i + 12], 20, -1926607734);
  58. a = HH(a, b, c, d, m[i + 5], 4, -378558);
  59. d = HH(d, a, b, c, m[i + 8], 11, -2022574463);
  60. c = HH(c, d, a, b, m[i + 11], 16, 1839030562);
  61. b = HH(b, c, d, a, m[i + 14], 23, -35309556);
  62. a = HH(a, b, c, d, m[i + 1], 4, -1530992060);
  63. d = HH(d, a, b, c, m[i + 4], 11, 1272893353);
  64. c = HH(c, d, a, b, m[i + 7], 16, -155497632);
  65. b = HH(b, c, d, a, m[i + 10], 23, -1094730640);
  66. a = HH(a, b, c, d, m[i + 13], 4, 681279174);
  67. d = HH(d, a, b, c, m[i + 0], 11, -358537222);
  68. c = HH(c, d, a, b, m[i + 3], 16, -722521979);
  69. b = HH(b, c, d, a, m[i + 6], 23, 76029189);
  70. a = HH(a, b, c, d, m[i + 9], 4, -640364487);
  71. d = HH(d, a, b, c, m[i + 12], 11, -421815835);
  72. c = HH(c, d, a, b, m[i + 15], 16, 530742520);
  73. b = HH(b, c, d, a, m[i + 2], 23, -995338651);
  74. a = II(a, b, c, d, m[i + 0], 6, -198630844);
  75. d = II(d, a, b, c, m[i + 7], 10, 1126891415);
  76. c = II(c, d, a, b, m[i + 14], 15, -1416354905);
  77. b = II(b, c, d, a, m[i + 5], 21, -57434055);
  78. a = II(a, b, c, d, m[i + 12], 6, 1700485571);
  79. d = II(d, a, b, c, m[i + 3], 10, -1894986606);
  80. c = II(c, d, a, b, m[i + 10], 15, -1051523);
  81. b = II(b, c, d, a, m[i + 1], 21, -2054922799);
  82. a = II(a, b, c, d, m[i + 8], 6, 1873313359);
  83. d = II(d, a, b, c, m[i + 15], 10, -30611744);
  84. c = II(c, d, a, b, m[i + 6], 15, -1560198380);
  85. b = II(b, c, d, a, m[i + 13], 21, 1309151649);
  86. a = II(a, b, c, d, m[i + 4], 6, -145523070);
  87. d = II(d, a, b, c, m[i + 11], 10, -1120210379);
  88. c = II(c, d, a, b, m[i + 2], 15, 718787259);
  89. b = II(b, c, d, a, m[i + 9], 21, -343485551);
  90. a = (a + aa) >>> 0;
  91. b = (b + bb) >>> 0;
  92. c = (c + cc) >>> 0;
  93. d = (d + dd) >>> 0;
  94. }
  95. return [a, b, c, d];
  96. }
  97. var K = [ 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
  98. 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
  99. 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
  100. 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
  101. 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
  102. 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
  103. 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
  104. 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
  105. 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
  106. 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
  107. 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
  108. 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
  109. 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
  110. 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
  111. 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
  112. 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 ];
  113. function sha256(m, H) {
  114. var w = [],
  115. a, b, c, d, e, f, g, h, i, j,
  116. t1, t2;
  117. for (var i = 0; i < m.length; i += 16) {
  118. a = H[0];
  119. b = H[1];
  120. c = H[2];
  121. d = H[3];
  122. e = H[4];
  123. f = H[5];
  124. g = H[6];
  125. h = H[7];
  126. for (var j = 0; j < 64; j++) {
  127. if (j < 16) w[j] = m[j + i];
  128. else {
  129. var gamma0x = w[j - 15],
  130. gamma1x = w[j - 2],
  131. gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^
  132. ((gamma0x << 14) | (gamma0x >>> 18)) ^
  133. (gamma0x >>> 3),
  134. gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^
  135. ((gamma1x << 13) | (gamma1x >>> 19)) ^
  136. (gamma1x >>> 10);
  137. w[j] = gamma0 + (w[j - 7] >>> 0) +
  138. gamma1 + (w[j - 16] >>> 0);
  139. }
  140. var ch = e & f ^ ~e & g,
  141. maj = a & b ^ a & c ^ b & c,
  142. sigma0 = ((a << 30) | (a >>> 2)) ^
  143. ((a << 19) | (a >>> 13)) ^
  144. ((a << 10) | (a >>> 22)),
  145. sigma1 = ((e << 26) | (e >>> 6)) ^
  146. ((e << 21) | (e >>> 11)) ^
  147. ((e << 7) | (e >>> 25));
  148. t1 = (h >>> 0) + sigma1 + ch + (K[j]) + (w[j] >>> 0);
  149. t2 = sigma0 + maj;
  150. h = g;
  151. g = f;
  152. f = e;
  153. e = (d + t1) >>> 0;
  154. d = c;
  155. c = b;
  156. b = a;
  157. a = (t1 + t2) >>> 0;
  158. }
  159. // Intermediate hash value
  160. H[0] = (H[0] + a) | 0;
  161. H[1] = (H[1] + b) | 0;
  162. H[2] = (H[2] + c) | 0;
  163. H[3] = (H[3] + d) | 0;
  164. H[4] = (H[4] + e) | 0;
  165. H[5] = (H[5] + f) | 0;
  166. H[6] = (H[6] + g) | 0;
  167. H[7] = (H[7] + h) | 0;
  168. }
  169. return H;
  170. };
  171. self.hashMD5 = [1732584193, -271733879, -1732584194, 271733878];
  172. self.hashSHA256 = [ 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 ];
  173. self.addEventListener('message', function (event) {
  174. var uint8_array, message, block, output, nBitsTotal, nBitsLeft, nBitsTotalH, nBitsTotalL;
  175. uint8_array = new Uint8Array(event.data.message);
  176. var messageMD5 = Crypto.util.endian(Crypto.util.bytesToWords(uint8_array));
  177. var messageSHA256 = Crypto.util.bytesToWords(uint8_array);
  178. block = event.data.block;
  179. event = null;
  180. uint8_array = null;
  181. output = {
  182. 'block' : block
  183. };
  184. if (block.end === block.file_size) {
  185. //MD5
  186. nBitsTotal = block.file_size * 8;
  187. nBitsLeft = (block.end - block.start) * 8;
  188. nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
  189. nBitsTotalL = nBitsTotal & 0xFFFFFFFF;
  190. messageMD5[nBitsLeft >>> 5] |= 0x80 << (nBitsLeft % 32);
  191. messageMD5[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotalH;
  192. messageMD5[(((nBitsLeft + 64) >>> 9) << 4) + 14] = nBitsTotalL;
  193. //SHA256
  194. nBitsTotal = block.file_size * 8;
  195. nBitsLeft = (block.end - block.start) * 8;
  196. nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
  197. nBitsTotalL = nBitsTotal & 0xFFFFFFFF;
  198. messageSHA256[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsTotal % 32);
  199. messageSHA256[((nBitsLeft + 64 >>> 9) << 4) + 14] = nBitsTotalH;
  200. messageSHA256[((nBitsLeft + 64 >>> 9) << 4) + 15] = nBitsTotalL;
  201. self.hashMD5 = md5(messageMD5, self.hashMD5);
  202. self.hashSHA256 = sha256(messageSHA256, self.hashSHA256);
  203. output.result = Crypto.util.bytesToHex(Crypto.util.wordsToBytes(Crypto.util.endian(self.hashMD5)))
  204. +Crypto.util.bytesToHex(Crypto.util.wordsToBytes(self.hashSHA256));
  205. } else {
  206. self.hashMD5 = md5(messageMD5, self.hashMD5);
  207. self.hashSHA256 = sha256(messageSHA256, self.hashSHA256);
  208. }
  209. messageMD5 = null;
  210. messageSHA256 = null;
  211. self.postMessage(output);
  212. }, false);