summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2015-01-26 15:59:25 +0100
committerJosJuice <josjuice@gmail.com>2015-01-26 15:59:25 +0100
commit521ccd7b44f08054beac77a0abcc7812ae6b590b (patch)
tree201174714c04e312b33cb446b2313d504590958c /Source/Core/DiscIO
parent7df55d220f8cd699f47a3b51ebc808554f6fbd7a (diff)
VolumeWiiCrypted: Decryption optimization
The block doesn't have to be read if it already is in m_pBuffer.
Diffstat (limited to 'Source/Core/DiscIO')
-rw-r--r--Source/Core/DiscIO/VolumeWiiCrypted.cpp30
-rw-r--r--Source/Core/DiscIO/VolumeWiiCrypted.h2
2 files changed, 18 insertions, 14 deletions
diff --git a/Source/Core/DiscIO/VolumeWiiCrypted.cpp b/Source/Core/DiscIO/VolumeWiiCrypted.cpp
index d956b9444d..57545eee01 100644
--- a/Source/Core/DiscIO/VolumeWiiCrypted.cpp
+++ b/Source/Core/DiscIO/VolumeWiiCrypted.cpp
@@ -47,7 +47,6 @@ bool CVolumeWiiCrypted::ChangePartition(u64 offset)
return true;
}
-
CVolumeWiiCrypted::~CVolumeWiiCrypted()
{
delete[] m_pBuffer;
@@ -66,36 +65,41 @@ bool CVolumeWiiCrypted::Read(u64 _ReadOffset, u64 _Length, u8* _pBuffer, bool de
while (_Length > 0)
{
- static unsigned char IV[16];
-
- // math block offset
+ // Calculate block offset
u64 Block = _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)
{
- memcpy(IV, m_pBuffer + 0x3d0, 16);
- aes_crypt_cbc(m_AES_ctx.get(), AES_DECRYPT, 0x7C00, IV, m_pBuffer + 0x400, m_LastDecryptedBlock);
+ // Read the current block
+ 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;
+
+ // 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 CopySize = (_Length > MaxSizeToCopy) ? MaxSizeToCopy : _Length;
memcpy(_pBuffer, &m_LastDecryptedBlock[Offset], (size_t)CopySize);
- // increase buffers
+ // Update offsets
_Length -= CopySize;
_pBuffer += CopySize;
_ReadOffset += CopySize;
}
- return(true);
+ return true;
}
bool CVolumeWiiCrypted::GetTitleID(u8* _pBuffer) const
diff --git a/Source/Core/DiscIO/VolumeWiiCrypted.h b/Source/Core/DiscIO/VolumeWiiCrypted.h
index 1cca81c410..608964dc64 100644
--- a/Source/Core/DiscIO/VolumeWiiCrypted.h
+++ b/Source/Core/DiscIO/VolumeWiiCrypted.h
@@ -53,7 +53,7 @@ private:
u64 m_dataOffset;
mutable u64 m_LastDecryptedBlockOffset;
- mutable unsigned char m_LastDecryptedBlock[0x8000];
+ mutable unsigned char m_LastDecryptedBlock[0x7C00];
};
} // namespace