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 11014be0bfSNan Zhou #include <cstdio> 12f4d63488SMarri Devender Rao #include <filesystem> 13014be0bfSNan Zhou #include <memory> 14f4d63488SMarri Devender Rao #include <phosphor-logging/elog-errors.hpp> 15f4d63488SMarri Devender Rao #include <phosphor-logging/elog.hpp> 16014be0bfSNan Zhou #include <phosphor-logging/log.hpp> 17014be0bfSNan 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) : 36*ebd21ba4SPatrick Williams internal::CSRInterface(bus, path, 37*ebd21ba4SPatrick Williams internal::CSRInterface::action::defer_emit), 38cf06ccdcSNan Zhou objectPath(path), certInstallPath(std::move(installPath)), csrStatus(status) 39f4d63488SMarri Devender Rao { 40f4d63488SMarri Devender Rao // Emit deferred signal. 41f4d63488SMarri Devender Rao this->emit_object_added(); 42f4d63488SMarri Devender Rao } 43f4d63488SMarri Devender Rao 44e129be3bSPatrick Williams std::string CSR::csr() 45f4d63488SMarri Devender Rao { 46f4d63488SMarri Devender Rao if (csrStatus == Status::FAILURE) 47f4d63488SMarri Devender Rao { 48f4d63488SMarri Devender Rao log<level::ERR>("Failure in Generating CSR"); 49f4d63488SMarri Devender Rao elog<InternalFailure>(); 50f4d63488SMarri Devender Rao } 51f4d63488SMarri Devender Rao fs::path csrFilePath = certInstallPath; 52718eef37SNan Zhou csrFilePath = csrFilePath.parent_path() / defaultCSRFileName; 53f4d63488SMarri Devender Rao if (!fs::exists(csrFilePath)) 54f4d63488SMarri Devender Rao { 55f4d63488SMarri Devender Rao log<level::ERR>("CSR file doesn't exists", 56f4d63488SMarri Devender Rao entry("FILENAME=%s", csrFilePath.c_str())); 57f4d63488SMarri Devender Rao elog<InternalFailure>(); 58f4d63488SMarri Devender Rao } 59f4d63488SMarri Devender Rao 60f4d63488SMarri Devender Rao FILE* fp = std::fopen(csrFilePath.c_str(), "r"); 61cf06ccdcSNan Zhou X509ReqPtr x509Req(PEM_read_X509_REQ(fp, nullptr, nullptr, nullptr), 62f4d63488SMarri Devender Rao ::X509_REQ_free); 63cfb5802aSNan Zhou if (x509Req == nullptr || fp == nullptr) 64f4d63488SMarri Devender Rao { 65cfb5802aSNan Zhou if (fp != nullptr) 66f4d63488SMarri Devender Rao { 67f4d63488SMarri Devender Rao std::fclose(fp); 68f4d63488SMarri Devender Rao } 69bf3cf751SNan Zhou log<level::ERR>("ERROR occurred while reading CSR file", 70f4d63488SMarri Devender Rao entry("FILENAME=%s", csrFilePath.c_str())); 71f4d63488SMarri Devender Rao elog<InternalFailure>(); 72f4d63488SMarri Devender Rao } 73f4d63488SMarri Devender Rao std::fclose(fp); 74f4d63488SMarri Devender Rao 75cf06ccdcSNan Zhou BIOPtr bio(BIO_new(BIO_s_mem()), ::BIO_free_all); 76f4d63488SMarri Devender Rao int ret = PEM_write_bio_X509_REQ(bio.get(), x509Req.get()); 77f4d63488SMarri Devender Rao if (ret <= 0) 78f4d63488SMarri Devender Rao { 79bf3cf751SNan Zhou log<level::ERR>("Error occurred while calling PEM_write_bio_X509_REQ"); 80f4d63488SMarri Devender Rao elog<InternalFailure>(); 81f4d63488SMarri Devender Rao } 82f4d63488SMarri Devender Rao 83cfb5802aSNan Zhou BUF_MEM* mem = nullptr; 84f4d63488SMarri Devender Rao BIO_get_mem_ptr(bio.get(), &mem); 85f4d63488SMarri Devender Rao std::string pem(mem->data, mem->length); 86f4d63488SMarri Devender Rao return pem; 87f4d63488SMarri Devender Rao } 88f4d63488SMarri Devender Rao 89e1289adfSNan Zhou } // namespace phosphor::certs 90