Skip to content

Commit a5b4dfa

Browse files
committed
update ciainfo, other things
1 parent 43fd8e3 commit a5b4dfa

File tree

1 file changed

+40
-42
lines changed

1 file changed

+40
-42
lines changed

Diff for: 3dsconv.py

+40-42
Original file line numberDiff line numberDiff line change
@@ -51,43 +51,42 @@
5151
# includes certificate chain, ticket (blank titlekey and title id), and tmd signature + blank header (blank title id)
5252
# + blank content info records
5353
# compressed using zlib then encoded with base64
54-
ciainfo = """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
90-
YtNfNM8GG2ywwQYbbLDB/xS/AbtxR+8="""
54+
ciainfo = """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"""
9190

9291
if len(sys.argv) < 2:
9392
print(helptext % (version, ("current directory" if xorpad_directory == "" else "'%s'" % xorpad_directory),
@@ -332,22 +331,22 @@ def bytes2int(string):
332331
# CIA
333332
with open(rom[2], "wb") as cia:
334333
print_v("- writing CIA header")
335-
chunkrecords = "\x00" * 0xC # 1st content: ID 0x00000000, Index 0x0000
334+
chunkrecords = "\x00" * 0xC # 1st content: ID 0x00000000, Index 0x0000
336335
chunkrecords += struct.pack(">I", gamecxi_size)
337336
chunkrecords += "\x00" * 0x20 # sha256 hash to be filled in later
338337
if manualcfa_offset != 0:
339-
chunkrecords += binascii.unhexlify("000000010001000000000000") # 2nd content: ID 0x00000001, Index 0x0001
338+
chunkrecords += binascii.unhexlify("000000010001000000000000") # 2nd content: ID 0x1, Index 0x1
340339
chunkrecords += struct.pack(">I", manualcfa_size)
341340
chunkrecords += "\x00" * 0x20 # sha256 hash to be filled in later
342341
if dlpchildcfa_offset != 0:
343-
chunkrecords += binascii.unhexlify("000000020002000000000000") # 3nd content: ID 0x00000002, Index 0x0002
342+
chunkrecords += binascii.unhexlify("000000020002000000000000") # 3nd content: ID 0x2, Index 0x2
344343
chunkrecords += struct.pack(">I", dlpchildcfa_size)
345344
chunkrecords += "\x00" * 0x20 # sha256 hash to be filled in later
346345

347346
cia.write(binascii.unhexlify("2020000000000000000A000050030000") + tmdsize
348347
+ struct.pack("<I", gamecxi_size + manualcfa_size + dlpchildcfa_size)
349348
+ ("\x00" * 4) + contentindex + ("\x00" * 0x201F)
350-
+ zlib.decompress(ciainfo.decode('base64'))
349+
+ zlib.decompress(ciainfo.decode('base64')) + ("\x00" * 2412)
351350
+ chunkrecords + tmdpadding)
352351

353352
chunkrecords = list(chunkrecords) # to update hashes in it, then calculate the hash over the entire thing
@@ -412,7 +411,6 @@ def bytes2int(string):
412411
cia.write(manualcfa_hash.digest())
413412
chunkrecords[0x40:0x60] = list(manualcfa_hash.digest())
414413

415-
416414
# Download Play child container CFA
417415
if dlpchildcfa_offset != 0:
418416
cia.seek(0, 2)

0 commit comments

Comments
 (0)