9 #include <boost/filesystem.hpp> 13 enum class ProvisionMode { kSharedCred = 0, kDeviceCred, kSharedCredReuse, kDefault };
14 std::ostream &operator<<(std::ostream &os, ProvisionMode mode);
16 enum class StorageType { kFileSystem = 0, kSqlite };
17 std::ostream &operator<<(std::ostream &os, StorageType stype);
31 BasedPath(boost::filesystem::path p) : p_(std::move(p)) {}
32 boost::filesystem::path
get(
const boost::filesystem::path &base)
const;
33 bool empty()
const {
return p_.empty(); }
34 bool operator==(
const BasedPath &b)
const {
return p_ == b.p_; }
35 bool operator!=(
const BasedPath &b)
const {
return !(*
this == b); }
38 boost::filesystem::path p_;
46 kFirstKnown = kED25519,
50 kLastKnown = kRSA4096,
54 inline std::ostream &operator<<(std::ostream &os,
const KeyType kt) {
57 case KeyType::kRSA2048:
60 case KeyType::kRSA3072:
63 case KeyType::kRSA4096:
66 case KeyType::kED25519:
73 os <<
'"' << kt_str <<
'"';
77 inline std::istream &operator>>(std::istream &is, KeyType &kt) {
81 std::transform(kt_str.begin(), kt_str.end(), kt_str.begin(), ::toupper);
82 kt_str.erase(std::remove(kt_str.begin(), kt_str.end(),
'"'), kt_str.end());
84 if (kt_str ==
"RSA2048") {
85 kt = KeyType::kRSA2048;
86 }
else if (kt_str ==
"RSA3072") {
87 kt = KeyType::kRSA3072;
88 }
else if (kt_str ==
"RSA4096") {
89 kt = KeyType::kRSA4096;
90 }
else if (kt_str ==
"ED25519") {
91 kt = KeyType::kED25519;
93 kt = KeyType::kUnknown;
98 enum class CryptoSource { kFile = 0, kPkcs11, kAndroid };
100 inline std::ostream &operator<<(std::ostream &os, CryptoSource cs) {
103 case CryptoSource::kFile:
106 case CryptoSource::kPkcs11:
113 os <<
'"' << cs_str <<
'"';
120 explicit PublicKey(
const boost::filesystem::path &path);
122 explicit PublicKey(Json::Value uptane_json);
124 PublicKey(
const std::string &value, KeyType type);
126 std::string Value()
const {
return value_; }
128 KeyType Type()
const {
return type_; }
132 bool VerifySignature(
const std::string &signature,
const std::string &message)
const;
137 Json::Value ToUptane()
const;
139 std::string KeyId()
const;
140 bool operator==(
const PublicKey &rhs)
const;
142 bool operator!=(
const PublicKey &rhs)
const {
return !(*
this == rhs); }
149 KeyType type_{KeyType::kUnknown};
160 enum class Type { kSha256, kSha512, kUnknownAlgorithm };
162 static Hash generate(Type type,
const std::string &
data);
163 Hash(
const std::string &type,
const std::string &hash);
164 Hash(Type type,
const std::string &hash);
166 bool HaveAlgorithm()
const {
return type_ != Type::kUnknownAlgorithm; }
167 bool operator==(
const Hash &other)
const;
168 bool operator!=(
const Hash &other)
const {
return !operator==(other); }
169 static std::string TypeString(Type type);
170 std::string TypeString()
const;
172 std::string HashString()
const {
return hash_; }
173 friend std::ostream &operator<<(std::ostream &os,
const Hash &h);
175 static std::string encodeVector(
const std::vector<Hash> &hashes);
176 static std::vector<Hash> decodeVector(std::string hashes_str);
183 std::ostream &operator<<(std::ostream &os,
const Hash &h);
189 static struct tm CurrentTime();
194 bool IsExpiredAt(
const TimeStamp &now)
const;
195 bool IsValid()
const;
196 std::string ToString()
const {
return time_; }
197 bool operator<(
const TimeStamp &other)
const;
198 bool operator>(
const TimeStamp &other)
const;
199 friend std::ostream &operator<<(std::ostream &os,
const TimeStamp &t);
200 bool operator==(
const TimeStamp &rhs)
const {
return time_ == rhs.time_; }
212 std::ostream &operator<<(std::ostream &os,
const TimeStamp &t);
217 using UpdateRequestId = std::string;
221 Json::Value toJson()
const;
222 static Package fromJson(
const std::string & );
230 kAlreadyProcessed = 1,
232 kVerificationFailed = 3,
242 kNeedCompletion = 21,
252 : num_code(in_num_code), text_code(std::move(text_code_in)) {}
254 bool operator==(
const ResultCode &rhs)
const {
return num_code == rhs.num_code && toString() == rhs.toString(); }
255 bool operator!=(
const ResultCode &rhs)
const {
return !(*
this == rhs); }
256 friend std::ostream &operator<<(std::ostream &os,
const ResultCode &result_code);
259 std::string text_code;
265 std::string toString()
const {
266 if (text_code !=
"") {
270 return std::string(string_repr.at(num_code));
274 std::string toRepr()
const;
275 static ResultCode fromRepr(
const std::string &repr);
278 static const std::map<Numeric, const char *> string_repr;
281 std::ostream &operator<<(std::ostream &os,
const ResultCode &result_code);
286 : success(result_code_in.num_code == ResultCode::Numeric::kOk ||
287 result_code_in.num_code == ResultCode::Numeric::kAlreadyProcessed),
288 result_code(std::move(result_code_in)),
289 description(std::move(description_in)) {}
291 : success(success_in), result_code(std::move(result_code_in)), description(std::move(description_in)) {}
293 Json::Value toJson()
const;
294 bool isSuccess()
const {
return success; };
295 bool needCompletion()
const {
return result_code == ResultCode::Numeric::kNeedCompletion; }
298 ResultCode result_code{ResultCode::Numeric::kOk};
299 std::string description;
309 : name(std::move(name_in)), len(len_in), hash(std::move(hash_in)) {}
318 static const int kMinLength = 0;
319 static const int kMaxLength = 200;
326 if (kMaxLength < hwid.length()) {
327 throw std::out_of_range(
"Hardware Identifier too long");
331 std::string ToString()
const {
return hwid_; }
344 std::ostream &operator<<(std::ostream &os, const HardwareIdentifier &hwid);
349 static const int kMinLength = 1;
350 static const int kMaxLength = 64;
352 static EcuSerial Unknown() { return EcuSerial("Unknown"); }
353 explicit EcuSerial(const std::string &ecu_serial) : ecu_serial_(ecu_serial) {
354 if (ecu_serial.length() < kMinLength) {
355 throw std::out_of_range("Ecu serial identifier is too short");
357 if (kMaxLength < ecu_serial.length()) {
358 throw std::out_of_range("Ecu serial identifier is too long");
362 std::string ToString() const { return ecu_serial_; }
364 bool operator==(const EcuSerial &rhs) const { return ecu_serial_ == rhs.ecu_serial_; }
365 bool operator!=(const EcuSerial &rhs) const { return !(*this == rhs); }
367 bool operator<(const EcuSerial &rhs) const { return ecu_serial_ < rhs.ecu_serial_; }
368 friend std::ostream &operator<<(std::ostream &os, const EcuSerial &ecu_serial);
369 friend struct std::hash<Uptane::EcuSerial>;
372 std::string ecu_serial_;
375 std::ostream &operator<<(std::ostream &os, const EcuSerial &ecu_serial);
377 using EcuMap = std::map<EcuSerial, HardwareIdentifier>;
382 Target(std::string filename, const Json::Value &content);
385 Target(std::string filename, EcuMap ecus, std::vector<Hash> hashes, uint64_t length, std::string correlation_id = "");
387 static Target Unknown();
389 const EcuMap &ecus() const { return ecus_; }
390 std::string filename() const { return filename_; }
391 std::string sha256Hash() const;
392 std::string sha512Hash() const;
393 const std::vector<Hash> &hashes() const { return hashes_; }
394 const std::vector<HardwareIdentifier> &hardwareIds() const { return hwids_; }
395 std::string custom_version() const { return custom_["version"].asString(); }
396 Json::Value custom_data() const { return custom_; }
397 void updateCustom(Json::Value &custom) { custom_ = custom; }
398 std::string correlation_id() const { return correlation_id_; }
399 void setCorrelationId(std::string correlation_id) { correlation_id_ = std::move(correlation_id); }
400 uint64_t length() const { return length_; }
401 bool IsValid() const { return valid; }
402 std::string uri() const { return uri_; }
403 void setUri(std::string uri) { uri_ = std::move(uri); }
404 bool MatchHash(const Hash &hash) const;
406 void InsertEcu(const std::pair<EcuSerial, HardwareIdentifier> &pair) { ecus_.insert(pair); }
408 bool IsForEcu(const EcuSerial &ecuIdentifier) const {
409 return (std::find_if(ecus_.cbegin(), ecus_.cend(),
410 [&ecuIdentifier](const std::pair<EcuSerial, HardwareIdentifier> &pair) {
411 return pair.first == ecuIdentifier;
421 bool IsOstree() const;
422 std::string type() const { return type_; }
425 bool operator==(const Target &t2) = delete;
426 bool MatchTarget(const Target &t2) const;
427 Json::Value toDebugJson() const;
428 friend std::ostream &operator<<(std::ostream &os, const Target &t);
429 InstalledImageInfo getTargetImageInfo() const { return {filename(), length(), sha256Hash()}; }
433 std::string filename_;
436 std::vector<Hash> hashes_;
437 std::vector<HardwareIdentifier> hwids_;
440 std::string correlation_id_;
443 std::string hashString(Hash::Type type) const;
446 std::ostream &operator<<(std::ostream &os, const Target &t);
450 struct SecondaryInfo {
451 SecondaryInfo() : serial(Uptane::EcuSerial::Unknown()), hw_id(Uptane::HardwareIdentifier::Unknown()) {}
452 SecondaryInfo(Uptane::EcuSerial serial_in, Uptane::HardwareIdentifier hw_id_in, std::string type_in,
453 PublicKey pub_key_in, std::string extra_in)
454 : serial(std::move(serial_in)),
455 hw_id(std::move(hw_id_in)),
456 type(std::move(type_in)),
457 pub_key(std::move(pub_key_in)),
458 extra(std::move(extra_in)) {}
460 Uptane::EcuSerial serial;
461 Uptane::HardwareIdentifier hw_id;
TimeStamp()
An invalid TimeStamp.
The Hash class The hash of a file or Uptane metadata.
The BasedPath class Can represent an absolute or relative path, only readable through the BasePath::g...
Base data types that are used in The Update Framework (TUF), part of Uptane.