Skip to content

Commit

Permalink
Storing encryption trophy key in config.toml (#1930)
Browse files Browse the repository at this point in the history
* get trophy key from toml file

* clang format fix

* get trophy key from toml file

* clang format fix

* merge fixes

* Update config.cpp
  • Loading branch information
georgemoralis authored Jan 1, 2025
1 parent d69341f commit 283442b
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/common/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ static int cursorHideTimeout = 5; // 5 seconds (default)
static bool separateupdatefolder = false;
static bool compatibilityData = false;
static bool checkCompatibilityOnStartup = false;
static std::string trophyKey = "";

// Gui
std::vector<std::filesystem::path> settings_install_dirs = {};
Expand All @@ -91,6 +92,14 @@ std::string emulator_language = "en";
// Language
u32 m_language = 1; // english

std::string getTrophyKey() {
return trophyKey;
}

void setTrophyKey(std::string key) {
trophyKey = key;
}

bool isNeoMode() {
return isNeo;
}
Expand Down Expand Up @@ -652,6 +661,11 @@ void load(const std::filesystem::path& path) {

m_language = toml::find_or<int>(settings, "consoleLanguage", 1);
}

if (data.contains("Keys")) {
const toml::value& keys = data.at("Keys");
trophyKey = toml::find_or<std::string>(keys, "TrophyKey", "");
}
}

void save(const std::filesystem::path& path) {
Expand Down Expand Up @@ -712,6 +726,8 @@ void save(const std::filesystem::path& path) {
data["Debug"]["DebugDump"] = isDebugDump;
data["Debug"]["CollectShader"] = isShaderDebug;

data["Keys"]["TrophyKey"] = trophyKey;

std::vector<std::string> install_dirs;
for (const auto& dirString : settings_install_dirs) {
install_dirs.emplace_back(std::string{fmt::UTF(dirString.u8string()).data});
Expand Down
3 changes: 3 additions & 0 deletions src/common/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ void load(const std::filesystem::path& path);
void save(const std::filesystem::path& path);
void saveMainWindow(const std::filesystem::path& path);

std::string getTrophyKey();
void setTrophyKey(std::string key);

bool isNeoMode();
bool isFullscreenMode();
bool getPlayBGM();
Expand Down
14 changes: 14 additions & 0 deletions src/core/crypto/crypto.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later

#include <array>
#include <common/config.h>
#include "crypto.h"

CryptoPP::RSA::PrivateKey Crypto::key_pkg_derived_key3_keyset_init() {
Expand Down Expand Up @@ -137,6 +138,13 @@ void Crypto::aesCbcCfb128DecryptEntry(std::span<const CryptoPP::byte, 32> ivkey,
}
}

static void hexToBytes(const char* hex, unsigned char* dst) {
for (size_t i = 0; hex[i] != 0; i++) {
const unsigned char value = (hex[i] < 0x3A) ? (hex[i] - 0x30) : (hex[i] - 0x37);
dst[i / 2] |= ((i % 2) == 0) ? (value << 4) : (value);
}
}

void Crypto::decryptEFSM(std::span<CryptoPP::byte, 16> NPcommID,
std::span<CryptoPP::byte, 16> efsmIv, std::span<CryptoPP::byte> ciphertext,
std::span<CryptoPP::byte> decrypted) {
Expand All @@ -145,9 +153,15 @@ void Crypto::decryptEFSM(std::span<CryptoPP::byte, 16> NPcommID,
// step 1: Encrypt NPcommID
CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption encrypt;

const char* TrophyKeyget = Config::getTrophyKey().c_str();
std::vector<CryptoPP::byte> TrophyKey;
hexToBytes(TrophyKeyget, TrophyKey.data());

std::vector<CryptoPP::byte> trpKey(16);

encrypt.ProcessData(trpKey.data(), NPcommID.data(), 16);
encrypt.SetKeyWithIV(TrophyKey.data(), TrophyKey.size(), TrophyIV.data());

// step 2: decrypt efsm.
CryptoPP::CBC_Mode<CryptoPP::AES>::Decryption decrypt;
decrypt.SetKeyWithIV(trpKey.data(), trpKey.size(), efsmIv.data());
Expand Down

0 comments on commit 283442b

Please sign in to comment.