Squashed commit of the following CDM changes:
* Add additional parameters to CDM decryption API https://widevine-internal-review.googlesource.com/#/c/6500/ * Pass Length and Flags Parameters to Decrypt() https://widevine-internal-review.googlesource.com/#/c/6740/ * Remove core files from oemcrypto/mock https://widevine-internal-review.googlesource.com/#/c/6853/ Change-Id: I1c73f5454da20da99130b161543fb990e16e7130
This commit is contained in:
@@ -85,16 +85,7 @@ class CdmEngine : public TimerHandler {
|
||||
// Decryption and key related methods
|
||||
// Accept encrypted buffer and return decrypted data.
|
||||
virtual CdmResponseType Decrypt(const CdmSessionId& session_id,
|
||||
bool is_encrypted,
|
||||
bool is_secure,
|
||||
const KeyId& key_id,
|
||||
const uint8_t* encrypt_buffer,
|
||||
size_t encrypt_length,
|
||||
const std::vector<uint8_t>& iv,
|
||||
size_t block_offset,
|
||||
void* decrypt_buffer,
|
||||
size_t decrypt_buffer_offset,
|
||||
bool is_video);
|
||||
const CdmDecryptionParameters& parameters);
|
||||
|
||||
// Is the key known to any session?
|
||||
virtual bool IsKeyValid(const KeyId& key_id);
|
||||
|
||||
@@ -59,11 +59,7 @@ class CdmSession {
|
||||
CdmResponseType QueryKeyControlInfo(CdmQueryMap* key_info);
|
||||
|
||||
// Decrypt() - Accept encrypted buffer and return decrypted data.
|
||||
CdmResponseType Decrypt(bool is_encrypted, bool is_secure,
|
||||
const KeyId& key_id, const uint8_t* encrypt_buffer,
|
||||
size_t encrypt_length, const std::vector<uint8_t>& iv,
|
||||
size_t block_offset, void* decrypt_buffer,
|
||||
size_t decrypt_buffer_offset, bool is_video);
|
||||
CdmResponseType Decrypt(const CdmDecryptionParameters& parameters);
|
||||
|
||||
// License renewal
|
||||
// GenerateRenewalRequest() - Construct valid renewal request for the current
|
||||
|
||||
@@ -68,15 +68,7 @@ class CryptoSession {
|
||||
|
||||
// Media data path
|
||||
bool SelectKey(const std::string& key_id);
|
||||
CdmResponseType Decrypt(bool is_encrypted,
|
||||
bool is_secure,
|
||||
const uint8_t* encrypt_buffer,
|
||||
size_t encrypt_length,
|
||||
const std::vector<uint8_t>& iv,
|
||||
size_t block_offset,
|
||||
void* decrypt_buffer,
|
||||
size_t decrypt_buffer_offset,
|
||||
bool is_video);
|
||||
CdmResponseType Decrypt(const CdmDecryptionParameters& parameters);
|
||||
|
||||
bool GetRandom(uint8_t* random_data, size_t data_length);
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ enum CdmResponseType {
|
||||
};
|
||||
|
||||
#define CORE_DISALLOW_COPY_AND_ASSIGN(TypeName) \
|
||||
TypeName(const TypeName&); \
|
||||
TypeName(const TypeName&); \
|
||||
void operator=(const TypeName&)
|
||||
|
||||
enum CdmEventType {
|
||||
@@ -55,6 +55,50 @@ enum CdmLicenseType {
|
||||
kLicenseTypeRelease
|
||||
};
|
||||
|
||||
struct CdmDecryptionParameters {
|
||||
bool is_encrypted;
|
||||
bool is_secure;
|
||||
const KeyId* key_id;
|
||||
const uint8_t* encrypt_buffer;
|
||||
size_t encrypt_length;
|
||||
const std::vector<uint8_t>* iv;
|
||||
size_t block_offset;
|
||||
void* decrypt_buffer;
|
||||
size_t decrypt_buffer_length;
|
||||
size_t decrypt_buffer_offset;
|
||||
uint8_t subsample_flags;
|
||||
bool is_video;
|
||||
CdmDecryptionParameters()
|
||||
: is_encrypted(true),
|
||||
is_secure(true),
|
||||
key_id(NULL),
|
||||
encrypt_buffer(NULL),
|
||||
encrypt_length(0),
|
||||
iv(NULL),
|
||||
block_offset(0),
|
||||
decrypt_buffer(NULL),
|
||||
decrypt_buffer_length(0),
|
||||
decrypt_buffer_offset(0),
|
||||
subsample_flags(0),
|
||||
is_video(true) {}
|
||||
CdmDecryptionParameters(const KeyId* key, const uint8_t* encrypted_buffer,
|
||||
size_t encrypted_length,
|
||||
const std::vector<uint8_t>* initialization_vector,
|
||||
size_t offset, void* decrypted_buffer)
|
||||
: is_encrypted(true),
|
||||
is_secure(true),
|
||||
key_id(key),
|
||||
encrypt_buffer(encrypted_buffer),
|
||||
encrypt_length(encrypted_length),
|
||||
iv(initialization_vector),
|
||||
block_offset(offset),
|
||||
decrypt_buffer(decrypted_buffer),
|
||||
decrypt_buffer_length(encrypted_length),
|
||||
decrypt_buffer_offset(0),
|
||||
subsample_flags(0),
|
||||
is_video(true) {}
|
||||
};
|
||||
|
||||
// forward class references
|
||||
class KeyMessage;
|
||||
class Request;
|
||||
|
||||
@@ -458,26 +458,34 @@ CdmResponseType CdmEngine::ReleaseSecureStops(
|
||||
|
||||
CdmResponseType CdmEngine::Decrypt(
|
||||
const CdmSessionId& session_id,
|
||||
bool is_encrypted,
|
||||
bool is_secure,
|
||||
const KeyId& key_id,
|
||||
const uint8_t* encrypt_buffer,
|
||||
size_t encrypt_length,
|
||||
const std::vector<uint8_t>& iv,
|
||||
size_t block_offset,
|
||||
void* decrypt_buffer,
|
||||
size_t decrypt_buffer_offset,
|
||||
bool is_video) {
|
||||
const CdmDecryptionParameters& parameters) {
|
||||
if (parameters.key_id == NULL) {
|
||||
LOGE("CdmEngine::Decrypt: no key_id");
|
||||
return KEY_ERROR;
|
||||
}
|
||||
|
||||
if (parameters.encrypt_buffer == NULL) {
|
||||
LOGE("CdmEngine::Decrypt: no src encrypt buffer");
|
||||
return KEY_ERROR;
|
||||
}
|
||||
|
||||
if (parameters.iv == NULL) {
|
||||
LOGE("CdmEngine::Decrypt: no iv");
|
||||
return KEY_ERROR;
|
||||
}
|
||||
|
||||
if (parameters.decrypt_buffer == NULL) {
|
||||
LOGE("CdmEngine::Decrypt: no dest decrypt buffer");
|
||||
return KEY_ERROR;
|
||||
}
|
||||
|
||||
CdmSessionMap::iterator iter = sessions_.find(session_id);
|
||||
if (iter == sessions_.end()) {
|
||||
LOGW("CdmEngine::Decrypt: session_id not found = %s", session_id.c_str());
|
||||
return KEY_ERROR;
|
||||
}
|
||||
|
||||
return iter->second->Decrypt(is_encrypted, is_secure, key_id, encrypt_buffer,
|
||||
encrypt_length, iv, block_offset,
|
||||
decrypt_buffer, decrypt_buffer_offset,
|
||||
is_video);
|
||||
return iter->second->Decrypt(parameters);
|
||||
}
|
||||
|
||||
bool CdmEngine::IsKeyValid(const KeyId& key_id) {
|
||||
|
||||
@@ -217,8 +217,15 @@ CdmResponseType CdmSession::QueryKeyStatus(CdmQueryMap* key_info) {
|
||||
}
|
||||
|
||||
CdmResponseType CdmSession::QueryKeyControlInfo(CdmQueryMap* key_info) {
|
||||
if (crypto_session_.get() == NULL || !crypto_session_->IsOpen())
|
||||
if (crypto_session_.get() == NULL) {
|
||||
LOGW("CdmSession::QueryKeyControlInfo: Invalid crypto session");
|
||||
return UNKNOWN_ERROR;
|
||||
}
|
||||
|
||||
if (!crypto_session_->IsOpen()) {
|
||||
LOGW("CdmSession::QueryKeyControlInfo: Crypto session not open");
|
||||
return UNKNOWN_ERROR;
|
||||
}
|
||||
|
||||
std::stringstream ss;
|
||||
ss << crypto_session_->oec_session_id();
|
||||
@@ -234,28 +241,22 @@ CdmResponseType CdmSession::CancelKeyRequest() {
|
||||
}
|
||||
|
||||
// Decrypt() - Accept encrypted buffer and return decrypted data.
|
||||
CdmResponseType CdmSession::Decrypt(
|
||||
bool is_encrypted, bool is_secure, const KeyId& key_id,
|
||||
const uint8_t* encrypt_buffer, size_t encrypt_length,
|
||||
const std::vector<uint8_t>& iv, size_t block_offset, void* decrypt_buffer,
|
||||
size_t decrypt_buffer_offset, bool is_video) {
|
||||
CdmResponseType CdmSession::Decrypt(const CdmDecryptionParameters& params) {
|
||||
if (crypto_session_.get() == NULL || !crypto_session_->IsOpen())
|
||||
return UNKNOWN_ERROR;
|
||||
|
||||
// Check if key needs to be selected
|
||||
if (is_encrypted) {
|
||||
if (key_id_.compare(key_id) != 0) {
|
||||
if (crypto_session_->SelectKey(key_id)) {
|
||||
key_id_ = key_id;
|
||||
if (params.is_encrypted) {
|
||||
if (key_id_.compare(*params.key_id) != 0) {
|
||||
if (crypto_session_->SelectKey(*params.key_id)) {
|
||||
key_id_ = *params.key_id;
|
||||
} else {
|
||||
return NEED_KEY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return crypto_session_->Decrypt(
|
||||
is_encrypted, is_secure, encrypt_buffer, encrypt_length, iv, block_offset,
|
||||
decrypt_buffer, decrypt_buffer_offset, is_video);
|
||||
return crypto_session_->Decrypt(params);
|
||||
}
|
||||
|
||||
// License renewal
|
||||
|
||||
@@ -529,39 +529,41 @@ bool CryptoSession::GenerateSignature(const std::string& message, bool use_rsa,
|
||||
return true;
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::Decrypt(
|
||||
bool is_encrypted, bool is_secure, const uint8_t* encrypt_buffer,
|
||||
size_t encrypt_length, const std::vector<uint8_t>& iv, size_t block_offset,
|
||||
void* decrypt_buffer, size_t decrypt_buffer_offset, bool is_video) {
|
||||
CdmResponseType CryptoSession::Decrypt(const CdmDecryptionParameters& params) {
|
||||
if (!is_destination_buffer_type_valid_) {
|
||||
if (!SetDestinationBufferType()) return UNKNOWN_ERROR;
|
||||
}
|
||||
|
||||
OEMCrypto_DestBufferDesc buffer_descriptor;
|
||||
buffer_descriptor.type =
|
||||
is_secure ? destination_buffer_type_ : OEMCrypto_BufferType_Clear;
|
||||
params.is_secure ? destination_buffer_type_ : OEMCrypto_BufferType_Clear;
|
||||
|
||||
switch (buffer_descriptor.type) {
|
||||
case OEMCrypto_BufferType_Clear:
|
||||
buffer_descriptor.buffer.clear.address =
|
||||
static_cast<uint8_t*>(decrypt_buffer) + decrypt_buffer_offset;
|
||||
buffer_descriptor.buffer.clear.max_length = encrypt_length;
|
||||
static_cast<uint8_t*>(params.decrypt_buffer) + params.decrypt_buffer_offset;
|
||||
buffer_descriptor.buffer.clear.max_length = params.decrypt_buffer_length;
|
||||
break;
|
||||
case OEMCrypto_BufferType_Secure:
|
||||
buffer_descriptor.buffer.secure.handle = decrypt_buffer;
|
||||
buffer_descriptor.buffer.secure.offset = decrypt_buffer_offset;
|
||||
buffer_descriptor.buffer.secure.max_length = encrypt_length;
|
||||
buffer_descriptor.buffer.secure.handle = params.decrypt_buffer;
|
||||
buffer_descriptor.buffer.secure.offset = params.decrypt_buffer_offset;
|
||||
buffer_descriptor.buffer.secure.max_length = params.decrypt_buffer_length;
|
||||
break;
|
||||
case OEMCrypto_BufferType_Direct:
|
||||
buffer_descriptor.type = OEMCrypto_BufferType_Direct;
|
||||
buffer_descriptor.buffer.direct.is_video = is_video;
|
||||
buffer_descriptor.buffer.direct.is_video = params.is_video;
|
||||
break;
|
||||
}
|
||||
|
||||
OEMCryptoResult sts = OEMCrypto_DecryptCTR(
|
||||
oec_session_id_, encrypt_buffer, encrypt_length, is_encrypted, &iv[0],
|
||||
block_offset, &buffer_descriptor,
|
||||
OEMCrypto_FirstSubsample | OEMCrypto_LastSubsample);
|
||||
oec_session_id_,
|
||||
params.encrypt_buffer,
|
||||
params.encrypt_length,
|
||||
params.is_encrypted,
|
||||
&(*params.iv).front(),
|
||||
params.block_offset,
|
||||
&buffer_descriptor,
|
||||
params.subsample_flags);
|
||||
|
||||
if (OEMCrypto_SUCCESS != sts) {
|
||||
return UNKNOWN_ERROR;
|
||||
|
||||
@@ -56,8 +56,7 @@ class WvContentDecryptionModule {
|
||||
|
||||
// Provisioning related methods
|
||||
virtual CdmResponseType GetProvisioningRequest(
|
||||
CdmProvisioningRequest* request,
|
||||
std::string* default_url);
|
||||
CdmProvisioningRequest* request, std::string* default_url);
|
||||
|
||||
virtual CdmResponseType HandleProvisioningResponse(
|
||||
CdmProvisioningResponse& response);
|
||||
@@ -67,23 +66,20 @@ class WvContentDecryptionModule {
|
||||
virtual CdmResponseType ReleaseSecureStops(
|
||||
const CdmSecureStopReleaseMessage& message);
|
||||
|
||||
// Accept encrypted buffer and return decrypted data.
|
||||
// Accept encrypted buffer and decrypt data.
|
||||
// Decryption parameters that need to be specified are
|
||||
// is_encrypted, is_secure, key_id, encrypt_buffer, encrypt_length,
|
||||
// iv, block_offset, decrypt_buffer, decrypt_buffer_length,
|
||||
// decrypt_buffer_offset and subsample_flags
|
||||
virtual CdmResponseType Decrypt(const CdmSessionId& session_id,
|
||||
bool is_encrypted,
|
||||
bool is_secure,
|
||||
const KeyId& key_id,
|
||||
const uint8_t* encrypt_buffer,
|
||||
size_t encrypt_length,
|
||||
const std::vector<uint8_t>& iv,
|
||||
size_t block_offset,
|
||||
void* decrypt_buffer,
|
||||
size_t decrypt_buffer_offset);
|
||||
const CdmDecryptionParameters& parameters);
|
||||
|
||||
// Event listener related methods
|
||||
virtual bool AttachEventListener(const CdmSessionId& session_id,
|
||||
WvCdmEventListener* listener);
|
||||
virtual bool DetachEventListener(const CdmSessionId& session_id,
|
||||
WvCdmEventListener* listener);
|
||||
|
||||
private:
|
||||
|
||||
// instance variables
|
||||
|
||||
@@ -11,16 +11,13 @@
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
WvContentDecryptionModule::WvContentDecryptionModule() :
|
||||
cdm_engine_(new CdmEngine()) {
|
||||
}
|
||||
WvContentDecryptionModule::WvContentDecryptionModule()
|
||||
: cdm_engine_(new CdmEngine()) {}
|
||||
|
||||
WvContentDecryptionModule::~WvContentDecryptionModule() {
|
||||
}
|
||||
WvContentDecryptionModule::~WvContentDecryptionModule() {}
|
||||
|
||||
CdmResponseType WvContentDecryptionModule::OpenSession(
|
||||
const CdmKeySystem& key_system,
|
||||
CdmSessionId* session_id) {
|
||||
const CdmKeySystem& key_system, CdmSessionId* session_id) {
|
||||
return cdm_engine_->OpenSession(key_system, session_id);
|
||||
}
|
||||
|
||||
@@ -75,26 +72,22 @@ CdmResponseType WvContentDecryptionModule::CancelKeyRequest(
|
||||
return cdm_engine_->CancelKeyRequest(session_id);
|
||||
}
|
||||
|
||||
CdmResponseType WvContentDecryptionModule::QueryStatus(
|
||||
CdmQueryMap* key_info) {
|
||||
CdmResponseType WvContentDecryptionModule::QueryStatus(CdmQueryMap* key_info) {
|
||||
return cdm_engine_->QueryStatus(key_info);
|
||||
}
|
||||
|
||||
CdmResponseType WvContentDecryptionModule::QueryKeyStatus(
|
||||
const CdmSessionId& session_id,
|
||||
CdmQueryMap* key_info) {
|
||||
const CdmSessionId& session_id, CdmQueryMap* key_info) {
|
||||
return cdm_engine_->QueryKeyStatus(session_id, key_info);
|
||||
}
|
||||
|
||||
CdmResponseType WvContentDecryptionModule::QueryKeyControlInfo(
|
||||
const CdmSessionId& session_id,
|
||||
CdmQueryMap* key_info) {
|
||||
const CdmSessionId& session_id, CdmQueryMap* key_info) {
|
||||
return cdm_engine_->QueryKeyControlInfo(session_id, key_info);
|
||||
}
|
||||
|
||||
CdmResponseType WvContentDecryptionModule::GetProvisioningRequest(
|
||||
CdmProvisioningRequest* request,
|
||||
std::string* default_url) {
|
||||
CdmProvisioningRequest* request, std::string* default_url) {
|
||||
return cdm_engine_->GetProvisioningRequest(request, default_url);
|
||||
}
|
||||
|
||||
@@ -115,30 +108,17 @@ CdmResponseType WvContentDecryptionModule::ReleaseSecureStops(
|
||||
|
||||
CdmResponseType WvContentDecryptionModule::Decrypt(
|
||||
const CdmSessionId& session_id,
|
||||
bool is_encrypted,
|
||||
bool is_secure,
|
||||
const KeyId& key_id,
|
||||
const uint8_t* encrypt_buffer,
|
||||
size_t encrypt_length,
|
||||
const std::vector<uint8_t>& iv,
|
||||
size_t block_offset,
|
||||
void* decrypt_buffer,
|
||||
size_t decrypt_buffer_offset) {
|
||||
return cdm_engine_->Decrypt(session_id, is_encrypted, is_secure, key_id,
|
||||
encrypt_buffer, encrypt_length, iv,
|
||||
block_offset, decrypt_buffer,
|
||||
decrypt_buffer_offset, true);
|
||||
const CdmDecryptionParameters& parameters) {
|
||||
return cdm_engine_->Decrypt(session_id, parameters);
|
||||
}
|
||||
|
||||
bool WvContentDecryptionModule::AttachEventListener(
|
||||
const CdmSessionId& session_id,
|
||||
WvCdmEventListener* listener) {
|
||||
const CdmSessionId& session_id, WvCdmEventListener* listener) {
|
||||
return cdm_engine_->AttachEventListener(session_id, listener);
|
||||
}
|
||||
|
||||
bool WvContentDecryptionModule::DetachEventListener(
|
||||
const CdmSessionId& session_id,
|
||||
WvCdmEventListener* listener) {
|
||||
const CdmSessionId& session_id, WvCdmEventListener* listener) {
|
||||
return cdm_engine_->DetachEventListener(session_id, listener);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "gtest/gtest.h"
|
||||
#include "license_request.h"
|
||||
#include "log.h"
|
||||
#include "OEMCryptoCENC.h"
|
||||
#include "string_conversions.h"
|
||||
#include "url_request.h"
|
||||
#include "wv_cdm_constants.h"
|
||||
@@ -28,15 +29,163 @@ int g_use_full_path = 0; // cannot use boolean in getopt_long
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
typedef struct DecryptionData {
|
||||
// TODO(rfrias): refactor to print out the decryption test names
|
||||
struct SubSampleInfo {
|
||||
bool retrieve_key;
|
||||
size_t num_of_subsamples;
|
||||
bool is_encrypted;
|
||||
bool is_secure;
|
||||
wvcdm::KeyId key_id;
|
||||
std::vector<uint8_t> encrypt_data;
|
||||
std::vector<uint8_t> decrypt_data;
|
||||
std::vector<uint8_t> iv;
|
||||
size_t block_offset;
|
||||
std::vector<uint8_t> decrypt_data;
|
||||
} DecryptionData;
|
||||
};
|
||||
|
||||
SubSampleInfo clear_sub_sample = {
|
||||
true, 1, false, false, wvcdm::a2bs_hex("E02562E04CD55351B14B3D748D36ED8E"),
|
||||
wvcdm::a2b_hex(
|
||||
"9da401105ab8da443e93e6fe089dfc69e00a9a51690d406872f338c5fa7dd3d5"
|
||||
"abf8dfd660aaff3e327850a56eedf707c03e2d1a00f9f0371e3e19ea32b13267"
|
||||
"7bc083ccbb83e6d9c03794ee97f50081221a8e5eb123f6dfa895e7a971166483"
|
||||
"cdadd61cd8d0f859501e750e9d356d57252ecd9f7388459f5470de9d92198c44"
|
||||
"0b520055b3b9a1c6b2c9d21e78dce99622d9d031fc7dee28a6d1d6dfb81502eb"
|
||||
"463c4c189555f496d9aa529b3f5522e9f46dcf70b2bfe8df47daf02b6a267f93"
|
||||
"f80d871786eb4bd7f08f9c52079c034a9534d885ba4c00cbe2234cfbb5205a56"
|
||||
"41dd760f83d0f09f27881ad490efa8b99b7ab24b34311a2e8416b1a80d736ad7"),
|
||||
wvcdm::a2b_hex(
|
||||
"9da401105ab8da443e93e6fe089dfc69e00a9a51690d406872f338c5fa7dd3d5"
|
||||
"abf8dfd660aaff3e327850a56eedf707c03e2d1a00f9f0371e3e19ea32b13267"
|
||||
"7bc083ccbb83e6d9c03794ee97f50081221a8e5eb123f6dfa895e7a971166483"
|
||||
"cdadd61cd8d0f859501e750e9d356d57252ecd9f7388459f5470de9d92198c44"
|
||||
"0b520055b3b9a1c6b2c9d21e78dce99622d9d031fc7dee28a6d1d6dfb81502eb"
|
||||
"463c4c189555f496d9aa529b3f5522e9f46dcf70b2bfe8df47daf02b6a267f93"
|
||||
"f80d871786eb4bd7f08f9c52079c034a9534d885ba4c00cbe2234cfbb5205a56"
|
||||
"41dd760f83d0f09f27881ad490efa8b99b7ab24b34311a2e8416b1a80d736ad7"),
|
||||
wvcdm::a2b_hex("50a6c61c3f7c2b37e72b0c047000dd4a"), 0};
|
||||
|
||||
SubSampleInfo clear_sub_sample_no_key = {
|
||||
false, 1, false, false, wvcdm::a2bs_hex("77777777777777777777777777777777"),
|
||||
wvcdm::a2b_hex(
|
||||
"9da401105ab8da443e93e6fe089dfc69e00a9a51690d406872f338c5fa7dd3d5"
|
||||
"abf8dfd660aaff3e327850a56eedf707c03e2d1a00f9f0371e3e19ea32b13267"
|
||||
"7bc083ccbb83e6d9c03794ee97f50081221a8e5eb123f6dfa895e7a971166483"
|
||||
"cdadd61cd8d0f859501e750e9d356d57252ecd9f7388459f5470de9d92198c44"
|
||||
"0b520055b3b9a1c6b2c9d21e78dce99622d9d031fc7dee28a6d1d6dfb81502eb"
|
||||
"463c4c189555f496d9aa529b3f5522e9f46dcf70b2bfe8df47daf02b6a267f93"
|
||||
"f80d871786eb4bd7f08f9c52079c034a9534d885ba4c00cbe2234cfbb5205a56"
|
||||
"41dd760f83d0f09f27881ad490efa8b99b7ab24b34311a2e8416b1a80d736ad7"),
|
||||
wvcdm::a2b_hex(
|
||||
"9da401105ab8da443e93e6fe089dfc69e00a9a51690d406872f338c5fa7dd3d5"
|
||||
"abf8dfd660aaff3e327850a56eedf707c03e2d1a00f9f0371e3e19ea32b13267"
|
||||
"7bc083ccbb83e6d9c03794ee97f50081221a8e5eb123f6dfa895e7a971166483"
|
||||
"cdadd61cd8d0f859501e750e9d356d57252ecd9f7388459f5470de9d92198c44"
|
||||
"0b520055b3b9a1c6b2c9d21e78dce99622d9d031fc7dee28a6d1d6dfb81502eb"
|
||||
"463c4c189555f496d9aa529b3f5522e9f46dcf70b2bfe8df47daf02b6a267f93"
|
||||
"f80d871786eb4bd7f08f9c52079c034a9534d885ba4c00cbe2234cfbb5205a56"
|
||||
"41dd760f83d0f09f27881ad490efa8b99b7ab24b34311a2e8416b1a80d736ad7"),
|
||||
wvcdm::a2b_hex("50a6c61c3f7c2b37e72b0c047000dd4a"), 0};
|
||||
|
||||
SubSampleInfo single_encrypted_sub_sample = {
|
||||
// key 1, encrypted, 256b
|
||||
true, 1, true, false, wvcdm::a2bs_hex("E02562E04CD55351B14B3D748D36ED8E"),
|
||||
wvcdm::a2b_hex(
|
||||
"3b2cbde084973539329bd5656da22d20396249bf4a18a51c38c4743360cc9fea"
|
||||
"a1c78d53de1bd7e14dc5d256fd20a57178a98b83804258c239acd7aa38f2d7d2"
|
||||
"eca614965b3d22049e19e236fc1800e60965d8b36415677bf2f843d50a6943c4"
|
||||
"683c07c114a32f5e5fbc9939c483c3a1b2ecd3d82b554d649798866191724283"
|
||||
"f0ab082eba2da79aaca5c4eaf186f9ee9a0c568f621f705a578f30e4e2ef7b96"
|
||||
"5e14cc046ce6dbf272ee5558b098f332333e95fc879dea6c29bf34acdb649650"
|
||||
"f08201b9e649960f2493fd7677cc3abf5ae70e5445845c947ba544456b431646"
|
||||
"d95a133bff5f57614dda5e4446cd8837901d074149dadf4b775b5b07bb88ca20"),
|
||||
wvcdm::a2b_hex(
|
||||
"5a36c0b633b58faf22156d78fdfb608e54a8095788b2b0463ef78d030b4abf82"
|
||||
"eff34b8d9b7b6352e7d72de991b599662aa475da355033620152e2356ebfadee"
|
||||
"06172be9e1058fa177e223b9fdd191380cff53c3ea810c6fd852a1df4967b799"
|
||||
"415179a2276ec388ef763bab89605b9c6952c28dc8d6bf86b03fabbb46b392a3"
|
||||
"1dad15be602eeeeabb45070b3e25d6bb0217073b1fc44c9fe848594121fd6a91"
|
||||
"304d605e21f69615e1b57db18312b6b948725724b74e91d8aea7371e99532469"
|
||||
"1b358bdee873f1936b63efe83d190a53c2d21754d302d63ff285174023473755"
|
||||
"58b938c2e3ca4c2ce48942da97f9e45797f2c074ac6004734e93784a48af6160"),
|
||||
wvcdm::a2b_hex("4cca615fc013102892f91efee936639b"), 0};
|
||||
|
||||
SubSampleInfo switch_key_encrypted_sub_sample[2] = {
|
||||
// block 0, key 1, encrypted, 256b
|
||||
{true, 2, true, false, wvcdm::a2bs_hex("E02562E04CD55351B14B3D748D36ED8E"),
|
||||
wvcdm::a2b_hex(
|
||||
"3b2cbde084973539329bd5656da22d20396249bf4a18a51c38c4743360cc9fea"
|
||||
"a1c78d53de1bd7e14dc5d256fd20a57178a98b83804258c239acd7aa38f2d7d2"
|
||||
"eca614965b3d22049e19e236fc1800e60965d8b36415677bf2f843d50a6943c4"
|
||||
"683c07c114a32f5e5fbc9939c483c3a1b2ecd3d82b554d649798866191724283"
|
||||
"f0ab082eba2da79aaca5c4eaf186f9ee9a0c568f621f705a578f30e4e2ef7b96"
|
||||
"5e14cc046ce6dbf272ee5558b098f332333e95fc879dea6c29bf34acdb649650"
|
||||
"f08201b9e649960f2493fd7677cc3abf5ae70e5445845c947ba544456b431646"
|
||||
"d95a133bff5f57614dda5e4446cd8837901d074149dadf4b775b5b07bb88ca20"),
|
||||
wvcdm::a2b_hex(
|
||||
"5a36c0b633b58faf22156d78fdfb608e54a8095788b2b0463ef78d030b4abf82"
|
||||
"eff34b8d9b7b6352e7d72de991b599662aa475da355033620152e2356ebfadee"
|
||||
"06172be9e1058fa177e223b9fdd191380cff53c3ea810c6fd852a1df4967b799"
|
||||
"415179a2276ec388ef763bab89605b9c6952c28dc8d6bf86b03fabbb46b392a3"
|
||||
"1dad15be602eeeeabb45070b3e25d6bb0217073b1fc44c9fe848594121fd6a91"
|
||||
"304d605e21f69615e1b57db18312b6b948725724b74e91d8aea7371e99532469"
|
||||
"1b358bdee873f1936b63efe83d190a53c2d21754d302d63ff285174023473755"
|
||||
"58b938c2e3ca4c2ce48942da97f9e45797f2c074ac6004734e93784a48af6160"),
|
||||
wvcdm::a2b_hex("4cca615fc013102892f91efee936639b"), 0},
|
||||
// block 1, key 3, encrypted, 256b
|
||||
{true, 2, true, false, wvcdm::a2bs_hex("0065901A64A25899A5193664ABF9AF62"),
|
||||
wvcdm::a2b_hex(
|
||||
"337f294addb4c16d1015fd839e80314472432eda503bd0529422318bec7d2b34"
|
||||
"2b28d24b2c0bf999fd31711901a2b90e03373cb9553ffd4b2e6e655b80a39fe8"
|
||||
"61718220948f0031a37fe277f943409d09c83ff1c19fe8d601f5b4d139821750"
|
||||
"47170006db5f38cb84706a9beeaa455fca3b17d8de90c143eb36aaaac3f4670a"
|
||||
"7194064f4d59996c95992a3e6a848d4da8adddae3ad03c8d28110fda3e5c1d0a"
|
||||
"35d175c816481275a02d2da96c7fc313864ae076f03887309cdf00ca856bad28"
|
||||
"2146141964b7f7972e9b253b1fbed6d74ffedcfc51bb91fa78a602479b0b757f"
|
||||
"53a16cca15c381a4eab3034ee38e12280982d575fe3de23dd65cf8ba240daa88"),
|
||||
wvcdm::a2b_hex(
|
||||
"c397c1c9bc6782cd859e92f7158e3ff2a54ee984869582b942b400c22ebb6843"
|
||||
"7c50f999f73831fa12040f6aab607f57280189ff1db1ab1d0046ffaa55ce1790"
|
||||
"3baf0f9c983351b2ff15cc4f61f0f8db6922804e74a207e1e5baaeca67b427c7"
|
||||
"2dd7883ee8232041a9c4e56ccfb8bdc3016602c73fa8944e734ee34c41cf1a17"
|
||||
"b009b404fd924d23dfee1f494b5e374c9e87c2910de36826044bff89939a70d2"
|
||||
"47ff1a8a0baa7643026b8d9442fda69dde6802816ddd4b6e3b18f0a95e788d6d"
|
||||
"166ed7435ef663ef019b4438d3e203734eb95d68758e028f29cd623f35cde4bd"
|
||||
"edfea33ade378a92a356020bcf3fbba01c9ab16ad448ce6ebe708f768c6676a7"),
|
||||
wvcdm::a2b_hex("6d4ee851e563b951119cd33c52aadbf5"), 0}};
|
||||
|
||||
SubSampleInfo partial_single_encrypted_sub_sample = {
|
||||
// key 3, encrypted, 125b, offset 0
|
||||
true, 1, true, false, wvcdm::a2bs_hex("0065901A64A25899A5193664ABF9AF62"),
|
||||
wvcdm::a2b_hex(
|
||||
"337f294addb4c16d1015fd839e80314472432eda503bd0529422318bec7d2b34"
|
||||
"2b28d24b2c0bf999fd31711901a2b90e03373cb9553ffd4b2e6e655b80a39fe8"
|
||||
"61718220948f0031a37fe277f943409d09c83ff1c19fe8d601f5b4d139821750"
|
||||
"47170006db5f38cb84706a9beeaa455fca3b17d8de90c143eb36aaaac3"),
|
||||
wvcdm::a2b_hex(
|
||||
"c397c1c9bc6782cd859e92f7158e3ff2a54ee984869582b942b400c22ebb6843"
|
||||
"7c50f999f73831fa12040f6aab607f57280189ff1db1ab1d0046ffaa55ce1790"
|
||||
"3baf0f9c983351b2ff15cc4f61f0f8db6922804e74a207e1e5baaeca67b427c7"
|
||||
"2dd7883ee8232041a9c4e56ccfb8bdc3016602c73fa8944e734ee34c41"),
|
||||
wvcdm::a2b_hex("6d4ee851e563b951119cd33c52aadbf5"), 0};
|
||||
|
||||
SubSampleInfo partial_offset_single_encrypted_sub_sample = {
|
||||
// key 3, encrypted, 123b, offset 5
|
||||
true, 1, true, false, wvcdm::a2bs_hex("0065901A64A25899A5193664ABF9AF62"),
|
||||
wvcdm::a2b_hex(
|
||||
"97f39b919ba56f3c3a51ecdcd7318bc130f054320c74db3990f925"
|
||||
"054734c03ec79ee0da68938dc4f8c2d91e46ec2342ef24f9328294a9475f7ead"
|
||||
"8ad3e71db62d6328e826e4ab375f4796aa2bc8b9266551e3007fb3c253780293"
|
||||
"31fbc32ed29afcb9e7152cf072712c5a22c6b52d60e381eb53eeb58d36528746"),
|
||||
wvcdm::a2b_hex(
|
||||
"d36911b44f470ff05d152a7bc69ea6b68aa812cd3676964acb4597"
|
||||
"b518fe4b7ec0fe44469b1e4f8806922af9ac998d3e23349cea0e68f833564c15"
|
||||
"e49584f94ef16b7ab6cd2d0b152430f1fb4d7644a0f591980388ac02012d3d42"
|
||||
"73d6c9604517b1a622b66b8f4e8414e40b00351cc9859061bde810190c7b5df8"),
|
||||
wvcdm::a2b_hex("43ba341482212c70f79d81c0f4faef8a"), 5};
|
||||
|
||||
} // namespace
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
class TestWvCdmEventListener : public WvCdmEventListener {
|
||||
public:
|
||||
@@ -183,6 +332,10 @@ class WvCdmRequestLicenseTest : public testing::Test {
|
||||
CdmKeySetId key_set_id_;
|
||||
};
|
||||
|
||||
class WvCdmDecryptionTest
|
||||
: public WvCdmRequestLicenseTest,
|
||||
public ::testing::WithParamInterface<SubSampleInfo*> {};
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, ProvisioningTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
std::string provisioning_server_url;
|
||||
@@ -430,294 +583,37 @@ TEST_F(WvCdmRequestLicenseTest, QueryKeyControlInfo) {
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, ClearDecryptionTest) {
|
||||
TEST_P(WvCdmDecryptionTest, DecryptionTest) {
|
||||
SubSampleInfo* data = GetParam();
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
if (data->retrieve_key) {
|
||||
GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
}
|
||||
|
||||
// key 1, clear, 256b
|
||||
DecryptionData data;
|
||||
data.is_encrypted = false;
|
||||
data.is_secure = false;
|
||||
data.key_id = wvcdm::a2bs_hex("E02562E04CD55351B14B3D748D36ED8E");
|
||||
data.encrypt_data = wvcdm::a2b_hex(
|
||||
"9da401105ab8da443e93e6fe089dfc69e00a9a51690d406872f338c5fa7dd3d5"
|
||||
"abf8dfd660aaff3e327850a56eedf707c03e2d1a00f9f0371e3e19ea32b13267"
|
||||
"7bc083ccbb83e6d9c03794ee97f50081221a8e5eb123f6dfa895e7a971166483"
|
||||
"cdadd61cd8d0f859501e750e9d356d57252ecd9f7388459f5470de9d92198c44"
|
||||
"0b520055b3b9a1c6b2c9d21e78dce99622d9d031fc7dee28a6d1d6dfb81502eb"
|
||||
"463c4c189555f496d9aa529b3f5522e9f46dcf70b2bfe8df47daf02b6a267f93"
|
||||
"f80d871786eb4bd7f08f9c52079c034a9534d885ba4c00cbe2234cfbb5205a56"
|
||||
"41dd760f83d0f09f27881ad490efa8b99b7ab24b34311a2e8416b1a80d736ad7");
|
||||
data.iv = wvcdm::a2b_hex("50a6c61c3f7c2b37e72b0c047000dd4a");
|
||||
data.block_offset = 0;
|
||||
data.decrypt_data = wvcdm::a2b_hex(
|
||||
"9da401105ab8da443e93e6fe089dfc69e00a9a51690d406872f338c5fa7dd3d5"
|
||||
"abf8dfd660aaff3e327850a56eedf707c03e2d1a00f9f0371e3e19ea32b13267"
|
||||
"7bc083ccbb83e6d9c03794ee97f50081221a8e5eb123f6dfa895e7a971166483"
|
||||
"cdadd61cd8d0f859501e750e9d356d57252ecd9f7388459f5470de9d92198c44"
|
||||
"0b520055b3b9a1c6b2c9d21e78dce99622d9d031fc7dee28a6d1d6dfb81502eb"
|
||||
"463c4c189555f496d9aa529b3f5522e9f46dcf70b2bfe8df47daf02b6a267f93"
|
||||
"f80d871786eb4bd7f08f9c52079c034a9534d885ba4c00cbe2234cfbb5205a56"
|
||||
"41dd760f83d0f09f27881ad490efa8b99b7ab24b34311a2e8416b1a80d736ad7");
|
||||
for (size_t i = 0; i < data->num_of_subsamples; i++) {
|
||||
std::vector<uint8_t> decrypt_buffer((data + i)->encrypt_data.size());
|
||||
CdmDecryptionParameters decryption_parameters(
|
||||
&(data + i)->key_id, &(data + i)->encrypt_data.front(),
|
||||
(data + i)->encrypt_data.size(), &(data + i)->iv,
|
||||
(data + i)->block_offset, &decrypt_buffer[0]);
|
||||
decryption_parameters.is_encrypted = (data + i)->is_encrypted;
|
||||
decryption_parameters.is_secure = (data + i)->is_secure;
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_, decryption_parameters));
|
||||
|
||||
std::vector<uint8_t> decrypt_buffer;
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_.Decrypt(session_id_, data.is_encrypted, data.is_secure,
|
||||
data.key_id, &data.encrypt_data.front(),
|
||||
encrypt_length, data.iv, data.block_offset,
|
||||
&decrypt_buffer.front(), 0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, ClearDecryptionNoKeyTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
|
||||
// key 1, clear, 256b
|
||||
DecryptionData data;
|
||||
data.is_encrypted = false;
|
||||
data.is_secure = false;
|
||||
data.key_id = wvcdm::a2bs_hex("77777777777777777777777777777777");
|
||||
data.encrypt_data = wvcdm::a2b_hex(
|
||||
"9da401105ab8da443e93e6fe089dfc69e00a9a51690d406872f338c5fa7dd3d5"
|
||||
"abf8dfd660aaff3e327850a56eedf707c03e2d1a00f9f0371e3e19ea32b13267"
|
||||
"7bc083ccbb83e6d9c03794ee97f50081221a8e5eb123f6dfa895e7a971166483"
|
||||
"cdadd61cd8d0f859501e750e9d356d57252ecd9f7388459f5470de9d92198c44"
|
||||
"0b520055b3b9a1c6b2c9d21e78dce99622d9d031fc7dee28a6d1d6dfb81502eb"
|
||||
"463c4c189555f496d9aa529b3f5522e9f46dcf70b2bfe8df47daf02b6a267f93"
|
||||
"f80d871786eb4bd7f08f9c52079c034a9534d885ba4c00cbe2234cfbb5205a56"
|
||||
"41dd760f83d0f09f27881ad490efa8b99b7ab24b34311a2e8416b1a80d736ad7");
|
||||
data.iv = wvcdm::a2b_hex("50a6c61c3f7c2b37e72b0c047000dd4a");
|
||||
data.block_offset = 0;
|
||||
data.decrypt_data = wvcdm::a2b_hex(
|
||||
"9da401105ab8da443e93e6fe089dfc69e00a9a51690d406872f338c5fa7dd3d5"
|
||||
"abf8dfd660aaff3e327850a56eedf707c03e2d1a00f9f0371e3e19ea32b13267"
|
||||
"7bc083ccbb83e6d9c03794ee97f50081221a8e5eb123f6dfa895e7a971166483"
|
||||
"cdadd61cd8d0f859501e750e9d356d57252ecd9f7388459f5470de9d92198c44"
|
||||
"0b520055b3b9a1c6b2c9d21e78dce99622d9d031fc7dee28a6d1d6dfb81502eb"
|
||||
"463c4c189555f496d9aa529b3f5522e9f46dcf70b2bfe8df47daf02b6a267f93"
|
||||
"f80d871786eb4bd7f08f9c52079c034a9534d885ba4c00cbe2234cfbb5205a56"
|
||||
"41dd760f83d0f09f27881ad490efa8b99b7ab24b34311a2e8416b1a80d736ad7");
|
||||
|
||||
std::vector<uint8_t> decrypt_buffer;
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_.Decrypt(session_id_, data.is_encrypted, data.is_secure,
|
||||
data.key_id, &data.encrypt_data.front(),
|
||||
encrypt_length, data.iv, data.block_offset,
|
||||
&decrypt_buffer.front(), 0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, DecryptionTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
|
||||
// key 1, encrypted, 256b
|
||||
DecryptionData data;
|
||||
data.is_encrypted = true;
|
||||
data.is_secure = false;
|
||||
data.key_id = wvcdm::a2bs_hex("E02562E04CD55351B14B3D748D36ED8E");
|
||||
data.encrypt_data = wvcdm::a2b_hex(
|
||||
"3b2cbde084973539329bd5656da22d20396249bf4a18a51c38c4743360cc9fea"
|
||||
"a1c78d53de1bd7e14dc5d256fd20a57178a98b83804258c239acd7aa38f2d7d2"
|
||||
"eca614965b3d22049e19e236fc1800e60965d8b36415677bf2f843d50a6943c4"
|
||||
"683c07c114a32f5e5fbc9939c483c3a1b2ecd3d82b554d649798866191724283"
|
||||
"f0ab082eba2da79aaca5c4eaf186f9ee9a0c568f621f705a578f30e4e2ef7b96"
|
||||
"5e14cc046ce6dbf272ee5558b098f332333e95fc879dea6c29bf34acdb649650"
|
||||
"f08201b9e649960f2493fd7677cc3abf5ae70e5445845c947ba544456b431646"
|
||||
"d95a133bff5f57614dda5e4446cd8837901d074149dadf4b775b5b07bb88ca20");
|
||||
data.iv = wvcdm::a2b_hex("4cca615fc013102892f91efee936639b");
|
||||
data.block_offset = 0;
|
||||
data.decrypt_data = wvcdm::a2b_hex(
|
||||
"5a36c0b633b58faf22156d78fdfb608e54a8095788b2b0463ef78d030b4abf82"
|
||||
"eff34b8d9b7b6352e7d72de991b599662aa475da355033620152e2356ebfadee"
|
||||
"06172be9e1058fa177e223b9fdd191380cff53c3ea810c6fd852a1df4967b799"
|
||||
"415179a2276ec388ef763bab89605b9c6952c28dc8d6bf86b03fabbb46b392a3"
|
||||
"1dad15be602eeeeabb45070b3e25d6bb0217073b1fc44c9fe848594121fd6a91"
|
||||
"304d605e21f69615e1b57db18312b6b948725724b74e91d8aea7371e99532469"
|
||||
"1b358bdee873f1936b63efe83d190a53c2d21754d302d63ff285174023473755"
|
||||
"58b938c2e3ca4c2ce48942da97f9e45797f2c074ac6004734e93784a48af6160");
|
||||
|
||||
std::vector<uint8_t> decrypt_buffer;
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_.Decrypt(session_id_, data.is_encrypted, data.is_secure,
|
||||
data.key_id, &data.encrypt_data.front(),
|
||||
encrypt_length, data.iv, data.block_offset,
|
||||
&decrypt_buffer.front(), 0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, SwitchKeyDecryptionTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
|
||||
uint8_t data_blocks = 2;
|
||||
DecryptionData data[data_blocks];
|
||||
|
||||
// block 0, key 1, encrypted, 256b
|
||||
data[0].is_encrypted = true;
|
||||
data[0].is_secure = false;
|
||||
data[0].key_id = wvcdm::a2bs_hex("E02562E04CD55351B14B3D748D36ED8E");
|
||||
data[0].encrypt_data = wvcdm::a2b_hex(
|
||||
"3b2cbde084973539329bd5656da22d20396249bf4a18a51c38c4743360cc9fea"
|
||||
"a1c78d53de1bd7e14dc5d256fd20a57178a98b83804258c239acd7aa38f2d7d2"
|
||||
"eca614965b3d22049e19e236fc1800e60965d8b36415677bf2f843d50a6943c4"
|
||||
"683c07c114a32f5e5fbc9939c483c3a1b2ecd3d82b554d649798866191724283"
|
||||
"f0ab082eba2da79aaca5c4eaf186f9ee9a0c568f621f705a578f30e4e2ef7b96"
|
||||
"5e14cc046ce6dbf272ee5558b098f332333e95fc879dea6c29bf34acdb649650"
|
||||
"f08201b9e649960f2493fd7677cc3abf5ae70e5445845c947ba544456b431646"
|
||||
"d95a133bff5f57614dda5e4446cd8837901d074149dadf4b775b5b07bb88ca20");
|
||||
data[0].iv = wvcdm::a2b_hex("4cca615fc013102892f91efee936639b");
|
||||
data[0].block_offset = 0;
|
||||
data[0].decrypt_data = wvcdm::a2b_hex(
|
||||
"5a36c0b633b58faf22156d78fdfb608e54a8095788b2b0463ef78d030b4abf82"
|
||||
"eff34b8d9b7b6352e7d72de991b599662aa475da355033620152e2356ebfadee"
|
||||
"06172be9e1058fa177e223b9fdd191380cff53c3ea810c6fd852a1df4967b799"
|
||||
"415179a2276ec388ef763bab89605b9c6952c28dc8d6bf86b03fabbb46b392a3"
|
||||
"1dad15be602eeeeabb45070b3e25d6bb0217073b1fc44c9fe848594121fd6a91"
|
||||
"304d605e21f69615e1b57db18312b6b948725724b74e91d8aea7371e99532469"
|
||||
"1b358bdee873f1936b63efe83d190a53c2d21754d302d63ff285174023473755"
|
||||
"58b938c2e3ca4c2ce48942da97f9e45797f2c074ac6004734e93784a48af6160");
|
||||
|
||||
// block 1, key 3, encrypted, 256b
|
||||
data[1].is_encrypted = true;
|
||||
data[1].is_secure = false;
|
||||
data[1].key_id = wvcdm::a2bs_hex("0065901A64A25899A5193664ABF9AF62");
|
||||
data[1].encrypt_data = wvcdm::a2b_hex(
|
||||
"337f294addb4c16d1015fd839e80314472432eda503bd0529422318bec7d2b34"
|
||||
"2b28d24b2c0bf999fd31711901a2b90e03373cb9553ffd4b2e6e655b80a39fe8"
|
||||
"61718220948f0031a37fe277f943409d09c83ff1c19fe8d601f5b4d139821750"
|
||||
"47170006db5f38cb84706a9beeaa455fca3b17d8de90c143eb36aaaac3f4670a"
|
||||
"7194064f4d59996c95992a3e6a848d4da8adddae3ad03c8d28110fda3e5c1d0a"
|
||||
"35d175c816481275a02d2da96c7fc313864ae076f03887309cdf00ca856bad28"
|
||||
"2146141964b7f7972e9b253b1fbed6d74ffedcfc51bb91fa78a602479b0b757f"
|
||||
"53a16cca15c381a4eab3034ee38e12280982d575fe3de23dd65cf8ba240daa88");
|
||||
data[1].iv = wvcdm::a2b_hex("6d4ee851e563b951119cd33c52aadbf5");
|
||||
data[1].block_offset = 0;
|
||||
data[1].decrypt_data = wvcdm::a2b_hex(
|
||||
"c397c1c9bc6782cd859e92f7158e3ff2a54ee984869582b942b400c22ebb6843"
|
||||
"7c50f999f73831fa12040f6aab607f57280189ff1db1ab1d0046ffaa55ce1790"
|
||||
"3baf0f9c983351b2ff15cc4f61f0f8db6922804e74a207e1e5baaeca67b427c7"
|
||||
"2dd7883ee8232041a9c4e56ccfb8bdc3016602c73fa8944e734ee34c41cf1a17"
|
||||
"b009b404fd924d23dfee1f494b5e374c9e87c2910de36826044bff89939a70d2"
|
||||
"47ff1a8a0baa7643026b8d9442fda69dde6802816ddd4b6e3b18f0a95e788d6d"
|
||||
"166ed7435ef663ef019b4438d3e203734eb95d68758e028f29cd623f35cde4bd"
|
||||
"edfea33ade378a92a356020bcf3fbba01c9ab16ad448ce6ebe708f768c6676a7");
|
||||
std::vector<uint8_t> decrypt_buffer;
|
||||
|
||||
for (int i = 0; i < data_blocks; ++i) {
|
||||
size_t encrypt_length = data[i].encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.Decrypt(session_id_, data[i].is_encrypted, data[i].is_secure,
|
||||
data[i].key_id, &data[i].encrypt_data.front(),
|
||||
encrypt_length, data[i].iv, data[i].block_offset,
|
||||
&decrypt_buffer.front(), 0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data[i].decrypt_data.begin(),
|
||||
data[i].decrypt_data.end(), decrypt_buffer.begin()));
|
||||
EXPECT_TRUE(std::equal((data + i)->decrypt_data.begin(),
|
||||
(data + i)->decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
}
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, PartialBlockDecryptionTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
|
||||
// key 3, encrypted, 125b, offset 0
|
||||
DecryptionData data;
|
||||
data.is_encrypted = true;
|
||||
data.is_secure = false;
|
||||
data.key_id = wvcdm::a2bs_hex("0065901A64A25899A5193664ABF9AF62");
|
||||
data.encrypt_data = wvcdm::a2b_hex(
|
||||
"337f294addb4c16d1015fd839e80314472432eda503bd0529422318bec7d2b34"
|
||||
"2b28d24b2c0bf999fd31711901a2b90e03373cb9553ffd4b2e6e655b80a39fe8"
|
||||
"61718220948f0031a37fe277f943409d09c83ff1c19fe8d601f5b4d139821750"
|
||||
"47170006db5f38cb84706a9beeaa455fca3b17d8de90c143eb36aaaac3");
|
||||
data.iv = wvcdm::a2b_hex("6d4ee851e563b951119cd33c52aadbf5");
|
||||
data.block_offset = 0;
|
||||
data.decrypt_data = wvcdm::a2b_hex(
|
||||
"c397c1c9bc6782cd859e92f7158e3ff2a54ee984869582b942b400c22ebb6843"
|
||||
"7c50f999f73831fa12040f6aab607f57280189ff1db1ab1d0046ffaa55ce1790"
|
||||
"3baf0f9c983351b2ff15cc4f61f0f8db6922804e74a207e1e5baaeca67b427c7"
|
||||
"2dd7883ee8232041a9c4e56ccfb8bdc3016602c73fa8944e734ee34c41");
|
||||
|
||||
std::vector<uint8_t> decrypt_buffer;
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_.Decrypt(session_id_, data.is_encrypted, data.is_secure,
|
||||
data.key_id, &data.encrypt_data.front(),
|
||||
encrypt_length, data.iv, data.block_offset,
|
||||
&decrypt_buffer.front(), 0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, PartialBlockWithOffsetDecryptionTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
|
||||
// key 3, encrypted, 123b, offset 5
|
||||
DecryptionData data;
|
||||
data.is_encrypted = true;
|
||||
data.is_secure = false;
|
||||
data.key_id = wvcdm::a2bs_hex("0065901A64A25899A5193664ABF9AF62");
|
||||
data.encrypt_data = wvcdm::a2b_hex(
|
||||
"97f39b919ba56f3c3a51ecdcd7318bc130f054320c74db3990f925"
|
||||
"054734c03ec79ee0da68938dc4f8c2d91e46ec2342ef24f9328294a9475f7ead"
|
||||
"8ad3e71db62d6328e826e4ab375f4796aa2bc8b9266551e3007fb3c253780293"
|
||||
"31fbc32ed29afcb9e7152cf072712c5a22c6b52d60e381eb53eeb58d36528746");
|
||||
data.iv = wvcdm::a2b_hex("43ba341482212c70f79d81c0f4faef8a");
|
||||
data.block_offset = 5;
|
||||
data.decrypt_data = wvcdm::a2b_hex(
|
||||
"d36911b44f470ff05d152a7bc69ea6b68aa812cd3676964acb4597"
|
||||
"b518fe4b7ec0fe44469b1e4f8806922af9ac998d3e23349cea0e68f833564c15"
|
||||
"e49584f94ef16b7ab6cd2d0b152430f1fb4d7644a0f591980388ac02012d3d42"
|
||||
"73d6c9604517b1a622b66b8f4e8414e40b00351cc9859061bde810190c7b5df8");
|
||||
|
||||
std::vector<uint8_t> decrypt_buffer;
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_.Decrypt(session_id_, data.is_encrypted, data.is_secure,
|
||||
data.key_id, &data.encrypt_data.front(),
|
||||
encrypt_length, data.iv, data.block_offset,
|
||||
&decrypt_buffer.front(), 0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
INSTANTIATE_TEST_CASE_P(
|
||||
Cdm, WvCdmDecryptionTest,
|
||||
::testing::Values(&clear_sub_sample, &clear_sub_sample_no_key,
|
||||
&single_encrypted_sub_sample,
|
||||
&switch_key_encrypted_sub_sample[0],
|
||||
&partial_single_encrypted_sub_sample));
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, DISABLED_OfflineLicenseDecryptionTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
|
||||
Reference in New Issue
Block a user