blob: 46371bbfa1b397cd47043252e32902352cdb5771 [file] [log] [blame]
Marri Devender Rao6ceec402019-02-01 03:15:19 -06001#pragma once
2
3#include <openssl/x509.h>
4
5#include <filesystem>
6#include <phosphor-logging/elog.hpp>
Marri Devender Raoedd11312019-02-27 08:45:10 -06007#include <xyz/openbmc_project/Certs/Certificate/server.hpp>
Marri Devender Rao13bf74e2019-03-26 01:52:17 -05008#include <xyz/openbmc_project/Certs/Replace/server.hpp>
Marri Devender Rao6ceec402019-02-01 03:15:19 -06009
10namespace phosphor
11{
12namespace certs
13{
Marri Devender Raoedd11312019-02-27 08:45:10 -060014using CertificateIface = sdbusplus::server::object::object<
15 sdbusplus::xyz::openbmc_project::Certs::server::Certificate>;
Marri Devender Rao13bf74e2019-03-26 01:52:17 -050016using ReplaceIface = sdbusplus::xyz::openbmc_project::Certs::server::Replace;
Marri Devender Raoedd11312019-02-27 08:45:10 -060017using CertIfaces =
Marri Devender Rao13bf74e2019-03-26 01:52:17 -050018 sdbusplus::server::object::object<CertificateIface, ReplaceIface>;
Marri Devender Raoedd11312019-02-27 08:45:10 -060019
Marri Devender Rao6ceec402019-02-01 03:15:19 -060020using CertificateType = std::string;
21using UnitsToRestart = std::string;
22using CertInstallPath = std::string;
23using CertUploadPath = std::string;
24using InputType = std::string;
25using InstallFunc = std::function<void(const std::string&)>;
26
27using namespace phosphor::logging;
28
29// for placeholders
30using namespace std::placeholders;
31namespace fs = std::filesystem;
32
33// Supported Types.
34static constexpr auto SERVER = "server";
35static constexpr auto CLIENT = "client";
36static constexpr auto AUTHORITY = "authority";
37
38// RAII support for openSSL functions.
39using X509_Ptr = std::unique_ptr<X509, decltype(&::X509_free)>;
40
41/** @class Certificate
42 * @brief OpenBMC Certificate entry implementation.
43 * @details A concrete implementation for the
44 * xyz.openbmc_project.Certs.Certificate DBus API
45 * xyz.openbmc_project.Certs.Instal DBus API
46 */
Marri Devender Raoedd11312019-02-27 08:45:10 -060047class Certificate : public CertIfaces
Marri Devender Rao6ceec402019-02-01 03:15:19 -060048{
49 public:
50 Certificate() = delete;
51 Certificate(const Certificate&) = delete;
52 Certificate& operator=(const Certificate&) = delete;
53 Certificate(Certificate&&) = delete;
54 Certificate& operator=(Certificate&&) = delete;
55 virtual ~Certificate();
56
57 /** @brief Constructor for the Certificate Object
58 * @param[in] bus - Bus to attach to.
59 * @param[in] objPath - Object path to attach to
60 * @param[in] type - Type of the certificate
61 * @param[in] unit - Units to restart after a certificate is installed
62 * @param[in] installPath - Path of the certificate to install
63 * @param[in] uploadPath - Path of the certificate file to upload
Marri Devender Rao8f80c352019-05-13 00:53:01 -050064 * @param[in] isSkipUnitReload - If true do not restart units
Marri Devender Rao6ceec402019-02-01 03:15:19 -060065 */
66 Certificate(sdbusplus::bus::bus& bus, const std::string& objPath,
67 const CertificateType& type, const UnitsToRestart& unit,
68 const CertInstallPath& installPath,
Marri Devender Rao8f80c352019-05-13 00:53:01 -050069 const CertUploadPath& uploadPath, bool isSkipUnitReload);
Marri Devender Rao6ceec402019-02-01 03:15:19 -060070
Marri Devender Rao13bf74e2019-03-26 01:52:17 -050071 /** @brief Validate certificate and replace the existing certificate
72 * @param[in] filePath - Certificate file path.
73 */
74 void replace(const std::string filePath) override;
75
76 private:
77 /** @brief Validate and Replace/Install the certificate file
78 * Install/Replace the existing certificate file with another
Marri Devender Rao6ceec402019-02-01 03:15:19 -060079 * (possibly CA signed) Certificate file.
80 * @param[in] filePath - Certificate file path.
Marri Devender Rao8f80c352019-05-13 00:53:01 -050081 * @param[in] isSkipUnitReload - If true do not restart units
Marri Devender Rao6ceec402019-02-01 03:15:19 -060082 */
Marri Devender Rao8f80c352019-05-13 00:53:01 -050083 void install(const std::string& filePath, bool isSkipUnitReload);
Marri Devender Rao6ceec402019-02-01 03:15:19 -060084
Marri Devender Rao6ceec402019-02-01 03:15:19 -060085 /** @brief Load Certificate file into the X509 structre.
86 * @param[in] fileName - Certificate and key full file path.
87 * @return pointer to the X509 structure.
88 */
89 X509_Ptr loadCert(const std::string& filePath);
90
Dhruvaraj Subhashchandran36f25142019-02-14 05:06:26 -060091 /** @brief Populate certificate properties by parsing certificate file
92 * @return void
93 */
94 void populateProperties();
95
Marri Devender Rao6ceec402019-02-01 03:15:19 -060096 /** @brief Public/Private key compare function.
97 * Comparing private key against certificate public key
98 * from input .pem file.
99 * @param[in] fileName - Certificate and key full file path.
100 * @return Return true if Key compare is successful,
101 * false if not
102 */
103 bool compareKeys(const std::string& filePath);
104 /** @brief systemd unit reload or reset helper function
105 * Reload if the unit supports it and use a restart otherwise.
106 * @param[in] unit - service need to reload.
107 */
108 void reloadOrReset(const UnitsToRestart& unit);
109
110 /** @brief Type specific function pointer map **/
111 std::unordered_map<InputType, InstallFunc> typeFuncMap;
112
113 /** @brief sdbusplus handler */
114 sdbusplus::bus::bus& bus;
115
116 /** @brief object path */
117 std::string objectPath;
118
119 /** @brief Type of the certificate **/
120 CertificateType certType;
121
122 /** @brief Unit name associated to the service **/
123 UnitsToRestart unitToRestart;
124
125 /** @brief Certificate file installation path **/
126 CertInstallPath certInstallPath;
127};
128
129} // namespace certs
130} // namespace phosphor