Merge cdm changes to android repo

Bug: 251924225
Test: GtsMediaTestCases
Change-Id: I1b4e64c0abf701fe1f5017f14dc72b72c3ea6770
This commit is contained in:
Kyle Zhang
2022-10-07 23:55:37 +00:00
parent 3cfe7c7299
commit af0168dbed
54 changed files with 295536 additions and 294359 deletions

View File

@@ -22,6 +22,7 @@
#include <algorithm>
#include <iostream>
#include <memory>
#include <mutex>
#include <string>
#include <vector>
@@ -249,6 +250,24 @@ RoundTrip<CoreRequest, PrepAndSignRequest, CoreResponse, ResponseData>::
return result;
}
template <class CoreRequest, PrepAndSignRequest_t PrepAndSignRequest,
class CoreResponse, class ResponseData>
void RoundTrip<CoreRequest, PrepAndSignRequest, CoreResponse,
ResponseData>::SetEncryptAndSignResponseLengths() {
encrypted_response_length_ = encrypted_response_.size();
response_signature_length_ = response_signature_.size();
}
template <class CoreRequest, PrepAndSignRequest_t PrepAndSignRequest,
class CoreResponse, class ResponseData>
void RoundTrip<CoreRequest, PrepAndSignRequest, CoreResponse,
ResponseData>::VerifyEncryptAndSignResponseLengths() const {
EXPECT_NE(encrypted_response_length_, 0u);
EXPECT_EQ(encrypted_response_length_, encrypted_response_.size());
EXPECT_NE(response_signature_length_, 0u);
EXPECT_EQ(response_signature_length_, response_signature_.size());
}
template <PrepAndSignRequest_t PrepAndSignRequest>
void GetDefaultRequestSignatureAndCoreMessageLengths(
uint32_t& session_id, const size_t& small_size,
@@ -436,6 +455,7 @@ void ProvisioningRoundTrip::SignResponse() {
session()->key_deriver().ServerSignBuffer(encrypted_response_.data(),
encrypted_response_.size(),
&response_signature_);
SetEncryptAndSignResponseLengths();
}
void ProvisioningRoundTrip::InjectFuzzedResponseData(const uint8_t* data,
@@ -519,12 +539,14 @@ OEMCryptoResult ProvisioningRoundTrip::LoadResponseNoRetry(
Session* session, size_t* wrapped_key_length) {
EXPECT_NE(session, nullptr);
if (global_features.api_version >= kCoreMessagesAPI) {
VerifyEncryptAndSignResponseLengths();
return OEMCrypto_LoadProvisioning(
session->session_id(), encrypted_response_.data(),
encrypted_response_.size(), serialized_core_message_.size(),
response_signature_.data(), response_signature_.size(),
wrapped_rsa_key_.data(), wrapped_key_length);
} else if (global_features.provisioning_method == OEMCrypto_Keybox) {
VerifyEncryptAndSignResponseLengths();
return OEMCrypto_RewrapDeviceRSAKey_V15(
session->session_id(), encrypted_response_.data(),
encrypted_response_.size(), response_signature_.data(),
@@ -859,6 +881,7 @@ void LicenseRoundTrip::SignEncryptedResponse() {
session()->key_deriver().ServerSignBuffer(encrypted_response_.data(),
encrypted_response_.size(),
&response_signature_);
SetEncryptAndSignResponseLengths();
}
void LicenseRoundTrip::EncryptAndSignResponse() {
@@ -909,6 +932,7 @@ OEMCryptoResult LicenseRoundTrip::LoadResponse(Session* session,
// garbage. Since the memory after the message buffer is an exact copy of the
// message, we can increment the offset by the message size and get valid
// data.
VerifyEncryptAndSignResponseLengths();
std::vector<uint8_t> double_message = encrypted_response_;
double_message.insert(
double_message.end(),
@@ -1075,14 +1099,20 @@ OEMCrypto_Substring EntitledMessage::FindSubstring(const void* ptr,
return substring;
}
void EntitledMessage::LoadKeys(OEMCryptoResult expected_sts) {
void EntitledMessage::LoadKeys(bool expected_success) {
EncryptContentKey();
ASSERT_EQ(expected_sts,
OEMCrypto_LoadEntitledContentKeys(
entitled_key_session_,
reinterpret_cast<const uint8_t*>(entitled_key_data_),
sizeof(entitled_key_data_), num_keys_, entitled_key_array_));
if (expected_sts != OEMCrypto_SUCCESS) {
if (expected_success) {
ASSERT_EQ(OEMCrypto_SUCCESS,
OEMCrypto_LoadEntitledContentKeys(
entitled_key_session_,
reinterpret_cast<const uint8_t*>(entitled_key_data_),
sizeof(entitled_key_data_), num_keys_, entitled_key_array_));
} else {
ASSERT_NE(OEMCrypto_SUCCESS,
OEMCrypto_LoadEntitledContentKeys(
entitled_key_session_,
reinterpret_cast<const uint8_t*>(entitled_key_data_),
sizeof(entitled_key_data_), num_keys_, entitled_key_array_));
return;
}
VerifyKCBs();
@@ -1362,6 +1392,7 @@ void RenewalRoundTrip::EncryptAndSignResponse() {
session()->key_deriver().ServerSignBuffer(encrypted_response_.data(),
encrypted_response_.size(),
&response_signature_);
SetEncryptAndSignResponseLengths();
}
void RenewalRoundTrip::InjectFuzzedResponseData(
@@ -1409,6 +1440,7 @@ OEMCryptoResult RenewalRoundTrip::LoadResponse(Session* session) {
reinterpret_cast<const char*>(&encrypted_response_data_),
sizeof(encrypted_response_data_));
}
VerifyEncryptAndSignResponseLengths();
if (license_messages_->api_version() < kCoreMessagesAPI) {
return OEMCrypto_RefreshKeys(
session->session_id(), encrypted_response_.data(),
@@ -1422,6 +1454,11 @@ OEMCryptoResult RenewalRoundTrip::LoadResponse(Session* session) {
}
}
std::unordered_map<util::EccCurve, std::unique_ptr<util::EccPrivateKey>,
std::hash<int>>
Session::server_ephemeral_keys_;
std::mutex Session::ephemeral_key_map_lock_;
Session::Session() {}
Session::~Session() {
@@ -1798,15 +1835,21 @@ bool Session::GenerateEccSessionKey(vector<uint8_t>* session_key,
cerr << "No public ECC key loaded in test code\n";
return false;
}
auto ephemeral_key = util::EccPrivateKey::New(public_ec_->curve());
if (!ephemeral_key) {
std::unique_lock<std::mutex> lock(Session::ephemeral_key_map_lock_);
const util::EccCurve curve = public_ec_->curve();
if (server_ephemeral_keys_.count(curve) == 0) {
server_ephemeral_keys_[curve] = util::EccPrivateKey::New(curve);
}
if (server_ephemeral_keys_.count(curve) == 0) {
cerr << "Failed to find/create server ECC key for curve "
<< util::EccCurveToString(curve) << std::endl;
return false;
}
*session_key = ephemeral_key->DeriveSessionKey(*public_ec_);
*session_key = server_ephemeral_keys_[curve]->DeriveSessionKey(*public_ec_);
if (session_key->empty()) {
return false;
}
*ecdh_public_key_data = ephemeral_key->SerializeAsPublicKey();
*ecdh_public_key_data = server_ephemeral_keys_[curve]->SerializeAsPublicKey();
if (ecdh_public_key_data->empty()) {
session_key->clear();
return false;