1 #include "isotpsecondary.h" 4 #include <linux/can/raw.h> 8 #include <boost/algorithm/hex.hpp> 9 #include <boost/lexical_cast.hpp> 12 #define LIBUPTINY_ISOTP_PRIMARY_CANID 0x7D8 14 constexpr
size_t kChunkSize = 500;
16 enum class IsoTpUptaneMesType {
18 kGetSerialResp = 0x41,
24 kGetRootVerResp = 0x44,
26 kGetManifestResp = 0x45,
29 kPutImageChunk = 0x08,
30 kPutImageChunkAckErr = 0x48,
35 IsoTpSecondary::IsoTpSecondary(
const std::string& can_iface, uint16_t can_id)
36 : conn(can_iface, LIBUPTINY_ISOTP_PRIMARY_CANID, can_id) {}
38 EcuSerial IsoTpSecondary::getSerial()
const {
42 out +=
static_cast<char>(IsoTpUptaneMesType::kGetSerial);
43 if (!conn.SendRecv(out, &in)) {
44 return EcuSerial::Unknown();
47 if (in[0] != static_cast<char>(IsoTpUptaneMesType::kGetSerialResp)) {
48 return EcuSerial::Unknown();
50 return EcuSerial(in.substr(1));
53 HardwareIdentifier IsoTpSecondary::getHwId()
const {
57 out +=
static_cast<char>(IsoTpUptaneMesType::kGetHwId);
58 if (!conn.SendRecv(out, &in)) {
59 return HardwareIdentifier::Unknown();
62 if (in[0] != static_cast<char>(IsoTpUptaneMesType::kGetHwIdResp)) {
63 return HardwareIdentifier::Unknown();
65 return HardwareIdentifier(in.substr(1));
68 PublicKey IsoTpSecondary::getPublicKey()
const {
72 out +=
static_cast<char>(IsoTpUptaneMesType::kGetPkey);
73 if (!conn.SendRecv(out, &in)) {
77 if (in[0] != static_cast<char>(IsoTpUptaneMesType::kGetPkeyResp)) {
80 return PublicKey(boost::algorithm::hex(in.substr(1)), KeyType::kED25519);
87 out +=
static_cast<char>(IsoTpUptaneMesType::kGetManifest);
88 if (!conn.SendRecv(out, &in)) {
89 return Json::Value(Json::nullValue);
92 if (in[0] != static_cast<char>(IsoTpUptaneMesType::kGetManifestResp)) {
93 return Json::Value(Json::nullValue);
95 return Utils::parseJSON(in.substr(1));
98 int IsoTpSecondary::getRootVersion(
bool director)
const {
106 out +=
static_cast<char>(IsoTpUptaneMesType::kGetRootVer);
107 if (!conn.SendRecv(out, &in)) {
111 if (in[0] != static_cast<char>(IsoTpUptaneMesType::kGetRootVerResp)) {
115 return boost::lexical_cast<
int>(in.substr(1));
116 }
catch (boost::bad_lexical_cast
const&) {
121 bool IsoTpSecondary::putRoot(
const std::string& root,
bool director) {
126 out +=
static_cast<char>(IsoTpUptaneMesType::kPutRoot);
129 return conn.Send(out);
132 bool IsoTpSecondary::putMetadata(
const RawMetaPack& meta_pack) {
134 out +=
static_cast<char>(IsoTpUptaneMesType::kPutTargets);
135 out += meta_pack.director_targets;
137 return conn.Send(out);
140 bool IsoTpSecondary::sendFirmware(
const std::string&
data) {
141 size_t num_chunks = 1 + (data.length() - 1) / kChunkSize;
143 if (num_chunks > 127) {
147 for (
size_t i = 0; i < num_chunks; ++i) {
150 out +=
static_cast<char>(IsoTpUptaneMesType::kPutImageChunk);
151 out +=
static_cast<char>(num_chunks);
152 out +=
static_cast<char>(i + 1);
153 if (i == num_chunks - 1) {
154 out += data.substr(static_cast<size_t>(i * kChunkSize));
156 out += data.substr(static_cast<size_t>(i * kChunkSize), static_cast<size_t>(kChunkSize));
158 if (!conn.SendRecv(out, &in)) {
161 if (in[0] != static_cast<char>(IsoTpUptaneMesType::kPutImageChunkAckErr)) {
Base data types that are used in The Update Framework (TUF), part of Uptane.