diff --git a/Source/Core/Core/IOS/ES/ES.cpp b/Source/Core/Core/IOS/ES/ES.cpp index 9a3bd84a73..91a7fdbb9b 100644 --- a/Source/Core/Core/IOS/ES/ES.cpp +++ b/Source/Core/Core/IOS/ES/ES.cpp @@ -14,6 +14,7 @@ #include #include +#include #include "Common/Align.h" #include "Common/Assert.h" @@ -581,6 +582,13 @@ IPCCommandResult ES::AddContentData(const IOCtlVRequest& request) return GetDefaultReply(IPC_SUCCESS); } +static bool CheckIfContentHashMatches(const std::vector& content, const IOS::ES::Content& info) +{ + std::array sha1; + mbedtls_sha1(content.data(), info.size, sha1.data()); + return sha1 == info.sha1; +} + IPCCommandResult ES::AddContentFinish(const IOCtlVRequest& request) { if (!request.HasNumberOfValidVectors(1, 0)) @@ -615,6 +623,11 @@ IPCCommandResult ES::AddContentFinish(const IOCtlVRequest& request) std::vector decrypted_data(m_addtitle_content_buffer.size()); mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_DECRYPT, m_addtitle_content_buffer.size(), iv, m_addtitle_content_buffer.data(), decrypted_data.data()); + if (!CheckIfContentHashMatches(decrypted_data, content_info)) + { + ERROR_LOG(IOS_ES, "AddContentFinish: Hash for content %08x doesn't match", content_info.id); + return GetDefaultReply(ES_HASH_DOESNT_MATCH); + } std::string content_path; if (content_info.IsShared())