Minor formatting

This commit is contained in:
Raul Tambre 2015-07-26 11:14:56 +03:00 committed by Nekotekina
parent 6ef4cecf57
commit 14897b23b7
7 changed files with 120 additions and 33 deletions

View file

@ -82,7 +82,8 @@ void AutoPause::Reload(void)
initialized = true; initialized = true;
} }
void AutoPause::TryPause(u32 code) { void AutoPause::TryPause(u32 code)
{
if (code < 1024) if (code < 1024)
{ {
//Would first check Enable setting. Then the list length. //Would first check Enable setting. Then the list length.

View file

@ -773,27 +773,34 @@ void rap_to_rif(unsigned char* rap, unsigned char* rif)
aes_crypt_cbc(&aes, AES_DECRYPT, 0x10, iv, rap, key); aes_crypt_cbc(&aes, AES_DECRYPT, 0x10, iv, rap, key);
// rap2rifkey round. // rap2rifkey round.
for (round = 0; round < 5; ++round) { for (round = 0; round < 5; ++round)
for (i = 0; i < 16; ++i) { {
for (i = 0; i < 16; ++i)
{
int p = RAP_PBOX[i]; int p = RAP_PBOX[i];
key[p] ^= RAP_E1[p]; key[p] ^= RAP_E1[p];
} }
for (i = 15; i >= 1; --i) { for (i = 15; i >= 1; --i)
{
int p = RAP_PBOX[i]; int p = RAP_PBOX[i];
int pp = RAP_PBOX[i - 1]; int pp = RAP_PBOX[i - 1];
key[p] ^= key[pp]; key[p] ^= key[pp];
} }
int o = 0; int o = 0;
for (i = 0; i < 16; ++i) { for (i = 0; i < 16; ++i)
{
int p = RAP_PBOX[i]; int p = RAP_PBOX[i];
unsigned char kc = key[p] - o; unsigned char kc = key[p] - o;
unsigned char ec2 = RAP_E2[p]; unsigned char ec2 = RAP_E2[p];
if (o != 1 || kc != 0xFF) { if (o != 1 || kc != 0xFF)
{
o = kc < ec2 ? 1 : 0; o = kc < ec2 ? 1 : 0;
key[p] = kc - ec2; key[p] = kc - ec2;
} else if (kc == 0xFF) { } else if (kc == 0xFF)
{
key[p] = kc - ec2; key[p] = kc - ec2;
} else { } else
{
key[p] = kc; key[p] = kc;
} }
} }

View file

@ -7,7 +7,8 @@
void generate_key(int crypto_mode, int version, unsigned char *key_final, unsigned char *iv_final, unsigned char *key, unsigned char *iv) void generate_key(int crypto_mode, int version, unsigned char *key_final, unsigned char *iv_final, unsigned char *key, unsigned char *iv)
{ {
int mode = (int)(crypto_mode & 0xF0000000); int mode = (int)(crypto_mode & 0xF0000000);
switch (mode) { switch (mode)
{
case 0x10000000: case 0x10000000:
// Encrypted ERK. // Encrypted ERK.
// Decrypt the key with EDAT_KEY + EDAT_IV and copy the original IV. // Decrypt the key with EDAT_KEY + EDAT_IV and copy the original IV.
@ -32,7 +33,8 @@ void generate_key(int crypto_mode, int version, unsigned char *key_final, unsign
void generate_hash(int hash_mode, int version, unsigned char *hash_final, unsigned char *hash) void generate_hash(int hash_mode, int version, unsigned char *hash_final, unsigned char *hash)
{ {
int mode = (int)(hash_mode & 0xF0000000); int mode = (int)(hash_mode & 0xF0000000);
switch (mode) { switch (mode)
{
case 0x10000000: case 0x10000000:
// Encrypted HASH. // Encrypted HASH.
// Decrypt the hash with EDAT_KEY + EDAT_IV. // Decrypt the hash with EDAT_KEY + EDAT_IV.

View file

@ -145,7 +145,8 @@ int Decrypt(const fs::file& pkg_f, const fs::file& dec_pkg_f, PKGHeader* m_heade
*(be_t<u64>*)&iv[8] = lo; *(be_t<u64>*)&iv[8] = lo;
} }
for (u32 j=0; j<length; j++) { for (u32 j = 0; j < length; j++)
{
buf[j] ^= ctr[j]; buf[j] ^= ctr[j];
} }
} }

View file

@ -46,19 +46,26 @@ static std::pair<int, int> StringToSize(const std::string& str)
{ {
std::size_t start = 0, found; std::size_t start = 0, found;
std::vector<int> vec; std::vector<int> vec;
for (int i = 0; i < 2 && (found = str.find_first_of('x', start)); i++) {
try { for (int i = 0; i < 2 && (found = str.find_first_of('x', start)); i++)
{
try
{
vec.push_back(std::stoi(str.substr(start, found == std::string::npos ? found : found - start))); vec.push_back(std::stoi(str.substr(start, found == std::string::npos ? found : found - start)));
} }
catch (const std::invalid_argument& e) { catch (const std::invalid_argument& e)
{
return std::make_pair(-1, -1); return std::make_pair(-1, -1);
} }
if (found == std::string::npos) if (found == std::string::npos)
break; break;
start = found + 1; start = found + 1;
} }
if (vec.size() < 2 || vec[0] < 0 || vec[1] < 0) if (vec.size() < 2 || vec[0] < 0 || vec[1] < 0)
{
return std::make_pair(-1, -1); return std::make_pair(-1, -1);
}
return std::make_pair(vec[0], vec[1]); return std::make_pair(vec[0], vec[1]);
} }

View file

@ -20,10 +20,14 @@ TROPUSRLoader::~TROPUSRLoader()
bool TROPUSRLoader::Load(const std::string& filepath, const std::string& configpath) bool TROPUSRLoader::Load(const std::string& filepath, const std::string& configpath)
{ {
if (m_file) if (m_file)
{
Close(); Close();
}
if (!Emu.GetVFS().ExistsFile(filepath)) if (!Emu.GetVFS().ExistsFile(filepath))
{
Generate(filepath, configpath); Generate(filepath, configpath);
}
m_file = Emu.GetVFS().OpenFile(filepath, vfsRead); m_file = Emu.GetVFS().OpenFile(filepath, vfsRead);
LoadHeader(); LoadHeader();
@ -37,33 +41,46 @@ bool TROPUSRLoader::Load(const std::string& filepath, const std::string& configp
bool TROPUSRLoader::LoadHeader() bool TROPUSRLoader::LoadHeader()
{ {
if (!m_file->IsOpened()) if (!m_file->IsOpened())
{
return false; return false;
}
m_file->Seek(0); m_file->Seek(0);
if (m_file->Read(&m_header, sizeof(TROPUSRHeader)) != sizeof(TROPUSRHeader)) if (m_file->Read(&m_header, sizeof(TROPUSRHeader)) != sizeof(TROPUSRHeader))
{
return false; return false;
}
return true; return true;
} }
bool TROPUSRLoader::LoadTableHeaders() bool TROPUSRLoader::LoadTableHeaders()
{ {
if (!m_file->IsOpened()) if (!m_file->IsOpened())
{
return false; return false;
}
m_file->Seek(0x30); m_file->Seek(0x30);
m_tableHeaders.clear(); m_tableHeaders.clear();
m_tableHeaders.resize(m_header.tables_count); m_tableHeaders.resize(m_header.tables_count);
for (TROPUSRTableHeader& tableHeader : m_tableHeaders) {
for (TROPUSRTableHeader& tableHeader : m_tableHeaders)
{
if (m_file->Read(&tableHeader, sizeof(TROPUSRTableHeader)) != sizeof(TROPUSRTableHeader)) if (m_file->Read(&tableHeader, sizeof(TROPUSRTableHeader)) != sizeof(TROPUSRTableHeader))
return false; return false;
} }
return true; return true;
} }
bool TROPUSRLoader::LoadTables() bool TROPUSRLoader::LoadTables()
{ {
if (!m_file->IsOpened()) if (!m_file->IsOpened())
{
return false; return false;
}
for (const TROPUSRTableHeader& tableHeader : m_tableHeaders) for (const TROPUSRTableHeader& tableHeader : m_tableHeaders)
{ {
@ -73,7 +90,9 @@ bool TROPUSRLoader::LoadTables()
{ {
m_table4.clear(); m_table4.clear();
m_table4.resize(tableHeader.entries_count); m_table4.resize(tableHeader.entries_count);
for (auto& entry : m_table4) {
for (auto& entry : m_table4)
{
if (m_file->Read(&entry, sizeof(TROPUSREntry4)) != sizeof(TROPUSREntry4)) if (m_file->Read(&entry, sizeof(TROPUSREntry4)) != sizeof(TROPUSREntry4))
return false; return false;
} }
@ -83,7 +102,9 @@ bool TROPUSRLoader::LoadTables()
{ {
m_table6.clear(); m_table6.clear();
m_table6.resize(tableHeader.entries_count); m_table6.resize(tableHeader.entries_count);
for (auto& entry : m_table6) {
for (auto& entry : m_table6)
{
if (m_file->Read(&entry, sizeof(TROPUSREntry6)) != sizeof(TROPUSREntry6)) if (m_file->Read(&entry, sizeof(TROPUSREntry6)) != sizeof(TROPUSREntry6))
return false; return false;
} }
@ -99,20 +120,30 @@ bool TROPUSRLoader::LoadTables()
bool TROPUSRLoader::Save(const std::string& filepath) bool TROPUSRLoader::Save(const std::string& filepath)
{ {
if (m_file) if (m_file)
{
Close(); Close();
}
m_file = Emu.GetVFS().OpenFile(filepath, vfsWriteNew); m_file = Emu.GetVFS().OpenFile(filepath, vfsWriteNew);
m_file->Write(&m_header, sizeof(TROPUSRHeader)); m_file->Write(&m_header, sizeof(TROPUSRHeader));
for (const TROPUSRTableHeader& tableHeader : m_tableHeaders) for (const TROPUSRTableHeader& tableHeader : m_tableHeaders)
{
m_file->Write(&tableHeader, sizeof(TROPUSRTableHeader)); m_file->Write(&tableHeader, sizeof(TROPUSRTableHeader));
}
for (const auto& entry : m_table4) for (const auto& entry : m_table4)
{
m_file->Write(&entry, sizeof(TROPUSREntry4)); m_file->Write(&entry, sizeof(TROPUSREntry4));
}
for (const auto& entry : m_table6) for (const auto& entry : m_table6)
{
m_file->Write(&entry, sizeof(TROPUSREntry6)); m_file->Write(&entry, sizeof(TROPUSREntry6));
}
m_file->Close(); m_file->Close();
return true; return true;
} }
@ -125,6 +156,7 @@ bool TROPUSRLoader::Generate(const std::string& filepath, const std::string& con
m_table4.clear(); m_table4.clear();
m_table6.clear(); m_table6.clear();
for (std::shared_ptr<rXmlNode> n = doc.GetRoot()->GetChildren(); n; n = n->GetNext()) for (std::shared_ptr<rXmlNode> n = doc.GetRoot()->GetChildren(); n; n = n->GetNext())
{ {
if (n->GetName() == "trophy") if (n->GetName() == "trophy")
@ -164,6 +196,7 @@ bool TROPUSRLoader::Generate(const std::string& filepath, const std::string& con
m_header.unk2 = 0; m_header.unk2 = 0;
Save(filepath); Save(filepath);
return true; return true;
} }
@ -175,7 +208,9 @@ u32 TROPUSRLoader::GetTrophiesCount()
u32 TROPUSRLoader::GetTrophyUnlockState(u32 id) u32 TROPUSRLoader::GetTrophyUnlockState(u32 id)
{ {
if (id >= m_table6.size()) if (id >= m_table6.size())
{
LOG_WARNING(LOADER, "TROPUSRLoader::GetUnlockState: Invalid id=%d", id); LOG_WARNING(LOADER, "TROPUSRLoader::GetUnlockState: Invalid id=%d", id);
}
return m_table6[id].trophy_state; // Let's assume the trophies are stored ordered return m_table6[id].trophy_state; // Let's assume the trophies are stored ordered
} }
@ -183,7 +218,9 @@ u32 TROPUSRLoader::GetTrophyUnlockState(u32 id)
u64 TROPUSRLoader::GetTrophyTimestamp(u32 id) u64 TROPUSRLoader::GetTrophyTimestamp(u32 id)
{ {
if (id >= m_table6.size()) if (id >= m_table6.size())
{
LOG_WARNING(LOADER, "TROPUSRLoader::GetTrophyTimestamp: Invalid id=%d", id); LOG_WARNING(LOADER, "TROPUSRLoader::GetTrophyTimestamp: Invalid id=%d", id);
}
// TODO: What timestamp does sceNpTrophyGetTrophyInfo want, timestamp1 or timestamp2? // TODO: What timestamp does sceNpTrophyGetTrophyInfo want, timestamp1 or timestamp2?
return m_table6[id].timestamp2; // Let's assume the trophies are stored ordered return m_table6[id].timestamp2; // Let's assume the trophies are stored ordered
@ -192,11 +229,14 @@ u64 TROPUSRLoader::GetTrophyTimestamp(u32 id)
bool TROPUSRLoader::UnlockTrophy(u32 id, u64 timestamp1, u64 timestamp2) bool TROPUSRLoader::UnlockTrophy(u32 id, u64 timestamp1, u64 timestamp2)
{ {
if (id >= m_table6.size()) if (id >= m_table6.size())
{
return false; return false;
}
m_table6[id].trophy_state = 1; m_table6[id].trophy_state = 1;
m_table6[id].timestamp1 = timestamp1; m_table6[id].timestamp1 = timestamp1;
m_table6[id].timestamp2 = timestamp2; m_table6[id].timestamp2 = timestamp2;
return true; return true;
} }
@ -208,5 +248,6 @@ bool TROPUSRLoader::Close()
m_file = nullptr; m_file = nullptr;
return true; return true;
} }
return false; return false;
} }

View file

@ -17,10 +17,14 @@ TRPLoader::~TRPLoader()
bool TRPLoader::Install(std::string dest, bool show) bool TRPLoader::Install(std::string dest, bool show)
{ {
if (!trp_f.IsOpened()) if (!trp_f.IsOpened())
{
return false; return false;
}
if (!dest.empty() && dest.back() != '/') if (!dest.empty() && dest.back() != '/')
{
dest += '/'; dest += '/';
}
if (!Emu.GetVFS().ExistsDir(dest)) if (!Emu.GetVFS().ExistsDir(dest))
{ {
@ -42,17 +46,26 @@ bool TRPLoader::Install(std::string dest, bool show)
bool TRPLoader::LoadHeader(bool show) bool TRPLoader::LoadHeader(bool show)
{ {
if (!trp_f.IsOpened()) if (!trp_f.IsOpened())
{
return false; return false;
}
trp_f.Seek(0); trp_f.Seek(0);
if (trp_f.Read(&m_header, sizeof(TRPHeader)) != sizeof(TRPHeader)) if (trp_f.Read(&m_header, sizeof(TRPHeader)) != sizeof(TRPHeader))
{
return false; return false;
}
if (m_header.trp_magic != 0xDCA24D00) if (m_header.trp_magic != 0xDCA24D00)
{
return false; return false;
}
if (show) if (show)
{
LOG_NOTICE(LOADER, "TRP version: 0x%x", m_header.trp_version); LOG_NOTICE(LOADER, "TRP version: 0x%x", m_header.trp_version);
}
m_entries.clear(); m_entries.clear();
m_entries.resize(m_header.trp_files_count); m_entries.resize(m_header.trp_files_count);
@ -60,42 +73,57 @@ bool TRPLoader::LoadHeader(bool show)
for (u32 i = 0; i < m_header.trp_files_count; i++) for (u32 i = 0; i < m_header.trp_files_count; i++)
{ {
if (trp_f.Read(&m_entries[i], sizeof(TRPEntry)) != sizeof(TRPEntry)) if (trp_f.Read(&m_entries[i], sizeof(TRPEntry)) != sizeof(TRPEntry))
{
return false; return false;
}
if (show) if (show)
{
LOG_NOTICE(LOADER, "TRP entry #%d: %s", m_entries[i].name); LOG_NOTICE(LOADER, "TRP entry #%d: %s", m_entries[i].name);
} }
}
return true; return true;
} }
bool TRPLoader::ContainsEntry(const char *filename) bool TRPLoader::ContainsEntry(const char *filename)
{ {
for (const TRPEntry& entry : m_entries) { for (const TRPEntry& entry : m_entries)
{
if (!strcmp(entry.name, filename)) if (!strcmp(entry.name, filename))
{
return true; return true;
} }
}
return false; return false;
} }
void TRPLoader::RemoveEntry(const char *filename) void TRPLoader::RemoveEntry(const char *filename)
{ {
std::vector<TRPEntry>::iterator i = m_entries.begin(); std::vector<TRPEntry>::iterator i = m_entries.begin();
while (i != m_entries.end()) { while (i != m_entries.end())
{
if (!strcmp(i->name, filename)) if (!strcmp(i->name, filename))
{
i = m_entries.erase(i); i = m_entries.erase(i);
}
else else
{
i++; i++;
} }
} }
}
void TRPLoader::RenameEntry(const char *oldname, const char *newname) void TRPLoader::RenameEntry(const char *oldname, const char *newname)
{ {
for (const TRPEntry& entry : m_entries) { for (const TRPEntry& entry : m_entries)
{
if (!strcmp(entry.name, oldname)) if (!strcmp(entry.name, oldname))
{
memcpy((void*)entry.name, newname, 32); memcpy((void*)entry.name, newname, 32);
} }
} }
}
bool TRPLoader::Close() bool TRPLoader::Close()
{ {