8 #include <boost/filesystem.hpp>
9 #include <boost/optional.hpp>
11 #include "storage_config.h"
12 #include "storage_exception.h"
14 #include "uptane/tuf.h"
21 using store_data_t = void (
INvStorage::*)(
const std::string&);
22 using load_data_t = bool (
INvStorage::*)(std::string*);
24 typedef std::vector<std::pair<Uptane::EcuSerial, Uptane::HardwareIdentifier>> EcuSerials;
26 enum class EcuState { kOld = 0, kNotRegistered };
30 : serial(std::move(serial_in)), hardware_id(std::move(hardware_id_in)), state(state_in) {}
40 explicit WriteError(
const std::string& what) : std::runtime_error(what) {}
43 virtual size_t wfeed(
const uint8_t* buf,
size_t size) = 0;
44 virtual void wcommit() = 0;
45 virtual void wabort() = 0;
46 uintmax_t getWrittenSize() {
return written_size_; }
49 std::array<uint8_t, 256> arr{};
51 is.read(reinterpret_cast<char*>(arr.data()), arr.size());
52 handle.wfeed(arr.data(), static_cast<size_t>(is.gcount()));
58 uintmax_t written_size_{0};
65 explicit ReadError(
const std::string& what) : std::runtime_error(what) {}
68 virtual bool isPartial()
const = 0;
69 virtual std::unique_ptr<StorageTargetWHandle> toWriteHandle() = 0;
71 virtual uintmax_t rsize()
const = 0;
72 virtual size_t rread(uint8_t* buf,
size_t size) = 0;
73 virtual void rclose() = 0;
75 void writeToFile(
const boost::filesystem::path& path) {
76 std::array<uint8_t, 1024> arr{};
77 uintmax_t written = 0;
78 std::ofstream file(path.c_str());
80 throw std::runtime_error(std::string(
"Error opening file ") + path.string());
82 while (written < rsize()) {
83 size_t nread = rread(arr.data(), arr.size());
84 file.write(reinterpret_cast<char*>(arr.data()), static_cast<std::streamsize>(nread));
91 std::array<uint8_t, 256> arr{};
92 uintmax_t written = 0;
93 while (written < handle.rsize()) {
94 size_t nread = handle.rread(arr.data(), arr.size());
96 os.write(reinterpret_cast<char*>(arr.data()), static_cast<std::streamsize>(nread));
104 enum class InstalledVersionUpdateMode { kNone, kCurrent, kPending };
107 SecondaryInfo() : serial(Uptane::EcuSerial::Unknown()), hw_id(Uptane::HardwareIdentifier::Unknown()) {}
109 PublicKey pub_key_in, std::string extra_in)
110 : serial(std::move(serial_in)),
111 hw_id(std::move(hw_id_in)),
112 type(std::move(type_in)),
113 pub_key(std::move(pub_key_in)),
114 extra(std::move(extra_in)) {}
130 virtual StorageType type() = 0;
131 virtual void storePrimaryKeys(
const std::string& public_key,
const std::string& private_key) = 0;
132 virtual bool loadPrimaryKeys(std::string* public_key, std::string* private_key) = 0;
133 virtual bool loadPrimaryPublic(std::string* public_key) = 0;
134 virtual bool loadPrimaryPrivate(std::string* private_key) = 0;
135 virtual void clearPrimaryKeys() = 0;
137 virtual void saveSecondaryInfo(
const Uptane::EcuSerial& ecu_serial,
const std::string& sec_type,
141 virtual bool loadSecondariesInfo(std::vector<SecondaryInfo>* secondaries) = 0;
143 virtual void storeTlsCreds(
const std::string& ca,
const std::string& cert,
const std::string& pkey) = 0;
144 virtual void storeTlsCa(
const std::string& ca) = 0;
145 virtual void storeTlsCert(
const std::string& cert) = 0;
146 virtual void storeTlsPkey(
const std::string& pkey) = 0;
147 virtual bool loadTlsCreds(std::string* ca, std::string* cert, std::string* pkey) = 0;
148 virtual bool loadTlsCa(std::string* ca) = 0;
149 virtual bool loadTlsCert(std::string* cert) = 0;
150 virtual bool loadTlsPkey(std::string* cert) = 0;
151 virtual void clearTlsCreds() = 0;
161 virtual void clearMetadata() = 0;
162 virtual void storeDelegation(
const std::string&
data,
Uptane::Role role) = 0;
164 virtual bool loadAllDelegations(std::vector<std::pair<Uptane::Role, std::string>>&
data)
const = 0;
166 virtual void clearDelegations() = 0;
168 virtual void storeDeviceId(
const std::string& device_id) = 0;
169 virtual bool loadDeviceId(std::string* device_id) = 0;
170 virtual void clearDeviceId() = 0;
172 virtual void storeEcuSerials(
const EcuSerials& serials) = 0;
173 virtual bool loadEcuSerials(EcuSerials* serials) = 0;
174 virtual void clearEcuSerials() = 0;
176 virtual void storeCachedEcuManifest(
const Uptane::EcuSerial& ecu_serial,
const std::string& manifest) = 0;
177 virtual bool loadCachedEcuManifest(
const Uptane::EcuSerial& ecu_serial, std::string* manifest) = 0;
179 virtual void storeMisconfiguredEcus(
const std::vector<MisconfiguredEcu>& ecus) = 0;
180 virtual bool loadMisconfiguredEcus(std::vector<MisconfiguredEcu>* ecus) = 0;
181 virtual void clearMisconfiguredEcus() = 0;
183 virtual void storeEcuRegistered() = 0;
184 virtual bool loadEcuRegistered() = 0;
185 virtual void clearEcuRegistered() = 0;
187 virtual void storeNeedReboot() = 0;
188 virtual bool loadNeedReboot(
bool* need_reboot) = 0;
189 virtual void clearNeedReboot() = 0;
191 virtual void saveInstalledVersion(
const std::string& ecu_serial,
const Uptane::Target& target,
192 InstalledVersionUpdateMode update_mode) = 0;
193 virtual bool loadInstalledVersions(
const std::string& ecu_serial, boost::optional<Uptane::Target>* current_version,
194 boost::optional<Uptane::Target>* pending_version) = 0;
195 virtual bool loadInstallationLog(
const std::string& ecu_serial, std::vector<Uptane::Target>* log,
196 bool only_installed) = 0;
197 virtual bool hasPendingInstall() = 0;
198 virtual void getPendingEcus(std::vector<std::pair<Uptane::EcuSerial, Uptane::Hash>>* pendingEcus) = 0;
199 virtual void clearInstalledVersions() = 0;
203 virtual bool loadEcuInstallationResults(
204 std::vector<std::pair<Uptane::EcuSerial, data::InstallationResult>>* results) = 0;
206 const std::string& correlation_id) = 0;
208 std::string* correlation_id) = 0;
209 virtual void clearInstallationResults() = 0;
211 virtual void saveEcuReportCounter(
const Uptane::EcuSerial& ecu_serial, int64_t counter) = 0;
212 virtual bool loadEcuReportCounter(std::vector<std::pair<Uptane::EcuSerial, int64_t>>* results) = 0;
214 virtual bool checkAvailableDiskSpace(uint64_t required_bytes)
const = 0;
215 virtual boost::optional<std::pair<uintmax_t, std::string>> checkTargetFile(
const Uptane::Target& target)
const = 0;
218 virtual std::unique_ptr<StorageTargetWHandle> allocateTargetFile(
const Uptane::Target& target) = 0;
220 virtual std::unique_ptr<StorageTargetRHandle> openTargetFile(
const Uptane::Target& target) = 0;
221 virtual std::vector<Uptane::Target> getTargetFiles() = 0;
222 virtual void removeTargetFile(
const std::string& target_name) = 0;
224 virtual void cleanUp() = 0;
227 static std::shared_ptr<INvStorage> newStorage(
const StorageConfig& config,
bool readonly =
false);
229 static bool fsReadInstalledVersions(
const boost::filesystem::path& filename,
230 std::vector<Uptane::Target>* installed_versions,
size_t* current_version);
234 bool loadPrimaryInstalledVersions(boost::optional<Uptane::Target>* current_version,
235 boost::optional<Uptane::Target>* pending_version) {
236 return loadInstalledVersions(
"", current_version, pending_version);
238 void savePrimaryInstalledVersion(
const Uptane::Target& target, InstalledVersionUpdateMode update_mode) {
239 return saveInstalledVersion(
"", target, update_mode);
241 bool loadPrimaryInstallationLog(std::vector<Uptane::Target>* log,
bool only_installed) {
242 return loadInstallationLog(
"", log, only_installed);
244 void importInstalledVersions(
const boost::filesystem::path& base_path);
247 void importSimple(
const boost::filesystem::path& base_path, store_data_t store_func, load_data_t load_func,
249 void importUpdateSimple(
const boost::filesystem::path& base_path, store_data_t store_func, load_data_t load_func,
251 void importPrimaryKeys(
const boost::filesystem::path& base_path,
const BasedPath& import_pubkey_path,
258 #endif // INVSTORAGE_H_