Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
partialverificationsecondary.cc
1 #include "libaktualizr/types.h"
2 
3 #include "logging/logging.h"
4 #include "partialverificationsecondary.h"
5 #include "primary/secondaryinterface.h"
6 #include "utilities/exceptions.h"
7 
8 namespace Uptane {
9 
10 PartialVerificationSecondary::PartialVerificationSecondary(Primary::PartialVerificationSecondaryConfig sconfig_in)
11  : sconfig(std::move(sconfig_in)), root_(Root::Policy::kAcceptAll) {
12  boost::filesystem::create_directories(sconfig.metadata_path);
13 
14  // TODO(OTA-2484): Probably we need to generate keys on the secondary
15  std::string public_key_string;
16  if (!loadKeys(&public_key_string, &private_key_)) {
17  if (!Crypto::generateKeyPair(sconfig.key_type, &public_key_string, &private_key_)) {
18  LOG_ERROR << "Could not generate keys for secondary " << PartialVerificationSecondary::getSerial() << "@"
19  << sconfig.ecu_hardware_id;
20  throw std::runtime_error("Unable to generate secondary keys");
21  }
22  storeKeys(public_key_string, private_key_);
23  }
24  public_key_ = PublicKey(public_key_string, sconfig.key_type);
25 }
26 
27 data::InstallationResult PartialVerificationSecondary::putMetadata(const Target &target) {
28  (void)target;
29  TimeStamp now(TimeStamp::Now());
30  detected_attack_.clear();
31 
32  std::string director_root;
33  std::string director_targets;
34  if (!secondary_provider_->getDirectorMetadata(&director_root, &director_targets)) {
35  LOG_ERROR << "Unable to read Director metadata.";
36  return data::InstallationResult(data::ResultCode::Numeric::kInternalError, "Unable to read Director metadata");
37  }
38 
39  // TODO(OTA-2484): check for expiration and version downgrade
40  root_ = Uptane::Root(RepositoryType::Director(), Utils::parseJSON(director_root), root_);
41  Uptane::Targets targets(RepositoryType::Director(), Role::Targets(), Utils::parseJSON(director_targets),
42  std::make_shared<Uptane::Root>(root_));
43  if (meta_targets_.version() > targets.version()) {
44  detected_attack_ = "Rollback attack detected";
46  }
47  meta_targets_ = targets;
48  return data::InstallationResult(data::ResultCode::Numeric::kOk, "");
49 }
50 
51 Uptane::Manifest PartialVerificationSecondary::getManifest() const {
53  return Json::Value();
54 }
55 
56 int PartialVerificationSecondary::getRootVersion(bool director) const {
57  (void)director;
59  return 0;
60 }
61 
62 data::InstallationResult PartialVerificationSecondary::putRoot(const std::string &root, bool director) {
63  (void)root;
64  (void)director;
65 
67  return data::InstallationResult(data::ResultCode::Numeric::kOk, "");
68 }
69 
70 data::InstallationResult PartialVerificationSecondary::sendFirmware(const Uptane::Target &target) {
71  (void)target;
73  return data::InstallationResult(data::ResultCode::Numeric::kOk, "");
74 }
75 
76 data::InstallationResult PartialVerificationSecondary::install(const Uptane::Target &target) {
77  (void)target;
79  return data::InstallationResult(data::ResultCode::Numeric::kOk, "");
80 }
81 
82 void PartialVerificationSecondary::storeKeys(const std::string &public_key, const std::string &private_key) {
83  Utils::writeFile((sconfig.full_client_dir / sconfig.ecu_private_key), private_key);
84  Utils::writeFile((sconfig.full_client_dir / sconfig.ecu_public_key), public_key);
85 }
86 
87 bool PartialVerificationSecondary::loadKeys(std::string *public_key, std::string *private_key) {
88  boost::filesystem::path public_key_path = sconfig.full_client_dir / sconfig.ecu_public_key;
89  boost::filesystem::path private_key_path = sconfig.full_client_dir / sconfig.ecu_private_key;
90 
91  if (!boost::filesystem::exists(public_key_path) || !boost::filesystem::exists(private_key_path)) {
92  return false;
93  }
94 
95  *private_key = Utils::readFile(private_key_path.string());
96  *public_key = Utils::readFile(public_key_path.string());
97  return true;
98 }
99 } // namespace Uptane
STL namespace.
SWM Internal integrity error.
Base data types that are used in The Update Framework (TUF), part of Uptane.
Definition: types.h:304