From 774c4667fc59ea633efa33217762beeb754799ea Mon Sep 17 00:00:00 2001 From: Alex Dale Date: Fri, 18 Apr 2025 12:34:52 -0700 Subject: [PATCH] Allow ProvisioningHolder to return load status. [ Merge of http://go/wvgerrit/219452 ] Allow ProvisioningHolder to load the a provisioning response without triggering test failure if the CDM rejects the response. This is to allow testing cases where we expect the CDM to reject the response. VIC-specific: No specialized provisioning dump call. Bug: 391469176 Change-Id: Ief1791f23035fe9b554f8e82e049343aa7e97362 --- .../cdm/core/test/provisioning_holder.cpp | 44 ++++++++++++++++++- .../cdm/core/test/provisioning_holder.h | 4 ++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/libwvdrmengine/cdm/core/test/provisioning_holder.cpp b/libwvdrmengine/cdm/core/test/provisioning_holder.cpp index d69de025..80a7ae54 100644 --- a/libwvdrmengine/cdm/core/test/provisioning_holder.cpp +++ b/libwvdrmengine/cdm/core/test/provisioning_holder.cpp @@ -7,7 +7,6 @@ #include #include "cdm_engine.h" -#include "config_test_env.h" #include "log.h" #include "message_dumper.h" @@ -130,6 +129,49 @@ void ProvisioningHolder::LoadResponse(bool binary_provisioning) { } } +CdmResponseType ProvisioningHolder::LoadResponseReturnStatus( + bool binary_provisioning) { + // Preconditions. + if (response_.empty()) { + ADD_FAILURE() << "No response was fetched"; + return CdmResponseType(UNKNOWN_ERROR); + } + + std::string cdm_prov_response; + if (binary_provisioning) { + // CDM is expecting the response to be in binary form, response + // must be extracted and decoded. + std::string base_64_response; + if (!ExtractSignedMessage(response_, &base_64_response)) { + ADD_FAILURE() + << "Failed to extract signed serialized response from JSON response"; + return CdmResponseType(UNKNOWN_ERROR); + } + if (base_64_response.empty()) { + ADD_FAILURE() + << "Base64 encoded provisioning response is unexpectedly empty"; + return CdmResponseType(UNKNOWN_ERROR); + } + LOGV("Extracted response message: \n%s\n", base_64_response.c_str()); + + const std::vector response_vec = + wvutil::Base64SafeDecode(base_64_response); + if (response_vec.empty()) { + ADD_FAILURE() << "Failed to decode base64 response: " << base_64_response; + return CdmResponseType(UNKNOWN_ERROR); + } + cdm_prov_response.assign(response_vec.begin(), response_vec.end()); + } else { + cdm_prov_response = response_; + } + // HandleProvisioningResponse() may or may not succeed, + // left to caller to determine if this is considered a + // test failure. + const CdmResponseType status = cdm_engine_->HandleProvisioningResponse( + cdm_prov_response, kLevelDefault, &certificate_, &wrapped_key_); + return status; +} + bool ProvisioningHolder::ExtractSignedMessage(const std::string& response, std::string* result) { static const std::string kMessageStart = "\"signedResponse\": \""; diff --git a/libwvdrmengine/cdm/core/test/provisioning_holder.h b/libwvdrmengine/cdm/core/test/provisioning_holder.h index 17de9e35..ccc10e59 100644 --- a/libwvdrmengine/cdm/core/test/provisioning_holder.h +++ b/libwvdrmengine/cdm/core/test/provisioning_holder.h @@ -40,7 +40,11 @@ class ProvisioningHolder { // JSON message of the response to |response_|. void FetchResponse(); + // Loads the response into the |cdm_engine_|, expecting success. void LoadResponse(bool binary_provisioning); + // Loads the response into the |cdm_engine_|, returning the + // result from CDM. + CdmResponseType LoadResponseReturnStatus(bool binary_provisioning); const std::string& request() const { return request_; } // Sets the request to be used on next call to FetchResponse().