Index: tools/telemetry/telemetry/internal/backends/chrome/crx_id.py |
diff --git a/tools/telemetry/telemetry/internal/backends/chrome/crx_id.py b/tools/telemetry/telemetry/internal/backends/chrome/crx_id.py |
deleted file mode 100644 |
index 21d17a28b240211a96cb77adc3ae9c072996a121..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/telemetry/internal/backends/chrome/crx_id.py |
+++ /dev/null |
@@ -1,130 +0,0 @@ |
-# Copyright 2012 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-""" Read a CRX file and write out the App ID and the Full Hash of the ID. |
-See: http://code.google.com/chrome/extensions/crx.html |
-and 'http://stackoverflow.com/questions/' |
- + '1882981/google-chrome-alphanumeric-hashes-to-identify-extensions' |
-for docs on the format. |
-""" |
- |
-import base64 |
-import os |
-import hashlib |
-import json |
- |
-EXPECTED_CRX_MAGIC_NUM = 'Cr24' |
-EXPECTED_CRX_VERSION = 2 |
- |
-def HexToInt(hex_chars): |
- """ Convert bytes like \xab -> 171 """ |
- val = 0 |
- for i in xrange(len(hex_chars)): |
- val += pow(256, i) * ord(hex_chars[i]) |
- return val |
- |
-def HexToMPDecimal(hex_chars): |
- """ Convert bytes to an MPDecimal string. Example \x00 -> "aa" |
- This gives us the AppID for a chrome extension. |
- """ |
- result = '' |
- base = ord('a') |
- for i in xrange(len(hex_chars)): |
- value = ord(hex_chars[i]) |
- dig1 = value / 16 |
- dig2 = value % 16 |
- result += chr(dig1 + base) |
- result += chr(dig2 + base) |
- return result |
- |
-def HexTo256(hex_chars): |
- """ Convert bytes to pairs of hex digits. E.g., \x00\x11 -> "{0x00, 0x11}" |
- The format is taylored for copy and paste into C code: |
- const uint8 sha256_hash[] = { ... }; """ |
- result = [] |
- for i in xrange(len(hex_chars)): |
- value = ord(hex_chars[i]) |
- dig1 = value / 16 |
- dig2 = value % 16 |
- result.append('0x' + hex(dig1)[2:] + hex(dig2)[2:]) |
- return '{%s}' % ', '.join(result) |
- |
-def GetPublicKeyPacked(f): |
- magic_num = f.read(4) |
- if magic_num != EXPECTED_CRX_MAGIC_NUM: |
- raise Exception('Invalid magic number: %s (expecting %s)' % |
- (magic_num, |
- EXPECTED_CRX_MAGIC_NUM)) |
- version = f.read(4) |
- if not version[0] != EXPECTED_CRX_VERSION: |
- raise Exception('Invalid version number: %s (expecting %s)' % |
- (version, |
- EXPECTED_CRX_VERSION)) |
- pub_key_len_bytes = HexToInt(f.read(4)) |
- f.read(4) |
- return f.read(pub_key_len_bytes) |
- |
-def GetPublicKeyFromPath(filepath, is_win_path=False): |
- # Normalize the path for windows to have capital drive letters. |
- # We intentionally don't check if sys.platform == 'win32' and just |
- # check if this looks like drive letter so that we can test this |
- # even on posix systems. |
- if (len(filepath) >= 2 and |
- filepath[0].islower() and |
- filepath[1] == ':'): |
- filepath = filepath[0].upper() + filepath[1:] |
- |
- # On Windows, filepaths are encoded using UTF-16, little endian byte order, |
- # using "wide characters" that are 16 bits in size. On POSIX systems, the |
- # encoding is generally UTF-8, which has the property of being equivalent to |
- # ASCII when only ASCII characters are in the path. |
- if is_win_path: |
- filepath = filepath.encode('utf-16le') |
- |
- return filepath |
- |
-def GetPublicKeyUnpacked(f, filepath): |
- manifest = json.load(f) |
- if 'key' not in manifest: |
- # Use the path as the public key. |
- # See Extension::GenerateIdForPath in extension.cc |
- return GetPublicKeyFromPath(filepath) |
- else: |
- return base64.standard_b64decode(manifest['key']) |
- |
-def HasPublicKey(filename): |
- if os.path.isdir(filename): |
- with open(os.path.join(filename, 'manifest.json'), 'rb') as f: |
- manifest = json.load(f) |
- return 'key' in manifest |
- return False |
- |
-def GetPublicKey(filename, from_file_path, is_win_path=False): |
- if from_file_path: |
- return GetPublicKeyFromPath( |
- filename, is_win_path=is_win_path) |
- |
- pub_key = '' |
- if os.path.isdir(filename): |
- # Assume it's an unpacked extension |
- f = open(os.path.join(filename, 'manifest.json'), 'rb') |
- pub_key = GetPublicKeyUnpacked(f, filename) |
- f.close() |
- else: |
- # Assume it's a packed extension. |
- f = open(filename, 'rb') |
- pub_key = GetPublicKeyPacked(f) |
- f.close() |
- return pub_key |
- |
-def GetCRXHash(filename, from_file_path=False, is_win_path=False): |
- pub_key = GetPublicKey(filename, from_file_path, is_win_path=is_win_path) |
- pub_key_hash = hashlib.sha256(pub_key).digest() |
- return HexTo256(pub_key_hash) |
- |
-def GetCRXAppID(filename, from_file_path=False, is_win_path=False): |
- pub_key = GetPublicKey(filename, from_file_path, is_win_path=is_win_path) |
- pub_key_hash = hashlib.sha256(pub_key).digest() |
- # AppID is the MPDecimal of only the first 128 bits of the hash. |
- return HexToMPDecimal(pub_key_hash[:128/8]) |