From 692cb259f39f6791f39addc1d74f926c54e3b6fe Mon Sep 17 00:00:00 2001 From: Jacob Trimble Date: Wed, 4 Oct 2023 17:32:16 +0000 Subject: [PATCH] Fix dynamic adapter with provisioning Bug: 302721191 Change-Id: Icdc003ed903142129eb1f89d109f447ea6dc2079 --- .../core/src/oemcrypto_adapter_dynamic.cpp | 46 +++++++++++++------ 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp index 73d5061e..8562d5b7 100644 --- a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp +++ b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp @@ -2108,6 +2108,20 @@ extern "C" OEMCryptoResult OEMCrypto_PrepAndSignRenewalRequest( return OEMCrypto_ERROR_NOT_IMPLEMENTED; } +template +std::vector MakeContext(const char (&key_label)[N], + const uint8_t* context, size_t context_length, + uint32_t suffix) { + // TODO(b/299343035): Use ODK methods. + std::vector ret; + ret.insert(ret.end(), key_label, key_label + N); + ret.insert(ret.end(), context, context + context_length); + const uint32_t suffix_net = htonl(suffix); + auto* ptr = reinterpret_cast(&suffix_net); + ret.insert(ret.end(), ptr, ptr + sizeof(suffix_net)); + return ret; +} + extern "C" OEMCryptoResult OEMCrypto_PrepAndSignProvisioningRequest( OEMCrypto_SESSION session, uint8_t* message, size_t message_length, size_t* core_message_length, uint8_t* signature, size_t* signature_length) { @@ -2115,6 +2129,24 @@ extern "C" OEMCryptoResult OEMCrypto_PrepAndSignProvisioningRequest( LevelSession pair = gAdapter->GetSession(session); if (!pair.fcn) return OEMCrypto_ERROR_INVALID_SESSION; if (pair.fcn->PrepAndSignProvisioningRequest != nullptr) { + if (pair.fcn->version < 19 && + pair.fcn->GenerateDerivedKeys_V18 != nullptr) { + if (!core_message_length || *core_message_length > message_length) { + return OEMCrypto_ERROR_INVALID_CONTEXT; + } + + const std::vector mac_context = + MakeContext("AUTHENTICATION", message + *core_message_length, + message_length - *core_message_length, 0x200); + const std::vector enc_context = + MakeContext("ENCRYPTION", message + *core_message_length, + message_length - *core_message_length, 0x80); + const OEMCryptoResult result = pair.fcn->GenerateDerivedKeys_V18( + pair.session, mac_context.data(), mac_context.size(), + enc_context.data(), enc_context.size()); + if (result != OEMCrypto_SUCCESS) return result; + } + return pair.fcn->PrepAndSignProvisioningRequest( pair.session, message, message_length, core_message_length, signature, signature_length); @@ -2141,20 +2173,6 @@ const uint8_t* PointerOrNull(const uint8_t* pointer, size_t length) { return length ? pointer : nullptr; } -template -std::vector MakeContext(const char (&key_label)[N], - const uint8_t* context, size_t context_length, - uint32_t suffix) { - // TODO(b/299343035): Use ODK methods. - std::vector ret; - ret.insert(ret.end(), key_label, key_label + N); - ret.insert(ret.end(), context, context + context_length); - const uint32_t suffix_net = htonl(suffix); - auto* ptr = reinterpret_cast(&suffix_net); - ret.insert(ret.end(), ptr, ptr + sizeof(suffix_net)); - return ret; -} - extern "C" OEMCryptoResult OEMCrypto_LoadLicense( OEMCrypto_SESSION session, const uint8_t* context, size_t context_length, const uint8_t* derivation_key, size_t derivation_key_length,