diff options
| author | 2018-08-16 17:12:31 -0400 | |
|---|---|---|
| committer | 2018-08-23 11:53:30 -0400 | |
| commit | 61a5b56abde4a87e1e66c76b506bdd4dada58389 (patch) | |
| tree | 186d2efbf0577104b32379a18ea60f4c5fdf6679 /src/core/crypto/key_manager.cpp | |
| parent | key_manager: Add support for KEK and SD seed derivation (diff) | |
| download | yuzu-61a5b56abde4a87e1e66c76b506bdd4dada58389.tar.gz yuzu-61a5b56abde4a87e1e66c76b506bdd4dada58389.tar.xz yuzu-61a5b56abde4a87e1e66c76b506bdd4dada58389.zip | |
key_manager: Add support for autogenerated keys
Stored in a separate file than manual keys.
Diffstat (limited to 'src/core/crypto/key_manager.cpp')
| -rw-r--r-- | src/core/crypto/key_manager.cpp | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/src/core/crypto/key_manager.cpp b/src/core/crypto/key_manager.cpp index e4b33f750..994ac4eec 100644 --- a/src/core/crypto/key_manager.cpp +++ b/src/core/crypto/key_manager.cpp | |||
| @@ -153,17 +153,17 @@ void KeyManager::LoadFromFile(const std::string& filename, bool is_title_keys) { | |||
| 153 | u128 rights_id{}; | 153 | u128 rights_id{}; |
| 154 | std::memcpy(rights_id.data(), rights_id_raw.data(), rights_id_raw.size()); | 154 | std::memcpy(rights_id.data(), rights_id_raw.data(), rights_id_raw.size()); |
| 155 | Key128 key = Common::HexStringToArray<16>(out[1]); | 155 | Key128 key = Common::HexStringToArray<16>(out[1]); |
| 156 | SetKey(S128KeyType::Titlekey, key, rights_id[1], rights_id[0]); | 156 | s128_keys[{S128KeyType::Titlekey, rights_id[1], rights_id[0]}] = key; |
| 157 | } else { | 157 | } else { |
| 158 | std::transform(out[0].begin(), out[0].end(), out[0].begin(), ::tolower); | 158 | std::transform(out[0].begin(), out[0].end(), out[0].begin(), ::tolower); |
| 159 | if (s128_file_id.find(out[0]) != s128_file_id.end()) { | 159 | if (s128_file_id.find(out[0]) != s128_file_id.end()) { |
| 160 | const auto index = s128_file_id.at(out[0]); | 160 | const auto index = s128_file_id.at(out[0]); |
| 161 | Key128 key = Common::HexStringToArray<16>(out[1]); | 161 | Key128 key = Common::HexStringToArray<16>(out[1]); |
| 162 | SetKey(index.type, key, index.field1, index.field2); | 162 | s128_keys[{index.type, index.field1, index.field2}] = key; |
| 163 | } else if (s256_file_id.find(out[0]) != s256_file_id.end()) { | 163 | } else if (s256_file_id.find(out[0]) != s256_file_id.end()) { |
| 164 | const auto index = s256_file_id.at(out[0]); | 164 | const auto index = s256_file_id.at(out[0]); |
| 165 | Key256 key = Common::HexStringToArray<32>(out[1]); | 165 | Key256 key = Common::HexStringToArray<32>(out[1]); |
| 166 | SetKey(index.type, key, index.field1, index.field2); | 166 | s256_keys[{index.type, index.field1, index.field2}] = key; |
| 167 | } | 167 | } |
| 168 | } | 168 | } |
| 169 | } | 169 | } |
| @@ -197,11 +197,51 @@ Key256 KeyManager::GetKey(S256KeyType id, u64 field1, u64 field2) const { | |||
| 197 | return s256_keys.at({id, field1, field2}); | 197 | return s256_keys.at({id, field1, field2}); |
| 198 | } | 198 | } |
| 199 | 199 | ||
| 200 | template <size_t Size> | ||
| 201 | void KeyManager::WriteKeyToFile(bool title_key, std::string_view keyname, | ||
| 202 | std::array<u8, Size> key) { | ||
| 203 | const std::string yuzu_keys_dir = FileUtil::GetUserPath(FileUtil::UserPath::KeysDir); | ||
| 204 | std::string filename = "title.keys_autogenerated"; | ||
| 205 | if (!title_key) | ||
| 206 | filename = dev_mode ? "dev.keys_autogenerated" : "prod.keys_autogenerated"; | ||
| 207 | const auto add_info_text = !FileUtil::Exists(yuzu_keys_dir + DIR_SEP + filename); | ||
| 208 | std::ofstream file(yuzu_keys_dir + DIR_SEP + filename, std::ios::app); | ||
| 209 | if (!file.is_open()) | ||
| 210 | return; | ||
| 211 | if (add_info_text) { | ||
| 212 | file << "# This file is autogenerated by Yuzu" << std::endl | ||
| 213 | << "# It serves to store keys that were automatically generated from the normal keys" | ||
| 214 | << std::endl | ||
| 215 | << "# If you are experiencing issues involving keys, it may help to delete this file" | ||
| 216 | << std::endl; | ||
| 217 | } | ||
| 218 | |||
| 219 | file << std::endl | ||
| 220 | << fmt::format("{} = {}", keyname, Common::HexArrayToString(key)) << std::endl; | ||
| 221 | AttemptLoadKeyFile(yuzu_keys_dir, yuzu_keys_dir, filename, title_key); | ||
| 222 | } | ||
| 223 | |||
| 200 | void KeyManager::SetKey(S128KeyType id, Key128 key, u64 field1, u64 field2) { | 224 | void KeyManager::SetKey(S128KeyType id, Key128 key, u64 field1, u64 field2) { |
| 225 | const auto iter = std::find_if( | ||
| 226 | s128_file_id.begin(), s128_file_id.end(), | ||
| 227 | [&id, &field1, &field2](const std::pair<std::string, KeyIndex<S128KeyType>> elem) { | ||
| 228 | return std::tie(elem.second.type, elem.second.field1, elem.second.field2) == | ||
| 229 | std::tie(id, field1, field2); | ||
| 230 | }); | ||
| 231 | if (iter != s128_file_id.end()) | ||
| 232 | WriteKeyToFile(id == S128KeyType::Titlekey, iter->first, key); | ||
| 201 | s128_keys[{id, field1, field2}] = key; | 233 | s128_keys[{id, field1, field2}] = key; |
| 202 | } | 234 | } |
| 203 | 235 | ||
| 204 | void KeyManager::SetKey(S256KeyType id, Key256 key, u64 field1, u64 field2) { | 236 | void KeyManager::SetKey(S256KeyType id, Key256 key, u64 field1, u64 field2) { |
| 237 | const auto iter = std::find_if( | ||
| 238 | s256_file_id.begin(), s256_file_id.end(), | ||
| 239 | [&id, &field1, &field2](const std::pair<std::string, KeyIndex<S256KeyType>> elem) { | ||
| 240 | return std::tie(elem.second.type, elem.second.field1, elem.second.field2) == | ||
| 241 | std::tie(id, field1, field2); | ||
| 242 | }); | ||
| 243 | if (iter != s256_file_id.end()) | ||
| 244 | WriteKeyToFile(false, iter->first, key); | ||
| 205 | s256_keys[{id, field1, field2}] = key; | 245 | s256_keys[{id, field1, field2}] = key; |
| 206 | } | 246 | } |
| 207 | 247 | ||