|
|
|
@ -71,23 +71,24 @@ boost::optional<Key128> DeriveSDSeed() {
|
|
|
|
|
return seed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Loader::ResultStatus DeriveSDKeys(std::array<Key256, 2>& sd_keys, const KeyManager& keys) {
|
|
|
|
|
if (!keys.HasKey(S128KeyType::Source, static_cast<u64>(SourceKeyType::SDKEK)))
|
|
|
|
|
Loader::ResultStatus DeriveSDKeys(std::array<Key256, 2>& sd_keys, KeyManager& keys) {
|
|
|
|
|
if (!keys.HasKey(S128KeyType::Source, static_cast<u64>(SourceKeyType::SDKek)))
|
|
|
|
|
return Loader::ResultStatus::ErrorMissingSDKEKSource;
|
|
|
|
|
if (!keys.HasKey(S128KeyType::Source, static_cast<u64>(SourceKeyType::AESKEKGeneration)))
|
|
|
|
|
if (!keys.HasKey(S128KeyType::Source, static_cast<u64>(SourceKeyType::AESKekGeneration)))
|
|
|
|
|
return Loader::ResultStatus::ErrorMissingAESKEKGenerationSource;
|
|
|
|
|
if (!keys.HasKey(S128KeyType::Source, static_cast<u64>(SourceKeyType::AESKeyGeneration)))
|
|
|
|
|
return Loader::ResultStatus::ErrorMissingAESKeyGenerationSource;
|
|
|
|
|
|
|
|
|
|
const auto sd_kek_source =
|
|
|
|
|
keys.GetKey(S128KeyType::Source, static_cast<u64>(SourceKeyType::SDKEK));
|
|
|
|
|
keys.GetKey(S128KeyType::Source, static_cast<u64>(SourceKeyType::SDKek));
|
|
|
|
|
const auto aes_kek_gen =
|
|
|
|
|
keys.GetKey(S128KeyType::Source, static_cast<u64>(SourceKeyType::AESKEKGeneration));
|
|
|
|
|
keys.GetKey(S128KeyType::Source, static_cast<u64>(SourceKeyType::AESKekGeneration));
|
|
|
|
|
const auto aes_key_gen =
|
|
|
|
|
keys.GetKey(S128KeyType::Source, static_cast<u64>(SourceKeyType::AESKeyGeneration));
|
|
|
|
|
const auto master_00 = keys.GetKey(S128KeyType::Master);
|
|
|
|
|
const auto sd_kek =
|
|
|
|
|
GenerateKeyEncryptionKey(sd_kek_source, master_00, aes_kek_gen, aes_key_gen);
|
|
|
|
|
keys.SetKey(S128KeyType::SDKek, sd_kek);
|
|
|
|
|
|
|
|
|
|
if (!keys.HasKey(S128KeyType::SDSeed))
|
|
|
|
|
return Loader::ResultStatus::ErrorMissingSDSeed;
|
|
|
|
|