aes_util.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <memory>
  6. #include <type_traits>
  7. #include <vector>
  8. #include "common/common_types.h"
  9. #include "core/file_sys/vfs.h"
  10. namespace Core::Crypto {
  11. struct CipherContext;
  12. enum class Mode {
  13. CTR = 11,
  14. ECB = 2,
  15. XTS = 70,
  16. };
  17. enum class Op {
  18. Encrypt,
  19. Decrypt,
  20. };
  21. template <typename Key, size_t KeySize = sizeof(Key)>
  22. class AESCipher {
  23. static_assert(std::is_same_v<Key, std::array<u8, KeySize>>, "Key must be std::array of u8.");
  24. static_assert(KeySize == 0x10 || KeySize == 0x20, "KeySize must be 128 or 256.");
  25. public:
  26. AESCipher(Key key, Mode mode);
  27. ~AESCipher();
  28. void SetIV(std::vector<u8> iv);
  29. template <typename Source, typename Dest>
  30. void Transcode(const Source* src, size_t size, Dest* dest, Op op) const {
  31. static_assert(std::is_trivially_copyable_v<Source> && std::is_trivially_copyable_v<Dest>,
  32. "Transcode source and destination types must be trivially copyable.");
  33. Transcode(reinterpret_cast<const u8*>(src), size, reinterpret_cast<u8*>(dest), op);
  34. }
  35. void Transcode(const u8* src, size_t size, u8* dest, Op op) const;
  36. template <typename Source, typename Dest>
  37. void XTSTranscode(const Source* src, size_t size, Dest* dest, size_t sector_id,
  38. size_t sector_size, Op op) {
  39. static_assert(std::is_trivially_copyable_v<Source> && std::is_trivially_copyable_v<Dest>,
  40. "XTSTranscode source and destination types must be trivially copyable.");
  41. XTSTranscode(reinterpret_cast<const u8*>(src), size, reinterpret_cast<u8*>(dest), sector_id,
  42. sector_size, op);
  43. }
  44. void XTSTranscode(const u8* src, size_t size, u8* dest, size_t sector_id, size_t sector_size,
  45. Op op);
  46. private:
  47. std::unique_ptr<CipherContext> ctx;
  48. };
  49. } // namespace Core::Crypto