Chromium Code Reviews| 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; |
| + } |
| +}; |