MCPcopy Create free account
hub / github.com/RPCSX/rpcsx / LoadMetadata

Method LoadMetadata

rpcs3/Crypto/unself.cpp:623–687  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

621}
622
623bool SCEDecrypter::LoadMetadata(const u8 erk[32], const u8 riv[16])
624{
625 aes_context aes;
626 const auto metadata_info = std::make_unique<u8[]>(sizeof(meta_info));
627 const auto metadata_headers_size = sce_hdr.se_hsize - (sizeof(sce_hdr) + sce_hdr.se_meta + sizeof(meta_info));
628 const auto metadata_headers = std::make_unique<u8[]>(metadata_headers_size);
629
630 // Locate and read the encrypted metadata info.
631 sce_f.seek(sce_hdr.se_meta + sizeof(sce_hdr));
632 sce_f.read(metadata_info.get(), sizeof(meta_info));
633
634 // Locate and read the encrypted metadata header and section header.
635 sce_f.seek(sce_hdr.se_meta + sizeof(sce_hdr) + sizeof(meta_info));
636 sce_f.read(metadata_headers.get(), metadata_headers_size);
637
638 // Copy the necessary parameters.
639 u8 metadata_key[0x20];
640 u8 metadata_iv[0x10];
641 memcpy(metadata_key, erk, 0x20);
642 memcpy(metadata_iv, riv, 0x10);
643
644 // Check DEBUG flag.
645 if ((sce_hdr.se_flags & 0x8000) != 0x8000)
646 {
647 // Decrypt the metadata info.
648 aes_setkey_dec(&aes, metadata_key, 256); // AES-256
649 aes_crypt_cbc(&aes, AES_DECRYPT, sizeof(meta_info), metadata_iv, metadata_info.get(), metadata_info.get());
650 }
651
652 // Load the metadata info.
653 meta_info.Load(metadata_info.get());
654
655 // If the padding is not NULL for the key or iv fields, the metadata info
656 // is not properly decrypted.
657 if ((meta_info.key_pad[0] != 0x00) ||
658 (meta_info.iv_pad[0] != 0x00))
659 {
660 self_log.error("Failed to decrypt SCE metadata info!");
661 return false;
662 }
663
664 // Perform AES-CTR encryption on the metadata headers.
665 usz ctr_nc_off = 0;
666 u8 ctr_stream_block[0x10];
667 aes_setkey_enc(&aes, meta_info.key, 128);
668 aes_crypt_ctr(&aes, metadata_headers_size, &ctr_nc_off, meta_info.iv, ctr_stream_block, metadata_headers.get(), metadata_headers.get());
669
670 // Load the metadata header.
671 meta_hdr.Load(metadata_headers.get());
672
673 // Load the metadata section headers.
674 meta_shdr.clear();
675 for (unsigned int i = 0; i < meta_hdr.section_count; i++)
676 {
677 meta_shdr.emplace_back();
678 meta_shdr.back().Load(metadata_headers.get() + sizeof(meta_hdr) + sizeof(MetadataSectionHeader) * i);
679 }
680

Callers 4

installPupFunction · 0.80
extract_tarFunction · 0.80
decrypt_selfFunction · 0.80

Calls 9

errorMethod · 0.80
emplace_backMethod · 0.80
FindSelfKeyMethod · 0.80
SetKlicenseeKeyMethod · 0.80
seekMethod · 0.45
readMethod · 0.45
getMethod · 0.45
LoadMethod · 0.45
clearMethod · 0.45

Tested by

no test coverage detected