Files
eden/src/core/crypto/aes_util.h
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

59 lines
1.6 KiB
C++
Raw Normal View History

// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
2025-09-21 21:58:59 +02:00
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
2018-07-27 23:55:23 -04:00
#pragma once
#include <memory>
2021-04-23 09:58:38 -04:00
#include <span>
#include <type_traits>
2018-08-04 16:41:17 -04:00
#include "common/common_types.h"
2018-07-27 23:55:23 -04:00
2018-07-28 16:23:00 -04:00
namespace Core::Crypto {
2018-07-27 23:55:23 -04:00
struct CipherContext;
2018-07-27 23:55:23 -04:00
enum class Mode {
2018-07-28 16:23:00 -04:00
CTR = 11,
ECB = 2,
XTS = 74,
2018-07-27 23:55:23 -04:00
};
enum class Op {
2018-07-28 16:23:00 -04:00
Encrypt,
Decrypt,
2018-07-27 23:55:23 -04:00
};
template <typename Key>
2018-07-28 16:23:00 -04:00
class AESCipher {
public:
static_assert(sizeof(Key) == 0x10 || sizeof(Key) == 0x20);
2018-07-28 16:23:00 -04:00
AESCipher(Key key, Mode mode);
~AESCipher();
2018-07-27 23:55:23 -04:00
2021-04-23 09:58:38 -04:00
void SetIV(std::span<const u8> data);
2018-07-27 23:55:23 -04:00
template <typename Source, typename Dest>
requires std::is_trivially_copyable_v<Source> && std::is_trivially_copyable_v<Dest>
void Transcode(const Source* src, std::size_t size, Dest* dest, Op op) const {
2018-07-28 16:23:00 -04:00
Transcode(reinterpret_cast<const u8*>(src), size, reinterpret_cast<u8*>(dest), op);
2018-07-27 23:55:23 -04:00
}
void Transcode(const u8* src, std::size_t size, u8* dest, Op op) const;
2018-07-28 16:23:00 -04:00
2018-07-27 23:55:23 -04:00
template <typename Source, typename Dest>
requires std::is_trivially_copyable_v<Source> && std::is_trivially_copyable_v<Dest>
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<const u8*>(src), size, reinterpret_cast<u8*>(dest), sector_id, sector_size, op);
2018-07-27 23:55:23 -04:00
}
void XTSTranscode(const u8* src, std::size_t size, u8* dest, std::size_t sector_id, std::size_t sector_size, Op op);
2018-07-28 16:23:00 -04:00
2018-07-27 23:55:23 -04:00
private:
std::unique_ptr<CipherContext> ctx;
2018-07-27 23:55:23 -04:00
};
} // namespace Core::Crypto