Skip to content

Commit b06e347

Browse files
committed
unpkg: Add support for IDU packages
1 parent e72cb68 commit b06e347

File tree

1 file changed

+27
-5
lines changed

1 file changed

+27
-5
lines changed

rpcs3/Crypto/unpkg.cpp

+27-5
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ bool package_reader::read_header()
6666
}
6767

6868
pkg_log.notice("Path: '%s'", m_path);
69-
pkg_log.notice("Header: pkg_magic = 0x%x = \"%s\"", +m_header.pkg_magic, std::string_view(reinterpret_cast<const char*>(&m_header.pkg_magic + 1), 3)); // Skip 0x7F
69+
pkg_log.notice("Header: pkg_magic = 0x%x = \"%s\"", +m_header.pkg_magic, std::string_view(reinterpret_cast<const char*>(&m_header.pkg_magic), 4).substr(1)); // Skip 0x7F
7070
pkg_log.notice("Header: pkg_type = 0x%x = %d", m_header.pkg_type, m_header.pkg_type);
7171
pkg_log.notice("Header: pkg_platform = 0x%x = %d", m_header.pkg_platform, m_header.pkg_platform);
7272
pkg_log.notice("Header: meta_offset = 0x%x = %d", m_header.meta_offset, m_header.meta_offset);
@@ -93,7 +93,7 @@ bool package_reader::read_header()
9393
return false;
9494
}
9595

96-
pkg_log.notice("Extended header: magic = 0x%x = \"%s\"", +ext_header.magic, std::string_view(reinterpret_cast<const char*>(&ext_header.magic + 1), 3));
96+
pkg_log.notice("Extended header: magic = 0x%x = \"%s\"", +ext_header.magic, std::string_view(reinterpret_cast<const char*>(&ext_header.magic), 4).substr(1));
9797
pkg_log.notice("Extended header: unknown_1 = 0x%x = %d", ext_header.unknown_1, ext_header.unknown_1);
9898
pkg_log.notice("Extended header: ext_hdr_size = 0x%x = %d", ext_header.ext_hdr_size, ext_header.ext_hdr_size);
9999
pkg_log.notice("Extended header: ext_data_size = 0x%x = %d", ext_header.ext_data_size, ext_header.ext_data_size);
@@ -306,7 +306,7 @@ bool package_reader::read_metadata()
306306
if (packet.size == sizeof(m_metadata.qa_digest))
307307
{
308308
archive_read(&m_metadata.qa_digest, sizeof(m_metadata.qa_digest));
309-
pkg_log.notice("Metadata: QA Digest = 0x%x", m_metadata.qa_digest);
309+
pkg_log.notice("Metadata: QA Digest = %s", std::span<const u8>(m_metadata.qa_digest, sizeof(m_metadata.qa_digest)));
310310
continue;
311311
}
312312
else
@@ -494,11 +494,33 @@ bool package_reader::decrypt_data()
494494
aes_setkey_enc(&ctx, m_metadata.content_type == 0x15u ? PKG_AES_KEY_VITA_1 : m_metadata.content_type == 0x16u ? PKG_AES_KEY_VITA_2 : PKG_AES_KEY_VITA_3, 128);
495495
aes_crypt_ecb(&ctx, AES_ENCRYPT, reinterpret_cast<const uchar*>(&m_header.klicensee), m_dec_key.data());
496496
decrypt(0, m_header.file_count * sizeof(PKGEntry), m_dec_key.data());
497+
return true;
497498
}
498-
else
499+
500+
switch (m_metadata.package_revision.data.make_package_npdrm_ver[0])
501+
{
502+
case 0x15:
503+
{
504+
if (!!(read_from_ptr<u128>(m_metadata.qa_digest) | read_from_ptr<u64>(m_metadata.qa_digest + 16)))
505+
{
506+
pkg_log.error("IDU PKG contains QA Digest!");
507+
}
508+
509+
std::memcpy(m_dec_key.data(), PKG_AES_KEY_IDU, m_dec_key.size());
510+
decrypt(0, m_header.file_count * sizeof(PKGEntry), m_dec_key.data());
511+
break;
512+
}
513+
default:
514+
{
515+
pkg_log.error("Unknown NPDRM package version: 0x%x", read_from_ptr<be_t<u16>>(m_metadata.package_revision.data.make_package_npdrm_ver));
516+
[[fallthrough]];
517+
}
518+
case 0x19:
499519
{
500520
std::memcpy(m_dec_key.data(), PKG_AES_KEY, m_dec_key.size());
501-
decrypt(0, m_header.file_count * sizeof(PKGEntry), m_header.pkg_platform == PKG_PLATFORM_TYPE_PSP_PSVITA ? PKG_AES_KEY2 : m_dec_key.data());
521+
decrypt(0, m_header.file_count * sizeof(PKGEntry), m_header.pkg_platform == PKG_PLATFORM_TYPE_PSP_PSVITA ? PKG_AES_KEY2 : m_dec_key.data());\
522+
break;
523+
}
502524
}
503525

504526
return true;

0 commit comments

Comments
 (0)