From d4e11f17271de476de2931f58ff2f6041c5dbf33 Mon Sep 17 00:00:00 2001 From: Alex Dale Date: Thu, 3 Oct 2024 14:29:37 -0700 Subject: [PATCH] Update test data for entitled license test [ Merge of http://go/wvgerrit/199355 ] A new set of license data was created on UAT so that we could have keys that match those in the license returned by a License SDK and by those generated by UAT. It should be more clear now which data is just made up, and which data has to match some golden values based on the made up data. Bug: 338323091 Test: WVTS Change-Id: Ic112b4594afb99c6f43e011f59ee7592d4809189 --- .../cdm/core/src/initialization_data.cpp | 5 ++- libwvdrmengine/cdm/core/test/test_base.cpp | 31 +++++++++++++++++++ libwvdrmengine/cdm/core/test/test_base.h | 4 +++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/libwvdrmengine/cdm/core/src/initialization_data.cpp b/libwvdrmengine/cdm/core/src/initialization_data.cpp index 8e11afb6..f1c8ba4f 100644 --- a/libwvdrmengine/cdm/core/src/initialization_data.cpp +++ b/libwvdrmengine/cdm/core/src/initialization_data.cpp @@ -683,7 +683,7 @@ void InitializationData::DumpToLogs() const { if (!is_supported()) { LOGD("InitData: Not supported"); } - if (!IsEmpty()) { + if (IsEmpty()) { LOGD("InitData: Empty"); } std::string type_info = type(); @@ -738,6 +738,9 @@ void InitializationData::DumpToLogs() const { LOGD("InitData: entitlement_key_id %d: %s -> %s", i, wvutil::b2a_hex(key.entitlement_key_id()).c_str(), wvutil::b2a_hex(key.key_id()).c_str()); + LOGD("InitData: entitled_key %d: %s", i, + wvutil::b2a_hex(key.key()).c_str()); + LOGD("InitData: iv %d: %s", i, wvutil::b2a_hex(key.iv()).c_str()); } } diff --git a/libwvdrmengine/cdm/core/test/test_base.cpp b/libwvdrmengine/cdm/core/test/test_base.cpp index 1c478342..e154e0f6 100644 --- a/libwvdrmengine/cdm/core/test/test_base.cpp +++ b/libwvdrmengine/cdm/core/test/test_base.cpp @@ -144,6 +144,17 @@ void show_menu(const char* prog_name, const std::string& extra_help_text) { std::cout << extra_help_text << std::endl; } + +// Increment counter for AES-CTR. The CENC spec specifies we increment only +// the low 64 bits of the IV counter, and leave the high 64 bits alone. This +// is different from the BoringSSL implementation, so we implement the CTR loop +// ourselves. +void ctr128_inc64(int64_t increaseBy, std::vector& iv) { + uint64_t* counterBuffer = reinterpret_cast(&(iv[8])); + (*counterBuffer) = + wvutil::htonll64(wvutil::ntohll64(*counterBuffer) + increaseBy); +} + } // namespace std::unique_ptr WvCdmTestBase::default_config_; @@ -157,6 +168,26 @@ void WvCdmTestBase::StripeBuffer(std::vector* buffer, size_t size, } } +// Encrypt a block of data using CTR mode. +std::vector WvCdmTestBase::Aes128CtrEncrypt( + const std::vector& key, const std::vector& starting_iv, + const std::vector& in_buffer) { + AES_KEY aes_key; + AES_set_encrypt_key(key.data(), AES_BLOCK_SIZE * 8, &aes_key); + std::vector out_buffer(in_buffer.size()); + std::vector iv = starting_iv; + size_t l = 0; // byte index into encrypted subsample. + while (l < in_buffer.size()) { + uint8_t aes_output[AES_BLOCK_SIZE]; + AES_encrypt(iv.data(), aes_output, &aes_key); + for (size_t n = 0; n < AES_BLOCK_SIZE && l < in_buffer.size(); n++, l++) { + out_buffer[l] = aes_output[n] ^ in_buffer[l]; + } + ctr128_inc64(1, iv); + } + return out_buffer; +} + std::string WvCdmTestBase::Aes128CbcEncrypt(std::vector key, const std::vector& clear, const std::vector iv) { diff --git a/libwvdrmengine/cdm/core/test/test_base.h b/libwvdrmengine/cdm/core/test/test_base.h index c8d48776..4f573917 100644 --- a/libwvdrmengine/cdm/core/test/test_base.h +++ b/libwvdrmengine/cdm/core/test/test_base.h @@ -62,6 +62,10 @@ class WvCdmTestBase : public ::testing::Test { const std::vector& clear, const std::vector iv); // Helper method for doing cryptography. + static std::vector Aes128CtrEncrypt( + const std::vector& key, const std::vector& starting_iv, + const std::vector& in_buffer); + // Helper method for doing cryptography. static std::string SignHMAC(const std::string& message, const std::vector& key);