mirror of
https://github.com/NinjaCheetah/libWiiPy.git
synced 2025-04-25 21:01:01 -04:00
Merge remote-tracking branch 'origin/main'
This commit is contained in:
commit
128f4a9303
@ -49,6 +49,10 @@ def _pad_bytes(data, alignment=64) -> bytes:
|
|||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def _bitmask(x: int) -> int:
|
||||||
|
return 1 << x
|
||||||
|
|
||||||
|
|
||||||
_wii_menu_versions = {
|
_wii_menu_versions = {
|
||||||
"Prelaunch": [0, 1, 2],
|
"Prelaunch": [0, 1, 2],
|
||||||
"1.0J": 64,
|
"1.0J": 64,
|
||||||
|
@ -252,6 +252,27 @@ class Ticket:
|
|||||||
except OverflowError:
|
except OverflowError:
|
||||||
raise Exception("An error occurred during fakesigning. Ticket could not be fakesigned!")
|
raise Exception("An error occurred during fakesigning. Ticket could not be fakesigned!")
|
||||||
|
|
||||||
|
def get_is_fakesigned(self) -> bool:
|
||||||
|
"""
|
||||||
|
Checks the Ticket object to see if it is currently fakesigned. For a description of fakesigning, refer to the
|
||||||
|
fakesign() method.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
bool:
|
||||||
|
True if the Ticket is fakesigned, False otherwise.
|
||||||
|
|
||||||
|
See Also
|
||||||
|
--------
|
||||||
|
libWiiPy.title.ticket.Ticket.fakesign()
|
||||||
|
"""
|
||||||
|
if self.signature != b'\x00' * 256:
|
||||||
|
return False
|
||||||
|
test_hash = hashlib.sha1(self.dump()[320:]).hexdigest()
|
||||||
|
if test_hash[:2] != '00':
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
def get_title_id(self) -> str:
|
def get_title_id(self) -> str:
|
||||||
"""
|
"""
|
||||||
Gets the Title ID of the ticket's associated title.
|
Gets the Title ID of the ticket's associated title.
|
||||||
@ -275,7 +296,7 @@ class Ticket:
|
|||||||
|
|
||||||
See Also
|
See Also
|
||||||
--------
|
--------
|
||||||
commonkeys.get_common_key
|
libWiiPy.title.commonkeys.get_common_key
|
||||||
"""
|
"""
|
||||||
match self.common_key_index:
|
match self.common_key_index:
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -316,3 +316,22 @@ class Title:
|
|||||||
"""
|
"""
|
||||||
self.tmd.fakesign()
|
self.tmd.fakesign()
|
||||||
self.ticket.fakesign()
|
self.ticket.fakesign()
|
||||||
|
|
||||||
|
def get_is_fakesigned(self):
|
||||||
|
"""
|
||||||
|
Checks the Title object to see if it is currently fakesigned. This ensures that both the TMD and Ticket are
|
||||||
|
fakesigned. For a description of fakesigning, refer to the fakesign() method.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
bool:
|
||||||
|
True if the Title is fakesigned, False otherwise.
|
||||||
|
|
||||||
|
See Also
|
||||||
|
--------
|
||||||
|
libWiiPy.title.title.Title.fakesign()
|
||||||
|
"""
|
||||||
|
if self.tmd.get_is_fakesigned and self.ticket.get_is_fakesigned():
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
@ -8,7 +8,9 @@ import binascii
|
|||||||
import hashlib
|
import hashlib
|
||||||
import struct
|
import struct
|
||||||
from typing import List
|
from typing import List
|
||||||
|
from enum import IntEnum
|
||||||
from ..types import _ContentRecord
|
from ..types import _ContentRecord
|
||||||
|
from ..shared import _bitmask
|
||||||
from .util import title_ver_dec_to_standard, title_ver_standard_to_dec
|
from .util import title_ver_dec_to_standard, title_ver_standard_to_dec
|
||||||
|
|
||||||
|
|
||||||
@ -50,7 +52,7 @@ class TMD:
|
|||||||
self.reserved1: bytes = b'' # Unknown data labeled "Reserved" on WiiBrew.
|
self.reserved1: bytes = b'' # Unknown data labeled "Reserved" on WiiBrew.
|
||||||
self.ipc_mask: bytes = b''
|
self.ipc_mask: bytes = b''
|
||||||
self.reserved2: bytes = b'' # Other "Reserved" data from WiiBrew.
|
self.reserved2: bytes = b'' # Other "Reserved" data from WiiBrew.
|
||||||
self.access_rights: bytes = b''
|
self.access_rights: int = 0
|
||||||
self.title_version: int = 0 # The version of the associated title.
|
self.title_version: int = 0 # The version of the associated title.
|
||||||
self.title_version_converted: int = 0 # The title version in vX.X format.
|
self.title_version_converted: int = 0 # The title version in vX.X format.
|
||||||
self.num_contents: int = 0 # The number of contents contained in the associated title.
|
self.num_contents: int = 0 # The number of contents contained in the associated title.
|
||||||
@ -131,7 +133,7 @@ class TMD:
|
|||||||
self.reserved2 = tmd_data.read(18)
|
self.reserved2 = tmd_data.read(18)
|
||||||
# Access rights of the title; DVD-video and AHB access.
|
# Access rights of the title; DVD-video and AHB access.
|
||||||
tmd_data.seek(0x1D8)
|
tmd_data.seek(0x1D8)
|
||||||
self.access_rights = tmd_data.read(4)
|
self.access_rights = int.from_bytes(tmd_data.read(4))
|
||||||
# Version number straight from the TMD.
|
# Version number straight from the TMD.
|
||||||
tmd_data.seek(0x1DC)
|
tmd_data.seek(0x1DC)
|
||||||
self.title_version = int.from_bytes(tmd_data.read(2))
|
self.title_version = int.from_bytes(tmd_data.read(2))
|
||||||
@ -203,7 +205,7 @@ class TMD:
|
|||||||
# "Reserved" 2.
|
# "Reserved" 2.
|
||||||
tmd_data += self.reserved2
|
tmd_data += self.reserved2
|
||||||
# Access rights.
|
# Access rights.
|
||||||
tmd_data += self.access_rights
|
tmd_data += int.to_bytes(self.access_rights, 4)
|
||||||
# Title version.
|
# Title version.
|
||||||
tmd_data += int.to_bytes(self.title_version, 2)
|
tmd_data += int.to_bytes(self.title_version, 2)
|
||||||
# Number of contents.
|
# Number of contents.
|
||||||
@ -255,6 +257,27 @@ class TMD:
|
|||||||
except OverflowError:
|
except OverflowError:
|
||||||
raise Exception("An error occurred during fakesigning. TMD could not be fakesigned!")
|
raise Exception("An error occurred during fakesigning. TMD could not be fakesigned!")
|
||||||
|
|
||||||
|
def get_is_fakesigned(self) -> bool:
|
||||||
|
"""
|
||||||
|
Checks the TMD object to see if it is currently fakesigned. For a description of fakesigning, refer to the
|
||||||
|
fakesign() method.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
bool:
|
||||||
|
True if the TMD is fakesigned, False otherwise.
|
||||||
|
|
||||||
|
See Also
|
||||||
|
--------
|
||||||
|
libWiiPy.title.tmd.TMD.fakesign()
|
||||||
|
"""
|
||||||
|
if self.signature != b'\x00' * 256:
|
||||||
|
return False
|
||||||
|
test_hash = hashlib.sha1(self.dump()[320:]).hexdigest()
|
||||||
|
if test_hash[:2] != '00':
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
def get_title_region(self) -> str:
|
def get_title_region(self) -> str:
|
||||||
"""
|
"""
|
||||||
Gets the region of the TMD's associated title.
|
Gets the region of the TMD's associated title.
|
||||||
@ -367,6 +390,27 @@ class TMD:
|
|||||||
raise IndexError("Invalid content record! TMD lists '" + str(self.num_contents - 1) +
|
raise IndexError("Invalid content record! TMD lists '" + str(self.num_contents - 1) +
|
||||||
"' contents but index was '" + str(record) + "'!")
|
"' contents but index was '" + str(record) + "'!")
|
||||||
|
|
||||||
|
class AccessFlags(IntEnum):
|
||||||
|
AHB = 0
|
||||||
|
DVD_VIDEO = 1
|
||||||
|
|
||||||
|
def get_access_right(self, flag: int) -> bool:
|
||||||
|
"""
|
||||||
|
Gets whether an access rights flag is enabled or not. This is done by checking the specified bit. Possible flags
|
||||||
|
and their corresponding bits are defined in the AccessFlags enum.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
flag : int
|
||||||
|
The flag to check.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
bool
|
||||||
|
True if the flag is enabled, False otherwise.
|
||||||
|
"""
|
||||||
|
return bool(self.access_rights & _bitmask(flag))
|
||||||
|
|
||||||
def set_title_id(self, title_id) -> None:
|
def set_title_id(self, title_id) -> None:
|
||||||
"""
|
"""
|
||||||
Sets the Title ID property of the TMD. Recommended over setting the property directly because of input
|
Sets the Title ID property of the TMD. Recommended over setting the property directly because of input
|
||||||
|
Loading…
x
Reference in New Issue
Block a user