// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include #include "common/common_types.h" namespace Core::Crypto { struct CipherContext; enum class Mode { CTR = 11, ECB = 2, XTS = 74, }; enum class Op { Encrypt, Decrypt, }; template class AESCipher { public: static_assert(sizeof(Key) == 0x10 || sizeof(Key) == 0x20); AESCipher(Key key, Mode mode); ~AESCipher(); void SetIV(std::span data); template requires std::is_trivially_copyable_v && std::is_trivially_copyable_v void Transcode(const Source* src, std::size_t size, Dest* dest, Op op) const { Transcode(reinterpret_cast(src), size, reinterpret_cast(dest), op); } void Transcode(const u8* src, std::size_t size, u8* dest, Op op) const; template requires std::is_trivially_copyable_v && std::is_trivially_copyable_v void XTSTranscode(const Source* src, std::size_t size, Dest* dest, std::size_t sector_id, std::size_t sector_size, Op op) { XTSTranscode(reinterpret_cast(src), size, reinterpret_cast(dest), sector_id, sector_size, op); } void XTSTranscode(const u8* src, std::size_t size, u8* dest, std::size_t sector_id, std::size_t sector_size, Op op); private: std::unique_ptr ctx; }; } // namespace Core::Crypto