Index: tools/crx_id/crx_id.py |
diff --git a/tools/crx_id/crx_id.py b/tools/crx_id/crx_id.py |
index 299e1d64616a84562e7835b2ce7af33a15a2f206..795ddf21b34f27ff056845d2bded453cf730c3fe 100755 |
--- a/tools/crx_id/crx_id.py |
+++ b/tools/crx_id/crx_id.py |
@@ -1,5 +1,5 @@ |
#!/usr/bin/env python |
-# Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+# Copyright (c) 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. |
@@ -10,14 +10,19 @@ and 'http://stackoverflow.com/questions/' |
for docs on the format. |
""" |
+import base64 |
+import os |
import sys |
import hashlib |
+try: |
+ import json |
+except Exception: |
+ import simplejson as json |
EXPECTED_CRX_MAGIC_NUM = 'Cr24' |
EXPECTED_CRX_VERSION = 2 |
- |
def usage(argv): |
print "%s: crx_file" % argv[0] |
@@ -54,36 +59,55 @@ def HexTo256(hex_chars): |
result.append('0x' + hex(dig1)[2:] + hex(dig2)[2:]) |
return '{%s}' % ', '.join(result) |
-def GetPublicKey(f): |
+def GetPublicKeyPacked(f): |
magic_num = f.read(4) |
if magic_num != EXPECTED_CRX_MAGIC_NUM: |
- raise 'Invalid magic number: %s (expecting %s)' % (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 'Invalid version number: %s (expecting %s)' % (version, |
- EXPECTED_CRX_VERSION) |
+ raise Exception('Invalid version number: %s (expecting %s)' % |
+ (version, |
+ EXPECTED_CRX_VERSION)) |
pub_key_len_bytes = HexToInt(f.read(4)) |
sig_len_bytes = HexToInt(f.read(4)) |
pub_key = f.read(pub_key_len_bytes) |
return pub_key |
+def GetPublicKeyUnpacked(f): |
+ manifest = json.load(f) |
+ if 'key' not in manifest: |
jstritar
2012/03/13 16:55:52
I wonder if you can generate the ID from the file
|
+ raise Exception( |
+ 'Unpacked extension manifest has no key. Cannot compute AppID!') |
+ pub_key = base64.standard_b64decode(manifest['key']) |
+ return pub_key |
+ |
+def GetPublicKey(filename): |
+ 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) |
+ 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): |
- f = open(filename, 'rb') |
- pub_key = GetPublicKey(f) |
- f.close() |
+ pub_key = GetPublicKey(filename) |
pub_key_hash = hashlib.sha256(pub_key).digest() |
return HexTo256(pub_key_hash) |
def GetCRXAppID(filename): |
- f = open(filename, 'rb') |
- pub_key = GetPublicKey(f) |
- f.close() |
+ pub_key = GetPublicKey(filename) |
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]) |
- |
def main(argv): |
if len(argv) != 2: |
usage(argv) |