This makes 00000001.app work

This commit is contained in:
Campbell 2024-03-03 22:05:30 -05:00
parent 413b7a371f
commit b3923cfe40
2 changed files with 9 additions and 8 deletions

View File

@ -35,7 +35,7 @@ class ContentRegion:
self.num_contents = len(self.content_records) self.num_contents = len(self.content_records)
# Calculate the offsets of each content in the content region. # Calculate the offsets of each content in the content region.
for content in self.content_records[:-1]: for content in self.content_records[:-1]:
start_offset = int(16 * round(content.content_size / 16)) + self.content_start_offsets[-1] start_offset = int(64 * round(content.content_size / 64)) + self.content_start_offsets[-1]
self.content_start_offsets.append(start_offset) self.content_start_offsets.append(start_offset)
def get_enc_content(self, index: int) -> bytes: def get_enc_content(self, index: int) -> bytes:
@ -55,7 +55,7 @@ class ContentRegion:
# Seek to the start of the requested content based on the list of offsets. # Seek to the start of the requested content based on the list of offsets.
content_region_data.seek(self.content_start_offsets[index]) content_region_data.seek(self.content_start_offsets[index])
# Calculate the number of bytes we need to read by rounding the size to the nearest 16 bytes. # Calculate the number of bytes we need to read by rounding the size to the nearest 16 bytes.
bytes_to_read = int(16 * round(self.content_records[index].content_size / 16)) bytes_to_read = int(64 * round(self.content_records[index].content_size / 64))
# Read the file based on the size of the content in the associated record. # Read the file based on the size of the content in the associated record.
content_enc = content_region_data.read(bytes_to_read) content_enc = content_region_data.read(bytes_to_read)
return content_enc return content_enc
@ -77,7 +77,7 @@ class ContentRegion:
""" """
# Load the encrypted content at the specified index and then decrypt it with the Title Key. # Load the encrypted content at the specified index and then decrypt it with the Title Key.
content_enc = self.get_enc_content(index) content_enc = self.get_enc_content(index)
content_dec = decrypt_content(content_enc, title_key, self.content_records[index].index) content_dec = decrypt_content(content_enc, title_key, self.content_records[index].index, self.content_records[index].content_size)
# Hash the decrypted content and ensure that the hash matches the one in its Content Record. # Hash the decrypted content and ensure that the hash matches the one in its Content Record.
# If it does not, then something has gone wrong in the decryption, and an error will be thrown. # If it does not, then something has gone wrong in the decryption, and an error will be thrown.
content_dec_hash = hashlib.sha1(content_dec) content_dec_hash = hashlib.sha1(content_dec)

View File

@ -39,7 +39,7 @@ def decrypt_title_key(title_key_enc, common_key_index, title_id):
return title_key return title_key
def decrypt_content(content_enc, title_key, content_index): def decrypt_content(content_enc, title_key, content_index, content_length):
"""Gets the decrypted version of the encrypted content. """Gets the decrypted version of the encrypted content.
Requires the index of the common key to use, and the Title ID of the title that the Title Key is for. Requires the index of the common key to use, and the Title ID of the title that the Title Key is for.
@ -62,15 +62,16 @@ def decrypt_content(content_enc, title_key, content_index):
content_index_bin += b'\x00' content_index_bin += b'\x00'
# In CBC mode, content must be padded out to a 16-byte boundary, so do that here, and then remove bytes added after. # In CBC mode, content must be padded out to a 16-byte boundary, so do that here, and then remove bytes added after.
padded = False padded = False
if (len(content_enc) % 64) != 0: if (len(content_enc) % 128) != 0:
print("needs padding to 16 bytes") print("needs padding to 16 bytes")
content_enc = pad(content_enc, 64, "pkcs7") content_enc = pad(content_enc, 128, "pkcs7")
padded = True padded = True
# Create a new AES object with the values provided, with the content's unique ID as the IV. # Create a new AES object with the values provided, with the content's unique ID as the IV.
aes = AES.new(title_key, AES.MODE_CBC, content_index_bin) aes = AES.new(title_key, AES.MODE_CBC, content_index_bin)
# Decrypt the content using the AES object. # Decrypt the content using the AES object.
content_dec = aes.decrypt(content_enc) content_dec = aes.decrypt(content_enc)
# Remove padding bytes, if any were added. # Remove padding bytes, if any were added.
#if padded: if padded:
#content_dec = unpad(content_dec, AES.block_size) while len(content_dec) > content_length:
content_dec = content_dec[:-1]
return content_dec return content_dec