VolumeWiiCrypted: Replace some hardcoded values with constants

This commit is contained in:
JosJuice 2015-02-08 10:31:17 +01:00
parent 521ccd7b44
commit 28b441ebea
2 changed files with 12 additions and 7 deletions

View File

@ -33,7 +33,7 @@ CVolumeWiiCrypted::CVolumeWiiCrypted(IBlobReader* _pReader, u64 _VolumeOffset,
m_LastDecryptedBlockOffset(-1) m_LastDecryptedBlockOffset(-1)
{ {
aes_setkey_dec(m_AES_ctx.get(), _pVolumeKey, 128); aes_setkey_dec(m_AES_ctx.get(), _pVolumeKey, 128);
m_pBuffer = new u8[0x8000]; m_pBuffer = new u8[s_block_total_size];
} }
bool CVolumeWiiCrypted::ChangePartition(u64 offset) bool CVolumeWiiCrypted::ChangePartition(u64 offset)
@ -66,20 +66,21 @@ bool CVolumeWiiCrypted::Read(u64 _ReadOffset, u64 _Length, u8* _pBuffer, bool de
while (_Length > 0) while (_Length > 0)
{ {
// Calculate block offset // Calculate block offset
u64 Block = _ReadOffset / 0x7C00; u64 Block = _ReadOffset / s_block_data_size;
u64 Offset = _ReadOffset % 0x7C00; u64 Offset = _ReadOffset % s_block_data_size;
if (m_LastDecryptedBlockOffset != Block) if (m_LastDecryptedBlockOffset != Block)
{ {
// Read the current block // Read the current block
if (!m_pReader->Read(m_VolumeOffset + m_dataOffset + Block * 0x8000, 0x8000, m_pBuffer)) if (!m_pReader->Read(m_VolumeOffset + m_dataOffset + Block * s_block_total_size, s_block_total_size, m_pBuffer))
return false; return false;
// Decrypt the block's data. // Decrypt the block's data.
// 0x3D0 - 0x3DF in m_pBuffer will be overwritten, // 0x3D0 - 0x3DF in m_pBuffer will be overwritten,
// but that won't affect anything, because we won't // but that won't affect anything, because we won't
// use the content of m_pBuffer anymore after this // use the content of m_pBuffer anymore after this
aes_crypt_cbc(m_AES_ctx.get(), AES_DECRYPT, 0x7C00, m_pBuffer + 0x3D0, m_pBuffer + 0x400, m_LastDecryptedBlock); aes_crypt_cbc(m_AES_ctx.get(), AES_DECRYPT, s_block_data_size, m_pBuffer + 0x3D0,
m_pBuffer + s_block_header_size, m_LastDecryptedBlock);
m_LastDecryptedBlockOffset = Block; m_LastDecryptedBlockOffset = Block;
// The only thing we currently use from the 0x000 - 0x3FF part // The only thing we currently use from the 0x000 - 0x3FF part
@ -89,7 +90,7 @@ bool CVolumeWiiCrypted::Read(u64 _ReadOffset, u64 _Length, u8* _pBuffer, bool de
} }
// Copy the decrypted data // Copy the decrypted data
u64 MaxSizeToCopy = 0x7C00 - Offset; u64 MaxSizeToCopy = s_block_data_size - Offset;
u64 CopySize = (_Length > MaxSizeToCopy) ? MaxSizeToCopy : _Length; u64 CopySize = (_Length > MaxSizeToCopy) ? MaxSizeToCopy : _Length;
memcpy(_pBuffer, &m_LastDecryptedBlock[Offset], (size_t)CopySize); memcpy(_pBuffer, &m_LastDecryptedBlock[Offset], (size_t)CopySize);

View File

@ -44,6 +44,10 @@ public:
bool ChangePartition(u64 offset) override; bool ChangePartition(u64 offset) override;
private: private:
static const unsigned int s_block_header_size = 0x0400;
static const unsigned int s_block_data_size = 0x7C00;
static const unsigned int s_block_total_size = s_block_header_size + s_block_data_size;
std::unique_ptr<IBlobReader> m_pReader; std::unique_ptr<IBlobReader> m_pReader;
std::unique_ptr<aes_context> m_AES_ctx; std::unique_ptr<aes_context> m_AES_ctx;
@ -53,7 +57,7 @@ private:
u64 m_dataOffset; u64 m_dataOffset;
mutable u64 m_LastDecryptedBlockOffset; mutable u64 m_LastDecryptedBlockOffset;
mutable unsigned char m_LastDecryptedBlock[0x7C00]; mutable unsigned char m_LastDecryptedBlock[s_block_data_size];
}; };
} // namespace } // namespace