blob: d674619d58d69c22039fafcc5e8dfb23c6d5efde [file] [log] [blame]
David Zeuthen21e95262016-07-27 17:58:40 -04001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
David Zeuthenc612e2e2016-09-16 16:44:08 -04004 * Permission is hereby granted, free of charge, to any person
5 * obtaining a copy of this software and associated documentation
6 * files (the "Software"), to deal in the Software without
7 * restriction, including without limitation the rights to use, copy,
8 * modify, merge, publish, distribute, sublicense, and/or sell copies
9 * of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
David Zeuthen21e95262016-07-27 17:58:40 -040011 *
David Zeuthenc612e2e2016-09-16 16:44:08 -040012 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
David Zeuthen21e95262016-07-27 17:58:40 -040014 *
David Zeuthenc612e2e2016-09-16 16:44:08 -040015 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
David Zeuthen21e95262016-07-27 17:58:40 -040023 */
24
25#include <string.h>
26
27#include <gtest/gtest.h>
28
29#include "libavb.h"
30
31TEST(UtilTest, RSAPublicKeyHeaderByteswap) {
32 AvbRSAPublicKeyHeader h;
33 AvbRSAPublicKeyHeader s;
34 uint32_t n32;
35 uint64_t n64;
36
37 n32 = 0x11223344;
38 n64 = 0x1122334455667788;
39
40 h.key_num_bits = htobe32(n32);
41 n32++;
42 h.n0inv = htobe32(n32);
43 n32++;
44
45 EXPECT_NE(0, avb_rsa_public_key_header_validate_and_byteswap(&h, &s));
46
47 n32 = 0x11223344;
48 n64 = 0x1122334455667788;
49
50 EXPECT_EQ(n32, s.key_num_bits);
51 n32++;
52 EXPECT_EQ(n32, s.n0inv);
53 n32++;
54}
55
56TEST(UtilTest, FooterByteswap) {
57 AvbFooter h;
58 AvbFooter s;
59 AvbFooter other;
60 AvbFooter bad;
61 uint64_t n64;
62
63 n64 = 0x1122334455667788;
64
65 memcpy(h.magic, AVB_FOOTER_MAGIC, AVB_FOOTER_MAGIC_LEN);
66 h.version_major = htobe32(AVB_FOOTER_MAJOR_VERSION);
67 h.version_minor = htobe32(AVB_FOOTER_MINOR_VERSION);
68 h.original_image_size = htobe64(n64);
69 n64++;
70 h.vbmeta_offset = htobe64(n64);
71 n64++;
72 h.vbmeta_size = htobe64(n64);
73 n64++;
74
75 EXPECT_NE(0, avb_footer_validate_and_byteswap(&h, &s));
76
77 n64 = 0x1122334455667788;
78
79 EXPECT_EQ((uint32_t)AVB_FOOTER_MAJOR_VERSION, s.version_major);
80 EXPECT_EQ((uint32_t)AVB_FOOTER_MINOR_VERSION, s.version_minor);
81 EXPECT_EQ(n64, s.original_image_size);
82 n64++;
83 EXPECT_EQ(n64, s.vbmeta_offset);
84 n64++;
85 EXPECT_EQ(n64, s.vbmeta_size);
86 n64++;
87
88 // Check that the struct still validates if minor is bigger than
89 // what we expect.
90 other = h;
91 h.version_minor = htobe32(AVB_FOOTER_MINOR_VERSION + 1);
92 EXPECT_NE(0, avb_footer_validate_and_byteswap(&other, &s));
93
94 // Check for bad magic.
95 bad = h;
96 bad.magic[0] = 'x';
97 EXPECT_EQ(0, avb_footer_validate_and_byteswap(&bad, &s));
98
99 // Check for bad major version.
100 bad = h;
101 bad.version_major = htobe32(AVB_FOOTER_MAJOR_VERSION + 1);
102 EXPECT_EQ(0, avb_footer_validate_and_byteswap(&bad, &s));
103}
104
105TEST(UtilTest, KernelCmdlineDescriptorByteswap) {
106 AvbKernelCmdlineDescriptor h;
107 AvbKernelCmdlineDescriptor s;
108 AvbKernelCmdlineDescriptor bad;
109 uint64_t nbf;
110
111 // Specify 44 bytes of data past the end of the descriptor struct.
112 nbf = 44 + sizeof(AvbKernelCmdlineDescriptor) - sizeof(AvbDescriptor);
113 h.parent_descriptor.num_bytes_following = htobe64(nbf);
114 h.parent_descriptor.tag = htobe64(AVB_DESCRIPTOR_TAG_KERNEL_CMDLINE);
115 h.kernel_cmdline_length = htobe32(44);
116
117 EXPECT_NE(0, avb_kernel_cmdline_descriptor_validate_and_byteswap(&h, &s));
118
119 EXPECT_EQ(AVB_DESCRIPTOR_TAG_KERNEL_CMDLINE, s.parent_descriptor.tag);
120 EXPECT_EQ(nbf, s.parent_descriptor.num_bytes_following);
121 EXPECT_EQ(44UL, s.kernel_cmdline_length);
122
123 // Check for bad tag.
124 bad = h;
125 bad.parent_descriptor.tag = htobe64(0xf00dd00d);
126 EXPECT_EQ(0, avb_kernel_cmdline_descriptor_validate_and_byteswap(&bad, &s));
127
128 // Doesn't fit in 45 bytes.
129 bad = h;
130 bad.kernel_cmdline_length = htobe32(45);
131 EXPECT_EQ(0, avb_kernel_cmdline_descriptor_validate_and_byteswap(&bad, &s));
132}
133
134TEST(UtilTest, HashtreeDescriptorByteswap) {
135 AvbHashtreeDescriptor h;
136 AvbHashtreeDescriptor s;
137 AvbHashtreeDescriptor bad;
138 uint64_t nbf;
139 uint32_t n32;
140 uint64_t n64;
141
142 // Specify 40 bytes of data past the end of the descriptor struct.
143 nbf = 40 + sizeof(AvbHashtreeDescriptor) - sizeof(AvbDescriptor);
144 h.parent_descriptor.num_bytes_following = htobe64(nbf);
145 h.parent_descriptor.tag = htobe64(AVB_DESCRIPTOR_TAG_HASHTREE);
146 h.partition_name_len = htobe32(10);
147 h.salt_len = htobe32(10);
148 h.root_digest_len = htobe32(10);
149
150 n32 = 0x11223344;
151 n64 = 0x1122334455667788;
152
153 h.dm_verity_version = htobe32(n32);
154 n32++;
155 h.image_size = htobe64(n64);
156 n64++;
157 h.tree_offset = htobe64(n64);
158 n64++;
159 h.tree_size = htobe64(n64);
160 n64++;
161 h.data_block_size = htobe32(n32);
162 n32++;
163 h.hash_block_size = htobe32(n32);
164 n32++;
165
166 EXPECT_NE(0, avb_hashtree_descriptor_validate_and_byteswap(&h, &s));
167
168 n32 = 0x11223344;
169 n64 = 0x1122334455667788;
170
171 EXPECT_EQ(n32, s.dm_verity_version);
172 n32++;
173 EXPECT_EQ(n64, s.image_size);
174 n64++;
175 EXPECT_EQ(n64, s.tree_offset);
176 n64++;
177 EXPECT_EQ(n64, s.tree_size);
178 n64++;
179 EXPECT_EQ(n32, s.data_block_size);
180 n32++;
181 EXPECT_EQ(n32, s.hash_block_size);
182 n32++;
183
184 EXPECT_EQ(AVB_DESCRIPTOR_TAG_HASHTREE, s.parent_descriptor.tag);
185 EXPECT_EQ(nbf, s.parent_descriptor.num_bytes_following);
186 EXPECT_EQ(10UL, s.partition_name_len);
187 EXPECT_EQ(10UL, s.salt_len);
188 EXPECT_EQ(10UL, s.root_digest_len);
189
190 // Check for bad tag.
191 bad = h;
192 bad.parent_descriptor.tag = htobe64(0xf00dd00d);
193 EXPECT_EQ(0, avb_hashtree_descriptor_validate_and_byteswap(&bad, &s));
194
195 // Doesn't fit in 40 bytes (30 + 10 + 10 = 50).
196 bad = h;
197 bad.partition_name_len = htobe32(30);
198 EXPECT_EQ(0, avb_hashtree_descriptor_validate_and_byteswap(&bad, &s));
199
200 // Doesn't fit in 40 bytes (10 + 30 + 10 = 50).
201 bad = h;
202 bad.salt_len = htobe32(30);
203 EXPECT_EQ(0, avb_hashtree_descriptor_validate_and_byteswap(&bad, &s));
204
205 // Doesn't fit in 40 bytes (10 + 10 + 30 = 50).
206 bad = h;
207 bad.root_digest_len = htobe32(30);
208 EXPECT_EQ(0, avb_hashtree_descriptor_validate_and_byteswap(&bad, &s));
209}
210
211TEST(UtilTest, HashDescriptorByteswap) {
212 AvbHashDescriptor h;
213 AvbHashDescriptor s;
214 AvbHashDescriptor bad;
215 uint64_t nbf;
216
217 // Specify 44 bytes of data past the end of the descriptor struct.
218 nbf = 44 + sizeof(AvbHashDescriptor) - sizeof(AvbDescriptor);
219 h.parent_descriptor.num_bytes_following = htobe64(nbf);
220 h.parent_descriptor.tag = htobe64(AVB_DESCRIPTOR_TAG_HASH);
221 h.partition_name_len = htobe32(10);
222 h.salt_len = htobe32(10);
223 h.digest_len = htobe32(10);
224
225 EXPECT_NE(0, avb_hash_descriptor_validate_and_byteswap(&h, &s));
226
227 EXPECT_EQ(AVB_DESCRIPTOR_TAG_HASH, s.parent_descriptor.tag);
228 EXPECT_EQ(nbf, s.parent_descriptor.num_bytes_following);
229 EXPECT_EQ(10UL, s.partition_name_len);
230 EXPECT_EQ(10UL, s.salt_len);
231 EXPECT_EQ(10UL, s.digest_len);
232
233 // Check for bad tag.
234 bad = h;
235 bad.parent_descriptor.tag = htobe64(0xf00dd00d);
236 EXPECT_EQ(0, avb_hash_descriptor_validate_and_byteswap(&bad, &s));
237
238 // Doesn't fit in 44 bytes (30 + 10 + 10 = 50).
239 bad = h;
240 bad.partition_name_len = htobe32(30);
241 EXPECT_EQ(0, avb_hash_descriptor_validate_and_byteswap(&bad, &s));
242
243 // Doesn't fit in 44 bytes (10 + 30 + 10 = 50).
244 bad = h;
245 bad.salt_len = htobe32(30);
246 EXPECT_EQ(0, avb_hash_descriptor_validate_and_byteswap(&bad, &s));
247
248 // Doesn't fit in 44 bytes (10 + 10 + 30 = 50).
249 bad = h;
250 bad.digest_len = htobe32(30);
251 EXPECT_EQ(0, avb_hash_descriptor_validate_and_byteswap(&bad, &s));
252}
253
254TEST(UtilTest, ChainPartitionDescriptorByteswap) {
255 AvbChainPartitionDescriptor h;
256 AvbChainPartitionDescriptor s;
257 AvbChainPartitionDescriptor bad;
258 uint64_t nbf;
259
260 // Specify 36 bytes of data past the end of the descriptor struct.
261 nbf = 36 + sizeof(AvbChainPartitionDescriptor) - sizeof(AvbDescriptor);
262 h.parent_descriptor.num_bytes_following = htobe64(nbf);
263 h.parent_descriptor.tag = htobe64(AVB_DESCRIPTOR_TAG_CHAIN_PARTITION);
264 h.rollback_index_slot = htobe32(42);
265 h.partition_name_len = htobe32(16);
266 h.public_key_len = htobe32(17);
267
268 EXPECT_NE(0, avb_chain_partition_descriptor_validate_and_byteswap(&h, &s));
269
270 EXPECT_EQ(AVB_DESCRIPTOR_TAG_CHAIN_PARTITION, s.parent_descriptor.tag);
271 EXPECT_EQ(nbf, s.parent_descriptor.num_bytes_following);
272 EXPECT_EQ(42UL, s.rollback_index_slot);
273 EXPECT_EQ(16UL, s.partition_name_len);
274 EXPECT_EQ(17UL, s.public_key_len);
275
276 // Check for bad tag.
277 bad = h;
278 bad.parent_descriptor.tag = htobe64(0xf00dd00d);
279 EXPECT_EQ(0, avb_chain_partition_descriptor_validate_and_byteswap(&bad, &s));
280
281 // Check for bad rollback index slot (must be at least 1).
282 bad = h;
283 bad.rollback_index_slot = htobe32(0);
284 EXPECT_EQ(0, avb_chain_partition_descriptor_validate_and_byteswap(&bad, &s));
285
286 // Doesn't fit in 40 bytes (24 + 17 = 41).
287 bad = h;
288 bad.partition_name_len = htobe32(24);
289 EXPECT_EQ(0, avb_chain_partition_descriptor_validate_and_byteswap(&bad, &s));
290
291 // Doesn't fit in 40 bytes (16 + 25 = 41).
292 bad = h;
293 bad.public_key_len = htobe32(25);
294 EXPECT_EQ(0, avb_chain_partition_descriptor_validate_and_byteswap(&bad, &s));
295}
296
297TEST(UtilTest, PropertyDescriptorByteswap) {
298 AvbPropertyDescriptor h;
299 AvbPropertyDescriptor s;
300 AvbPropertyDescriptor bad;
301 uint64_t nbf;
302
303 // Specify 40 bytes of data past the end of the descriptor struct.
304 nbf = 40 + sizeof(AvbPropertyDescriptor) - sizeof(AvbDescriptor);
305 h.parent_descriptor.num_bytes_following = htobe64(nbf);
306 h.parent_descriptor.tag = htobe64(AVB_DESCRIPTOR_TAG_PROPERTY);
307 h.key_num_bytes = htobe64(16);
308 h.value_num_bytes = htobe64(17);
309
310 EXPECT_NE(0, avb_property_descriptor_validate_and_byteswap(&h, &s));
311
312 EXPECT_EQ(AVB_DESCRIPTOR_TAG_PROPERTY, s.parent_descriptor.tag);
313 EXPECT_EQ(nbf, s.parent_descriptor.num_bytes_following);
314 EXPECT_EQ(16UL, s.key_num_bytes);
315 EXPECT_EQ(17UL, s.value_num_bytes);
316
317 // Check for bad tag.
318 bad = h;
319 bad.parent_descriptor.tag = htobe64(0xf00dd00d);
320 EXPECT_EQ(0, avb_property_descriptor_validate_and_byteswap(&bad, &s));
321
322 // Doesn't fit in 40 bytes (22 + 17 + 2 = 41).
323 bad = h;
324 bad.key_num_bytes = htobe64(22);
325 EXPECT_EQ(0, avb_property_descriptor_validate_and_byteswap(&bad, &s));
326
327 // Doesn't fit in 40 bytes (16 + 23 + 2 = 41).
328 bad = h;
329 bad.value_num_bytes = htobe64(23);
330 EXPECT_EQ(0, avb_property_descriptor_validate_and_byteswap(&bad, &s));
331}
332
333TEST(UtilTest, DescriptorByteswap) {
334 AvbDescriptor h;
335 AvbDescriptor s;
336 uint64_t n64;
337
338 n64 = 0x1122334455667788;
339
340 h.num_bytes_following = htobe64(n64);
341 n64++;
342 h.tag = htobe64(n64);
343 n64++;
344
345 EXPECT_NE(0, avb_descriptor_validate_and_byteswap(&h, &s));
346
347 n64 = 0x1122334455667788;
348
349 EXPECT_EQ(n64, s.num_bytes_following);
350 n64++;
351 EXPECT_EQ(n64, s.tag);
352 n64++;
353
354 // Check that we catch if |num_bytes_following| isn't divisble by 8.
355 h.num_bytes_following = htobe64(7);
356 EXPECT_EQ(0, avb_descriptor_validate_and_byteswap(&h, &s));
357}
358
359TEST(UtilTest, SafeAddition) {
360 uint64_t value;
361 uint64_t pow2_60 = 1ULL << 60;
362
363 value = 2;
364 EXPECT_NE(0, avb_safe_add_to(&value, 5));
365 EXPECT_EQ(7UL, value);
366
367 /* These should not overflow */
368 value = 1 * pow2_60;
369 EXPECT_NE(0, avb_safe_add_to(&value, 2 * pow2_60));
370 EXPECT_EQ(3 * pow2_60, value);
371 value = 7 * pow2_60;
372 EXPECT_NE(0, avb_safe_add_to(&value, 8 * pow2_60));
373 EXPECT_EQ(15 * pow2_60, value);
374 value = 9 * pow2_60;
375 EXPECT_NE(0, avb_safe_add_to(&value, 3 * pow2_60));
376 EXPECT_EQ(12 * pow2_60, value);
377 value = 0xfffffffffffffffcUL;
378 EXPECT_NE(0, avb_safe_add_to(&value, 2));
379 EXPECT_EQ(0xfffffffffffffffeUL, value);
380
381 /* These should overflow. */
382 value = 8 * pow2_60;
383 EXPECT_EQ(0, avb_safe_add_to(&value, 8 * pow2_60));
384 value = 0xfffffffffffffffcUL;
385 EXPECT_EQ(0, avb_safe_add_to(&value, 4));
386}
387
388static int avb_validate_utf8z(const char* data) {
389 return avb_validate_utf8(reinterpret_cast<const uint8_t*>(data),
390 strlen(data));
391}
392
393TEST(UtilTest, UTF8Validation) {
394 // These should succeed.
395 EXPECT_NE(0, avb_validate_utf8z("foo bar"));
396 // Encoding of U+00E6 LATIN SMALL LETTER AE: æ
397 EXPECT_NE(0, avb_validate_utf8z("foo \xC3\xA6 bar"));
398 // Encoding of U+20AC EURO SIGN: €
399 EXPECT_NE(0, avb_validate_utf8z("foo \xE2\x82\xAC bar"));
400 // Encoding of U+1F466 BOY: 👦
401 EXPECT_NE(0, avb_validate_utf8z("foo \xF0\x9F\x91\xA6 bar"));
402 // All three runes following each other.
403 EXPECT_NE(0, avb_validate_utf8z("\xC3\xA6\xE2\x82\xAC\xF0\x9F\x91\xA6"));
404
405 // These should fail.
406 EXPECT_EQ(0, avb_validate_utf8z("foo \xF8 bar"));
407 EXPECT_EQ(0, avb_validate_utf8z("\xF8"));
408 // Stops in the middle of Unicode rune.
409 EXPECT_EQ(0, avb_validate_utf8z("foo \xC3"));
410}
411
412TEST(UtilTest, StrConcat) {
413 char buf[8];
414
415 // These should succeed.
416 EXPECT_NE(0, avb_str_concat(buf, sizeof buf, "foo", 3, "bar1", 4));
417
418 // This should fail: Insufficient space.
419 EXPECT_EQ(0, avb_str_concat(buf, sizeof buf, "foo0", 4, "bar1", 4));
420}
421
422TEST(UtilTest, StrStr) {
423 const char* haystack = "abc def abcabc";
424
425 EXPECT_EQ(nullptr, avb_strstr(haystack, "needle"));
426 EXPECT_EQ(haystack, avb_strstr(haystack, "abc"));
427 EXPECT_EQ(haystack + 4, avb_strstr(haystack, "def"));
428 EXPECT_EQ(haystack, avb_strstr(haystack, haystack));
429}
430
431TEST(UtilTest, StrReplace) {
432 // We don't care about leaking strings from avb_replace().
433 EXPECT_EQ("OK blah bah $(FOO OK blah",
434 std::string(avb_replace("$(FOO) blah bah $(FOO $(FOO) blah",
435 "$(FOO)", "OK")));
436 EXPECT_EQ("OK", std::string(avb_replace("$(FOO)", "$(FOO)", "OK")));
437 EXPECT_EQ(" OK", std::string(avb_replace(" $(FOO)", "$(FOO)", "OK")));
438 EXPECT_EQ("OK ", std::string(avb_replace("$(FOO) ", "$(FOO)", "OK")));
439 EXPECT_EQ("LONGSTRINGLONGSTRING",
440 std::string(avb_replace("$(FOO)$(FOO)", "$(FOO)", "LONGSTRING")));
441}