Index: third_party/WebKit/Source/devtools/front_end/product_registry/sha1.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/product_registry/sha1.js b/third_party/WebKit/Source/devtools/front_end/product_registry/sha1.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ad79cc06fcf544696c5a4fd7bb36f01c866ba132 |
--- /dev/null |
+++ b/third_party/WebKit/Source/devtools/front_end/product_registry/sha1.js |
@@ -0,0 +1,144 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
caseq
2017/03/22 23:56:42
Please just keep the original copyright.
allada
2017/03/23 01:26:16
Done.
|
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+/* |
+ * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined |
+ * in FIPS PUB 180-1 |
+ * Version 2.1a Copyright Paul Johnston 2000 - 2002. |
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet |
+ * Distributed under the BSD License |
+ * See http://pajhome.org.uk/crypt/md5 for details. |
+ */ |
+/** |
+ * @param {string} str |
+ * @return {string} |
+ */ |
+ProductRegistry.sha1 = function(str) { |
+ return binb2hex(core_sha1(str2binb(str), str.length * 8)); |
+ |
+ /** |
+ * Calculate the SHA-1 of an array of big-endian words, and a bit length |
+ * @param {!Array<number>} x |
+ * @param {number} len |
+ * @return {!Array<number>} |
+ */ |
+ function core_sha1(x, len) { |
+ /* append padding */ |
+ x[len >> 5] |= 0x80 << (24 - len % 32); |
+ x[((len + 64 >> 9) << 4) + 15] = len; |
+ |
+ var w = Array(80); |
+ var a = 1732584193; |
+ var b = -271733879; |
+ var c = -1732584194; |
+ var d = 271733878; |
+ var e = -1009589776; |
+ |
+ for (var i = 0; i < x.length; i += 16) { |
+ var olda = a; |
+ var oldb = b; |
+ var oldc = c; |
+ var oldd = d; |
+ var olde = e; |
+ |
+ for (var j = 0; j < 80; j++) { |
+ if (j < 16) |
+ w[j] = x[i + j]; |
+ else |
+ w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1); |
+ var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j))); |
+ e = d; |
+ d = c; |
+ c = rol(b, 30); |
+ b = a; |
+ a = t; |
+ } |
+ |
+ a = safe_add(a, olda); |
+ b = safe_add(b, oldb); |
+ c = safe_add(c, oldc); |
+ d = safe_add(d, oldd); |
+ e = safe_add(e, olde); |
+ } |
+ return Array(a, b, c, d, e); |
+ } |
+ |
+ /** |
+ * Perform the appropriate triplet combination function for the current |
+ * iteration |
+ * @param {number} t |
+ * @param {number} b |
+ * @param {number} c |
+ * @param {number} d |
+ * @return {number} |
+ */ |
+ function sha1_ft(t, b, c, d) { |
+ if (t < 20) |
+ return (b & c) | ((~b) & d); |
+ if (t < 40) |
+ return b ^ c ^ d; |
+ if (t < 60) |
+ return (b & c) | (b & d) | (c & d); |
+ return b ^ c ^ d; |
+ } |
+ |
+ /** |
+ * Determine the appropriate additive constant for the current iteration |
+ * @param {number} t |
+ * @return {number} |
+ */ |
+ function sha1_kt(t) { |
+ return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514; |
+ } |
+ |
+ /** |
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally |
+ * to work around bugs in some JS interpreters. |
+ * @param {number} x |
+ * @param {number} y |
+ * @return {number} |
+ */ |
+ function safe_add(x, y) { |
+ var lsw = (x & 0xFFFF) + (y & 0xFFFF); |
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16); |
+ return (msw << 16) | (lsw & 0xFFFF); |
+ } |
+ |
+ /** |
+ * Bitwise rotate a 32-bit number to the left. |
+ * @param {number} num |
+ * @param {number} cnt |
+ */ |
+ function rol(num, cnt) { |
+ return (num << cnt) | (num >>> (32 - cnt)); |
+ } |
+ |
+ /** |
+ * Convert an 8-bit or 16-bit string to an array of big-endian words |
+ * In 8-bit function, characters >255 have their hi-byte silently ignored. |
+ * @param {string} str |
+ * @return {!Array<number>} |
+ */ |
+ function str2binb(str) { |
+ var bin = Array(); |
+ var mask = 255; |
+ for (var i = 0; i < str.length * 8; i += 8) |
+ bin[i >> 5] |= (str.charCodeAt(i / 8) & mask) << (32 - 8 - i % 32); |
+ return bin; |
+ } |
+ |
+ /** |
+ * Convert an array of big-endian words to a hex string. |
+ * @param {!Array<number>} binarray |
+ * @return {string} |
+ */ |
+ function binb2hex(binarray) { |
+ const hex_tab = '0123456789abcdef'; |
+ var str = ''; |
+ for (var i = 0; i < binarray.length * 4; i++) { |
+ str += hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + |
+ hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF); |
+ } |
+ return str; |
+ } |
+}; |