blob: d77c7f9411ed4e46ef7ef9438a504605cbf5fa3d [file] [log] [blame]
John Wedig2098dab2021-09-14 13:56:28 -07001#pragma once
2
John Wedigb810c922021-11-17 16:38:03 -08003#include "cryptsetupInterface.hpp"
4#include "filesystemInterface.hpp"
5
6#include <libcryptsetup.h>
7
John Wedig2098dab2021-09-14 13:56:28 -07008#include <sdbusplus/bus.hpp>
9#include <sdbusplus/exception.hpp>
10#include <sdbusplus/server/object.hpp>
John Wedig972c3fa2021-12-29 17:30:41 -080011#include <xyz/openbmc_project/Inventory/Item/Volume/server.hpp>
John Wedig2098dab2021-09-14 13:56:28 -070012
John Wedigb810c922021-11-17 16:38:03 -080013#include <filesystem>
14#include <memory>
John Wedig2098dab2021-09-14 13:56:28 -070015#include <string>
John Wedigb810c922021-11-17 16:38:03 -080016#include <string_view>
John Wedig2098dab2021-09-14 13:56:28 -070017#include <vector>
18
19namespace estoraged
20{
21using eStoragedInherit = sdbusplus::server::object_t<
John Wedig972c3fa2021-12-29 17:30:41 -080022 sdbusplus::xyz::openbmc_project::Inventory::Item::server::Volume>;
John Wedigb810c922021-11-17 16:38:03 -080023using estoraged::Cryptsetup;
24using estoraged::Filesystem;
John Wedig2098dab2021-09-14 13:56:28 -070025
26/** @class eStoraged
27 * @brief eStoraged object to manage a LUKS encrypted storage device.
28 */
29class eStoraged : eStoragedInherit
30{
31 public:
John Wedigb810c922021-11-17 16:38:03 -080032 /** @brief Constructor for eStoraged
33 *
34 * @param[in] bus - sdbusplus dbus object
35 * @param[in] path - DBus object path
36 * @param[in] devPath - path to device file, e.g. /dev/mmcblk0
37 * @param[in] luksName - name for the LUKS container
38 * @param[in] cryptInterface - (optional) pointer to CryptsetupInterface
39 * object
40 * @param[in] fsInterface - (optional) pointer to FilesystemInterface
41 * object
42 */
John Wedig2098dab2021-09-14 13:56:28 -070043 eStoraged(sdbusplus::bus::bus& bus, const char* path,
John Wedigb810c922021-11-17 16:38:03 -080044 const std::string& devPath, const std::string& luksName,
45 std::unique_ptr<CryptsetupInterface> cryptInterface =
46 std::make_unique<Cryptsetup>(),
47 std::unique_ptr<FilesystemInterface> fsInterface =
48 std::make_unique<Filesystem>()) :
John Wedig2098dab2021-09-14 13:56:28 -070049 eStoragedInherit(bus, path),
John Wedigb810c922021-11-17 16:38:03 -080050 devPath(devPath), containerName(luksName),
51 mountPoint("/mnt/" + luksName + "_fs"),
52 cryptIface(std::move(cryptInterface)), fsIface(std::move(fsInterface))
John Wedig2098dab2021-09-14 13:56:28 -070053 {}
54
55 /** @brief Format the LUKS encrypted device and create empty filesystem.
56 *
57 * @param[in] password - password to set for the LUKS device.
John Wedig972c3fa2021-12-29 17:30:41 -080058 * @param[in] type - filesystem type, e.g. ext4
John Wedig2098dab2021-09-14 13:56:28 -070059 */
John Wedig972c3fa2021-12-29 17:30:41 -080060 void formatLuks(std::vector<uint8_t> password,
61 FilesystemType type) override;
John Wedig2098dab2021-09-14 13:56:28 -070062
63 /** @brief Erase the contents of the storage device.
64 *
John Wedig2098dab2021-09-14 13:56:28 -070065 * @param[in] eraseType - type of erase operation.
66 */
John Wedig972c3fa2021-12-29 17:30:41 -080067 void erase(EraseMethod eraseType) override;
John Wedig2098dab2021-09-14 13:56:28 -070068
69 /** @brief Unmount filesystem and lock the LUKS device.
John Wedig2098dab2021-09-14 13:56:28 -070070 */
John Wedig972c3fa2021-12-29 17:30:41 -080071 void lock() override;
John Wedig2098dab2021-09-14 13:56:28 -070072
73 /** @brief Unlock device and mount the filesystem.
74 *
75 * @param[in] password - password for the LUKS device.
76 */
77 void unlock(std::vector<uint8_t> password) override;
78
79 /** @brief Change the password for the LUKS device.
80 *
81 * @param[in] oldPassword - old password for the LUKS device.
82 * @param[in] newPassword - new password for the LUKS device.
83 */
84 void changePassword(std::vector<uint8_t> oldPassword,
85 std::vector<uint8_t> newPassword) override;
86
John Wedigb810c922021-11-17 16:38:03 -080087 /** @brief Check if the LUKS device is currently locked. */
88 bool isLocked() const;
89
90 /** @brief Get the mount point for the filesystem on the LUKS device. */
91 std::string_view getMountPoint() const;
92
John Wedig2098dab2021-09-14 13:56:28 -070093 private:
John Wedigb810c922021-11-17 16:38:03 -080094 /** @brief Full path of the device file, e.g. /dev/mmcblk0. */
John Wedig2098dab2021-09-14 13:56:28 -070095 std::string devPath;
96
John Wedigb810c922021-11-17 16:38:03 -080097 /** @brief Name of the LUKS container. */
John Wedig2098dab2021-09-14 13:56:28 -070098 std::string containerName;
John Wedigb810c922021-11-17 16:38:03 -080099
100 /** @brief Mount point for the filesystem. */
101 std::string mountPoint;
102
103 /** @brief Pointer to cryptsetup interface object.
104 * @details This is used to mock out the cryptsetup functions.
105 */
106 std::unique_ptr<CryptsetupInterface> cryptIface;
107
108 /** @brief Pointer to filesystem interface object.
109 * @details This is used to mock out filesystem operations.
110 */
111 std::unique_ptr<FilesystemInterface> fsIface;
112
113 /** @brief Format LUKS encrypted device.
114 *
115 * @param[in] cd - initialized crypt_device struct for the device.
116 * @param[in] password - password to set for the LUKS device.
117 */
118 void formatLuksDev(struct crypt_device* cd, std::vector<uint8_t> password);
119
120 /** @brief Unlock the device.
121 *
122 * @param[in] cd - initialized crypt_device struct for the device.
123 * @param[in] password - password to activate the LUKS device.
124 */
125 void activateLuksDev(struct crypt_device* cd,
126 std::vector<uint8_t> password);
127
128 /** @brief Create the filesystem on the LUKS device.
129 * @details The LUKS device should already be activated, i.e. unlocked.
130 */
131 void createFilesystem();
132
133 /** @brief Deactivate the LUKS device.
134 * @details The filesystem is assumed to be unmounted already.
135 */
136 void deactivateLuksDev();
137
138 /** @brief Mount the filesystem.
139 * @details The filesystem should already exist and the LUKS device should
140 * be unlocked already.
141 */
142 void mountFilesystem();
143
144 /** @brief Unmount the filesystem. */
145 void unmountFilesystem();
John Wedig2098dab2021-09-14 13:56:28 -0700146};
147
148} // namespace estoraged