Fixes for renew on license load

[ Merge of http://go/wvgerrit/173290 ]

* Renew timer offset from when license is loaded verifies that the
  rental duration has not expired and begins decryption.
* Renew timer offset from first decrypt bugfix
* Feature is enabled based on oemcrypto v18 presence
* Renewal logic verifies that |can_renew| is enabled
* Unit tests were added to reflect use cases from duration
  and renewal documentation

Bug: 278751387
Test: policy unittests, CdmUseCase tests, wvts tests
Change-Id: I3070b3f31b316e150c28ebe38d0440ab1eeb89b9
This commit is contained in:
Rahul Frias
2023-05-08 16:41:13 -07:00
parent 13368f4076
commit 669fc9c7af
5 changed files with 2436 additions and 13 deletions

View File

@@ -9,6 +9,7 @@
#include "clock.h"
#include "log.h"
#include "policy_timers_v16.h"
#include "policy_timers_v18.h"
#include "properties.h"
#include "string_conversions.h"
#include "wv_cdm_constants.h"
@@ -21,7 +22,7 @@ namespace {
const int kCdmPolicyTimerDurationSeconds = 1;
const int kClockSkewDelta = 5; // seconds
const int64_t kLicenseStateUpdateDelay = 20; // seconds
const uint32_t kMinOemCryptoApiVersionSupportsRenewalDelayBase = 18;
} // namespace
namespace wvcdm {
@@ -32,8 +33,17 @@ PolicyEngine::PolicyEngine(CdmSessionId session_id,
: session_id_(session_id),
event_listener_(event_listener),
license_keys_(new LicenseKeys(crypto_session->GetSecurityLevel())),
policy_timers_(new PolicyTimersV16()),
clock_(new wvutil::Clock()) {
uint32_t version = 0;
if (crypto_session->GetApiVersion(&version)) {
if (version >= kMinOemCryptoApiVersionSupportsRenewalDelayBase) {
policy_timers_.reset(new PolicyTimersV18());
}
}
if (policy_timers_ == nullptr) {
policy_timers_.reset(new PolicyTimersV16());
}
InitDevice(crypto_session);
}
@@ -121,7 +131,8 @@ void PolicyEngine::OnTimerEvent() {
// Test to determine if renewal should be attempted.
switch (license_state_) {
case kLicenseStateCanPlay: {
if (policy_timers_->HasRenewalDelayExpired(current_time)) {
if (policy_timers_->HasRenewalDelayExpired(current_time) &&
policy_timers_->get_policy().can_renew()) {
renewal_needed = true;
}
// HDCP may change, so force a check.
@@ -130,12 +141,15 @@ void PolicyEngine::OnTimerEvent() {
}
case kLicenseStateNeedRenewal: {
renewal_needed = true;
if (policy_timers_->get_policy().can_renew()) {
renewal_needed = true;
}
break;
}
case kLicenseStateWaitingLicenseUpdate: {
if (policy_timers_->HasRenewalRetryIntervalExpired(current_time)) {
if (policy_timers_->HasRenewalRetryIntervalExpired(current_time) &&
policy_timers_->get_policy().can_renew()) {
renewal_needed = true;
}
break;
@@ -249,7 +263,8 @@ bool PolicyEngine::BeginDecryption() {
case kLicenseStateWaitingLicenseUpdate:
policy_timers_->BeginDecryption(current_time);
if (policy_timers_->get_policy().renew_with_usage()) {
if (policy_timers_->get_policy().renew_with_usage() &&
policy_timers_->get_policy().can_renew()) {
license_state_ = kLicenseStateNeedRenewal;
}
NotifyExpirationUpdate(current_time);