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