1*f4d63488SMarri Devender Rao #include "config.h" 2*f4d63488SMarri Devender Rao 3*f4d63488SMarri Devender Rao #include "csr.hpp" 4*f4d63488SMarri Devender Rao 5*f4d63488SMarri Devender Rao #include <openssl/pem.h> 6*f4d63488SMarri Devender Rao 7*f4d63488SMarri Devender Rao #include <filesystem> 8*f4d63488SMarri Devender Rao #include <phosphor-logging/elog-errors.hpp> 9*f4d63488SMarri Devender Rao #include <phosphor-logging/elog.hpp> 10*f4d63488SMarri Devender Rao #include <xyz/openbmc_project/Certs/error.hpp> 11*f4d63488SMarri Devender Rao #include <xyz/openbmc_project/Common/error.hpp> 12*f4d63488SMarri Devender Rao 13*f4d63488SMarri Devender Rao namespace phosphor 14*f4d63488SMarri Devender Rao { 15*f4d63488SMarri Devender Rao namespace certs 16*f4d63488SMarri Devender Rao { 17*f4d63488SMarri Devender Rao 18*f4d63488SMarri Devender Rao using X509_REQ_Ptr = std::unique_ptr<X509_REQ, decltype(&::X509_REQ_free)>; 19*f4d63488SMarri Devender Rao using BIO_Ptr = std::unique_ptr<BIO, decltype(&::BIO_free_all)>; 20*f4d63488SMarri Devender Rao using InternalFailure = 21*f4d63488SMarri Devender Rao sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; 22*f4d63488SMarri Devender Rao using namespace phosphor::logging; 23*f4d63488SMarri Devender Rao namespace fs = std::filesystem; 24*f4d63488SMarri Devender Rao 25*f4d63488SMarri Devender Rao CSR::CSR(sdbusplus::bus::bus& bus, const char* path, 26*f4d63488SMarri Devender Rao CertInstallPath&& installPath, const Status& status) : 27*f4d63488SMarri Devender Rao CSRIface(bus, path, true), 28*f4d63488SMarri Devender Rao bus(bus), objectPath(path), certInstallPath(std::move(installPath)), 29*f4d63488SMarri Devender Rao csrStatus(status) 30*f4d63488SMarri Devender Rao { 31*f4d63488SMarri Devender Rao // Emit deferred signal. 32*f4d63488SMarri Devender Rao this->emit_object_added(); 33*f4d63488SMarri Devender Rao } 34*f4d63488SMarri Devender Rao 35*f4d63488SMarri Devender Rao std::string CSR::cSR() 36*f4d63488SMarri Devender Rao { 37*f4d63488SMarri Devender Rao if (csrStatus == Status::FAILURE) 38*f4d63488SMarri Devender Rao { 39*f4d63488SMarri Devender Rao log<level::ERR>("Failure in Generating CSR"); 40*f4d63488SMarri Devender Rao elog<InternalFailure>(); 41*f4d63488SMarri Devender Rao } 42*f4d63488SMarri Devender Rao fs::path csrFilePath = certInstallPath; 43*f4d63488SMarri Devender Rao csrFilePath = csrFilePath.parent_path() / CSR_FILE_NAME; 44*f4d63488SMarri Devender Rao if (!fs::exists(csrFilePath)) 45*f4d63488SMarri Devender Rao { 46*f4d63488SMarri Devender Rao log<level::ERR>("CSR file doesn't exists", 47*f4d63488SMarri Devender Rao entry("FILENAME=%s", csrFilePath.c_str())); 48*f4d63488SMarri Devender Rao elog<InternalFailure>(); 49*f4d63488SMarri Devender Rao } 50*f4d63488SMarri Devender Rao 51*f4d63488SMarri Devender Rao FILE* fp = std::fopen(csrFilePath.c_str(), "r"); 52*f4d63488SMarri Devender Rao X509_REQ_Ptr x509Req(PEM_read_X509_REQ(fp, NULL, NULL, NULL), 53*f4d63488SMarri Devender Rao ::X509_REQ_free); 54*f4d63488SMarri Devender Rao if (x509Req == NULL || fp == NULL) 55*f4d63488SMarri Devender Rao { 56*f4d63488SMarri Devender Rao if (fp != NULL) 57*f4d63488SMarri Devender Rao { 58*f4d63488SMarri Devender Rao std::fclose(fp); 59*f4d63488SMarri Devender Rao } 60*f4d63488SMarri Devender Rao log<level::ERR>("ERROR occured while reading CSR file", 61*f4d63488SMarri Devender Rao entry("FILENAME=%s", csrFilePath.c_str())); 62*f4d63488SMarri Devender Rao elog<InternalFailure>(); 63*f4d63488SMarri Devender Rao } 64*f4d63488SMarri Devender Rao std::fclose(fp); 65*f4d63488SMarri Devender Rao 66*f4d63488SMarri Devender Rao BIO_Ptr bio(BIO_new(BIO_s_mem()), ::BIO_free_all); 67*f4d63488SMarri Devender Rao int ret = PEM_write_bio_X509_REQ(bio.get(), x509Req.get()); 68*f4d63488SMarri Devender Rao if (ret <= 0) 69*f4d63488SMarri Devender Rao { 70*f4d63488SMarri Devender Rao log<level::ERR>("Error occured while calling PEM_write_bio_X509_REQ"); 71*f4d63488SMarri Devender Rao elog<InternalFailure>(); 72*f4d63488SMarri Devender Rao } 73*f4d63488SMarri Devender Rao 74*f4d63488SMarri Devender Rao BUF_MEM* mem = NULL; 75*f4d63488SMarri Devender Rao BIO_get_mem_ptr(bio.get(), &mem); 76*f4d63488SMarri Devender Rao std::string pem(mem->data, mem->length); 77*f4d63488SMarri Devender Rao return pem; 78*f4d63488SMarri Devender Rao } 79*f4d63488SMarri Devender Rao 80*f4d63488SMarri Devender Rao } // namespace certs 81*f4d63488SMarri Devender Rao } // namespace phosphor 82