xref: /openbmc/u-boot/lib/libavb/avb_hashtree_descriptor.c (revision d8f9d2af96b38f494b3991d5021d72f7c3cec54c)
1*d8f9d2afSIgor Opaniuk /*
2*d8f9d2afSIgor Opaniuk  * Copyright (C) 2016 The Android Open Source Project
3*d8f9d2afSIgor Opaniuk  *
4*d8f9d2afSIgor Opaniuk  * SPDX-License-Identifier:	MIT
5*d8f9d2afSIgor Opaniuk  */
6*d8f9d2afSIgor Opaniuk 
7*d8f9d2afSIgor Opaniuk #include "avb_hashtree_descriptor.h"
8*d8f9d2afSIgor Opaniuk #include "avb_util.h"
9*d8f9d2afSIgor Opaniuk 
10*d8f9d2afSIgor Opaniuk bool avb_hashtree_descriptor_validate_and_byteswap(
11*d8f9d2afSIgor Opaniuk     const AvbHashtreeDescriptor* src, AvbHashtreeDescriptor* dest) {
12*d8f9d2afSIgor Opaniuk   uint64_t expected_size;
13*d8f9d2afSIgor Opaniuk 
14*d8f9d2afSIgor Opaniuk   avb_memcpy(dest, src, sizeof(AvbHashtreeDescriptor));
15*d8f9d2afSIgor Opaniuk 
16*d8f9d2afSIgor Opaniuk   if (!avb_descriptor_validate_and_byteswap((const AvbDescriptor*)src,
17*d8f9d2afSIgor Opaniuk                                             (AvbDescriptor*)dest))
18*d8f9d2afSIgor Opaniuk     return false;
19*d8f9d2afSIgor Opaniuk 
20*d8f9d2afSIgor Opaniuk   if (dest->parent_descriptor.tag != AVB_DESCRIPTOR_TAG_HASHTREE) {
21*d8f9d2afSIgor Opaniuk     avb_error("Invalid tag for hashtree descriptor.\n");
22*d8f9d2afSIgor Opaniuk     return false;
23*d8f9d2afSIgor Opaniuk   }
24*d8f9d2afSIgor Opaniuk 
25*d8f9d2afSIgor Opaniuk   dest->dm_verity_version = avb_be32toh(dest->dm_verity_version);
26*d8f9d2afSIgor Opaniuk   dest->image_size = avb_be64toh(dest->image_size);
27*d8f9d2afSIgor Opaniuk   dest->tree_offset = avb_be64toh(dest->tree_offset);
28*d8f9d2afSIgor Opaniuk   dest->tree_size = avb_be64toh(dest->tree_size);
29*d8f9d2afSIgor Opaniuk   dest->data_block_size = avb_be32toh(dest->data_block_size);
30*d8f9d2afSIgor Opaniuk   dest->hash_block_size = avb_be32toh(dest->hash_block_size);
31*d8f9d2afSIgor Opaniuk   dest->fec_num_roots = avb_be32toh(dest->fec_num_roots);
32*d8f9d2afSIgor Opaniuk   dest->fec_offset = avb_be64toh(dest->fec_offset);
33*d8f9d2afSIgor Opaniuk   dest->fec_size = avb_be64toh(dest->fec_size);
34*d8f9d2afSIgor Opaniuk   dest->partition_name_len = avb_be32toh(dest->partition_name_len);
35*d8f9d2afSIgor Opaniuk   dest->salt_len = avb_be32toh(dest->salt_len);
36*d8f9d2afSIgor Opaniuk   dest->root_digest_len = avb_be32toh(dest->root_digest_len);
37*d8f9d2afSIgor Opaniuk   dest->flags = avb_be32toh(dest->flags);
38*d8f9d2afSIgor Opaniuk 
39*d8f9d2afSIgor Opaniuk   /* Check that partition_name, salt, and root_digest are fully contained. */
40*d8f9d2afSIgor Opaniuk   expected_size = sizeof(AvbHashtreeDescriptor) - sizeof(AvbDescriptor);
41*d8f9d2afSIgor Opaniuk   if (!avb_safe_add_to(&expected_size, dest->partition_name_len) ||
42*d8f9d2afSIgor Opaniuk       !avb_safe_add_to(&expected_size, dest->salt_len) ||
43*d8f9d2afSIgor Opaniuk       !avb_safe_add_to(&expected_size, dest->root_digest_len)) {
44*d8f9d2afSIgor Opaniuk     avb_error("Overflow while adding up sizes.\n");
45*d8f9d2afSIgor Opaniuk     return false;
46*d8f9d2afSIgor Opaniuk   }
47*d8f9d2afSIgor Opaniuk   if (expected_size > dest->parent_descriptor.num_bytes_following) {
48*d8f9d2afSIgor Opaniuk     avb_error("Descriptor payload size overflow.\n");
49*d8f9d2afSIgor Opaniuk     return false;
50*d8f9d2afSIgor Opaniuk   }
51*d8f9d2afSIgor Opaniuk   return true;
52*d8f9d2afSIgor Opaniuk }
53