Merge remote-tracking branch 'origin/main' into breakdown_wad

This commit is contained in:
Campbell 2024-02-28 09:44:18 -05:00
commit 9614defc2d
No known key found for this signature in database
GPG Key ID: BDEBC4A7A7205F5B

View File

@ -23,14 +23,14 @@ class TMD:
self.sig_type: int self.sig_type: int
self.sig: bytearray self.sig: bytearray
self.issuer: bytearray # Follows the format "Root-CA%08x-CP%08x" self.issuer: bytearray # Follows the format "Root-CA%08x-CP%08x"
self.version: bytearray # This seems to always be 0 no matter what? self.version: int # This seems to always be 0 no matter what?
self.ca_crl_version: int self.ca_crl_version: int
self.signer_crl_version: int self.signer_crl_version: int
self.vwii: int self.vwii: int
self.ios_tid: str self.ios_tid: str
self.ios_version: int self.ios_version: int
self.title_id: str self.title_id: str
self.title_type: str self.content_type: str
self.group_id: int # Publisher of the title self.group_id: int # Publisher of the title
self.region: int self.region: int
self.ratings: int self.ratings: int
@ -44,9 +44,9 @@ class TMD:
# Signing certificate issuer # Signing certificate issuer
tmdfile.seek(0x140) tmdfile.seek(0x140)
self.issuer = tmdfile.read(64) self.issuer = tmdfile.read(64)
# TMD version, always seems to be 0? # TMD version, seems to usually be 0, but I've seen references to other numbers
tmdfile.seek(0x180) tmdfile.seek(0x180)
self.version = tmdfile.read(1) self.version = int.from_bytes(tmdfile.read(1))
# TODO: label # TODO: label
tmdfile.seek(0x181) tmdfile.seek(0x181)
self.ca_crl_version = tmdfile.read(1) self.ca_crl_version = tmdfile.read(1)
@ -68,11 +68,11 @@ class TMD:
title_id_bin = tmdfile.read(8) title_id_bin = tmdfile.read(8)
title_id_hex = binascii.hexlify(title_id_bin) title_id_hex = binascii.hexlify(title_id_bin)
self.title_id = str(title_id_hex.decode()) self.title_id = str(title_id_hex.decode())
# Type of title # Type of content
tmdfile.seek(0x194) tmdfile.seek(0x194)
title_type_bin = tmdfile.read(4) content_type_bin = tmdfile.read(4)
title_type_hex = binascii.hexlify(title_type_bin) content_type_hex = binascii.hexlify(content_type_bin)
self.title_type = str(title_type_hex.decode()) self.content_type = str(content_type_hex.decode())
# Publisher of the title # Publisher of the title
tmdfile.seek(0x198) tmdfile.seek(0x198)
self.group_id = tmdfile.read(2) self.group_id = tmdfile.read(2)
@ -94,7 +94,7 @@ class TMD:
self.title_version = title_version_high + title_version_low self.title_version = title_version_high + title_version_low
# The number of contents listed in the TMD # The number of contents listed in the TMD
tmdfile.seek(0x1DE) tmdfile.seek(0x1DE)
self.num_contents = tmdfile.read(2) self.num_contents = int.from_bytes(tmdfile.read(2))
# Content index in content list that contains the boot file # Content index in content list that contains the boot file
tmdfile.seek(0x1E0) tmdfile.seek(0x1E0)
self.boot_index = tmdfile.read(2) self.boot_index = tmdfile.read(2)
@ -128,6 +128,10 @@ class TMD:
else: else:
return False return False
def get_tmd_version(self):
"""Returns the version of the TMD."""
return self.version
def get_required_ios_tid(self): def get_required_ios_tid(self):
"""Returns the TID of the required IOS for the title.""" """Returns the TID of the required IOS for the title."""
return self.ios_tid return self.ios_tid
@ -154,3 +158,25 @@ class TMD:
return "DLC" return "DLC"
case '00010008': case '00010008':
return "HiddenChannel" return "HiddenChannel"
case _:
return "Unknown"
def get_content_type(self):
"""Returns the type of content contained in the TMD's associated title."""
match self.content_type:
case '00000001':
return "Normal"
case '00000002':
return "Development/Unknown"
case '00000003':
return "Hash Tree"
case '00004001':
return "DLC"
case '00008001':
return "Shared"
case _:
return "Unknown"
def get_num_contents(self):
"""Returns the number of contents listed in the TMD."""
return self.num_contents