diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index fd5234f3..35fefd92 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -121,41 +121,50 @@ CdmResponseType CdmEngine::OpenSession(const CdmKeySystem& key_system, } LOGD("forced_session_id = %s", IdPtrToString(forced_session_id)); } + + SecurityLevel requested_security_level = kLevelDefault; + if (property_set && + property_set->security_level() == QUERY_VALUE_SECURITY_LEVEL_L3) { + requested_security_level = kLevel3; + } + bool forced_level3 = false; - if (OkpCheck()) { - bool okp_provisioned = false; - bool fallback = false; - { - std::unique_lock lock(okp_mutex_); - if (!okp_provisioner_) { - // Very rare race condition. Possible if two calls to OpenSession - // occur the same time. Cleanup would have been performed. - if (okp_fallback_) { - fallback = true; - } else { + if (requested_security_level == kLevelDefault) { + if (OkpCheck()) { + bool okp_provisioned = false; + bool fallback = false; + { + std::unique_lock lock(okp_mutex_); + if (!okp_provisioner_) { + // Very rare race condition. Possible if two calls to OpenSession + // occur the same time. Cleanup would have been performed. + if (okp_fallback_) { + fallback = true; + } else { + okp_provisioned = true; + } + } else if (okp_provisioner_->IsProvisioned()) { okp_provisioned = true; + } else if (okp_provisioner_->IsInFallbackMode()) { + fallback = true; } - } else if (okp_provisioner_->IsProvisioned()) { - okp_provisioned = true; - } else if (okp_provisioner_->IsInFallbackMode()) { - fallback = true; } - } - if (okp_provisioned) { - // OKP not required, engine may assume normal operations. - OkpCleanUp(); - } else if (fallback) { - LOGD("Engine is falling back to L3"); - OkpTriggerFallback(); - forced_level3 = true; + if (okp_provisioned) { + // OKP not required, engine may assume normal operations. + OkpCleanUp(); + } else if (fallback) { + LOGD("Engine is falling back to L3"); + OkpTriggerFallback(); + forced_level3 = true; + } else { + // OKP is required. + return NEED_PROVISIONING; + } } else { - // OKP is required. - return NEED_PROVISIONING; + std::unique_lock lock(okp_mutex_); + // |okp_fallback_| would have been set previously if required. + if (okp_fallback_) forced_level3 = true; } - } else { - std::unique_lock lock(okp_mutex_); - // |okp_fallback_| would have been set previously if required. - if (okp_fallback_) forced_level3 = true; } CloseExpiredReleaseSessions();