From 319c50897881c7ee1aba8e0bfe396cb385d9eb37 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Thu, 23 Jan 2020 16:47:49 +0100 Subject: DiscIO: Implement re-encryption of Wii partition data --- Source/Core/DiscIO/WiiEncryptionCache.h | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 Source/Core/DiscIO/WiiEncryptionCache.h (limited to 'Source/Core/DiscIO/WiiEncryptionCache.h') diff --git a/Source/Core/DiscIO/WiiEncryptionCache.h b/Source/Core/DiscIO/WiiEncryptionCache.h new file mode 100644 index 0000000000..0c8f4b489a --- /dev/null +++ b/Source/Core/DiscIO/WiiEncryptionCache.h @@ -0,0 +1,47 @@ +// Copyright 2020 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#pragma once + +#include +#include +#include + +#include "Common/CommonTypes.h" +#include "DiscIO/VolumeWii.h" + +namespace DiscIO +{ +class BlobReader; + +class WiiEncryptionCache +{ +public: + using Key = std::array; + + // The blob pointer is kept around for the lifetime of this object. + explicit WiiEncryptionCache(BlobReader* blob); + ~WiiEncryptionCache(); + + // Encrypts exactly one group. + // If the returned pointer is nullptr, reading from the blob failed. + // If the returned pointer is not nullptr, it is guaranteed to be valid until + // the next call of this function or the destruction of this object. + const std::array* EncryptGroup(u64 offset, + u64 partition_data_offset, + u64 partition_data_decrypted_size, + const Key& key); + + // Encrypts a variable number of groups, as determined by the offset and size parameters. + // Supports reading groups partially. + bool EncryptGroups(u64 offset, u64 size, u8* out_ptr, u64 partition_data_offset, + u64 partition_data_decrypted_size, const Key& key); + +private: + BlobReader* m_blob; + std::unique_ptr> m_cache; + u64 m_cached_offset = std::numeric_limits::max(); +}; + +} // namespace DiscIO -- cgit v1.2.3