Use device info from OS property when TEE returns empty
Some mandatory device info fields like manufacturer can be empty string when returned from TEE on devices which have not been provisioned with attestation IDs. The extraction tool also needs to check for empty string in the response, and if so, populates the field with Android property values. Test: extracting device info from new Pixel EVT 1.1 and uploading Bug: 276958001 Change-Id: I6e1b3dee8ffcd991335bc50b59a0c80f030cdc79
This commit is contained in:
@@ -17,6 +17,7 @@ namespace wvcdm {
|
||||
// This class gives device information/meta data.
|
||||
class Properties {
|
||||
public:
|
||||
static bool GetBrandName(std::string* brand_name);
|
||||
static bool GetCompanyName(std::string* company_name);
|
||||
static bool GetModelName(std::string* model_name);
|
||||
static bool GetArchitectureName(std::string* arch_name);
|
||||
|
||||
@@ -96,6 +96,11 @@ bool WidevineProvisioner::TryAddVerifiedDeviceInfo(
|
||||
for (size_t i = 0; i < verified_device_info_map->size(); i++) {
|
||||
auto& [key_item, value_item] = (*verified_device_info_map)[i];
|
||||
LOGI("Found device info %s", key_item->asTstr()->value().data());
|
||||
if (value_item != nullptr && value_item->asTstr() != nullptr &&
|
||||
value_item->asTstr()->value().empty()) {
|
||||
LOGI("Value is empty. Skip");
|
||||
continue;
|
||||
}
|
||||
device_info_map.add(key_item->clone(), value_item->clone());
|
||||
}
|
||||
return true;
|
||||
@@ -105,7 +110,22 @@ bool WidevineProvisioner::GetDeviceInfoCommon(cppbor::Map& device_info_map) {
|
||||
if (!TryAddVerifiedDeviceInfo(device_info_map)) return false;
|
||||
// Add device information from OS properties if the verified device info is
|
||||
// not present
|
||||
if (device_info_map.get("manufacturer") == nullptr) {
|
||||
if (device_info_map.get("brand") == nullptr ||
|
||||
device_info_map.get("brand")->asTstr()->value().empty()) {
|
||||
std::string brand_name;
|
||||
if (!wvcdm::Properties::GetBrandName(&brand_name) || brand_name.empty()) {
|
||||
LOGE("Failed to get brand name.");
|
||||
return false;
|
||||
}
|
||||
device_info_map.add(cppbor::Tstr("brand"), cppbor::Tstr(brand_name));
|
||||
LOGI("use OS property brand: %s", brand_name.data());
|
||||
} else {
|
||||
LOGI("use verified brand: %s",
|
||||
device_info_map.get("brand")->asTstr()->value().data());
|
||||
}
|
||||
|
||||
if (device_info_map.get("manufacturer") == nullptr ||
|
||||
device_info_map.get("manufacturer")->asTstr()->value().empty()) {
|
||||
std::string company_name;
|
||||
if (!wvcdm::Properties::GetCompanyName(&company_name) ||
|
||||
company_name.empty()) {
|
||||
@@ -114,18 +134,28 @@ bool WidevineProvisioner::GetDeviceInfoCommon(cppbor::Map& device_info_map) {
|
||||
}
|
||||
device_info_map.add(cppbor::Tstr("manufacturer"),
|
||||
cppbor::Tstr(company_name));
|
||||
LOGI("use OS property manufacturer: %s", company_name.data());
|
||||
} else {
|
||||
LOGI("use verified manufacture: %s",
|
||||
device_info_map.get("manufacturer")->asTstr()->value().data());
|
||||
}
|
||||
|
||||
if (device_info_map.get("model") == nullptr) {
|
||||
if (device_info_map.get("model") == nullptr ||
|
||||
device_info_map.get("model")->asTstr()->value().empty()) {
|
||||
std::string model_name;
|
||||
if (!wvcdm::Properties::GetModelName(&model_name) || model_name.empty()) {
|
||||
LOGE("Failed to get model name.");
|
||||
return false;
|
||||
}
|
||||
device_info_map.add(cppbor::Tstr("model"), cppbor::Tstr(model_name));
|
||||
LOGI("use OS property model: %s", model_name.data());
|
||||
} else {
|
||||
LOGI("use verified model: %s",
|
||||
device_info_map.get("model")->asTstr()->value().data());
|
||||
}
|
||||
|
||||
if (device_info_map.get("device") == nullptr) {
|
||||
if (device_info_map.get("device") == nullptr ||
|
||||
device_info_map.get("device")->asTstr()->value().empty()) {
|
||||
std::string device_name;
|
||||
if (!wvcdm::Properties::GetDeviceName(&device_name) ||
|
||||
device_name.empty()) {
|
||||
@@ -133,9 +163,14 @@ bool WidevineProvisioner::GetDeviceInfoCommon(cppbor::Map& device_info_map) {
|
||||
return false;
|
||||
}
|
||||
device_info_map.add(cppbor::Tstr("device"), cppbor::Tstr(device_name));
|
||||
LOGI("use OS property device: %s", device_name.data());
|
||||
} else {
|
||||
LOGI("use verified device: %s",
|
||||
device_info_map.get("device")->asTstr()->value().data());
|
||||
}
|
||||
|
||||
if (device_info_map.get("product") == nullptr) {
|
||||
if (device_info_map.get("product") == nullptr ||
|
||||
device_info_map.get("product")->asTstr()->value().empty()) {
|
||||
std::string product_name;
|
||||
if (!wvcdm::Properties::GetProductName(&product_name) ||
|
||||
product_name.empty()) {
|
||||
@@ -143,6 +178,10 @@ bool WidevineProvisioner::GetDeviceInfoCommon(cppbor::Map& device_info_map) {
|
||||
return false;
|
||||
}
|
||||
device_info_map.add(cppbor::Tstr("product"), cppbor::Tstr(product_name));
|
||||
LOGI("use OS property product: %s", product_name.data());
|
||||
} else {
|
||||
LOGI("use verified product: %s",
|
||||
device_info_map.get("product")->asTstr()->value().data());
|
||||
}
|
||||
|
||||
std::string arch_name;
|
||||
|
||||
@@ -33,6 +33,14 @@ bool GetAndroidProperty(const char* key, std::string* value) {
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
bool Properties::GetBrandName(std::string* brand_name) {
|
||||
if (!brand_name) {
|
||||
LOGW("Properties::GetBrandName: Invalid parameter");
|
||||
return false;
|
||||
}
|
||||
return GetAndroidProperty("ro.product.brand", brand_name);
|
||||
}
|
||||
|
||||
bool Properties::GetCompanyName(std::string* company_name) {
|
||||
if (!company_name) {
|
||||
LOGW("Properties::GetCompanyName: Invalid parameter");
|
||||
|
||||
Reference in New Issue
Block a user