Editing Talk:Package Files
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 4: | Line 4: | ||
<source lang="python"> | <source lang="python"> | ||
# UnPKG rev | # UnPKG rev 0x00000007 (public edition), (c) flatz | ||
import sys, os, hashlib, hmac, struct | import sys, os, hashlib, hmac, struct, traceback | ||
from cStringIO import StringIO | from cStringIO import StringIO | ||
Line 89: | Line 89: | ||
CONTENT_ID_SIZE = 0x24 | CONTENT_ID_SIZE = 0x24 | ||
SHA256_HASH_SIZE = 0x20 | SHA256_HASH_SIZE = 0x20 | ||
FILE_TYPE_FLAGS_RETAIL = 1 << 31 | FILE_TYPE_FLAGS_RETAIL = 1 << 31 | ||
ENTRY_TYPE_DIGEST_TABLE = 0x0001 | ENTRY_TYPE_DIGEST_TABLE = 0x0001 | ||
ENTRY_TYPE_META_TABLE = 0x0100 | ENTRY_TYPE_META_TABLE = 0x0100 | ||
ENTRY_TYPE_NAME_TABLE = 0x0200 | ENTRY_TYPE_NAME_TABLE = 0x0200 | ||
Line 106: | Line 102: | ||
ENTRY_TABLE_MAP = { | ENTRY_TABLE_MAP = { | ||
ENTRY_TYPE_DIGEST_TABLE: '.digests', | ENTRY_TYPE_DIGEST_TABLE: '.digests', | ||
ENTRY_TYPE_META_TABLE: '.meta', | ENTRY_TYPE_META_TABLE: '.meta', | ||
ENTRY_TYPE_NAME_TABLE: '.names', | ENTRY_TYPE_NAME_TABLE: '.names', | ||
Line 124: | Line 117: | ||
0x1200: 'icon0.png', | 0x1200: 'icon0.png', | ||
0x1220: 'pic0.png', | 0x1220: 'pic0.png', | ||
0x1260: 'changeinfo/changeinfo.xml', | 0x1260: 'changeinfo/changeinfo.xml', | ||
} | } | ||
Line 157: | Line 149: | ||
pkg_file.seek(0x10) # FIXME: or maybe uint16 at 0x16??? | pkg_file.seek(0x10) # FIXME: or maybe uint16 at 0x16??? | ||
num_table_entries = read_uint32_be(pkg_file) | num_table_entries = read_uint32_be(pkg_file) | ||
pkg_file.seek(0x18) | pkg_file.seek(0x18) | ||
file_table_offset = read_uint32_be(pkg_file) | file_table_offset = read_uint32_be(pkg_file) | ||
pkg_file.seek(0x40) | pkg_file.seek(0x40) | ||
Line 182: | Line 158: | ||
raise MyError('invalid content id') | raise MyError('invalid content id') | ||
pkg_file.seek( | pkg_file.seek(0x140) | ||
digest_table_digest = pkg_file.read(SHA256_HASH_SIZE) | digest_table_digest = pkg_file.read(SHA256_HASH_SIZE) | ||
table_entries = [] | table_entries = [] | ||
pkg_file.seek(file_table_offset) | pkg_file.seek(file_table_offset) | ||
for i in xrange(num_table_entries): | for i in xrange(num_table_entries): | ||
entry = FileTableEntry() | entry = FileTableEntry() | ||
entry.read(pkg_file) | entry.read(pkg_file) | ||
table_entries.append(entry) | table_entries.append(entry) | ||
Line 237: | Line 204: | ||
entry_digests = pkg_file.read(entry.size) | entry_digests = pkg_file.read(entry.size) | ||
computed_digest_table_digest = None | |||
computed_entry_digests = '\x00' * 32 | |||
computed_digest_table_digest = | |||
computed_entry_digests = '\x00' * | |||
for i in xrange(num_table_entries): | for i in xrange(num_table_entries): | ||
entry = table_entries[i] | entry = table_entries[i] | ||
Line 281: | Line 217: | ||
data = pkg_file.read(entry.size) | data = pkg_file.read(entry.size) | ||
entry_file.write(data) | entry_file.write(data) | ||
if entry.type != ENTRY_TYPE_DIGEST_TABLE: | |||
computed_entry_digests += sha256(data) | |||
else: | |||
computed_digest_table_digest = sha256(data) | |||
is_digests_valid = computed_entry_digests == entry_digests and computed_digest_table_digest == digest_table_digest | |||
is_digests_valid = | |||
print 'File information:' | print 'File information:' |