1f4d63488SMarri Devender Rao #include "config.h" 2f4d63488SMarri Devender Rao 3f4d63488SMarri Devender Rao #include "csr.hpp" 4f4d63488SMarri Devender Rao 5014be0bfSNan Zhou #include <openssl/bio.h> 6014be0bfSNan Zhou #include <openssl/buffer.h> 7014be0bfSNan Zhou #include <openssl/ossl_typ.h> 8f4d63488SMarri Devender Rao #include <openssl/pem.h> 9014be0bfSNan Zhou #include <openssl/x509.h> 10f4d63488SMarri Devender Rao 11f4d63488SMarri Devender Rao #include <phosphor-logging/elog-errors.hpp> 12f4d63488SMarri Devender Rao #include <phosphor-logging/elog.hpp> 13014be0bfSNan Zhou #include <phosphor-logging/log.hpp> 14f4d63488SMarri Devender Rao #include <xyz/openbmc_project/Certs/error.hpp> 15f4d63488SMarri Devender Rao #include <xyz/openbmc_project/Common/error.hpp> 16f4d63488SMarri Devender Rao 17*223e4604SPatrick Williams #include <cstdio> 18*223e4604SPatrick Williams #include <filesystem> 19*223e4604SPatrick Williams #include <memory> 20*223e4604SPatrick Williams #include <utility> 21*223e4604SPatrick Williams 22e1289adfSNan Zhou namespace phosphor::certs 23f4d63488SMarri Devender Rao { 24cf06ccdcSNan Zhou 25cf06ccdcSNan Zhou using ::phosphor::logging::elog; 26cf06ccdcSNan Zhou using ::phosphor::logging::entry; 27cf06ccdcSNan Zhou using ::phosphor::logging::level; 28cf06ccdcSNan Zhou using ::phosphor::logging::log; 29cf06ccdcSNan Zhou using ::sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; 30f4d63488SMarri Devender Rao namespace fs = std::filesystem; 31f4d63488SMarri Devender Rao 32cf06ccdcSNan Zhou using X509ReqPtr = std::unique_ptr<X509_REQ, decltype(&::X509_REQ_free)>; 33cf06ccdcSNan Zhou using BIOPtr = std::unique_ptr<BIO, decltype(&::BIO_free_all)>; 34cf06ccdcSNan Zhou 35b3dbfb37SPatrick Williams CSR::CSR(sdbusplus::bus_t& bus, const char* path, std::string&& installPath, 36cf06ccdcSNan Zhou const Status& status) : 37ebd21ba4SPatrick Williams internal::CSRInterface(bus, path, 38ebd21ba4SPatrick Williams internal::CSRInterface::action::defer_emit), 39cf06ccdcSNan Zhou objectPath(path), certInstallPath(std::move(installPath)), csrStatus(status) 40f4d63488SMarri Devender Rao { 41f4d63488SMarri Devender Rao // Emit deferred signal. 42f4d63488SMarri Devender Rao this->emit_object_added(); 43f4d63488SMarri Devender Rao } 44f4d63488SMarri Devender Rao 45e129be3bSPatrick Williams std::string CSR::csr() 46f4d63488SMarri Devender Rao { 47e3d47cd4SNan Zhou if (csrStatus == Status::failure) 48f4d63488SMarri Devender Rao { 49f4d63488SMarri Devender Rao log<level::ERR>("Failure in Generating CSR"); 50f4d63488SMarri Devender Rao elog<InternalFailure>(); 51f4d63488SMarri Devender Rao } 52f4d63488SMarri Devender Rao fs::path csrFilePath = certInstallPath; 53718eef37SNan Zhou csrFilePath = csrFilePath.parent_path() / defaultCSRFileName; 54f4d63488SMarri Devender Rao if (!fs::exists(csrFilePath)) 55f4d63488SMarri Devender Rao { 56f4d63488SMarri Devender Rao log<level::ERR>("CSR file doesn't exists", 57f4d63488SMarri Devender Rao entry("FILENAME=%s", csrFilePath.c_str())); 58f4d63488SMarri Devender Rao elog<InternalFailure>(); 59f4d63488SMarri Devender Rao } 60f4d63488SMarri Devender Rao 61f4d63488SMarri Devender Rao FILE* fp = std::fopen(csrFilePath.c_str(), "r"); 62cf06ccdcSNan Zhou X509ReqPtr x509Req(PEM_read_X509_REQ(fp, nullptr, nullptr, nullptr), 63f4d63488SMarri Devender Rao ::X509_REQ_free); 64cfb5802aSNan Zhou if (x509Req == nullptr || fp == nullptr) 65f4d63488SMarri Devender Rao { 66cfb5802aSNan Zhou if (fp != nullptr) 67f4d63488SMarri Devender Rao { 68f4d63488SMarri Devender Rao std::fclose(fp); 69f4d63488SMarri Devender Rao } 70bf3cf751SNan Zhou log<level::ERR>("ERROR occurred while reading CSR file", 71f4d63488SMarri Devender Rao entry("FILENAME=%s", csrFilePath.c_str())); 72f4d63488SMarri Devender Rao elog<InternalFailure>(); 73f4d63488SMarri Devender Rao } 74f4d63488SMarri Devender Rao std::fclose(fp); 75f4d63488SMarri Devender Rao 76cf06ccdcSNan Zhou BIOPtr bio(BIO_new(BIO_s_mem()), ::BIO_free_all); 77f4d63488SMarri Devender Rao int ret = PEM_write_bio_X509_REQ(bio.get(), x509Req.get()); 78f4d63488SMarri Devender Rao if (ret <= 0) 79f4d63488SMarri Devender Rao { 80bf3cf751SNan Zhou log<level::ERR>("Error occurred while calling PEM_write_bio_X509_REQ"); 81f4d63488SMarri Devender Rao elog<InternalFailure>(); 82f4d63488SMarri Devender Rao } 83f4d63488SMarri Devender Rao 84cfb5802aSNan Zhou BUF_MEM* mem = nullptr; 85f4d63488SMarri Devender Rao BIO_get_mem_ptr(bio.get(), &mem); 86f4d63488SMarri Devender Rao std::string pem(mem->data, mem->length); 87f4d63488SMarri Devender Rao return pem; 88f4d63488SMarri Devender Rao } 89f4d63488SMarri Devender Rao 90e1289adfSNan Zhou } // namespace phosphor::certs 91