Move AES code to Common/Crypto

This commit is contained in:
Léo Lam 2017-02-12 11:50:35 +01:00
parent c1a139e8ac
commit 5104caf6a6
8 changed files with 56 additions and 17 deletions

View File

@ -30,6 +30,7 @@ set(SRCS Analytics.cpp
x64ABI.cpp x64ABI.cpp
x64Emitter.cpp x64Emitter.cpp
MD5.cpp MD5.cpp
Crypto/AES.cpp
Crypto/bn.cpp Crypto/bn.cpp
Crypto/ec.cpp Crypto/ec.cpp
Logging/LogManager.cpp) Logging/LogManager.cpp)

View File

@ -139,6 +139,7 @@
<ClInclude Include="x64ABI.h" /> <ClInclude Include="x64ABI.h" />
<ClInclude Include="x64Emitter.h" /> <ClInclude Include="x64Emitter.h" />
<ClInclude Include="x64Reg.h" /> <ClInclude Include="x64Reg.h" />
<ClInclude Include="Crypto\AES.h" />
<ClInclude Include="Crypto\bn.h" /> <ClInclude Include="Crypto\bn.h" />
<ClInclude Include="Crypto\ec.h" /> <ClInclude Include="Crypto\ec.h" />
<ClInclude Include="Logging\ConsoleListener.h" /> <ClInclude Include="Logging\ConsoleListener.h" />
@ -188,6 +189,7 @@
<ClCompile Include="x64CPUDetect.cpp" /> <ClCompile Include="x64CPUDetect.cpp" />
<ClCompile Include="x64Emitter.cpp" /> <ClCompile Include="x64Emitter.cpp" />
<ClCompile Include="x64FPURoundMode.cpp" /> <ClCompile Include="x64FPURoundMode.cpp" />
<ClCompile Include="Crypto\AES.cpp" />
<ClCompile Include="Crypto\bn.cpp" /> <ClCompile Include="Crypto\bn.cpp" />
<ClCompile Include="Crypto\ec.cpp" /> <ClCompile Include="Crypto\ec.cpp" />
<ClCompile Include="Logging\LogManager.cpp" /> <ClCompile Include="Logging\LogManager.cpp" />

View File

@ -75,6 +75,9 @@
<ClInclude Include="Logging\LogManager.h"> <ClInclude Include="Logging\LogManager.h">
<Filter>Logging</Filter> <Filter>Logging</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Crypto\AES.h">
<Filter>Crypto</Filter>
</ClInclude>
<ClInclude Include="Crypto\ec.h"> <ClInclude Include="Crypto\ec.h">
<Filter>Crypto</Filter> <Filter>Crypto</Filter>
</ClInclude> </ClInclude>
@ -259,6 +262,9 @@
<ClCompile Include="x64CPUDetect.cpp" /> <ClCompile Include="x64CPUDetect.cpp" />
<ClCompile Include="x64Emitter.cpp" /> <ClCompile Include="x64Emitter.cpp" />
<ClCompile Include="x64FPURoundMode.cpp" /> <ClCompile Include="x64FPURoundMode.cpp" />
<ClCompile Include="Crypto\AES.cpp">
<Filter>Crypto</Filter>
</ClCompile>
<ClCompile Include="Crypto\bn.cpp"> <ClCompile Include="Crypto\bn.cpp">
<Filter>Crypto</Filter> <Filter>Crypto</Filter>
</ClCompile> </ClCompile>

View File

@ -0,0 +1,24 @@
// Copyright 2017 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#include <mbedtls/aes.h>
#include "Common/Crypto/AES.h"
namespace Common
{
namespace AES
{
std::vector<u8> Decrypt(const u8* key, u8* iv, const u8* src, size_t size)
{
mbedtls_aes_context aes_ctx;
std::vector<u8> buffer(size);
mbedtls_aes_setkey_dec(&aes_ctx, key, 128);
mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_DECRYPT, size, iv, src, buffer.data());
return buffer;
}
} // namespace AES
} // namespace Common

View File

@ -0,0 +1,18 @@
// Copyright 2017 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#pragma once
#include <cstddef>
#include <vector>
#include "Common/CommonTypes.h"
namespace Common
{
namespace AES
{
std::vector<u8> Decrypt(const u8* key, u8* iv, const u8* src, size_t size);
} // namespace AES
} // namespace Common

View File

@ -10,11 +10,10 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <mbedtls/aes.h>
#include "Common/ChunkFile.h" #include "Common/ChunkFile.h"
#include "Common/CommonFuncs.h" #include "Common/CommonFuncs.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/Crypto/AES.h"
namespace IOS namespace IOS
{ {
@ -22,17 +21,6 @@ namespace ES
{ {
constexpr size_t CONTENT_VIEW_SIZE = 0x10; constexpr size_t CONTENT_VIEW_SIZE = 0x10;
std::vector<u8> AESDecode(const u8* key, u8* iv, const u8* src, u32 size)
{
mbedtls_aes_context aes_ctx;
std::vector<u8> buffer(size);
mbedtls_aes_setkey_dec(&aes_ctx, key, 128);
mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_DECRYPT, size, iv, src, buffer.data());
return buffer;
}
TMDReader::TMDReader(const std::vector<u8>& bytes) : m_bytes(bytes) TMDReader::TMDReader(const std::vector<u8>& bytes) : m_bytes(bytes)
{ {
} }
@ -264,7 +252,8 @@ std::vector<u8> TicketReader::GetTitleKey() const
0x48, 0xd9, 0xc5, 0x45, 0x73, 0x81, 0xaa, 0xf7}; 0x48, 0xd9, 0xc5, 0x45, 0x73, 0x81, 0xaa, 0xf7};
u8 iv[16] = {}; u8 iv[16] = {};
std::copy_n(&m_bytes[GetOffset() + offsetof(Ticket, title_id)], sizeof(Ticket::title_id), iv); std::copy_n(&m_bytes[GetOffset() + offsetof(Ticket, title_id)], sizeof(Ticket::title_id), iv);
return AESDecode(common_key, iv, &m_bytes[GetOffset() + offsetof(Ticket, title_key)], 16); return Common::AES::Decrypt(common_key, iv, &m_bytes[GetOffset() + offsetof(Ticket, title_key)],
16);
} }
} // namespace ES } // namespace ES
} // namespace IOS } // namespace IOS

View File

@ -101,8 +101,6 @@ struct Ticket
static_assert(sizeof(Ticket) == 356, "Ticket has the wrong size"); static_assert(sizeof(Ticket) == 356, "Ticket has the wrong size");
#pragma pack(pop) #pragma pack(pop)
std::vector<u8> AESDecode(const u8* key, u8* iv, const u8* src, u32 size);
class TMDReader final class TMDReader final
{ {
public: public:

View File

@ -17,6 +17,7 @@
#include "Common/Align.h" #include "Common/Align.h"
#include "Common/CommonFuncs.h" #include "Common/CommonFuncs.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/Crypto/AES.h"
#include "Common/FileUtil.h" #include "Common/FileUtil.h"
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
#include "Common/MsgHandler.h" #include "Common/MsgHandler.h"
@ -239,7 +240,7 @@ void CNANDContentLoader::InitializeContentEntries(const std::vector<u8>& data_ap
u32 rounded_size = Common::AlignUp(static_cast<u32>(content.size), 0x40); u32 rounded_size = Common::AlignUp(static_cast<u32>(content.size), 0x40);
m_Content[i].m_Data = std::make_unique<CNANDContentDataBuffer>(IOS::ES::AESDecode( m_Content[i].m_Data = std::make_unique<CNANDContentDataBuffer>(Common::AES::Decrypt(
title_key.data(), iv.data(), &data_app[data_app_offset], rounded_size)); title_key.data(), iv.data(), &data_app[data_app_offset], rounded_size));
data_app_offset += rounded_size; data_app_offset += rounded_size;
} }