VolumeWiiCrypted: Decryption optimization
The block doesn't have to be read if it already is in m_pBuffer.
This commit is contained in:
parent
7df55d220f
commit
521ccd7b44
|
@ -47,7 +47,6 @@ bool CVolumeWiiCrypted::ChangePartition(u64 offset)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CVolumeWiiCrypted::~CVolumeWiiCrypted()
|
CVolumeWiiCrypted::~CVolumeWiiCrypted()
|
||||||
{
|
{
|
||||||
delete[] m_pBuffer;
|
delete[] m_pBuffer;
|
||||||
|
@ -66,36 +65,41 @@ bool CVolumeWiiCrypted::Read(u64 _ReadOffset, u64 _Length, u8* _pBuffer, bool de
|
||||||
|
|
||||||
while (_Length > 0)
|
while (_Length > 0)
|
||||||
{
|
{
|
||||||
static unsigned char IV[16];
|
// Calculate block offset
|
||||||
|
|
||||||
// math block offset
|
|
||||||
u64 Block = _ReadOffset / 0x7C00;
|
u64 Block = _ReadOffset / 0x7C00;
|
||||||
u64 Offset = _ReadOffset % 0x7C00;
|
u64 Offset = _ReadOffset % 0x7C00;
|
||||||
|
|
||||||
// read current block
|
|
||||||
if (!m_pReader->Read(m_VolumeOffset + m_dataOffset + Block * 0x8000, 0x8000, m_pBuffer))
|
|
||||||
return(false);
|
|
||||||
|
|
||||||
if (m_LastDecryptedBlockOffset != Block)
|
if (m_LastDecryptedBlockOffset != Block)
|
||||||
{
|
{
|
||||||
memcpy(IV, m_pBuffer + 0x3d0, 16);
|
// Read the current block
|
||||||
aes_crypt_cbc(m_AES_ctx.get(), AES_DECRYPT, 0x7C00, IV, m_pBuffer + 0x400, m_LastDecryptedBlock);
|
if (!m_pReader->Read(m_VolumeOffset + m_dataOffset + Block * 0x8000, 0x8000, m_pBuffer))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Decrypt the block's data.
|
||||||
|
// 0x3D0 - 0x3DF in m_pBuffer will be overwritten,
|
||||||
|
// but that won't affect anything, because we won't
|
||||||
|
// 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);
|
||||||
m_LastDecryptedBlockOffset = Block;
|
m_LastDecryptedBlockOffset = Block;
|
||||||
|
|
||||||
|
// The only thing we currently use from the 0x000 - 0x3FF part
|
||||||
|
// of the block is the IV (at 0x3D0), but it also contains SHA-1
|
||||||
|
// hashes that IOS uses to check that discs aren't tampered with.
|
||||||
|
// http://wiibrew.org/wiki/Wii_Disc#Encrypted
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy the encrypted data
|
// Copy the decrypted data
|
||||||
u64 MaxSizeToCopy = 0x7C00 - Offset;
|
u64 MaxSizeToCopy = 0x7C00 - 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);
|
||||||
|
|
||||||
// increase buffers
|
// Update offsets
|
||||||
_Length -= CopySize;
|
_Length -= CopySize;
|
||||||
_pBuffer += CopySize;
|
_pBuffer += CopySize;
|
||||||
_ReadOffset += CopySize;
|
_ReadOffset += CopySize;
|
||||||
}
|
}
|
||||||
|
|
||||||
return(true);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CVolumeWiiCrypted::GetTitleID(u8* _pBuffer) const
|
bool CVolumeWiiCrypted::GetTitleID(u8* _pBuffer) const
|
||||||
|
|
|
@ -53,7 +53,7 @@ private:
|
||||||
u64 m_dataOffset;
|
u64 m_dataOffset;
|
||||||
|
|
||||||
mutable u64 m_LastDecryptedBlockOffset;
|
mutable u64 m_LastDecryptedBlockOffset;
|
||||||
mutable unsigned char m_LastDecryptedBlock[0x8000];
|
mutable unsigned char m_LastDecryptedBlock[0x7C00];
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
Loading…
Reference in New Issue