yuzu/src/core/crypto/aes_util.h

65 lines
1.9 KiB
C
Raw Normal View History

2018-07-28 05:55:23 +02:00
// Copyright 2018 yuzu emulator team
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#pragma once
#include <memory>
#include <type_traits>
#include <vector>
#include "common/common_types.h"
2018-07-28 05:55:23 +02:00
#include "core/file_sys/vfs.h"
2018-07-28 22:23:00 +02:00
namespace Core::Crypto {
2018-07-28 05:55:23 +02:00
struct CipherContext;
2018-07-28 05:55:23 +02:00
enum class Mode {
2018-07-28 22:23:00 +02:00
CTR = 11,
ECB = 2,
XTS = 70,
2018-07-28 05:55:23 +02:00
};
enum class Op {
2018-07-28 22:23:00 +02:00
Encrypt,
Decrypt,
2018-07-28 05:55:23 +02:00
};
template <typename Key, size_t KeySize = sizeof(Key)>
2018-07-28 22:23:00 +02:00
class AESCipher {
2018-07-28 05:55:23 +02:00
static_assert(std::is_same_v<Key, std::array<u8, KeySize>>, "Key must be std::array of u8.");
static_assert(KeySize == 0x10 || KeySize == 0x20, "KeySize must be 128 or 256.");
2018-07-28 22:23:00 +02:00
public:
AESCipher(Key key, Mode mode);
2018-07-28 05:55:23 +02:00
2018-07-28 22:23:00 +02:00
~AESCipher();
2018-07-28 05:55:23 +02:00
2018-07-28 22:23:00 +02:00
void SetIV(std::vector<u8> iv);
2018-07-28 05:55:23 +02:00
template <typename Source, typename Dest>
void Transcode(const Source* src, size_t size, Dest* dest, Op op) const {
static_assert(std::is_trivially_copyable_v<Source> && std::is_trivially_copyable_v<Dest>,
"Transcode source and destination types must be trivially copyable.");
2018-07-28 22:23:00 +02:00
Transcode(reinterpret_cast<const u8*>(src), size, reinterpret_cast<u8*>(dest), op);
2018-07-28 05:55:23 +02:00
}
void Transcode(const u8* src, size_t size, u8* dest, Op op) const;
2018-07-28 22:23:00 +02:00
2018-07-28 05:55:23 +02:00
template <typename Source, typename Dest>
void XTSTranscode(const Source* src, size_t size, Dest* dest, size_t sector_id,
size_t sector_size, Op op) {
static_assert(std::is_trivially_copyable_v<Source> && std::is_trivially_copyable_v<Dest>,
"XTSTranscode source and destination types must be trivially copyable.");
XTSTranscode(reinterpret_cast<const u8*>(src), size, reinterpret_cast<u8*>(dest), sector_id,
sector_size, op);
2018-07-28 05:55:23 +02:00
}
void XTSTranscode(const u8* src, size_t size, u8* dest, size_t sector_id, size_t sector_size,
Op op);
2018-07-28 22:23:00 +02:00
2018-07-28 05:55:23 +02:00
private:
std::unique_ptr<CipherContext> ctx;
2018-07-28 05:55:23 +02:00
};
} // namespace Core::Crypto