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