0

CdmAdapter: Allow parallel SendPlatformChallenge() calls.

Previously CdmAdapter only allows one outstanding SendPlatformChallenge() call.
However, CDM actually needs to make parallel SendPlatformChallenge() calls. This
CL fixes CdmAdapter to allow this.

BUG=393722
TEST=Tested on ChromeOS build on Linux with hack in
PepperPlatformVerificationMessageFilter to return faked challenge platform reply.

Review URL: https://codereview.chromium.org/393713003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@283651 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
xhwang@chromium.org
2014-07-17 06:07:18 +00:00
parent 6f7b4e45f7
commit ca9f19e77b
2 changed files with 33 additions and 35 deletions

@ -255,7 +255,6 @@ CdmAdapter::CdmAdapter(PP_Instance instance, pp::Module* module)
#if defined(OS_CHROMEOS)
output_protection_(this),
platform_verification_(this),
challenge_in_progress_(false),
output_link_mask_(0),
output_protection_mask_(0),
query_output_protection_in_progress_(false),
@ -1009,34 +1008,33 @@ void CdmAdapter::SendPlatformChallenge(
const char* service_id, uint32_t service_id_length,
const char* challenge, uint32_t challenge_length) {
#if defined(OS_CHROMEOS)
PP_DCHECK(!challenge_in_progress_);
// Ensure member variables set by the callback are in a clean state.
signed_data_output_ = pp::Var();
signed_data_signature_output_ = pp::Var();
platform_key_certificate_output_ = pp::Var();
pp::VarArrayBuffer challenge_var(challenge_length);
uint8_t* var_data = static_cast<uint8_t*>(challenge_var.Map());
memcpy(var_data, challenge, challenge_length);
std::string service_id_str(service_id, service_id_length);
linked_ptr<PepperPlatformChallengeResponse> response(
new PepperPlatformChallengeResponse());
int32_t result = platform_verification_.ChallengePlatform(
pp::Var(service_id_str), challenge_var, &signed_data_output_,
&signed_data_signature_output_, &platform_key_certificate_output_,
callback_factory_.NewCallback(&CdmAdapter::SendPlatformChallengeDone));
pp::Var(service_id_str),
challenge_var,
&response->signed_data,
&response->signed_data_signature,
&response->platform_key_certificate,
callback_factory_.NewCallback(&CdmAdapter::SendPlatformChallengeDone,
response));
challenge_var.Unmap();
if (result == PP_OK_COMPLETIONPENDING) {
challenge_in_progress_ = true;
if (result == PP_OK_COMPLETIONPENDING)
return;
}
// Fall through on error and issue an empty OnPlatformChallengeResponse().
PP_DCHECK(result != PP_OK);
#endif
cdm::PlatformChallengeResponse response = {};
cdm_->OnPlatformChallengeResponse(response);
cdm::PlatformChallengeResponse platform_challenge_response = {};
cdm_->OnPlatformChallengeResponse(platform_challenge_response);
}
void CdmAdapter::EnableOutputProtection(uint32_t desired_protection_mask) {
@ -1154,29 +1152,29 @@ void CdmAdapter::ReportOutputProtectionQueryResult() {
// queries and success results.
}
void CdmAdapter::SendPlatformChallengeDone(int32_t result) {
challenge_in_progress_ = false;
void CdmAdapter::SendPlatformChallengeDone(
int32_t result,
const linked_ptr<PepperPlatformChallengeResponse>& response) {
if (result != PP_OK) {
CDM_DLOG() << __FUNCTION__ << ": Platform challenge failed!";
cdm::PlatformChallengeResponse response = {};
cdm_->OnPlatformChallengeResponse(response);
cdm::PlatformChallengeResponse platform_challenge_response = {};
cdm_->OnPlatformChallengeResponse(platform_challenge_response);
return;
}
pp::VarArrayBuffer signed_data_var(signed_data_output_);
pp::VarArrayBuffer signed_data_signature_var(signed_data_signature_output_);
pp::VarArrayBuffer signed_data_var(response->signed_data);
pp::VarArrayBuffer signed_data_signature_var(response->signed_data_signature);
std::string platform_key_certificate_string =
platform_key_certificate_output_.AsString();
response->platform_key_certificate.AsString();
cdm::PlatformChallengeResponse response = {
cdm::PlatformChallengeResponse platform_challenge_response = {
static_cast<uint8_t*>(signed_data_var.Map()),
signed_data_var.ByteLength(),
static_cast<uint8_t*>(signed_data_signature_var.Map()),
signed_data_signature_var.ByteLength(),
reinterpret_cast<const uint8_t*>(platform_key_certificate_string.data()),
static_cast<uint32_t>(platform_key_certificate_string.length())};
cdm_->OnPlatformChallengeResponse(response);
cdm_->OnPlatformChallengeResponse(platform_challenge_response);
signed_data_var.Unmap();
signed_data_signature_var.Unmap();

@ -245,21 +245,21 @@ class CdmAdapter : public pp::Instance,
void ReportOutputProtectionQuery();
void ReportOutputProtectionQueryResult();
void SendPlatformChallengeDone(int32_t result);
struct PepperPlatformChallengeResponse {
pp::Var signed_data;
pp::Var signed_data_signature;
pp::Var platform_key_certificate;
};
void SendPlatformChallengeDone(
int32_t result,
const linked_ptr<PepperPlatformChallengeResponse>& response);
void EnableProtectionDone(int32_t result);
void QueryOutputProtectionStatusDone(int32_t result);
pp::OutputProtection_Private output_protection_;
pp::PlatformVerification platform_verification_;
// Since PPAPI doesn't provide handlers for CompletionCallbacks with more than
// one output we need to manage our own. These values are only read by
// SendPlatformChallengeDone().
pp::Var signed_data_output_;
pp::Var signed_data_signature_output_;
pp::Var platform_key_certificate_output_;
bool challenge_in_progress_;
// Same as above, these are only read by QueryOutputProtectionStatusDone().
uint32_t output_link_mask_;
uint32_t output_protection_mask_;