OLD | NEW |
1 # This Source Code Form is subject to the terms of the Mozilla Public | 1 # This Source Code Form is subject to the terms of the Mozilla Public |
2 # License, v. 2.0. If a copy of the MPL was not distributed with this | 2 # License, v. 2.0. If a copy of the MPL was not distributed with this |
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. | 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
4 | 4 |
5 import re | 5 import re |
6 import struct | 6 import struct |
7 import time | 7 import time |
8 import zlib | 8 import zlib |
9 | 9 |
10 from Crypto.Hash import SHA | 10 from Crypto.Hash import SHA |
11 from Crypto.PublicKey import RSA | 11 from Crypto.PublicKey import RSA |
12 from Crypto.Signature import PKCS1_v1_5 | |
13 | 12 |
14 from buildtools.packager import getTemplate | 13 from buildtools.packager import getTemplate |
15 | 14 |
16 XAR_HEADER = struct.Struct('>IHHQQI') | 15 XAR_HEADER = struct.Struct('>IHHQQI') |
17 XAR_HEADER_MAGIC = 0x78617221 | 16 XAR_HEADER_MAGIC = 0x78617221 |
18 XAR_VERSION = 1 | 17 XAR_VERSION = 1 |
19 XAR_CKSUM_SHA1 = 1 | 18 XAR_CKSUM_SHA1 = 1 |
20 | 19 |
21 | 20 |
22 def read_certificates_and_key(keyfile): | 21 def read_certificates_and_key(keyfile): |
(...skipping 16 matching lines...) Expand all Loading... |
39 | 38 |
40 def get_checksum(data): | 39 def get_checksum(data): |
41 return SHA.new(data).digest() | 40 return SHA.new(data).digest() |
42 | 41 |
43 | 42 |
44 def get_hexchecksum(data): | 43 def get_hexchecksum(data): |
45 return SHA.new(data).hexdigest() | 44 return SHA.new(data).hexdigest() |
46 | 45 |
47 | 46 |
48 def get_signature(key, data): | 47 def get_signature(key, data): |
| 48 from Crypto.Signature import PKCS1_v1_5 |
| 49 |
49 return PKCS1_v1_5.new(key).sign(SHA.new(data)) | 50 return PKCS1_v1_5.new(key).sign(SHA.new(data)) |
50 | 51 |
51 | 52 |
52 def compress_files(filedata, root, offset): | 53 def compress_files(filedata, root, offset): |
53 compressed_data = [] | 54 compressed_data = [] |
54 filedata = sorted(filedata.iteritems()) | 55 filedata = sorted(filedata.iteritems()) |
55 directory_stack = [('', root)] | 56 directory_stack = [('', root)] |
56 file_id = 1 | 57 file_id = 1 |
57 for path, data in filedata: | 58 for path, data in filedata: |
58 # Remove directories that are done | 59 # Remove directories that are done |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 len(toc_uncompressed), XAR_CKSUM_SHA1)) | 132 len(toc_uncompressed), XAR_CKSUM_SHA1)) |
132 | 133 |
133 # It's followed up with a compressed XML table of contents | 134 # It's followed up with a compressed XML table of contents |
134 file.write(toc_compressed) | 135 file.write(toc_compressed) |
135 | 136 |
136 # Now the actual data, all the offsets are in the table of contents | 137 # Now the actual data, all the offsets are in the table of contents |
137 file.write(get_checksum(toc_compressed)) | 138 file.write(get_checksum(toc_compressed)) |
138 file.write(get_signature(key, toc_compressed)) | 139 file.write(get_signature(key, toc_compressed)) |
139 for blob in compressed_data: | 140 for blob in compressed_data: |
140 file.write(blob) | 141 file.write(blob) |
OLD | NEW |