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