From 65f50d46621f05b407eac141c7a110e8756c61ff Mon Sep 17 00:00:00 2001 From: Cong Lin Date: Mon, 24 Apr 2023 14:02:50 -0700 Subject: [PATCH] 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 --- .../factory_upload_tool/include/properties.h | 1 + .../src/WidevineProvisioner.cpp | 47 +++++++++++++++++-- .../src/properties_android.cpp | 8 ++++ 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/libwvdrmengine/tools/factory_upload_tool/include/properties.h b/libwvdrmengine/tools/factory_upload_tool/include/properties.h index d61394f8..02dd8dc8 100644 --- a/libwvdrmengine/tools/factory_upload_tool/include/properties.h +++ b/libwvdrmengine/tools/factory_upload_tool/include/properties.h @@ -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); diff --git a/libwvdrmengine/tools/factory_upload_tool/src/WidevineProvisioner.cpp b/libwvdrmengine/tools/factory_upload_tool/src/WidevineProvisioner.cpp index 7348e358..6f9d1f00 100644 --- a/libwvdrmengine/tools/factory_upload_tool/src/WidevineProvisioner.cpp +++ b/libwvdrmengine/tools/factory_upload_tool/src/WidevineProvisioner.cpp @@ -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; diff --git a/libwvdrmengine/tools/factory_upload_tool/src/properties_android.cpp b/libwvdrmengine/tools/factory_upload_tool/src/properties_android.cpp index 5b47b556..08f321fa 100644 --- a/libwvdrmengine/tools/factory_upload_tool/src/properties_android.cpp +++ b/libwvdrmengine/tools/factory_upload_tool/src/properties_android.cpp @@ -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");