mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-22 19:00:14 -05:00
key_manager: Switch to boost flat_map for keys
Should make key gets marginally faster.
This commit is contained in:
parent
60b7a3b904
commit
cde665c565
2 changed files with 14 additions and 32 deletions
|
@ -125,7 +125,8 @@ bool KeyManager::KeyFileExists(bool title) {
|
||||||
FileUtil::Exists(yuzu_keys_dir + DIR_SEP + "prod.keys");
|
FileUtil::Exists(yuzu_keys_dir + DIR_SEP + "prod.keys");
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::unordered_map<std::string, KeyIndex<S128KeyType>> KeyManager::s128_file_id = {
|
void KeyManager::DeriveSDSeedLazy() {
|
||||||
|
const boost::container::flat_map<std::string, KeyIndex<S128KeyType>> KeyManager::s128_file_id = {
|
||||||
{"master_key_00", {S128KeyType::Master, 0, 0}},
|
{"master_key_00", {S128KeyType::Master, 0, 0}},
|
||||||
{"master_key_01", {S128KeyType::Master, 1, 0}},
|
{"master_key_01", {S128KeyType::Master, 1, 0}},
|
||||||
{"master_key_02", {S128KeyType::Master, 2, 0}},
|
{"master_key_02", {S128KeyType::Master, 2, 0}},
|
||||||
|
@ -169,7 +170,7 @@ const std::unordered_map<std::string, KeyIndex<S128KeyType>> KeyManager::s128_fi
|
||||||
{"key_area_key_system_04", {S128KeyType::KeyArea, 4, static_cast<u64>(KeyAreaKeyType::System)}},
|
{"key_area_key_system_04", {S128KeyType::KeyArea, 4, static_cast<u64>(KeyAreaKeyType::System)}},
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::unordered_map<std::string, KeyIndex<S256KeyType>> KeyManager::s256_file_id = {
|
const boost::container::flat_map<std::string, KeyIndex<S256KeyType>> KeyManager::s256_file_id = {
|
||||||
{"header_key", {S256KeyType::Header, 0, 0}},
|
{"header_key", {S256KeyType::Header, 0, 0}},
|
||||||
{"sd_card_save_key", {S256KeyType::SDSave, 0, 0}},
|
{"sd_card_save_key", {S256KeyType::SDSave, 0, 0}},
|
||||||
{"sd_card_nca_key", {S256KeyType::SDNCA, 0, 0}},
|
{"sd_card_nca_key", {S256KeyType::SDNCA, 0, 0}},
|
||||||
|
|
|
@ -7,10 +7,11 @@
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <unordered_map>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <boost/container/flat_map.hpp>
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
#include "core/loader/loader.h"
|
||||||
|
|
||||||
namespace Core::Crypto {
|
namespace Core::Crypto {
|
||||||
|
|
||||||
|
@ -59,34 +60,14 @@ struct KeyIndex {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// The following two (== and hash) are so KeyIndex can be a key in unordered_map
|
// boost flat_map requires operator< for O(log(n)) lookups.
|
||||||
|
|
||||||
template <typename KeyType>
|
template <typename KeyType>
|
||||||
bool operator==(const KeyIndex<KeyType>& lhs, const KeyIndex<KeyType>& rhs) {
|
bool operator<(const KeyIndex<KeyType>& lhs, const KeyIndex<KeyType>& rhs) {
|
||||||
return std::tie(lhs.type, lhs.field1, lhs.field2) == std::tie(rhs.type, rhs.field1, rhs.field2);
|
return (static_cast<size_t>(lhs.type) < static_cast<size_t>(rhs.type)) ||
|
||||||
|
(lhs.type == rhs.type && lhs.field1 < rhs.field1) ||
|
||||||
|
(lhs.type == rhs.type && lhs.field1 == rhs.field1 && lhs.field2 < rhs.field2);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename KeyType>
|
|
||||||
bool operator!=(const KeyIndex<KeyType>& lhs, const KeyIndex<KeyType>& rhs) {
|
|
||||||
return !operator==(lhs, rhs);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Core::Crypto
|
|
||||||
|
|
||||||
namespace std {
|
|
||||||
template <typename KeyType>
|
|
||||||
struct hash<Core::Crypto::KeyIndex<KeyType>> {
|
|
||||||
size_t operator()(const Core::Crypto::KeyIndex<KeyType>& k) const {
|
|
||||||
using std::hash;
|
|
||||||
|
|
||||||
return ((hash<u64>()(static_cast<u64>(k.type)) ^ (hash<u64>()(k.field1) << 1)) >> 1) ^
|
|
||||||
(hash<u64>()(k.field2) << 1);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} // namespace std
|
|
||||||
|
|
||||||
namespace Core::Crypto {
|
|
||||||
|
|
||||||
class KeyManager {
|
class KeyManager {
|
||||||
public:
|
public:
|
||||||
KeyManager();
|
KeyManager();
|
||||||
|
@ -103,15 +84,15 @@ public:
|
||||||
static bool KeyFileExists(bool title);
|
static bool KeyFileExists(bool title);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unordered_map<KeyIndex<S128KeyType>, Key128> s128_keys;
|
boost::container::flat_map<KeyIndex<S128KeyType>, Key128> s128_keys;
|
||||||
std::unordered_map<KeyIndex<S256KeyType>, Key256> s256_keys;
|
boost::container::flat_map<KeyIndex<S256KeyType>, Key256> s256_keys;
|
||||||
|
|
||||||
bool dev_mode;
|
bool dev_mode;
|
||||||
void LoadFromFile(const std::string& filename, bool is_title_keys);
|
void LoadFromFile(const std::string& filename, bool is_title_keys);
|
||||||
void AttemptLoadKeyFile(const std::string& dir1, const std::string& dir2,
|
void AttemptLoadKeyFile(const std::string& dir1, const std::string& dir2,
|
||||||
const std::string& filename, bool title);
|
const std::string& filename, bool title);
|
||||||
|
|
||||||
static const std::unordered_map<std::string, KeyIndex<S128KeyType>> s128_file_id;
|
static const boost::container::flat_map<std::string, KeyIndex<S128KeyType>> s128_file_id;
|
||||||
static const std::unordered_map<std::string, KeyIndex<S256KeyType>> s256_file_id;
|
static const boost::container::flat_map<std::string, KeyIndex<S256KeyType>> s256_file_id;
|
||||||
};
|
};
|
||||||
} // namespace Core::Crypto
|
} // namespace Core::Crypto
|
||||||
|
|
Loading…
Reference in a new issue