diff options
| author | 2017-03-12 10:13:32 +0200 | |
|---|---|---|
| committer | 2017-03-12 12:24:57 +0200 | |
| commit | 363f36b904dc67e0455587644d41630e4a3fb9d6 (patch) | |
| tree | 4f5a5d8c524ef8e2bfc86a14b0731dd1a20e8c8a | |
| parent | Merge pull request #2614 from Schplee/patch-1 (diff) | |
| download | yuzu-363f36b904dc67e0455587644d41630e4a3fb9d6.tar.gz yuzu-363f36b904dc67e0455587644d41630e4a3fb9d6.tar.xz yuzu-363f36b904dc67e0455587644d41630e4a3fb9d6.zip | |
cfg: implement GenHashConsoleUnique
| -rw-r--r-- | src/core/hle/service/cfg/cfg.cpp | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/src/core/hle/service/cfg/cfg.cpp b/src/core/hle/service/cfg/cfg.cpp index 6f13cde27..4ddb1bc90 100644 --- a/src/core/hle/service/cfg/cfg.cpp +++ b/src/core/hle/service/cfg/cfg.cpp | |||
| @@ -3,6 +3,8 @@ | |||
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include <algorithm> | 5 | #include <algorithm> |
| 6 | #include <array> | ||
| 7 | #include <cryptopp/sha.h> | ||
| 6 | #include "common/file_util.h" | 8 | #include "common/file_util.h" |
| 7 | #include "common/logging/log.h" | 9 | #include "common/logging/log.h" |
| 8 | #include "common/string_util.h" | 10 | #include "common/string_util.h" |
| @@ -176,14 +178,29 @@ void SecureInfoGetRegion(Service::Interface* self) { | |||
| 176 | } | 178 | } |
| 177 | 179 | ||
| 178 | void GenHashConsoleUnique(Service::Interface* self) { | 180 | void GenHashConsoleUnique(Service::Interface* self) { |
| 179 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 181 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x03, 1, 0); |
| 180 | u32 app_id_salt = cmd_buff[1]; | 182 | const u32 app_id_salt = rp.Pop<u32>() & 0x000FFFFF; |
| 181 | 183 | ||
| 182 | cmd_buff[1] = RESULT_SUCCESS.raw; | 184 | IPC::RequestBuilder rb = rp.MakeBuilder(3, 0); |
| 183 | cmd_buff[2] = 0x33646D6F ^ (app_id_salt & 0xFFFFF); // 3dmoo hash | 185 | |
| 184 | cmd_buff[3] = 0x6F534841 ^ (app_id_salt & 0xFFFFF); | 186 | std::array<u8, 12> buffer; |
| 187 | const ResultCode result = GetConfigInfoBlock(ConsoleUniqueID2BlockID, 8, 2, buffer.data()); | ||
| 188 | rb.Push(result); | ||
| 189 | if (result.IsSuccess()) { | ||
| 190 | std::memcpy(&buffer[8], &app_id_salt, sizeof(u32)); | ||
| 191 | std::array<u8, CryptoPP::SHA256::DIGESTSIZE> hash; | ||
| 192 | CryptoPP::SHA256().CalculateDigest(hash.data(), buffer.data(), sizeof(buffer)); | ||
| 193 | u32 low, high; | ||
| 194 | memcpy(&low, &hash[hash.size() - 8], sizeof(u32)); | ||
| 195 | memcpy(&high, &hash[hash.size() - 4], sizeof(u32)); | ||
| 196 | rb.Push(low); | ||
| 197 | rb.Push(high); | ||
| 198 | } else { | ||
| 199 | rb.Push<u32>(0); | ||
| 200 | rb.Push<u32>(0); | ||
| 201 | } | ||
| 185 | 202 | ||
| 186 | LOG_WARNING(Service_CFG, "(STUBBED) called app_id_salt=0x%X", app_id_salt); | 203 | LOG_DEBUG(Service_CFG, "called app_id_salt=0x%X", app_id_salt); |
| 187 | } | 204 | } |
| 188 | 205 | ||
| 189 | void GetRegionCanadaUSA(Service::Interface* self) { | 206 | void GetRegionCanadaUSA(Service::Interface* self) { |