ES: Add more logging in title import functions

...to make troubleshooting easier.
This commit is contained in:
Léo Lam 2018-05-16 12:31:12 +02:00
parent 57f9928c49
commit 473cbfa951
2 changed files with 36 additions and 0 deletions

View File

@ -931,7 +931,10 @@ ReturnCode ES::VerifyContainer(VerifyContainerType type, VerifyMode mode,
Common::ScopeGuard ca_guard{[&] { iosc.DeleteObject(handle, PID_ES); }};
ret = iosc.ImportCertificate(ca_cert.GetBytes().data(), IOSC::HANDLE_ROOT_KEY, handle, PID_ES);
if (ret != IPC_SUCCESS)
{
ERROR_LOG(IOS_ES, "VerifyContainer: IOSC_ImportCertificate(ca) failed with error %d", ret);
return ret;
}
IOSC::Handle issuer_handle;
const IOSC::ObjectSubType subtype =
@ -942,7 +945,10 @@ ReturnCode ES::VerifyContainer(VerifyContainerType type, VerifyMode mode,
Common::ScopeGuard issuer_guard{[&] { iosc.DeleteObject(issuer_handle, PID_ES); }};
ret = iosc.ImportCertificate(issuer_cert.GetBytes().data(), handle, issuer_handle, PID_ES);
if (ret != IPC_SUCCESS)
{
ERROR_LOG(IOS_ES, "VerifyContainer: IOSC_ImportCertificate(issuer) failed with error %d", ret);
return ret;
}
// Calculate the SHA1 of the signed blob.
const size_t skip = type == VerifyContainerType::Device ? offsetof(SignatureECC, issuer) :
@ -955,7 +961,10 @@ ReturnCode ES::VerifyContainer(VerifyContainerType type, VerifyMode mode,
const std::vector<u8> signature = signed_blob.GetSignatureData();
ret = iosc.VerifyPublicKeySign(sha1, issuer_handle, signature.data(), PID_ES);
if (ret != IPC_SUCCESS)
{
ERROR_LOG(IOS_ES, "VerifyContainer: IOSC_VerifyPublicKeySign failed with error %d", ret);
return ret;
}
if (mode == VerifyMode::UpdateCertStore)
{
@ -970,7 +979,10 @@ ReturnCode ES::VerifyContainer(VerifyContainerType type, VerifyMode mode,
// Import the signed blob to iosc_handle (if a handle was passed to us).
if (ret == IPC_SUCCESS && iosc_handle)
{
ret = iosc.ImportCertificate(signed_blob.GetBytes().data(), issuer_handle, iosc_handle, PID_ES);
ERROR_LOG(IOS_ES, "VerifyContainer: IOSC_ImportCertificate(final) failed with error %d", ret);
}
return ret;
}

View File

@ -140,6 +140,8 @@ static void ResetTitleImportContext(ES::Context* context, IOSC& iosc)
ReturnCode ES::ImportTmd(Context& context, const std::vector<u8>& tmd_bytes)
{
INFO_LOG(IOS_ES, "ImportTmd");
// Ioctlv 0x2b writes the TMD to /tmp/title.tmd (for imports) and doesn't seem to write it
// to either /import or /title. So here we simply have to set the import TMD.
ResetTitleImportContext(&context, m_ios.GetIOSC());
@ -155,16 +157,26 @@ ReturnCode ES::ImportTmd(Context& context, const std::vector<u8>& tmd_bytes)
ret = VerifyContainer(VerifyContainerType::TMD, VerifyMode::UpdateCertStore,
context.title_import_export.tmd, cert_store);
if (ret != IPC_SUCCESS)
{
ERROR_LOG(IOS_ES, "ImportTmd: VerifyContainer failed with error %d", ret);
return ret;
}
if (!InitImport(context.title_import_export.tmd))
{
ERROR_LOG(IOS_ES, "ImportTmd: Failed to initialise title import");
return ES_EIO;
}
ret =
InitBackupKey(m_title_context.tmd, m_ios.GetIOSC(), &context.title_import_export.key_handle);
if (ret != IPC_SUCCESS)
{
ERROR_LOG(IOS_ES, "ImportTmd: InitBackupKey failed with error %d", ret);
return ret;
}
INFO_LOG(IOS_ES, "ImportTmd: All checks passed, marking context as valid");
context.title_import_export.valid = true;
return IPC_SUCCESS;
}
@ -421,7 +433,10 @@ IPCCommandResult ES::ImportContentEnd(Context& context, const IOCtlVRequest& req
ReturnCode ES::ImportTitleDone(Context& context)
{
if (!context.title_import_export.valid || context.title_import_export.content.valid)
{
ERROR_LOG(IOS_ES, "ImportTitleDone: No title import, or a content import is still in progress");
return ES_EINVAL;
}
// Make sure all listed, non-optional contents have been imported.
const u64 title_id = context.title_import_export.tmd.GetTitleId();
@ -442,13 +457,22 @@ ReturnCode ES::ImportTitleDone(Context& context)
return m_ios.GetFS()->GetMetadata(PID_KERNEL, PID_KERNEL, path).Succeeded();
});
if (!has_all_required_contents)
{
ERROR_LOG(IOS_ES, "ImportTitleDone: Some required contents are missing");
return ES_EINVAL;
}
if (!WriteImportTMD(context.title_import_export.tmd))
{
ERROR_LOG(IOS_ES, "ImportTitleDone: Failed to write import TMD");
return ES_EIO;
}
if (!FinishImport(context.title_import_export.tmd))
{
ERROR_LOG(IOS_ES, "ImportTitleDone: Failed to finalise title import");
return ES_EIO;
}
INFO_LOG(IOS_ES, "ImportTitleDone: title %016" PRIx64, title_id);
ResetTitleImportContext(&context, m_ios.GetIOSC());