From f3e9d84484d572a7164a9a29bbc9d631e23a02d0 Mon Sep 17 00:00:00 2001 From: Fred Gylys-Colwell Date: Mon, 12 Nov 2018 14:11:55 -0800 Subject: [PATCH] Add build info API to OEMCrypto Merge from master branch of Widevine repo of http://go/wvgerrit/66065 Merge from oemcrypto-v15 branch of Widevine repo of http://go/wvgerrit/63080 This is for the reference code, the unit tests, and the oemcrypto adapter. Bug: 116414218 Test: unit tests Test: tested as part of http://go/ag/5501993 Change-Id: I05a631f6cfcf1584a748b3a0c9ae48633893589f --- .../cdm/core/include/oemcrypto_adapter.h | 1 + .../core/src/oemcrypto_adapter_dynamic.cpp | 29 +++++++++++++++++-- .../oemcrypto/ref/src/oemcrypto_ref.cpp | 4 +++ .../oemcrypto/test/oemcrypto_test.cpp | 7 +++++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/libwvdrmengine/cdm/core/include/oemcrypto_adapter.h b/libwvdrmengine/cdm/core/include/oemcrypto_adapter.h index 3d21291e..52d662d6 100644 --- a/libwvdrmengine/cdm/core/include/oemcrypto_adapter.h +++ b/libwvdrmengine/cdm/core/include/oemcrypto_adapter.h @@ -56,6 +56,7 @@ OEMCryptoResult OEMCrypto_CreateOldUsageEntry(SecurityLevel level, uint8_t* server_mac_key, uint8_t* client_mac_key, const uint8_t* pst, size_t pst_length); uint32_t OEMCrypto_GetAnalogOutputFlags(SecurityLevel level); +const char* OEMCrypto_BuildInformation(SecurityLevel level); } // namespace wvcdm /* The following functions are deprecated in OEMCrypto v13. They are defined diff --git a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp index 7a316f37..b5a3009d 100644 --- a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp +++ b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp @@ -264,6 +264,7 @@ typedef OEMCryptoResult (*L1_CreateOldUsageEntry_t)( uint8_t* server_mac_key, uint8_t* client_mac_key, const uint8_t* pst, size_t pst_length); typedef uint32_t (*L1_GetAnalogOutputFlags_t)(void); +typedef const char* (*L1_BuildInformation_t)(void); struct FunctionPointers { uint32_t version; @@ -330,6 +331,7 @@ struct FunctionPointers { L1_CopyOldUsageEntry_t CopyOldUsageEntry; L1_CreateOldUsageEntry_t CreateOldUsageEntry; L1_GetAnalogOutputFlags_t GetAnalogOutputFlags; + L1_BuildInformation_t BuildInformation; L1_LoadKeys_V8_t LoadKeys_V8; L1_GenerateRSASignature_V8_t GenerateRSASignature_V8; @@ -567,6 +569,10 @@ class Adapter { WatchDog *watcher = new WatchDog(); watcher->CheckForPreviousFailure(&metrics); watcher->StartThread(); + if (level3_.BuildInformation) { + LOGI("Level 3 Build Info (v%d): %s", level3_.version, + level3_.BuildInformation()); + } OEMCryptoResult result = watcher->WaitForStatusAndCleanUp(); if (Level3_IsInApp()) { metrics.SetInitializationMode( @@ -599,6 +605,10 @@ class Adapter { } if (LoadLevel1(&metrics)) { LOGD("OEMCrypto_Initialize Level 1 success. I will use level 1."); + if (level1_.BuildInformation) { + LOGI("Level 1 Build Info (v%d): %s", level1_.version, + level1_.BuildInformation()); + } } else { level1_ = FunctionPointers(); // revert to all null pointers. level1_valid_ = false; @@ -677,15 +687,16 @@ class Adapter { LOOKUP( 9, 9, GetHDCPCapability_V9, OEMCrypto_GetHDCPCapability_V9); LOOKUP_ALL(10, GetHDCPCapability, OEMCrypto_GetHDCPCapability); LOOKUP_ALL(14, GetAnalogOutputFlags, OEMCrypto_GetAnalogOutputFlags); + LOOKUP_ALL(15, BuildInformation, OEMCrypto_BuildInformation); LOOKUP_ALL( 8, GetKeyData, OEMCrypto_GetKeyData); LOOKUP_ALL(10, GetMaxNumberOfSessions, OEMCrypto_GetMaxNumberOfSessions); LOOKUP_ALL(10, GetNumberOfOpenSessions, OEMCrypto_GetNumberOfOpenSessions); LOOKUP_ALL(12, GetOEMPublicCertificate, OEMCrypto_GetOEMPublicCertificate); LOOKUP_ALL(12, GetProvisioningMethod, OEMCrypto_GetProvisioningMethod); LOOKUP_ALL( 8, GetRandom, OEMCrypto_GetRandom); - LOOKUP_ALL( 8, InstallKeyboxOrOEMCert, OEMCrypto_InstallKeyboxOrOEMCert); + LOOKUP_ALL( 8, InstallKeyboxOrOEMCert, OEMCrypto_InstallKeyboxOrOEMCert); LOOKUP_ALL(10, IsAntiRollbackHwPresent, OEMCrypto_IsAntiRollbackHwPresent); - LOOKUP_ALL( 8, IsKeyboxOrOEMCertValid, OEMCrypto_IsKeyboxOrOEMCertValid); + LOOKUP_ALL( 8, IsKeyboxOrOEMCertValid, OEMCrypto_IsKeyboxOrOEMCertValid); LOOKUP_ALL(13, IsSRMUpdateSupported, OEMCrypto_IsSRMUpdateSupported); LOOKUP_ALL( 8, LoadDeviceRSAKey, OEMCrypto_LoadDeviceRSAKey); LOOKUP( 8, 8, LoadKeys_V8, OEMCrypto_LoadKeys_V8); @@ -820,6 +831,7 @@ class Adapter { level3_.SecurityLevel = Level3_SecurityLevel; level3_.GetHDCPCapability = Level3_GetHDCPCapability; level3_.GetAnalogOutputFlags = Level3_GetAnalogOutputFlags; + // TODO(srujzs) level3_.BuildInformation = Level3_BuildInformation; level3_.SupportsUsageTable = Level3_SupportsUsageTable; level3_.IsAntiRollbackHwPresent = Level3_IsAntiRollbackHwPresent; level3_.GetNumberOfOpenSessions = Level3_GetNumberOfOpenSessions; @@ -1066,6 +1078,15 @@ uint32_t OEMCrypto_GetAnalogOutputFlags(SecurityLevel level) { return fcn->GetAnalogOutputFlags(); } +const char* OEMCrypto_BuildInformation(SecurityLevel level) { + if (!gAdapter.get()) return ""; + const FunctionPointers* fcn = gAdapter->GetFunctionPointers(level); + if (!fcn) return ""; + if (fcn->version < 14) return "pre v15"; + if (fcn->BuildInformation == NULL) return "unknown"; + return fcn->BuildInformation(); +} + bool OEMCrypto_SupportsUsageTable(SecurityLevel level) { if (!gAdapter.get()) return false; const FunctionPointers* fcn = gAdapter->GetFunctionPointers(level); @@ -1231,6 +1252,10 @@ extern "C" uint32_t OEMCrypto_GetAnalogOutputFlags() { return OEMCrypto_GetAnalogOutputFlags(kLevelDefault); } +extern "C" const char* OEMCrypto_BuildInformation(){ + return OEMCrypto_BuildInformation(kLevelDefault); +} + extern "C" OEMCryptoResult OEMCrypto_LoadKeys_Back_Compat( OEMCrypto_SESSION session, const uint8_t* message, size_t message_length, const uint8_t* signature, size_t signature_length, diff --git a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_ref.cpp b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_ref.cpp index cd0959bf..98ae24f7 100644 --- a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_ref.cpp +++ b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_ref.cpp @@ -1148,6 +1148,10 @@ extern "C" uint32_t OEMCrypto_GetAnalogOutputFlags() { return crypto_engine->analog_output_flags(); } +extern "C" const char* OEMCrypto_BuildInformation() { + return "OEMCrypto Ref Code " __DATE__ " " __TIME__; +} + extern "C" bool OEMCrypto_SupportsUsageTable() { if (!crypto_engine) { LOGE("OEMCrypto_SupportsUsageTable: OEMCrypto Not Initialized."); diff --git a/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp b/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp index 7fa092ad..a66b62c4 100644 --- a/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp +++ b/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp @@ -112,6 +112,13 @@ TEST_F(OEMCryptoClientTest, VersionNumber) { } else { cout << " OEMCrypto does not support usage tables." << endl; } + if (version >= 15) { + const char* build_info = OEMCrypto_BuildInformation(); + ASSERT_TRUE(build_info != NULL); + ASSERT_TRUE(strnlen(build_info, 256) <= 256) + << "BuildInformation should be a short printable string."; + cout << " BuildInformation: " << build_info << endl; + } ASSERT_GE(version, 8u); ASSERT_LE(version, 15u); }