blob: 36dc8753ebba9a7b68f533641c18654ac843881c [file] [log] [blame]
#include "secureboot.hpp"
#include <cereal/archives/binary.hpp>
#include <fstream>
// Register class version with Cereal
CEREAL_CLASS_VERSION(bios_config::SecureBoot, 0)
namespace bios_config
{
SecureBoot::SecureBoot(sdbusplus::asio::object_server& objectServer,
std::shared_ptr<sdbusplus::asio::connection>& systemBus,
std::string persistPath) :
sdbusplus::xyz::openbmc_project::BIOSConfig::server::SecureBoot(
*systemBus, secureBootObjectPath),
objServer(objectServer), systemBus(systemBus)
{
fs::path secureBootDir(persistPath);
fs::create_directories(secureBootDir);
secureBootFile = secureBootDir / secureBootPersistFile;
deserialize();
}
SecureBootBase::CurrentBootType SecureBoot::currentBoot(
SecureBootBase::CurrentBootType value)
{
auto ret = SecureBootBase::currentBoot(value);
serialize();
return ret;
}
bool SecureBoot::pendingEnable(bool value)
{
auto ret = SecureBootBase::pendingEnable(value);
serialize();
return ret;
}
SecureBootBase::ModeType SecureBoot::mode(SecureBootBase::ModeType value)
{
auto ret = SecureBootBase::mode(value);
serialize();
return ret;
}
void SecureBoot::serialize()
{
try
{
std::filesystem::create_directories(secureBootFile.parent_path());
std::ofstream os(secureBootFile.c_str(),
std::ios::out | std::ios::binary);
cereal::BinaryOutputArchive oarchive(os);
oarchive(*this);
}
catch (const std::exception& e)
{
lg2::error("Failed to serialize SecureBoot: {ERROR}", "ERROR", e);
}
}
bool SecureBoot::deserialize()
{
try
{
if (std::filesystem::exists(secureBootFile))
{
std::ifstream is(secureBootFile.c_str(),
std::ios::in | std::ios::binary);
cereal::BinaryInputArchive iarchive(is);
iarchive(*this);
return true;
}
return false;
}
catch (const std::exception& e)
{
lg2::error("Failed to deserialize SecureBoot: {ERROR}", "ERROR", e);
return false;
}
}
} // namespace bios_config