1 #include "cryptErase.hpp"
2 #include "cryptsetupInterface.hpp"
3 #include "erase.hpp"
4
5 #include <libcryptsetup.h>
6
7 #include <phosphor-logging/lg2.hpp>
8 #include <xyz/openbmc_project/Common/error.hpp>
9
10 #include <memory>
11 #include <string>
12 #include <string_view>
13
14 namespace estoraged
15 {
16 using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
17 using sdbusplus::xyz::openbmc_project::Common::Error::ResourceNotFound;
18
CryptErase(std::string_view devPathIn,std::unique_ptr<estoraged::CryptsetupInterface> inCryptIface)19 CryptErase::CryptErase(
20 std::string_view devPathIn,
21 std::unique_ptr<estoraged::CryptsetupInterface> inCryptIface) :
22 Erase(devPathIn), cryptIface(std::move(inCryptIface))
23 {}
24
doErase()25 void CryptErase::doErase()
26 {
27 /* get cryptHandle */
28 CryptHandle cryptHandle{devPath};
29 /* cryptLoad */
30 if (cryptIface->cryptLoad(cryptHandle.get(), CRYPT_LUKS2, nullptr) != 0)
31 {
32 lg2::error("Failed to load the key slots for destruction",
33 "REDFISH_MESSAGE_ID",
34 std::string("OpenBMC.0.1.EraseFailure"));
35 throw ResourceNotFound();
36 }
37
38 /* find key slots */
39 int nKeySlots = cryptIface->cryptKeySlotMax(CRYPT_LUKS2);
40 if (nKeySlots < 0)
41 {
42 lg2::error("Failed to find the max keyslots", "REDFISH_MESSAGE_ID",
43 std::string("OpenBMC.0.1.EraseFailure"));
44 throw ResourceNotFound();
45 }
46
47 if (nKeySlots == 0)
48 {
49 lg2::error("Max keyslots should never be zero", "REDFISH_MESSAGE_ID",
50 std::string("OpenBMC.0.1.EraseFailure"));
51 throw ResourceNotFound();
52 }
53
54 /* destroy working keyslots */
55 bool keySlotIssue = false;
56 for (int i = 0; i < nKeySlots; i++)
57 {
58 crypt_keyslot_info ki =
59 cryptIface->cryptKeySlotStatus(cryptHandle.get(), i);
60
61 if (ki == CRYPT_SLOT_ACTIVE || ki == CRYPT_SLOT_ACTIVE_LAST)
62 {
63 if (cryptIface->cryptKeyslotDestroy(cryptHandle.get(), i) != 0)
64 {
65 lg2::error(
66 "Estoraged erase failed to destroy keyslot, continuing",
67 "REDFISH_MESSAGE_ID",
68 std::string("eStorageD.1.0.EraseFailure"));
69 keySlotIssue = true;
70 }
71 }
72 }
73 if (keySlotIssue)
74 {
75 throw InternalFailure();
76 }
77 }
78
79 } // namespace estoraged
80