From a53a6bf35577dd41402dcf60ca45a63c54f85838 Mon Sep 17 00:00:00 2001 From: Cong Lin Date: Wed, 25 Mar 2020 17:26:32 -0700 Subject: [PATCH] Use unique_ptr in oemcrypto ref Merge from Widevine repo of http://go/wvgerrit/95945 The reference oemcrypto and testbed still use old style pointers, even though we now require a more modern C++ compiler. Updated a few places where smart pointer would be appropriate. Bug: 141393616 Test: Ran unit tests Change-Id: I8b1e155bce241075928e373478d6f8e1001233f9 --- .../oemcrypto/ref/src/oemcrypto_session.cpp | 21 ++++++----------- .../oemcrypto/ref/src/oemcrypto_session.h | 4 ++-- .../ref/src/oemcrypto_usage_table_ref.cpp | 23 ++++++++----------- .../ref/src/oemcrypto_usage_table_ref.h | 5 ++-- 4 files changed, 22 insertions(+), 31 deletions(-) diff --git a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session.cpp b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session.cpp index 5b7ee644..a3ea95ef 100644 --- a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session.cpp +++ b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session.cpp @@ -210,14 +210,6 @@ SessionContext::SessionContext(CryptoEngine* ce, SessionId sid, } SessionContext::~SessionContext() { - if (usage_entry_) { - delete usage_entry_; - usage_entry_ = nullptr; - } - if (session_keys_) { - delete session_keys_; - session_keys_ = nullptr; - } } // Internal utility function to derive key using CMAC-128 @@ -777,11 +769,11 @@ OEMCryptoResult SessionContext::LoadKeysNoSignature( if (session_keys_ == nullptr) { switch (license_type) { case OEMCrypto_ContentLicense: - session_keys_ = new ContentKeysContext(); + session_keys_.reset(new ContentKeysContext()); break; case OEMCrypto_EntitlementLicense: - session_keys_ = new EntitlementKeysContext(); + session_keys_.reset(new EntitlementKeysContext()); break; default: @@ -915,7 +907,8 @@ OEMCryptoResult SessionContext::LoadEntitledContentKeys( if (!key_array) { return OEMCrypto_ERROR_UNKNOWN_FAILURE; } - if (!session_keys_ || session_keys_->type() != OEMCrypto_EntitlementLicense) { + if (session_keys_ == nullptr || + session_keys_->type() != OEMCrypto_EntitlementLicense) { return OEMCrypto_ERROR_INVALID_CONTEXT; } for (size_t i = 0; i < key_array_length; ++i) { @@ -1494,8 +1487,8 @@ OEMCryptoResult SessionContext::UpdateUsageEntry(uint8_t* header_buffer, return OEMCrypto_ERROR_INVALID_CONTEXT; } return ce_->usage_table().UpdateUsageEntry( - this, usage_entry_, header_buffer, header_buffer_length, entry_buffer, - entry_buffer_length, &clock_values_); + this, usage_entry_.get(), header_buffer, header_buffer_length, + entry_buffer, entry_buffer_length, &clock_values_); } OEMCryptoResult SessionContext::DeactivateUsageEntry( @@ -1514,7 +1507,7 @@ OEMCryptoResult SessionContext::ReportUsage(const std::vector& pst, OEMCryptoResult SessionContext::MoveEntry(uint32_t new_index) { if (!usage_entry_) return OEMCrypto_ERROR_INVALID_CONTEXT; - return ce_->usage_table().MoveEntry(usage_entry_, new_index); + return ce_->usage_table().MoveEntry(usage_entry_.get(), new_index); } // Internal utility function to decrypt the message diff --git a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session.h b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session.h index f092d639..e6a1d787 100644 --- a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session.h +++ b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session.h @@ -267,7 +267,7 @@ class SessionContext { std::vector encryption_key_; std::vector session_key_; const Key* current_content_key_; - SessionContextKeys* session_keys_; + std::unique_ptr session_keys_; ODK_NonceValues nonce_values_; uint8_t license_request_hash_[ODK_SHA256_HASH_SIZE]; RSA_shared_ptr rsa_key_; @@ -275,7 +275,7 @@ class SessionContext { bool decrypt_started_; // If the license has been used in this session. ODK_TimerLimits timer_limits_; ODK_ClockValues clock_values_; - UsageTableEntry* usage_entry_; + std::unique_ptr usage_entry_; SRMVersionStatus srm_requirements_status_; enum UsageEntryStatus { kNoUsageEntry, // No entry loaded for this session. diff --git a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_usage_table_ref.cpp b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_usage_table_ref.cpp index abe6167a..db04ae78 100644 --- a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_usage_table_ref.cpp +++ b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_usage_table_ref.cpp @@ -348,9 +348,9 @@ UsageTableEntry* UsageTable::MakeEntry(uint32_t index) { return new UsageTableEntry(this, index, master_generation_number_); } -OEMCryptoResult UsageTable::CreateNewUsageEntry(SessionContext* session, - UsageTableEntry** entry, - uint32_t* usage_entry_number) { +OEMCryptoResult UsageTable::CreateNewUsageEntry( + SessionContext* session, std::unique_ptr* entry, + uint32_t* usage_entry_number) { if (!header_loaded_) { LOGE("CreateNewUsageEntry: Header not loaded."); return OEMCrypto_ERROR_UNKNOWN_FAILURE; @@ -367,16 +367,15 @@ OEMCryptoResult UsageTable::CreateNewUsageEntry(SessionContext* session, generation_numbers_.push_back(master_generation_number_); sessions_.push_back(session); master_generation_number_++; - *entry = new_entry; + entry->reset(new_entry); *usage_entry_number = index; return OEMCrypto_SUCCESS; } -OEMCryptoResult UsageTable::LoadUsageEntry(SessionContext* session, - UsageTableEntry** entry, - uint32_t index, - const std::vector& buffer, - ODK_ClockValues* clock_values) { +OEMCryptoResult UsageTable::LoadUsageEntry( + SessionContext* session, std::unique_ptr* entry, + uint32_t index, const std::vector& buffer, + ODK_ClockValues* clock_values) { if (!header_loaded_) { LOGE("CreateNewUsageEntry: Header not loaded."); return OEMCrypto_ERROR_UNKNOWN_FAILURE; @@ -393,12 +392,11 @@ OEMCryptoResult UsageTable::LoadUsageEntry(SessionContext* session, LOGE("Too many usage entries: %d/%d", index, max); return OEMCrypto_ERROR_INSUFFICIENT_RESOURCES; } - UsageTableEntry* new_entry = MakeEntry(index); + std::unique_ptr new_entry(MakeEntry(index)); OEMCryptoResult status = new_entry->LoadData(ce_, index, buffer, clock_values); if (status != OEMCrypto_SUCCESS) { - delete new_entry; return status; } if (new_entry->generation_number() != generation_numbers_[index]) { @@ -406,13 +404,12 @@ OEMCryptoResult UsageTable::LoadUsageEntry(SessionContext* session, generation_numbers_[index]); if ((new_entry->generation_number() + 1 < generation_numbers_[index]) || (new_entry->generation_number() - 1 > generation_numbers_[index])) { - delete new_entry; return OEMCrypto_ERROR_GENERATION_SKEW; } status = OEMCrypto_WARNING_GENERATION_SKEW; } sessions_[index] = session; - *entry = new_entry; + *entry = std::move(new_entry); return status; } diff --git a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_usage_table_ref.h b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_usage_table_ref.h index e8d4360b..a2d87d01 100644 --- a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_usage_table_ref.h +++ b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_usage_table_ref.h @@ -88,10 +88,11 @@ class UsageTable { virtual ~UsageTable(); OEMCryptoResult CreateNewUsageEntry(SessionContext* session, - UsageTableEntry** entry, + std::unique_ptr* entry, uint32_t* usage_entry_number); OEMCryptoResult LoadUsageEntry(SessionContext* session, - UsageTableEntry** entry, uint32_t index, + std::unique_ptr* entry, + uint32_t index, const std::vector& buffer, ODK_ClockValues* clock_values); OEMCryptoResult UpdateUsageEntry(