Aktualizr
C++ SOTA Client
uptane_test_common.h
1 #ifndef UPTANE_TEST_COMMON_H_
2 #define UPTANE_TEST_COMMON_H_
3 
4 #include <string>
5 #include <vector>
6 
7 #include "json/json.h"
8 
9 #include "libaktualizr/config.h"
10 #include "libaktualizr/aktualizr.h"
11 #include "uptane/tuf.h"
12 #include "utilities/utils.h"
13 #include "virtualsecondary.h"
14 #include "primary/sotauptaneclient.h"
15 
16 static const char* sec_public_key = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyjUeAzozBEccaGFAJ2Q3\n9QBfItH5i5O7yLRjZlKcEnWnFsxAWHUn5W/msRgZN/pXUrlax0wvrvMvHHLwZA2J\nz+UQApzSqj53HPVAcCH6kB9x0r9PM/0vVTKtmcrdSHj7jJ2yAW2T4Vo/eKlpvz3w\n9kTPAj0j1f5LvUgX5VIjUnsQK1LGzMwnleHk2dkWeWnt3OqomnO7V5C0jkDi58tG\nJ6fnyCYWcMUbpMaldXVXqmQ+iBkWxBjZ99+XJSRjdsskC7x8u8t+sA146VDB977r\nN8D+i+P1tAe810crciUqpYNenDYx47aAm6gaDWr7oeDzp3HyCjx4dZi9Z85rVE36\n8wIDAQAB\n-----END PUBLIC KEY-----\n";
17 static const char* sec_private_key = "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAyjUeAzozBEccaGFAJ2Q39QBfItH5i5O7yLRjZlKcEnWnFsxA\nWHUn5W/msRgZN/pXUrlax0wvrvMvHHLwZA2Jz+UQApzSqj53HPVAcCH6kB9x0r9P\nM/0vVTKtmcrdSHj7jJ2yAW2T4Vo/eKlpvz3w9kTPAj0j1f5LvUgX5VIjUnsQK1LG\nzMwnleHk2dkWeWnt3OqomnO7V5C0jkDi58tGJ6fnyCYWcMUbpMaldXVXqmQ+iBkW\nxBjZ99+XJSRjdsskC7x8u8t+sA146VDB977rN8D+i+P1tAe810crciUqpYNenDYx\n47aAm6gaDWr7oeDzp3HyCjx4dZi9Z85rVE368wIDAQABAoIBAA0WlxS6Zab3O11+\nPfrOv9h5566HTNG+BD+ffXeYDUYcm24cVmXjX2u4bIQ1/RvkdlaCbN/NjKCUWQ5M\nWkb/oVX1i62/nNssI+WZ8kvPxzog7usnOucwkim/mAEGYoBYZF/brTPudc32W3lh\n7dhVGA24snWAo5ssVJax3eoYAPVLqFK5Pb8VUxpHtjERMDDUxM3w6WGXLxuBdA5s\n5vIdv+XrdiQhdPn1HMYEBBInkkYK8w4UytOCAS1/3xfVi2QwX5H9bHkduFpjLSQt\n2StWR9Kh4I80xXp7FwGpfkdUn+3qj5WwneuGY/JnD7AzjDlAThj0AE9iaYjkzXKJ\nVD4ULmECgYEA+UGQ1aglftFuTO427Xmi7tHhooo9U1pKMrg5CkCLkA+MudFzMEgj\npRtDdj8lTTWHEIYQXo5hhZfhk63j89RAKRz1MDFOvgknE8yJa9rSyCAEcwzRzXcY\n3WtWozEZ+5u4KYFHhGjJCSqVFdwyXmjP9ldb35Uxh06OuTbdNkSbiUsCgYEAz62t\nJ1EftTkd/YA/9Poq1deil5g0btPXnMJMj7C99dexNAXuVhS10Rz1Hi74wCFEbkcV\nGL/8U80pER9YYYeFUmqs1pYu7zwcYBT+iNrvFaPifid8FqlJEJ727swnWdpzXpwv\n/6q0h3JXU2odrEMNaGqiPycHQ/45EWMbCtpSs/kCgYEAwjMgWicA17bqvkuXRhzQ\nIkwqBU65ixi82JmJ73/sfNhwp1IV8hcylnAQdq+qK2a6Ddi2JkW+m6yDF2GTSiUj\nvCSQr/SqygsthBKHOx4pvbycWtsxF2lkWRdJUCpweQWRTd0o0HQntdmUgIyoPcBh\nzyevMBr4lNhTAOFLJv37RNMCgYAQq+ODjXqbJKuopvv7YX3Azt+phbln0C+10M8u\nlcSaEKeUAongdScnU0jGFIU5fzIsHB6wbvEFlSmfy0FgCu4D8LZRP5si71Njzyuj\ntteMiCxtbiQC+bH42JoAD3l1OBkc1jLwNjbpzJ7//jvFkVhpMm413Z8ysRzJrYgF\nNgN/mQKBgQDNT2nFoqanlQPkZekqNQNcVMHPyOWP40z4HC5JD1Z5F18Kg3El4EdS\nNfwaFGRT5qiFJBmmzl+6EFmUrrBNtV01zQ6rO+xgy2Y7qUQMNAUMjh1cCpWwUlN0\ng4aT/RawS5WpWN3+lEs4Ouxpgg4ZStXNZRJkSDHwZpkXtFfKzsEXaA==\n-----END RSA PRIVATE KEY-----\n";
18 
20 
21  class TestAktualizr: public Aktualizr {
22  public:
23  TestAktualizr(Config& config): Aktualizr(config) {}
24 
25  TestAktualizr(Config& config,
26  std::shared_ptr<INvStorage> storage,
27  std::shared_ptr<HttpInterface> http)
28  : Aktualizr(config, storage, http) {
29 
30  if (boost::filesystem::exists(config.uptane.secondary_config_file)) {
31  for (const auto& item : Primary::VirtualSecondaryConfig::create_from_file(config.uptane.secondary_config_file)) {
32  AddSecondary(std::make_shared<Primary::VirtualSecondary>(item));
33  }
34  }
35  }
36 
37  std::shared_ptr<SotaUptaneClient>& uptane_client() { return uptane_client_; }
38  };
39 
41  {
42  public:
43  TestUptaneClient(Config &config_in,
44  std::shared_ptr<INvStorage> storage_in,
45  std::shared_ptr<HttpInterface> http_client,
46  std::shared_ptr<event::Channel> events_channel_in):
47  SotaUptaneClient(config_in, storage_in, http_client, events_channel_in) {
48 
49  if (boost::filesystem::exists(config_in.uptane.secondary_config_file)) {
50  for (const auto& item : Primary::VirtualSecondaryConfig::create_from_file(config_in.uptane.secondary_config_file)) {
51  addSecondary(std::make_shared<Primary::VirtualSecondary>(item));
52  }
53  }
54  }
55 
56  TestUptaneClient(Config &config_in,
57  std::shared_ptr<INvStorage> storage_in,
58  std::shared_ptr<HttpInterface> http_client) : TestUptaneClient(config_in, storage_in, http_client, nullptr) {}
59 
60  TestUptaneClient(Config &config_in,
61  std::shared_ptr<INvStorage> storage_in) : TestUptaneClient(config_in, storage_in, std::make_shared<HttpClient>()) {}
62  };
63 
64  static Primary::VirtualSecondaryConfig addDefaultSecondary(Config& config, const TemporaryDirectory& temp_dir,
65  const std::string& serial, const std::string& hw_id,
66  bool hardcoded_keys = true) {
67  const boost::filesystem::path sec_dir = temp_dir / boost::filesystem::unique_path();
68  Utils::createDirectories(sec_dir, S_IRWXU);
69 
71  ecu_config.partial_verifying = false;
72  ecu_config.full_client_dir = sec_dir;
73  ecu_config.ecu_serial = serial;
74  ecu_config.ecu_hardware_id = hw_id;
75  ecu_config.ecu_private_key = "sec.priv";
76  ecu_config.ecu_public_key = "sec.pub";
77  ecu_config.firmware_path = sec_dir / "firmware.txt";
78  ecu_config.target_name_path = sec_dir / "firmware_name.txt";
79  ecu_config.metadata_path = sec_dir / "secondary_metadata";
80 
81  // Create or append to the Secondary config file.
82  config.uptane.secondary_config_file = temp_dir / "virtual_secondary_conf.json";
83  ecu_config.dump(config.uptane.secondary_config_file);
84 
85  if (hardcoded_keys) {
86  // store hard-coded keys to make the tests run WAY faster
87  Utils::writeFile((ecu_config.full_client_dir / ecu_config.ecu_private_key), std::string(sec_private_key));
88  Utils::writeFile((ecu_config.full_client_dir / ecu_config.ecu_public_key), std::string(sec_public_key));
89  }
90  return ecu_config;
91  }
92 
93  static Primary::VirtualSecondaryConfig altVirtualConfiguration(const boost::filesystem::path& client_dir) {
94  const boost::filesystem::path sec_dir = client_dir / boost::filesystem::unique_path();
95  Utils::createDirectories(sec_dir, S_IRWXU);
96 
98  ecu_config.partial_verifying = false;
99  ecu_config.full_client_dir = sec_dir;
100  ecu_config.ecu_serial = "ecuserial3";
101  ecu_config.ecu_hardware_id = "hw_id3";
102  ecu_config.ecu_private_key = "sec.priv";
103  ecu_config.ecu_public_key = "sec.pub";
104  ecu_config.firmware_path = sec_dir / "firmware.txt";
105  ecu_config.target_name_path = sec_dir / "firmware_name.txt";
106  ecu_config.metadata_path = sec_dir / "secondary_metadata";
107 
108  // store hard-coded keys to make the tests run WAY faster
109  Utils::writeFile((ecu_config.full_client_dir / ecu_config.ecu_private_key), std::string(sec_private_key));
110  Utils::writeFile((ecu_config.full_client_dir / ecu_config.ecu_public_key), std::string(sec_public_key));
111 
112  return ecu_config;
113  }
114 
115  static Config makeTestConfig(const TemporaryDirectory& temp_dir, const std::string& url) {
116  Config conf("tests/config/basic.toml");
117  conf.uptane.director_server = url + "/director";
118  conf.uptane.repo_server = url + "/repo";
119  conf.provision.server = url;
120  conf.provision.primary_ecu_serial = "CA:FE:A6:D2:84:9D";
121  conf.provision.primary_ecu_hardware_id = "primary_hw";
122  conf.storage.path = temp_dir.Path();
123  conf.import.base_path = temp_dir.Path() / "import";
124  conf.pacman.images_path = temp_dir.Path() / "images";
125  conf.tls.server = url;
126  conf.bootloader.reboot_sentinel_dir = temp_dir.Path();
127  UptaneTestCommon::addDefaultSecondary(conf, temp_dir, "secondary_ecu_serial", "secondary_hw");
128  return conf;
129  }
130 
131  static std::vector<Uptane::Target> makePackage(const std::string &serial, const std::string &hw_id) {
132  std::vector<Uptane::Target> packages_to_install;
133  Json::Value ot_json;
134  ot_json["custom"]["ecuIdentifiers"][serial]["hardwareId"] = hw_id;
135  ot_json["custom"]["targetFormat"] = "OSTREE";
136  ot_json["length"] = 0;
137  ot_json["hashes"]["sha256"] = serial;
138  packages_to_install.emplace_back(serial, ot_json);
139  return packages_to_install;
140  }
141 
142  static void verifyEcus(TemporaryDirectory& temp_dir, std::vector<std::string> expected_ecus) {
143  const Json::Value ecu_data = Utils::parseJSONFile(temp_dir / "post.json");
144  EXPECT_EQ(ecu_data["ecus"].size(), expected_ecus.size());
145  for (const Json::Value& ecu : ecu_data["ecus"]) {
146  auto found = std::find(expected_ecus.begin(), expected_ecus.end(), ecu["ecu_serial"].asString());
147  if (found != expected_ecus.end()) {
148  expected_ecus.erase(found);
149  } else {
150  FAIL() << "Unknown ECU in registration data: " << ecu["ecu_serial"].asString();
151  }
152  }
153  EXPECT_EQ(expected_ecus.size(), 0);
154  }
155 
156 };
157 
158 #endif // UPTANE_TEST_COMMON_H_
159 
160 
Aktualizr::Aktualizr
Aktualizr(const Config &config)
Aktualizr requires a configuration object.
Definition: aktualizr.cc:15
UptaneTestCommon::TestAktualizr
Definition: uptane_test_common.h:21
SotaUptaneClient
Definition: sotauptaneclient.h:35
Config
Configuration object for an aktualizr instance running on a Primary ECU.
Definition: config.h:208
UptaneTestCommon::TestUptaneClient
Definition: uptane_test_common.h:40
Aktualizr
This class provides the main APIs necessary for launching and controlling libaktualizr.
Definition: aktualizr.h:24
Aktualizr::AddSecondary
void AddSecondary(const std::shared_ptr< SecondaryInterface > &secondary)
Add new Secondary to aktualizr.
Definition: aktualizr.cc:103
Primary::VirtualSecondaryConfig
Definition: virtualsecondary.h:11
TemporaryDirectory
Definition: utils.h:82
UptaneTestCommon
Definition: uptane_test_common.h:19