summaryrefslogtreecommitdiff
path: root/src/core/crypto/key_manager.cpp
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-08-16 17:12:31 -0400
committerGravatar Zach Hilman2018-08-23 11:53:30 -0400
commit61a5b56abde4a87e1e66c76b506bdd4dada58389 (patch)
tree186d2efbf0577104b32379a18ea60f4c5fdf6679 /src/core/crypto/key_manager.cpp
parentkey_manager: Add support for KEK and SD seed derivation (diff)
downloadyuzu-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.cpp46
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
200template <size_t Size>
201void 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
200void KeyManager::SetKey(S128KeyType id, Key128 key, u64 field1, u64 field2) { 224void 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
204void KeyManager::SetKey(S256KeyType id, Key256 key, u64 field1, u64 field2) { 236void 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