From ab7c39a4502843bfbae83b50022d97d22bb8ed13 Mon Sep 17 00:00:00 2001 From: Cong Lin Date: Tue, 4 Apr 2023 10:04:30 -0700 Subject: [PATCH] OEMCrypto_ReassociateEntitledKeySession() to verify entitlement key IDs OEMCrypto_ReassociateEntitledKeySession() should prevent an entitled key session from being associated to an arbitrary entitlement session. The target entitlement session is supposed to have all the entitlement keys that the entitled key session uses. Updated OPK and ref/testbed implementations. Test: jenkins/opk_ta entitlement tests Bug: 262795590 Merged from https://widevine-internal-review.googlesource.com/169774 Change-Id: I4322422f01f7094c3862f33ef3199ff3a44995b0 --- .../oemcrypto/test/oemcrypto_test.cpp | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp b/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp index ae65061d..c627dc84 100644 --- a/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp +++ b/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp @@ -954,11 +954,7 @@ TEST_P(OEMCryptoEntitlementLicenseTest, ReassociateEntitledKeySessionAPI17) { ASSERT_NO_FATAL_FAILURE(license_messages_.CreateDefaultResponse()); ASSERT_NO_FATAL_FAILURE(license_messages_.EncryptAndSignResponse()); ASSERT_EQ(OEMCrypto_SUCCESS, license_messages_.LoadResponse()); - // Setup another session. - Session session2; - ASSERT_NO_FATAL_FAILURE(session2.open()); - ASSERT_NO_FATAL_FAILURE(InstallTestDrmKey(&session2)); - ASSERT_NO_FATAL_FAILURE(session2.GenerateDerivedKeysFromSessionKey()); + // Setup an entitled key session in the first OEMCrypto session. uint32_t key_session_id; OEMCryptoResult sts = OEMCrypto_CreateEntitledKeySession( @@ -969,7 +965,12 @@ TEST_P(OEMCryptoEntitlementLicenseTest, ReassociateEntitledKeySessionAPI17) { entitled_message.SetEntitledKeySession(key_session_id); ASSERT_NO_FATAL_FAILURE(entitled_message.LoadKeys(true)); - // Now reassociate the entitled key session to the second OEMCrypto session. + // Setup another session. + Session session2; + ASSERT_NO_FATAL_FAILURE(session2.open()); + ASSERT_NO_FATAL_FAILURE(InstallTestDrmKey(&session2)); + // session2 does not have entitlement keys. Re-associating the entitled key + // session to session2 should fail OEMCryptoResult status = OEMCrypto_ReassociateEntitledKeySession( key_session_id, session2.session_id()); if (status == OEMCrypto_ERROR_NOT_IMPLEMENTED && @@ -977,9 +978,18 @@ TEST_P(OEMCryptoEntitlementLicenseTest, ReassociateEntitledKeySessionAPI17) { GTEST_SKIP() << "Skipping test because " "OEMCrypto_ReassociateEntitledKeySession not implemented."; } - ASSERT_EQ(OEMCrypto_SUCCESS, status); - // session2 does not have entitlement keys. - ASSERT_NO_FATAL_FAILURE(entitled_message.LoadKeys(false)); + EXPECT_NE(OEMCrypto_SUCCESS, status); + + // session2 loads the correct entitlement keys. + LicenseRoundTrip license_messages2(&session2); + license_messages2.set_license_type(OEMCrypto_EntitlementLicense); + ASSERT_NO_FATAL_FAILURE(license_messages2.SignAndVerifyRequest()); + ASSERT_NO_FATAL_FAILURE(license_messages2.CreateDefaultResponse()); + ASSERT_NO_FATAL_FAILURE(license_messages2.EncryptAndSignResponse()); + ASSERT_EQ(OEMCrypto_SUCCESS, license_messages2.LoadResponse()); + // Re-associating to session2 should succeed. + ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_ReassociateEntitledKeySession( + key_session_id, session2.session_id())); // Now reassociate the entitled key session back to the first OEMCrypto // session.