xref: /aosp_15_r20/external/libbrillo/brillo/blkdev_utils/device_mapper_test.cc (revision 1a96fba65179ea7d3f56207137718607415c5953)
1 // Copyright 2018 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <libdevmapper.h>
6 
7 #include <base/files/file_util.h>
8 #include <base/memory/ptr_util.h>
9 #include <base/strings/string_number_conversions.h>
10 #include <base/strings/string_split.h>
11 #include <brillo/blkdev_utils/device_mapper_fake.h>
12 #include <gtest/gtest.h>
13 
14 namespace brillo {
15 
TEST(DevmapperTableTest,CreateTableFromSecureBlobTest)16 TEST(DevmapperTableTest, CreateTableFromSecureBlobTest) {
17   SecureBlob crypt_table_str("0 100 crypt");
18 
19   DevmapperTable dm_table =
20       DevmapperTable::CreateTableFromSecureBlob(crypt_table_str);
21   EXPECT_EQ(DevmapperTable(0, 0, "", SecureBlob()).ToSecureBlob(),
22             dm_table.ToSecureBlob());
23 }
24 
TEST(DevmapperTableTest,CryptCreateParametersTest)25 TEST(DevmapperTableTest, CryptCreateParametersTest) {
26   base::FilePath device("/some/random/filepath");
27 
28   SecureBlob secret;
29   SecureBlob::HexStringToSecureBlob("0123456789ABCDEF", &secret);
30 
31   SecureBlob crypt_parameters = DevmapperTable::CryptCreateParameters(
32       "aes-cbc-essiv:sha256", secret, 0, device, 0, true);
33 
34   DevmapperTable crypt_table(0, 100, "crypt", crypt_parameters);
35 
36   SecureBlob crypt_table_str(
37       "0 100 crypt aes-cbc-essiv:sha256 "
38       "0123456789ABCDEF 0 /some/random/filepath 0 1 "
39       "allow_discards");
40 
41   EXPECT_EQ(crypt_table.ToSecureBlob().to_string(),
42             crypt_table_str.to_string());
43 }
44 
TEST(DevmapperTableTest,CryptCreateTableFromSecureBlobTest)45 TEST(DevmapperTableTest, CryptCreateTableFromSecureBlobTest) {
46   base::FilePath device("/some/random/filepath");
47 
48   SecureBlob secret;
49   SecureBlob::HexStringToSecureBlob("0123456789ABCDEF", &secret);
50 
51   SecureBlob crypt_parameters = DevmapperTable::CryptCreateParameters(
52       "aes-cbc-essiv:sha256", secret, 0, device, 0, true);
53 
54   DevmapperTable crypt_table(0, 100, "crypt", crypt_parameters);
55 
56   SecureBlob crypt_table_str(
57       "0 100 crypt aes-cbc-essiv:sha256 "
58       "0123456789ABCDEF 0 /some/random/filepath 0 1 "
59       "allow_discards");
60 
61   DevmapperTable parsed_blob_table =
62       DevmapperTable::CreateTableFromSecureBlob(crypt_table_str);
63 
64   EXPECT_EQ(crypt_table.ToSecureBlob(), parsed_blob_table.ToSecureBlob());
65 }
66 
TEST(DevmapperTableTest,CryptGetKeyTest)67 TEST(DevmapperTableTest, CryptGetKeyTest) {
68   SecureBlob secret;
69   SecureBlob::HexStringToSecureBlob("0123456789ABCDEF", &secret);
70   SecureBlob crypt_table_str(
71       "0 100 crypt aes-cbc-essiv:sha256 "
72       "0123456789ABCDEF 0 /some/random/filepath 0 1 "
73       "allow_discards");
74 
75   DevmapperTable dm_table =
76       DevmapperTable::CreateTableFromSecureBlob(crypt_table_str);
77 
78   EXPECT_EQ(secret, dm_table.CryptGetKey());
79 }
80 
TEST(DevmapperTableTest,MalformedCryptTableTest)81 TEST(DevmapperTableTest, MalformedCryptTableTest) {
82   SecureBlob secret;
83   SecureBlob::HexStringToSecureBlob("0123456789ABCDEF", &secret);
84   // Pass malformed crypt table string.
85   SecureBlob crypt_table_str(
86       "0 100 crypt ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
87       "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
88       "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
89       "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ");
90 
91   DevmapperTable dm_table =
92       DevmapperTable::CreateTableFromSecureBlob(crypt_table_str);
93 
94   EXPECT_EQ(SecureBlob(), dm_table.CryptGetKey());
95 }
96 
TEST(DevmapperTableTest,GetterTest)97 TEST(DevmapperTableTest, GetterTest) {
98   SecureBlob verity_table(
99       "0 40 verity payload=/dev/loop6 hashtree=/dev/loop6 "
100       "hashstart=40 alg=sha256 root_hexdigest="
101       "01234567 "
102       "salt=89ABCDEF "
103       "error_behavior=eio");
104 
105   DevmapperTable dm_table =
106       DevmapperTable::CreateTableFromSecureBlob(verity_table);
107 
108   EXPECT_EQ(dm_table.GetStart(), 0);
109   EXPECT_EQ(dm_table.GetSize(), 40);
110   EXPECT_EQ(dm_table.GetType(), "verity");
111   EXPECT_EQ(dm_table.GetParameters(),
112             SecureBlob("payload=/dev/loop6 hashtree=/dev/loop6 "
113                        "hashstart=40 alg=sha256 root_hexdigest=01234567 "
114                        "salt=89ABCDEF error_behavior=eio"));
115 }
116 
TEST(DevmapperTest,FakeTaskConformance)117 TEST(DevmapperTest, FakeTaskConformance) {
118   SecureBlob secret;
119   SecureBlob::HexStringToSecureBlob("0123456789ABCDEF", &secret);
120   SecureBlob crypt_table_str(
121       "0 100 crypt aes-cbc-essiv:sha256 "
122       "0123456789ABCDEF 0 /some/random/filepath 0 1 "
123       "allow_discards");
124 
125   DevmapperTable dm_table =
126       DevmapperTable::CreateTableFromSecureBlob(crypt_table_str);
127 
128   EXPECT_EQ(secret, dm_table.CryptGetKey());
129   DeviceMapper dm(base::Bind(&fake::CreateDevmapperTask));
130 
131   // Add device.
132   EXPECT_TRUE(dm.Setup("abcd", dm_table));
133   EXPECT_FALSE(dm.Setup("abcd", dm_table));
134   DevmapperTable table = dm.GetTable("abcd");
135   // Expect tables to be the same.
136   EXPECT_EQ(table.ToSecureBlob(), dm_table.ToSecureBlob());
137   // Expect key to match.
138   EXPECT_EQ(table.CryptGetKey(), secret);
139   EXPECT_TRUE(dm.Remove("abcd"));
140   EXPECT_FALSE(dm.Remove("abcd"));
141 }
142 
143 }  // namespace brillo
144