1 /*
2  * Copyright (c) 2022-2023, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include "fwu_dut.h"
8 
9 #include <CppUTest/TestHarness.h>
10 #include <cassert>
11 #include <cstring>
12 #include <string>
13 
14 #include "common/endian/le.h"
15 #include "service/fwu/test/metadata_checker/metadata_checker_v1.h"
16 #include "service/fwu/test/metadata_checker/metadata_checker_v2.h"
17 
18 const char *fwu_dut::VALID_IMAGE_HEADER = "Valid-fw-image-";
19 
fwu_dut()20 fwu_dut::fwu_dut()
21 	: m_generated_image_count(0)
22 	, m_metadata_version(1)
23 {
24 }
25 
fwu_dut(unsigned int metadata_version)26 fwu_dut::fwu_dut(unsigned int metadata_version)
27 	: m_generated_image_count(0)
28 	, m_metadata_version(metadata_version)
29 {
30 }
31 
~fwu_dut()32 fwu_dut::~fwu_dut()
33 {
34 }
35 
generate_image_data(std::vector<uint8_t> * image_data,size_t image_size)36 void fwu_dut::generate_image_data(std::vector<uint8_t> *image_data, size_t image_size)
37 {
38 	std::string fixed_header(VALID_IMAGE_HEADER);
39 
40 	/* Image header consists of:
41 	 *    - Fixed header
42 	 *    - Image size (32-bit)
43 	 *    - Sequence count (32-bit)
44 	 */
45 	size_t header_len = fixed_header.size() + sizeof(uint32_t) + sizeof(uint32_t);
46 
47 	/* Reserve space */
48 	image_data->resize(image_size);
49 
50 	if (image_size >= header_len) {
51 		/* Prepare image header */
52 		memcpy(image_data->data(), fixed_header.data(), fixed_header.size());
53 
54 		store_u32_le(image_data->data(), fixed_header.size(),
55 			     static_cast<uint32_t>(image_size));
56 
57 		store_u32_le(image_data->data(), fixed_header.size() + sizeof(uint32_t),
58 			     static_cast<uint32_t>(m_generated_image_count));
59 
60 		/* Fill any remaining space */
61 		if (image_size > header_len) {
62 			uint8_t fill_val = static_cast<uint8_t>(m_generated_image_count);
63 			size_t fill_len = image_size - header_len;
64 
65 			memset(image_data->data() + header_len, fill_val, fill_len);
66 		}
67 	} else if (image_size > 0) {
68 		/* No room for header so just initialise to fixed value. This will
69 		 * fail any image verification check.
70 		 */
71 		memset(image_data->data(), 0, image_size);
72 	}
73 
74 	++m_generated_image_count;
75 }
76 
whole_volume_image_type_uuid(unsigned int location_index,struct uuid_octets * uuid) const77 void fwu_dut::whole_volume_image_type_uuid(unsigned int location_index,
78 					   struct uuid_octets *uuid) const
79 {
80 	static const char *img_type_guid[] = { "cb0faf2f-f498-49fb-9810-cb09dac1184f",
81 					       "e9755079-db61-4d90-8a8a-45727eaa1c6e",
82 					       "d439bc29-83e6-40c7-babe-eb59e415c05e",
83 					       "433a6c93-8bb0-4966-b49c-dc0c56080d19" };
84 
85 	CHECK_TRUE(location_index < sizeof(img_type_guid) / sizeof(char *));
86 
87 	uuid_guid_octets_from_canonical(uuid, img_type_guid[location_index]);
88 }
89 
create_metadata_checker(metadata_fetcher * metadata_fetcher,unsigned int num_images) const90 metadata_checker *fwu_dut::create_metadata_checker(metadata_fetcher *metadata_fetcher,
91 						   unsigned int num_images) const
92 {
93 	if (m_metadata_version == 1)
94 		return new metadata_checker_v1(metadata_fetcher, num_images);
95 
96 	if (m_metadata_version == 2)
97 		return new metadata_checker_v2(metadata_fetcher, num_images);
98 
99 	/* Unsupported metadata version */
100 	assert(false);
101 
102 	return NULL;
103 }
104 
metadata_version(void) const105 unsigned int fwu_dut::metadata_version(void) const
106 {
107 	return m_metadata_version;
108 }
109