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.
|
// This class gives device information/meta data.
|
||||||
class Properties {
|
class Properties {
|
||||||
public:
|
public:
|
||||||
|
static bool GetBrandName(std::string* brand_name);
|
||||||
static bool GetCompanyName(std::string* company_name);
|
static bool GetCompanyName(std::string* company_name);
|
||||||
static bool GetModelName(std::string* model_name);
|
static bool GetModelName(std::string* model_name);
|
||||||
static bool GetArchitectureName(std::string* arch_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++) {
|
for (size_t i = 0; i < verified_device_info_map->size(); i++) {
|
||||||
auto& [key_item, value_item] = (*verified_device_info_map)[i];
|
auto& [key_item, value_item] = (*verified_device_info_map)[i];
|
||||||
LOGI("Found device info %s", key_item->asTstr()->value().data());
|
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());
|
device_info_map.add(key_item->clone(), value_item->clone());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -105,7 +110,22 @@ bool WidevineProvisioner::GetDeviceInfoCommon(cppbor::Map& device_info_map) {
|
|||||||
if (!TryAddVerifiedDeviceInfo(device_info_map)) return false;
|
if (!TryAddVerifiedDeviceInfo(device_info_map)) return false;
|
||||||
// Add device information from OS properties if the verified device info is
|
// Add device information from OS properties if the verified device info is
|
||||||
// not present
|
// 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;
|
std::string company_name;
|
||||||
if (!wvcdm::Properties::GetCompanyName(&company_name) ||
|
if (!wvcdm::Properties::GetCompanyName(&company_name) ||
|
||||||
company_name.empty()) {
|
company_name.empty()) {
|
||||||
@@ -114,18 +134,28 @@ bool WidevineProvisioner::GetDeviceInfoCommon(cppbor::Map& device_info_map) {
|
|||||||
}
|
}
|
||||||
device_info_map.add(cppbor::Tstr("manufacturer"),
|
device_info_map.add(cppbor::Tstr("manufacturer"),
|
||||||
cppbor::Tstr(company_name));
|
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;
|
std::string model_name;
|
||||||
if (!wvcdm::Properties::GetModelName(&model_name) || model_name.empty()) {
|
if (!wvcdm::Properties::GetModelName(&model_name) || model_name.empty()) {
|
||||||
LOGE("Failed to get model name.");
|
LOGE("Failed to get model name.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
device_info_map.add(cppbor::Tstr("model"), cppbor::Tstr(model_name));
|
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;
|
std::string device_name;
|
||||||
if (!wvcdm::Properties::GetDeviceName(&device_name) ||
|
if (!wvcdm::Properties::GetDeviceName(&device_name) ||
|
||||||
device_name.empty()) {
|
device_name.empty()) {
|
||||||
@@ -133,9 +163,14 @@ bool WidevineProvisioner::GetDeviceInfoCommon(cppbor::Map& device_info_map) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
device_info_map.add(cppbor::Tstr("device"), cppbor::Tstr(device_name));
|
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;
|
std::string product_name;
|
||||||
if (!wvcdm::Properties::GetProductName(&product_name) ||
|
if (!wvcdm::Properties::GetProductName(&product_name) ||
|
||||||
product_name.empty()) {
|
product_name.empty()) {
|
||||||
@@ -143,6 +178,10 @@ bool WidevineProvisioner::GetDeviceInfoCommon(cppbor::Map& device_info_map) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
device_info_map.add(cppbor::Tstr("product"), cppbor::Tstr(product_name));
|
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;
|
std::string arch_name;
|
||||||
|
|||||||
@@ -33,6 +33,14 @@ bool GetAndroidProperty(const char* key, std::string* value) {
|
|||||||
|
|
||||||
namespace wvcdm {
|
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) {
|
bool Properties::GetCompanyName(std::string* company_name) {
|
||||||
if (!company_name) {
|
if (!company_name) {
|
||||||
LOGW("Properties::GetCompanyName: Invalid parameter");
|
LOGW("Properties::GetCompanyName: Invalid parameter");
|
||||||
|
|||||||
Reference in New Issue
Block a user