2 changed files with 231 additions and 0 deletions
@ -0,0 +1,230 @@ |
|||
// Copyright 2021 yuzu Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#include <span> |
|||
|
|||
#include "common/bit_field.h" |
|||
#include "common/common_types.h" |
|||
|
|||
namespace Service::SPL { |
|||
|
|||
constexpr size_t AES_128_KEY_SIZE = 0x10; |
|||
|
|||
namespace Smc { |
|||
|
|||
enum class FunctionId : u32 { |
|||
SetConfig = 0xC3000401, |
|||
GetConfig = 0xC3000002, |
|||
GetResult = 0xC3000003, |
|||
GetResultData = 0xC3000404, |
|||
ModularExponentiate = 0xC3000E05, |
|||
GenerateRandomBytes = 0xC3000006, |
|||
GenerateAesKek = 0xC3000007, |
|||
LoadAesKey = 0xC3000008, |
|||
ComputeAes = 0xC3000009, |
|||
GenerateSpecificAesKey = 0xC300000A, |
|||
ComputeCmac = 0xC300040B, |
|||
ReencryptDeviceUniqueData = 0xC300D60C, |
|||
DecryptDeviceUniqueData = 0xC300100D, |
|||
|
|||
ModularExponentiateWithStorageKey = 0xC300060F, |
|||
PrepareEsDeviceUniqueKey = 0xC3000610, |
|||
LoadPreparedAesKey = 0xC3000011, |
|||
PrepareCommonEsTitleKey = 0xC3000012, |
|||
|
|||
// Deprecated functions. |
|||
LoadEsDeviceKey = 0xC300100C, |
|||
DecryptAndStoreGcKey = 0xC300100E, |
|||
|
|||
// Atmosphere functions. |
|||
AtmosphereIramCopy = 0xF0000201, |
|||
AtmosphereReadWriteRegister = 0xF0000002, |
|||
|
|||
AtmosphereGetEmummcConfig = 0xF0000404, |
|||
}; |
|||
|
|||
enum class CipherMode { |
|||
CbcEncrypt = 0, |
|||
CbcDecrypt = 1, |
|||
Ctr = 2, |
|||
}; |
|||
|
|||
enum class DeviceUniqueDataMode { |
|||
DecryptDeviceUniqueData = 0, |
|||
DecryptAndStoreGcKey = 1, |
|||
DecryptAndStoreEsDeviceKey = 2, |
|||
DecryptAndStoreSslKey = 3, |
|||
DecryptAndStoreDrmDeviceCertKey = 4, |
|||
}; |
|||
|
|||
enum class ModularExponentiateWithStorageKeyMode { |
|||
Gc = 0, |
|||
Ssl = 1, |
|||
DrmDeviceCert = 2, |
|||
}; |
|||
|
|||
enum class EsCommonKeyType { |
|||
TitleKey = 0, |
|||
ArchiveKey = 1, |
|||
}; |
|||
|
|||
struct AsyncOperationKey { |
|||
u64 value; |
|||
}; |
|||
|
|||
} // namespace Smc |
|||
|
|||
enum class HardwareType { |
|||
Icosa = 0, |
|||
Copper = 1, |
|||
Hoag = 2, |
|||
Iowa = 3, |
|||
Calcio = 4, |
|||
Aula = 5, |
|||
}; |
|||
|
|||
enum class SocType { |
|||
Erista = 0, |
|||
Mariko = 1, |
|||
}; |
|||
|
|||
enum class HardwareState { |
|||
Development = 0, |
|||
Production = 1, |
|||
}; |
|||
|
|||
enum class MemoryArrangement { |
|||
Standard = 0, |
|||
StandardForAppletDev = 1, |
|||
StandardForSystemDev = 2, |
|||
Expanded = 3, |
|||
ExpandedForAppletDev = 4, |
|||
|
|||
// Note: Dynamic is not official. |
|||
// Atmosphere uses it to maintain compatibility with firmwares prior to 6.0.0, |
|||
// which removed the explicit retrieval of memory arrangement from PM. |
|||
Dynamic = 5, |
|||
Count, |
|||
}; |
|||
|
|||
enum class BootReason { |
|||
Unknown = 0, |
|||
AcOk = 1, |
|||
OnKey = 2, |
|||
RtcAlarm1 = 3, |
|||
RtcAlarm2 = 4, |
|||
}; |
|||
|
|||
struct BootReasonValue { |
|||
union { |
|||
u32 value{}; |
|||
|
|||
BitField<0, 8, u32> power_intr; |
|||
BitField<8, 8, u32> rtc_intr; |
|||
BitField<16, 8, u32> nv_erc; |
|||
BitField<24, 8, u32> boot_reason; |
|||
}; |
|||
}; |
|||
static_assert(sizeof(BootReasonValue) == sizeof(u32), "BootReasonValue definition!"); |
|||
|
|||
struct AesKey { |
|||
std::array<u64, AES_128_KEY_SIZE / sizeof(u64)> data64{}; |
|||
|
|||
std::span<u8> AsBytes() { |
|||
return std::span{reinterpret_cast<u8*>(data64.data()), AES_128_KEY_SIZE}; |
|||
} |
|||
|
|||
std::span<const u8> AsBytes() const { |
|||
return std::span{reinterpret_cast<const u8*>(data64.data()), AES_128_KEY_SIZE}; |
|||
} |
|||
}; |
|||
static_assert(sizeof(AesKey) == AES_128_KEY_SIZE, "AesKey definition!"); |
|||
|
|||
struct IvCtr { |
|||
std::array<u64, AES_128_KEY_SIZE / sizeof(u64)> data64{}; |
|||
|
|||
std::span<u8> AsBytes() { |
|||
return std::span{reinterpret_cast<u8*>(data64.data()), AES_128_KEY_SIZE}; |
|||
} |
|||
|
|||
std::span<const u8> AsBytes() const { |
|||
return std::span{reinterpret_cast<const u8*>(data64.data()), AES_128_KEY_SIZE}; |
|||
} |
|||
}; |
|||
static_assert(sizeof(AesKey) == AES_128_KEY_SIZE, "IvCtr definition!"); |
|||
|
|||
struct Cmac { |
|||
std::array<u64, AES_128_KEY_SIZE / sizeof(u64)> data64{}; |
|||
|
|||
std::span<u8> AsBytes() { |
|||
return std::span{reinterpret_cast<u8*>(data64.data()), AES_128_KEY_SIZE}; |
|||
} |
|||
|
|||
std::span<const u8> AsBytes() const { |
|||
return std::span{reinterpret_cast<const u8*>(data64.data()), AES_128_KEY_SIZE}; |
|||
} |
|||
}; |
|||
static_assert(sizeof(AesKey) == AES_128_KEY_SIZE, "Cmac definition!"); |
|||
|
|||
struct AccessKey { |
|||
std::array<u64, AES_128_KEY_SIZE / sizeof(u64)> data64{}; |
|||
|
|||
std::span<u8> AsBytes() { |
|||
return std::span{reinterpret_cast<u8*>(data64.data()), AES_128_KEY_SIZE}; |
|||
} |
|||
|
|||
std::span<const u8> AsBytes() const { |
|||
return std::span{reinterpret_cast<const u8*>(data64.data()), AES_128_KEY_SIZE}; |
|||
} |
|||
}; |
|||
static_assert(sizeof(AesKey) == AES_128_KEY_SIZE, "AccessKey definition!"); |
|||
|
|||
struct KeySource { |
|||
std::array<u64, AES_128_KEY_SIZE / sizeof(u64)> data64{}; |
|||
|
|||
std::span<u8> AsBytes() { |
|||
return std::span{reinterpret_cast<u8*>(data64.data()), AES_128_KEY_SIZE}; |
|||
} |
|||
|
|||
std::span<const u8> AsBytes() const { |
|||
return std::span{reinterpret_cast<const u8*>(data64.data()), AES_128_KEY_SIZE}; |
|||
} |
|||
}; |
|||
static_assert(sizeof(AesKey) == AES_128_KEY_SIZE, "KeySource definition!"); |
|||
|
|||
enum class ConfigItem : u32 { |
|||
// Standard config items. |
|||
DisableProgramVerification = 1, |
|||
DramId = 2, |
|||
SecurityEngineInterruptNumber = 3, |
|||
FuseVersion = 4, |
|||
HardwareType = 5, |
|||
HardwareState = 6, |
|||
IsRecoveryBoot = 7, |
|||
DeviceId = 8, |
|||
BootReason = 9, |
|||
MemoryMode = 10, |
|||
IsDevelopmentFunctionEnabled = 11, |
|||
KernelConfiguration = 12, |
|||
IsChargerHiZModeEnabled = 13, |
|||
QuestState = 14, |
|||
RegulatorType = 15, |
|||
DeviceUniqueKeyGeneration = 16, |
|||
Package2Hash = 17, |
|||
|
|||
// Extension config items for exosphere. |
|||
ExosphereApiVersion = 65000, |
|||
ExosphereNeedsReboot = 65001, |
|||
ExosphereNeedsShutdown = 65002, |
|||
ExosphereGitCommitHash = 65003, |
|||
ExosphereHasRcmBugPatch = 65004, |
|||
ExosphereBlankProdInfo = 65005, |
|||
ExosphereAllowCalWrites = 65006, |
|||
ExosphereEmummcType = 65007, |
|||
ExospherePayloadAddress = 65008, |
|||
ExosphereLogConfiguration = 65009, |
|||
ExosphereForceEnableUsb30 = 65010, |
|||
}; |
|||
|
|||
} // namespace Service::SPL |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue