@@ -66,7 +66,7 @@ bool package_reader::read_header()
66
66
}
67
67
68
68
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
70
70
pkg_log.notice (" Header: pkg_type = 0x%x = %d" , m_header.pkg_type , m_header.pkg_type );
71
71
pkg_log.notice (" Header: pkg_platform = 0x%x = %d" , m_header.pkg_platform , m_header.pkg_platform );
72
72
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()
93
93
return false ;
94
94
}
95
95
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 ));
97
97
pkg_log.notice (" Extended header: unknown_1 = 0x%x = %d" , ext_header.unknown_1 , ext_header.unknown_1 );
98
98
pkg_log.notice (" Extended header: ext_hdr_size = 0x%x = %d" , ext_header.ext_hdr_size , ext_header.ext_hdr_size );
99
99
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()
306
306
if (packet.size == sizeof (m_metadata.qa_digest ))
307
307
{
308
308
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 )) );
310
310
continue ;
311
311
}
312
312
else
@@ -494,11 +494,33 @@ bool package_reader::decrypt_data()
494
494
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 );
495
495
aes_crypt_ecb (&ctx, AES_ENCRYPT, reinterpret_cast <const uchar*>(&m_header.klicensee ), m_dec_key.data ());
496
496
decrypt (0 , m_header.file_count * sizeof (PKGEntry), m_dec_key.data ());
497
+ return true ;
497
498
}
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 :
499
519
{
500
520
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
+ }
502
524
}
503
525
504
526
return true ;
0 commit comments