Merge cdm changes to android repo
Bug: 251924225 Test: GtsMediaTestCases Change-Id: I1b4e64c0abf701fe1f5017f14dc72b72c3ea6770
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user