Close session after provisioning

Merge of CDM change:
https://widevine-internal-review.googlesource.com/#/c/10691/

This prevents the provisioning session from being created unless the
device needs provisioning.  And then, after provisioning, it closes
the session it had previously opened.

b/15782159 CertificateProvisioning object keeps unused CryptoSession

Change-Id: Ic52ed864fa47c7ba50b7ca4d9fea1e74930228e9
This commit is contained in:
Fred Gylys-Colwell
2014-07-18 13:54:42 -07:00
parent 174a218b30
commit a19a965fb7
3 changed files with 29 additions and 10 deletions

View File

@@ -120,7 +120,7 @@ class CdmEngine {
// instance variables
CdmSessionMap sessions_;
CdmReleaseKeySetMap release_key_sets_;
CertificateProvisioning cert_provisioning_;
scoped_ptr<CertificateProvisioning> cert_provisioning_;
SecurityLevel cert_provisioning_requested_security_level_;
static bool seeded_;

View File

@@ -28,7 +28,8 @@ namespace wvcdm {
bool CdmEngine::seeded_ = false;
CdmEngine::CdmEngine()
: cert_provisioning_requested_security_level_(kLevelDefault),
: cert_provisioning_(NULL),
cert_provisioning_requested_security_level_(kLevelDefault),
usage_session_(NULL),
last_usage_information_update_time(0) {
Properties::Init();
@@ -459,12 +460,19 @@ CdmResponseType CdmEngine::GetProvisioningRequest(
LOGE("CdmEngine::GetProvisioningRequest: invalid input parameters");
return UNKNOWN_ERROR;
}
return cert_provisioning_.GetProvisioningRequest(
cert_provisioning_requested_security_level_,
cert_type,
cert_authority,
request,
default_url);
if (NULL == cert_provisioning_.get()) {
cert_provisioning_.reset(new CertificateProvisioning());
}
CdmResponseType ret = cert_provisioning_->GetProvisioningRequest(
cert_provisioning_requested_security_level_,
cert_type,
cert_authority,
request,
default_url);
if (ret != NO_ERROR) {
cert_provisioning_.reset(NULL); // Release resources.
}
return ret;
}
/*
@@ -480,20 +488,30 @@ CdmResponseType CdmEngine::HandleProvisioningResponse(
std::string* wrapped_key) {
if (response.empty()) {
LOGE("CdmEngine::HandleProvisioningResponse: Empty provisioning response.");
cert_provisioning_.reset(NULL);
return UNKNOWN_ERROR;
}
if (NULL == cert) {
LOGE("CdmEngine::HandleProvisioningResponse: invalid certificate "
"destination");
cert_provisioning_.reset(NULL);
return UNKNOWN_ERROR;
}
if (NULL == wrapped_key) {
LOGE("CdmEngine::HandleProvisioningResponse: invalid wrapped key "
"destination");
cert_provisioning_.reset(NULL);
return UNKNOWN_ERROR;
}
return cert_provisioning_.HandleProvisioningResponse(response, cert,
wrapped_key);
if (NULL == cert_provisioning_.get()) {
LOGE("CdmEngine::HandleProvisioningResponse: provisioning object missing.");
return UNKNOWN_ERROR;
}
CdmResponseType ret =
cert_provisioning_->HandleProvisioningResponse(response, cert,
wrapped_key);
cert_provisioning_.reset(NULL); // Release resources.
return ret;
}
CdmResponseType CdmEngine::Unprovision(CdmSecurityLevel security_level) {

View File

@@ -7,6 +7,7 @@
#include <arpa/inet.h> // needed for ntoh()
#include <iostream>
#include <string.h>
#include "crypto_key.h"
#include "log.h"