diff --git a/tools/psptools/psptool/kirk.py b/tools/psptools/psptool/kirk.py index 68f4890..8bad818 100644 --- a/tools/psptools/psptool/kirk.py +++ b/tools/psptools/psptool/kirk.py @@ -218,8 +218,10 @@ def kirk1_encrypt_ecdsa(data, salt=b'', key=None): key = Random.get_random_bytes(16) # pad to 16 byte boundary if required - padding = padding = b'\x00' * \ - (0x10-(len(data) % 16)) if len(data) % 16 else b'' + padding = b'' + if len(data) % 16: + for i in range(15, len(data) % 16-1, -1): + padding += bytes([i << 4 | i]) # encrypt the data aes = AES.new(key, AES.MODE_CBC, iv=b'\x00'*16) @@ -246,8 +248,10 @@ def kirk1_encrypt_cmac(data, salt=b'', aes_key=None, cmac_key=None): cmac_key = Random.get_random_bytes(16) # pad to 16 byte boundary if required - padding = padding = b'\x00' * \ - (0x10-(len(data) % 16)) if len(data) % 16 else b'' + padding = b'' + if len(data) % 16: + for i in range(15, len(data) % 16-1, -1): + padding += bytes([i << 4 | i]) # encrypt the data aes = AES.new(aes_key, AES.MODE_CBC, iv=b'\x00'*16) diff --git a/tools/psptools/psptool/pack.py b/tools/psptools/psptool/pack.py index 94e11f0..cc636d1 100644 --- a/tools/psptools/psptool/pack.py +++ b/tools/psptools/psptool/pack.py @@ -250,4 +250,4 @@ def pack_prx(executable, is_pbp, fix_relocs=True, psptag=psptag_default, oetag=o psp_header.psptag = psptag(exec_type) psp_header.oetag = oetag(exec_type) - return psp_header.pack() + compressed_exec + padding + return psp_header.pack() + compressed_exec diff --git a/tools/psptools/psptool/prx.py b/tools/psptools/psptool/prx.py index 1c00412..c14d572 100644 --- a/tools/psptools/psptool/prx.py +++ b/tools/psptools/psptool/prx.py @@ -195,7 +195,36 @@ 0x4C9414F0: { 'key': 0x43, 'seed': '45EF5C5DED81998412948FABE8056D7D', - 'decrypt': type2.decrypt + 'decrypt': type2.decrypt, + 'encrypt': type2.encrypt + }, + + 0x4C9416F0: { + 'key': 0x43, + 'seed': 'EB1B530B624932581F830AF4993D75D0', + 'decrypt': type2.decrypt, + 'encrypt': type2.encrypt + }, + + 0x4C9417F0: { + 'key': 0x43, + 'seed': 'BAE2A31207FF041B64A51185F72F995B', + 'decrypt': type2.decrypt, + 'encrypt': type2.encrypt + }, + + 0x4C941FF0: { + 'key': 0x43, + 'seed': '2C8EAF1DFF79731AAD96AB09EA35598B', + 'decrypt': type2.decrypt, + 'encrypt': type2.encrypt + }, + + 0x38020AF0: { + 'key': 0x5A, + 'seed': 'AB8225D7436F6CC195C5F7F063733FE7', + 'decrypt': type2.decrypt, + 'encrypt': type2.encrypt } } diff --git a/tools/psptools/psptool/prxtypes/type2.py b/tools/psptools/psptool/prxtypes/type2.py index f187c20..9b0521b 100644 --- a/tools/psptools/psptool/prxtypes/type2.py +++ b/tools/psptools/psptool/prxtypes/type2.py @@ -128,23 +128,24 @@ def encrypt(prx, meta, id=None): id = kirk.kirk7(id, meta['key']) # create a prx header - prx_header = prx_header_2() - prx_header.set_elf_info(prx[:0x80]) - prx_header.set_kirk_block(header) - prx_header.set_kirk_metadata(encrypted[0x70:0x80]) - prx_header.set_btcnf_id(id) - prx_header.set_tag(prx[0xD0:0xD4]) + p = prx_header_2() + p.set_elf_info(prx[:0x80]) + p.set_kirk_block(header) + p.set_kirk_metadata(encrypted[0x70:0x80]) + p.set_btcnf_id(id) + p.set_tag(prx[0xD0:0xD4]) # calculate SHA1 of header h = SHA1.new() - h.update(prx_header.tag()) + h.update(p.tag()) h.update(xorbuf[:0x10]) h.update(b'\x00'*0x58) - h.update(prx_header.btcnf_id()) - h.update(prx_header.kirk_metadata()) - h.update(prx_header.elf_info()) - prx_header.set_sha1_hash(h.digest()) + h.update(p.btcnf_id()) + h.update(p.kirk_block()) + h.update(p.kirk_metadata()) + h.update(p.elf_info()) + p.set_sha1_hash(h.digest()) # encrypt the header and return the complete PRX - prx_header.encrypt_header(meta['key']) - return prx_header.prx() + encrypted[0x90+0x80:] + p.encrypt_header(meta['key']) + return p.prx() + encrypted[0x90+0x80:]