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