Source release 19.5.0

This commit is contained in:
Cong Lin
2025-04-02 10:27:18 -07:00
parent 4407acee62
commit f7ec4fdeff
295 changed files with 32196 additions and 21748 deletions

View File

@@ -4,6 +4,9 @@
#include "message_dumper.h"
#include <iomanip>
#include "core_message_deserialize.h"
#include "license_request.h"
#include "odk.h"
#include "odk_message.h"
@@ -129,6 +132,65 @@ void MessageDumper::TearDown() {
provision_file.close();
}
void MessageDumper::PrintLicenseRequest(const CdmKeyRequest& request) {
SignedMessage signed_message;
ASSERT_TRUE(signed_message.ParseFromString(request.message));
if (wvoec::global_features.api_version >= wvoec::kCoreMessagesAPI) {
ASSERT_TRUE(signed_message.has_oemcrypto_core_message());
const std::string& core_request = signed_message.oemcrypto_core_message();
oemcrypto_core_message::ODK_LicenseRequest core_request_data;
ASSERT_TRUE(
oemcrypto_core_message::deserialize::CoreLicenseRequestFromMessage(
core_request, &core_request_data));
// Print core message information for the license request.
std::cout << std::endl << "License Request Information:" << std::endl;
std::cout << " License Request Core Version = "
<< core_request_data.api_major_version << "."
<< core_request_data.api_minor_version << std::endl;
std::cout << " Nonce = " << core_request_data.nonce << std::endl;
std::cout << " Session ID = " << core_request_data.session_id << std::endl;
}
}
void MessageDumper::PrintLicenseResponse(const std::string& response) {
SignedMessage signed_response;
ASSERT_TRUE(signed_response.ParseFromString(response));
if (wvoec::global_features.api_version >= wvoec::kCoreMessagesAPI) {
ASSERT_TRUE(signed_response.has_oemcrypto_core_message());
video_widevine::License license;
ASSERT_TRUE(license.ParseFromString(signed_response.msg()));
std::string message =
signed_response.oemcrypto_core_message() + signed_response.msg();
ODK_Message odk_msg = ODK_Message_Create(
reinterpret_cast<uint8_t*>(const_cast<char*>(message.c_str())),
message.length());
ODK_Message_SetSize(&odk_msg,
signed_response.oemcrypto_core_message().length());
ODK_ParsedLicense odk_parsed_license = {};
ODK_LicenseResponse odk_license_response = {};
odk_license_response.parsed_license = &odk_parsed_license;
Unpack_ODK_LicenseResponse(&odk_msg, &odk_license_response);
ASSERT_EQ(ODK_Message_GetStatus(&odk_msg), MESSAGE_STATUS_OK);
// Print core message information for the license response.
std::cout << std::endl << "License Response Information:" << std::endl;
std::cout
<< " License Response Core Version = "
<< odk_license_response.core_message.nonce_values.api_major_version
<< "."
<< odk_license_response.core_message.nonce_values.api_minor_version
<< std::endl;
std::cout << " Nonce = "
<< odk_license_response.core_message.nonce_values.nonce
<< std::endl;
std::cout << " Session ID = "
<< odk_license_response.core_message.nonce_values.session_id
<< std::endl;
}
}
void MessageDumper::DumpLicenseRequest(const CdmKeyRequest& request) {
SignedMessage signed_message;
DumpHeader(&license_file, "License");
@@ -142,8 +204,8 @@ void MessageDumper::DumpLicenseRequest(const CdmKeyRequest& request) {
// request is valid.
video_widevine::LicenseRequest license_request;
EXPECT_TRUE(license_request.ParseFromString(signed_message.msg()));
// TODO(fredgc): figure out if we can build tests with full protobufs instead
// of proto lite, so that we can use TextFormat.
// TODO(fredgc): figure out if we can build tests with full protobufs
// instead of proto lite, so that we can use TextFormat.
PrintRequestProto("License Request", license_request);
}
@@ -231,6 +293,131 @@ void MessageDumper::DumpRenewal(const std::string& response) {
renewal_file << "}\n\n";
}
void MessageDumper::PrintProvisioningRequest(
const CdmProvisioningRequest& request) {
SignedProvisioningMessage signed_message;
ASSERT_TRUE(signed_message.ParseFromString(request));
if (wvoec::global_features.api_version >= wvoec::kCoreMessagesAPI) {
ASSERT_TRUE(signed_message.has_oemcrypto_core_message());
const std::string& core_request = signed_message.oemcrypto_core_message();
oemcrypto_core_message::ODK_ProvisioningRequest core_request_data;
ASSERT_TRUE(
oemcrypto_core_message::deserialize::CoreProvisioningRequestFromMessage(
core_request, &core_request_data));
// Print core message information for the provisioning request.
if (wvoec::global_features.derive_key_method ==
wvoec::DeviceFeatures::TEST_PROVISION_40) {
std::cout << std::endl
<< "Provisioning 4.0 Request Information:" << std::endl;
std::cout << " Provisioning 4.0 Request Core Version = "
<< core_request_data.api_major_version << "."
<< core_request_data.api_minor_version << std::endl;
} else {
std::cout << std::endl
<< "Provisioning Request Information:" << std::endl;
std::cout << " Provisioning Request Core Version = "
<< core_request_data.api_major_version << "."
<< core_request_data.api_minor_version << std::endl;
}
std::cout << " Nonce = " << core_request_data.nonce << std::endl;
std::cout << " Session ID = " << core_request_data.session_id << std::endl;
}
}
void MessageDumper::PrintProvisioningResponse(
const CdmProvisioningResponse& response) {
if (wvoec::global_features.derive_key_method ==
wvoec::DeviceFeatures::TEST_PROVISION_40) {
std::cout << " Provisioning 4.0 does not have a response. " << std::endl;
return;
}
SignedProvisioningMessage signed_response;
if (!signed_response.ParseFromString(response)) {
// A binary provisioning response is buried within a json structure.
std::string extracted_message;
ASSERT_TRUE(CertificateProvisioning::ExtractAndDecodeSignedMessage(
response, &extracted_message));
ASSERT_TRUE(signed_response.ParseFromString(extracted_message));
}
if (wvoec::global_features.api_version >= wvoec::kCoreMessagesAPI) {
ASSERT_TRUE(signed_response.has_oemcrypto_core_message());
std::string message =
signed_response.oemcrypto_core_message() + signed_response.message();
ODK_Message odk_msg = ODK_Message_Create(
reinterpret_cast<uint8_t*>(const_cast<char*>(message.c_str())),
message.length());
ODK_Message_SetSize(&odk_msg,
signed_response.oemcrypto_core_message().length());
ODK_ParsedProvisioning odk_parsed_provisioning;
// For v17 and earlier, we use a special v16/v17 provisioning response type.
// So need to separate the way we unpack the provisioning response into
// v16/v17 and v18+.
if (wvoec::global_features.api_version > 17) {
ODK_ProvisioningResponse odk_provisioning_response;
odk_provisioning_response.parsed_provisioning = &odk_parsed_provisioning;
Unpack_ODK_ProvisioningResponse(&odk_msg, &odk_provisioning_response);
EXPECT_EQ(ODK_Message_GetStatus(&odk_msg), MESSAGE_STATUS_OK);
// Print core message information for the provisioning response.
std::cout << std::endl
<< "Provisioning Response Information:" << std::endl;
std::cout << " Provisioning Response Core Version = "
<< odk_provisioning_response.core_message.nonce_values
.api_major_version
<< "."
<< odk_provisioning_response.core_message.nonce_values
.api_minor_version
<< std::endl;
std::cout << " Nonce = "
<< odk_provisioning_response.core_message.nonce_values.nonce
<< std::endl;
std::cout
<< " Session ID = "
<< odk_provisioning_response.core_message.nonce_values.session_id
<< std::endl;
std::cout << " Key Type = "
<< ((odk_parsed_provisioning.key_type ==
OEMCrypto_RSA_Private_Key)
? "OEMCrypto_RSA_Private_Key"
: "OEMCrypto_ECC_Private_Key")
<< std::endl;
} else {
// ODK_ParsedProvisioning odk_parsed_provisioning;
ODK_ProvisioningResponseV16 odk_provisioning_response;
odk_provisioning_response.parsed_provisioning = &odk_parsed_provisioning;
Unpack_ODK_ProvisioningResponseV16(&odk_msg, &odk_provisioning_response);
EXPECT_EQ(ODK_Message_GetStatus(&odk_msg), MESSAGE_STATUS_OK);
// Print core message information for the provisioning response.
std::cout << std::endl
<< "Provisioning Response Information:" << std::endl;
std::cout << " Provisioning Response Core Version = "
<< odk_provisioning_response.request.core_message.nonce_values
.api_major_version
<< "."
<< odk_provisioning_response.request.core_message.nonce_values
.api_minor_version
<< std::endl;
std::cout
<< " Nonce = "
<< odk_provisioning_response.request.core_message.nonce_values.nonce
<< std::endl;
std::cout << " Session ID = "
<< odk_provisioning_response.request.core_message.nonce_values
.session_id
<< std::endl;
std::cout << " Key Type = "
<< ((odk_parsed_provisioning.key_type ==
OEMCrypto_RSA_Private_Key)
? "OEMCrypto_RSA_Private_Key"
: "OEMCrypto_ECC_Private_Key")
<< std::endl;
}
}
}
void MessageDumper::DumpProvisioningRequest(
const CdmProvisioningRequest& request) {
if (wvoec::global_features.derive_key_method ==
@@ -255,7 +442,8 @@ void MessageDumper::DumpProvisioning(const CdmProvisioningResponse& response) {
if (wvoec::global_features.derive_key_method ==
wvoec::DeviceFeatures::TEST_PROVISION_40) {
LOGD(
"Provisioning 4.0 does not have a v17, v18 or v19 core message in the "
"Provisioning 4.0 does not have a v17, v18 or v19 core message in "
"the "
"response.");
provision_file << " RunTest();\n";
provision_file << "}\n\n";
@@ -285,13 +473,13 @@ void MessageDumper::DumpProvisioning(const CdmProvisioningResponse& response) {
message.length());
ODK_Message_SetSize(&odk_msg,
signed_response.oemcrypto_core_message().length());
ODK_ParsedProvisioning odk_parsed_response;
ODK_ProvisioningResponse provisioning_response;
provisioning_response.parsed_provisioning = &odk_parsed_response;
Unpack_ODK_ProvisioningResponse(&odk_msg, &provisioning_response);
ODK_ParsedProvisioning odk_parsed_provisioning;
ODK_ProvisioningResponse odk_provisioning_response;
odk_provisioning_response.parsed_provisioning = &odk_parsed_provisioning;
Unpack_ODK_ProvisioningResponse(&odk_msg, &odk_provisioning_response);
EXPECT_EQ(ODK_Message_GetStatus(&odk_msg), MESSAGE_STATUS_OK);
provision_file << " device_key_type_ = "
<< ((odk_parsed_response.key_type ==
<< ((odk_parsed_provisioning.key_type ==
OEMCrypto_RSA_Private_Key)
? "OEMCrypto_RSA_Private_Key;\n"
: "OEMCrypto_ECC_Private_Key;\n");