You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
231 lines
8.0 KiB
231 lines
8.0 KiB
/* |
|
* Copyright (C) 2016 The Android Open Source Project |
|
* |
|
* Permission is hereby granted, free of charge, to any person |
|
* obtaining a copy of this software and associated documentation |
|
* files (the "Software"), to deal in the Software without |
|
* restriction, including without limitation the rights to use, copy, |
|
* modify, merge, publish, distribute, sublicense, and/or sell copies |
|
* of the Software, and to permit persons to whom the Software is |
|
* furnished to do so, subject to the following conditions: |
|
* |
|
* The above copyright notice and this permission notice shall be |
|
* included in all copies or substantial portions of the Software. |
|
* |
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
* SOFTWARE. |
|
*/ |
|
|
|
#ifndef FAKE_AVB_OPS_H_ |
|
#define FAKE_AVB_OPS_H_ |
|
|
|
#include <base/files/file_util.h> |
|
#include <map> |
|
#include <set> |
|
#include <string> |
|
|
|
#include <libavb_ab/libavb_ab.h> |
|
#include <libavb_atx/libavb_atx.h> |
|
|
|
namespace avb { |
|
|
|
// A delegate interface for ops callbacks. This allows tests to override default |
|
// fake implementations. |
|
class FakeAvbOpsDelegate { |
|
public: |
|
virtual ~FakeAvbOpsDelegate() {} |
|
virtual AvbIOResult read_from_partition(const char* partition, |
|
int64_t offset, |
|
size_t num_bytes, |
|
void* buffer, |
|
size_t* out_num_read) = 0; |
|
|
|
virtual AvbIOResult write_to_partition(const char* partition, |
|
int64_t offset, |
|
size_t num_bytes, |
|
const void* buffer) = 0; |
|
|
|
virtual AvbIOResult validate_vbmeta_public_key( |
|
AvbOps* ops, |
|
const uint8_t* public_key_data, |
|
size_t public_key_length, |
|
const uint8_t* public_key_metadata, |
|
size_t public_key_metadata_length, |
|
bool* out_key_is_trusted) = 0; |
|
|
|
virtual AvbIOResult read_rollback_index(AvbOps* ops, |
|
size_t rollback_index_slot, |
|
uint64_t* out_rollback_index) = 0; |
|
|
|
virtual AvbIOResult write_rollback_index(AvbOps* ops, |
|
size_t rollback_index_slot, |
|
uint64_t rollback_index) = 0; |
|
|
|
virtual AvbIOResult read_is_device_unlocked(AvbOps* ops, |
|
bool* out_is_device_unlocked) = 0; |
|
|
|
virtual AvbIOResult get_unique_guid_for_partition(AvbOps* ops, |
|
const char* partition, |
|
char* guid_buf, |
|
size_t guid_buf_size) = 0; |
|
|
|
virtual AvbIOResult get_size_of_partition(AvbOps* ops, |
|
const char* partition, |
|
uint64_t* out_size) = 0; |
|
|
|
virtual AvbIOResult read_permanent_attributes( |
|
AvbAtxPermanentAttributes* attributes) = 0; |
|
|
|
virtual AvbIOResult read_permanent_attributes_hash( |
|
uint8_t hash[AVB_SHA256_DIGEST_SIZE]) = 0; |
|
}; |
|
|
|
// Provides fake implementations of AVB ops. All instances of this class must be |
|
// created on the same thread. |
|
class FakeAvbOps : public FakeAvbOpsDelegate { |
|
public: |
|
FakeAvbOps(); |
|
virtual ~FakeAvbOps(); |
|
|
|
static FakeAvbOps* GetInstanceFromAvbOps(AvbOps* ops) { |
|
return reinterpret_cast<FakeAvbOps*>(ops->user_data); |
|
} |
|
static FakeAvbOps* GetInstanceFromAvbABOps(AvbABOps* ab_ops) { |
|
return reinterpret_cast<FakeAvbOps*>(ab_ops->ops->user_data); |
|
} |
|
|
|
AvbOps* avb_ops() { |
|
return &avb_ops_; |
|
} |
|
|
|
AvbABOps* avb_ab_ops() { |
|
return &avb_ab_ops_; |
|
} |
|
|
|
AvbAtxOps* avb_atx_ops() { |
|
return &avb_atx_ops_; |
|
} |
|
|
|
FakeAvbOpsDelegate* delegate() { |
|
return delegate_; |
|
} |
|
|
|
// Does not take ownership of |delegate|. |
|
void set_delegate(FakeAvbOpsDelegate* delegate) { |
|
delegate_ = delegate; |
|
} |
|
|
|
void set_partition_dir(const base::FilePath& partition_dir) { |
|
partition_dir_ = partition_dir; |
|
} |
|
|
|
void set_expected_public_key(const std::string& expected_public_key) { |
|
expected_public_key_ = expected_public_key; |
|
} |
|
|
|
void set_expected_public_key_metadata( |
|
const std::string& expected_public_key_metadata) { |
|
expected_public_key_metadata_ = expected_public_key_metadata; |
|
} |
|
|
|
void set_stored_rollback_indexes( |
|
const std::map<size_t, uint64_t>& stored_rollback_indexes) { |
|
stored_rollback_indexes_ = stored_rollback_indexes; |
|
} |
|
|
|
std::map<size_t, uint64_t> get_stored_rollback_indexes() { |
|
return stored_rollback_indexes_; |
|
} |
|
|
|
void set_stored_is_device_unlocked(bool stored_is_device_unlocked) { |
|
stored_is_device_unlocked_ = stored_is_device_unlocked; |
|
} |
|
|
|
void set_permanent_attributes(const AvbAtxPermanentAttributes& attributes) { |
|
permanent_attributes_ = attributes; |
|
} |
|
|
|
void set_permanent_attributes_hash(const std::string& hash) { |
|
permanent_attributes_hash_ = hash; |
|
} |
|
|
|
// Gets the partition names that were passed to the |
|
// read_from_partition() operation. |
|
std::set<std::string> get_partition_names_read_from(); |
|
|
|
// FakeAvbOpsDelegate methods. |
|
AvbIOResult read_from_partition(const char* partition, |
|
int64_t offset, |
|
size_t num_bytes, |
|
void* buffer, |
|
size_t* out_num_read) override; |
|
|
|
AvbIOResult write_to_partition(const char* partition, |
|
int64_t offset, |
|
size_t num_bytes, |
|
const void* buffer) override; |
|
|
|
AvbIOResult validate_vbmeta_public_key(AvbOps* ops, |
|
const uint8_t* public_key_data, |
|
size_t public_key_length, |
|
const uint8_t* public_key_metadata, |
|
size_t public_key_metadata_length, |
|
bool* out_key_is_trusted) override; |
|
|
|
AvbIOResult read_rollback_index(AvbOps* ops, |
|
size_t rollback_index_location, |
|
uint64_t* out_rollback_index) override; |
|
|
|
AvbIOResult write_rollback_index(AvbOps* ops, |
|
size_t rollback_index_location, |
|
uint64_t rollback_index) override; |
|
|
|
AvbIOResult read_is_device_unlocked(AvbOps* ops, |
|
bool* out_is_device_unlocked) override; |
|
|
|
AvbIOResult get_unique_guid_for_partition(AvbOps* ops, |
|
const char* partition, |
|
char* guid_buf, |
|
size_t guid_buf_size) override; |
|
|
|
AvbIOResult get_size_of_partition(AvbOps* ops, |
|
const char* partition, |
|
uint64_t* out_size) override; |
|
|
|
AvbIOResult read_permanent_attributes( |
|
AvbAtxPermanentAttributes* attributes) override; |
|
|
|
AvbIOResult read_permanent_attributes_hash( |
|
uint8_t hash[AVB_SHA256_DIGEST_SIZE]) override; |
|
|
|
private: |
|
AvbOps avb_ops_; |
|
AvbABOps avb_ab_ops_; |
|
AvbAtxOps avb_atx_ops_; |
|
|
|
FakeAvbOpsDelegate* delegate_; |
|
|
|
base::FilePath partition_dir_; |
|
|
|
std::string expected_public_key_; |
|
std::string expected_public_key_metadata_; |
|
|
|
std::map<size_t, uint64_t> stored_rollback_indexes_; |
|
|
|
bool stored_is_device_unlocked_; |
|
|
|
AvbAtxPermanentAttributes permanent_attributes_; |
|
std::string permanent_attributes_hash_; |
|
|
|
std::set<std::string> partition_names_read_from_; |
|
}; |
|
|
|
} // namespace avb |
|
|
|
#endif /* FAKE_AVB_OPS_H_ */
|
|
|