xref: /openbmc/estoraged/src/test/erase/crypto_test.cpp (revision 15b63e12bdc3f3116fb841349dd4f1cd17a8398b)
159dffa63SJohn Edward Broadbent 
259dffa63SJohn Edward Broadbent #include "cryptErase.hpp"
359dffa63SJohn Edward Broadbent #include "cryptsetupInterface.hpp"
459dffa63SJohn Edward Broadbent #include "estoraged.hpp"
559dffa63SJohn Edward Broadbent #include "estoraged_test.hpp"
659dffa63SJohn Edward Broadbent 
759dffa63SJohn Edward Broadbent #include <unistd.h>
859dffa63SJohn Edward Broadbent 
959dffa63SJohn Edward Broadbent #include <xyz/openbmc_project/Common/error.hpp>
1059dffa63SJohn Edward Broadbent 
1159dffa63SJohn Edward Broadbent #include <exception>
1259dffa63SJohn Edward Broadbent #include <filesystem>
1359dffa63SJohn Edward Broadbent #include <fstream>
1459dffa63SJohn Edward Broadbent #include <string>
1559dffa63SJohn Edward Broadbent 
1659dffa63SJohn Edward Broadbent #include <gmock/gmock.h>
1759dffa63SJohn Edward Broadbent #include <gtest/gtest.h>
1859dffa63SJohn Edward Broadbent 
1959dffa63SJohn Edward Broadbent namespace estoraged_test
2059dffa63SJohn Edward Broadbent {
2159dffa63SJohn Edward Broadbent 
2259dffa63SJohn Edward Broadbent using estoraged::CryptErase;
2359dffa63SJohn Edward Broadbent using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
2459dffa63SJohn Edward Broadbent using sdbusplus::xyz::openbmc_project::Common::Error::ResourceNotFound;
2559dffa63SJohn Edward Broadbent using ::testing::_;
2659dffa63SJohn Edward Broadbent using ::testing::Return;
2759dffa63SJohn Edward Broadbent using ::testing::StrEq;
2859dffa63SJohn Edward Broadbent 
2982897c35SEd Tanous const std::string testFileName = "testFile";
3082897c35SEd Tanous 
3182897c35SEd Tanous class CryptoEraseTest : public testing::Test
3259dffa63SJohn Edward Broadbent {
3359dffa63SJohn Edward Broadbent   public:
3459dffa63SJohn Edward Broadbent     std::ofstream testFile;
3559dffa63SJohn Edward Broadbent 
SetUp()3659dffa63SJohn Edward Broadbent     void SetUp() override
3759dffa63SJohn Edward Broadbent     {
3859dffa63SJohn Edward Broadbent         /* Create an empty file that we'll pretend is a 'storage device'. */
39ba000b95SPatrick Williams         testFile.open(testFileName,
4059dffa63SJohn Edward Broadbent                       std::ios::out | std::ios::binary | std::ios::trunc);
4159dffa63SJohn Edward Broadbent         testFile.close();
4259dffa63SJohn Edward Broadbent         if (testFile.fail())
4359dffa63SJohn Edward Broadbent         {
4459dffa63SJohn Edward Broadbent             throw std::runtime_error("Failed to open test file");
4559dffa63SJohn Edward Broadbent         }
4659dffa63SJohn Edward Broadbent         testFile.close();
4759dffa63SJohn Edward Broadbent     }
4859dffa63SJohn Edward Broadbent };
4959dffa63SJohn Edward Broadbent 
TEST_F(CryptoEraseTest,EraseCryptPass)5082897c35SEd Tanous TEST_F(CryptoEraseTest, EraseCryptPass)
5159dffa63SJohn Edward Broadbent {
5259dffa63SJohn Edward Broadbent     std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
5359dffa63SJohn Edward Broadbent         std::make_unique<MockCryptsetupInterface>();
5459dffa63SJohn Edward Broadbent 
5559dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
5659dffa63SJohn Edward Broadbent         .WillOnce(Return(0));
5759dffa63SJohn Edward Broadbent 
5859dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
5959dffa63SJohn Edward Broadbent         .WillOnce(Return(1));
6059dffa63SJohn Edward Broadbent 
6159dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptKeySlotStatus(_, 0))
6259dffa63SJohn Edward Broadbent         .WillOnce(Return(CRYPT_SLOT_ACTIVE_LAST));
6359dffa63SJohn Edward Broadbent 
6459dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptKeyslotDestroy(_, 0)).Times(1);
6559dffa63SJohn Edward Broadbent 
66*15b63e12SPatrick Williams     CryptErase myCryptErase =
67*15b63e12SPatrick Williams         CryptErase(testFileName, std::move(mockCryptIface));
6859dffa63SJohn Edward Broadbent     EXPECT_NO_THROW(myCryptErase.doErase());
6959dffa63SJohn Edward Broadbent }
7059dffa63SJohn Edward Broadbent 
TEST_F(CryptoEraseTest,EraseCrypMaxSlotFails)7182897c35SEd Tanous TEST_F(CryptoEraseTest, EraseCrypMaxSlotFails)
7259dffa63SJohn Edward Broadbent {
7359dffa63SJohn Edward Broadbent     std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
7459dffa63SJohn Edward Broadbent         std::make_unique<MockCryptsetupInterface>();
7559dffa63SJohn Edward Broadbent 
7659dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
7759dffa63SJohn Edward Broadbent         .WillOnce(Return(0));
7859dffa63SJohn Edward Broadbent 
7959dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
8059dffa63SJohn Edward Broadbent         .WillOnce(Return(-1));
8159dffa63SJohn Edward Broadbent 
82*15b63e12SPatrick Williams     CryptErase myCryptErase =
83*15b63e12SPatrick Williams         CryptErase(testFileName, std::move(mockCryptIface));
8459dffa63SJohn Edward Broadbent     EXPECT_THROW(myCryptErase.doErase(), ResourceNotFound);
8559dffa63SJohn Edward Broadbent }
8659dffa63SJohn Edward Broadbent 
TEST_F(CryptoEraseTest,EraseCrypMaxSlotZero)8782897c35SEd Tanous TEST_F(CryptoEraseTest, EraseCrypMaxSlotZero)
8859dffa63SJohn Edward Broadbent {
8959dffa63SJohn Edward Broadbent     std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
9059dffa63SJohn Edward Broadbent         std::make_unique<MockCryptsetupInterface>();
9159dffa63SJohn Edward Broadbent 
9259dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
9359dffa63SJohn Edward Broadbent         .WillOnce(Return(0));
9459dffa63SJohn Edward Broadbent 
9559dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
9659dffa63SJohn Edward Broadbent         .WillOnce(Return(0));
9759dffa63SJohn Edward Broadbent 
98*15b63e12SPatrick Williams     CryptErase myCryptErase =
99*15b63e12SPatrick Williams         CryptErase(testFileName, std::move(mockCryptIface));
10059dffa63SJohn Edward Broadbent     EXPECT_THROW(myCryptErase.doErase(), ResourceNotFound);
10159dffa63SJohn Edward Broadbent }
10259dffa63SJohn Edward Broadbent 
TEST_F(CryptoEraseTest,EraseCrypOnlyInvalid)10382897c35SEd Tanous TEST_F(CryptoEraseTest, EraseCrypOnlyInvalid)
10459dffa63SJohn Edward Broadbent {
10559dffa63SJohn Edward Broadbent     std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
10659dffa63SJohn Edward Broadbent         std::make_unique<MockCryptsetupInterface>();
10759dffa63SJohn Edward Broadbent 
10859dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
10959dffa63SJohn Edward Broadbent         .WillOnce(Return(0));
11059dffa63SJohn Edward Broadbent 
11159dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
11259dffa63SJohn Edward Broadbent         .WillOnce(Return(32));
11359dffa63SJohn Edward Broadbent 
11459dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptKeySlotStatus(_, _))
11559dffa63SJohn Edward Broadbent         .WillRepeatedly(Return(CRYPT_SLOT_INVALID));
11659dffa63SJohn Edward Broadbent 
117*15b63e12SPatrick Williams     CryptErase myCryptErase =
118*15b63e12SPatrick Williams         CryptErase(testFileName, std::move(mockCryptIface));
11959dffa63SJohn Edward Broadbent     EXPECT_NO_THROW(myCryptErase.doErase());
12059dffa63SJohn Edward Broadbent }
12159dffa63SJohn Edward Broadbent 
TEST_F(CryptoEraseTest,EraseCrypDestoryFails)12282897c35SEd Tanous TEST_F(CryptoEraseTest, EraseCrypDestoryFails)
12359dffa63SJohn Edward Broadbent {
12459dffa63SJohn Edward Broadbent     std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
12559dffa63SJohn Edward Broadbent         std::make_unique<MockCryptsetupInterface>();
12659dffa63SJohn Edward Broadbent 
12759dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
12859dffa63SJohn Edward Broadbent         .WillOnce(Return(0));
12959dffa63SJohn Edward Broadbent 
13059dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
13159dffa63SJohn Edward Broadbent         .WillOnce(Return(1));
13259dffa63SJohn Edward Broadbent 
13359dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptKeySlotStatus(_, 0))
13459dffa63SJohn Edward Broadbent         .WillOnce(Return(CRYPT_SLOT_ACTIVE));
13559dffa63SJohn Edward Broadbent 
13659dffa63SJohn Edward Broadbent     EXPECT_CALL(*mockCryptIface, cryptKeyslotDestroy(_, 0))
13759dffa63SJohn Edward Broadbent         .WillOnce(Return(-1));
13859dffa63SJohn Edward Broadbent 
139*15b63e12SPatrick Williams     CryptErase myCryptErase =
140*15b63e12SPatrick Williams         CryptErase(testFileName, std::move(mockCryptIface));
14159dffa63SJohn Edward Broadbent     EXPECT_THROW(myCryptErase.doErase(), InternalFailure);
14259dffa63SJohn Edward Broadbent }
14359dffa63SJohn Edward Broadbent 
14459dffa63SJohn Edward Broadbent } // namespace estoraged_test
145