1 #include "isotpsecondary.h" 4 #include <linux/can/raw.h> 11 #include <boost/algorithm/hex.hpp> 12 #include <boost/lexical_cast.hpp> 14 #include "storage/invstorage.h" 16 #define LIBUPTINY_ISOTP_PRIMARY_CANID 0x7D8 18 constexpr
size_t kChunkSize = 500;
20 enum class IsoTpUptaneMesType {
22 kGetSerialResp = 0x41,
28 kGetRootVerResp = 0x44,
30 kGetManifestResp = 0x45,
33 kPutImageChunk = 0x08,
34 kPutImageChunkAckErr = 0x48,
39 IsoTpSecondary::IsoTpSecondary(
const std::string& can_iface, uint16_t can_id)
40 : conn(can_iface, LIBUPTINY_ISOTP_PRIMARY_CANID, can_id) {}
42 EcuSerial IsoTpSecondary::getSerial()
const {
46 out +=
static_cast<char>(IsoTpUptaneMesType::kGetSerial);
47 if (!conn.SendRecv(out, &in)) {
48 return EcuSerial::Unknown();
51 if (in[0] != static_cast<char>(IsoTpUptaneMesType::kGetSerialResp)) {
52 return EcuSerial::Unknown();
54 return EcuSerial(in.substr(1));
57 HardwareIdentifier IsoTpSecondary::getHwId()
const {
61 out +=
static_cast<char>(IsoTpUptaneMesType::kGetHwId);
62 if (!conn.SendRecv(out, &in)) {
63 return HardwareIdentifier::Unknown();
66 if (in[0] != static_cast<char>(IsoTpUptaneMesType::kGetHwIdResp)) {
67 return HardwareIdentifier::Unknown();
69 return HardwareIdentifier(in.substr(1));
72 PublicKey IsoTpSecondary::getPublicKey()
const {
76 out +=
static_cast<char>(IsoTpUptaneMesType::kGetPkey);
77 if (!conn.SendRecv(out, &in)) {
81 if (in[0] != static_cast<char>(IsoTpUptaneMesType::kGetPkeyResp)) {
84 return PublicKey(boost::algorithm::hex(in.substr(1)), KeyType::kED25519);
91 out +=
static_cast<char>(IsoTpUptaneMesType::kGetManifest);
92 if (!conn.SendRecv(out, &in)) {
93 return Json::Value(Json::nullValue);
96 if (in[0] != static_cast<char>(IsoTpUptaneMesType::kGetManifestResp)) {
97 return Json::Value(Json::nullValue);
99 return Utils::parseJSON(in.substr(1));
102 int IsoTpSecondary::getRootVersion(
bool director)
const {
110 out +=
static_cast<char>(IsoTpUptaneMesType::kGetRootVer);
111 if (!conn.SendRecv(out, &in)) {
115 if (in[0] != static_cast<char>(IsoTpUptaneMesType::kGetRootVerResp)) {
119 return boost::lexical_cast<
int>(in.substr(1));
120 }
catch (boost::bad_lexical_cast
const&) {
130 out +=
static_cast<char>(IsoTpUptaneMesType::kPutRoot);
133 if (conn.Send(out)) {
137 "Error sending metadata to Secondary");
144 std::string director_targets;
145 if (!secondary_provider_->getDirectorMetadata(
nullptr, &director_targets)) {
146 LOG_ERROR <<
"Unable to read Director metadata.";
151 out +=
static_cast<char>(IsoTpUptaneMesType::kPutTargets);
152 out += director_targets;
154 if (conn.Send(out)) {
158 "Error sending metadata to Secondary");
171 auto image_reader = secondary_provider_->getTargetFileHandle(target);
172 uint64_t image_size = target.length();
174 size_t num_chunks = (image_size / kChunkSize) + (static_cast<bool>(image_size % kChunkSize) ? 1 : 0);
176 if (num_chunks > 127) {
180 for (
size_t i = 0; i < num_chunks; ++i) {
183 out +=
static_cast<char>(IsoTpUptaneMesType::kPutImageChunk);
184 out +=
static_cast<char>(num_chunks);
185 out +=
static_cast<char>(i + 1);
187 std::array<char, kChunkSize> buf{};
188 image_reader.read(buf.data(), kChunkSize);
189 out += std::string(buf.data());
191 if (!conn.SendRecv(out, &in)) {
193 "Error sending metadata to Secondary");
196 if (in[0] != static_cast<char>(IsoTpUptaneMesType::kPutImageChunkAckErr)) {
198 "Error sending metadata to Secondary");
203 "Error sending metadata to Secondary");
208 }
catch (
const std::exception& exc) {
209 LOG_ERROR <<
"Failed to upload a target image: " << target.filename() <<
", error " << exc.what();
Metadata verification failed.
SWM Internal integrity error.
Results of libaktualizr API calls.
Base data types that are used in The Update Framework (TUF), part of Uptane.