Let OPK call MoveUsageEntry after creation
Changes the OPK session state machine to allow API_MOVEENTRY in the same circumstances as API_CREATENEWUSAGEENTRY. Adds a test to trigger the same situation as the linked bug. The test cases in the bug fail because OEMCrypto_MoveEntry() is called immediately after OEMCrypto_CreateNewUsageEntry(), but the session state machine has different filters for the two calls. Furthermore, OEMCrypto_CreateNewUsageEntry() doesn't change the state machine, so we should align the two filters to allow OEMCrypto_MoveEntry() to be called immediately after OEMCrypto_CreateNewUsageEntry() in all situations where OEMCrypto_CreateNewUsageEntry() is allowed. The existing OEMCrypto defrag tests did not catch this edge case because the test helper functions always do something to modify the state machine after calling OEMCrypto_CreateNewUsageEntry(). Test: OEMCryptoUsageTableDefragTest.MakeAndMoveEntry Bug: 286938572 Merged from https://widevine-internal-review.googlesource.com/178013 (cherry picked from commit a87d66ccb7b2fc5f549142e64a7e45531dd95db6) Change-Id: I8a8465b2b7479effe4055a014bc94b166178a693
This commit is contained in:
committed by
Robert Shih
parent
001ede83fd
commit
2bdea1767f
@@ -983,6 +983,39 @@ TEST_P(OEMCryptoUsageTableDefragTest, MoveUsageEntries) {
|
|||||||
FailReloadLicense(&entries[3], OEMCrypto_ERROR_UNKNOWN_FAILURE));
|
FailReloadLicense(&entries[3], OEMCrypto_ERROR_UNKNOWN_FAILURE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_P(OEMCryptoUsageTableDefragTest, MakeAndMoveEntry) {
|
||||||
|
// 1. Make an entry then close.
|
||||||
|
LicenseWithUsageEntry entry;
|
||||||
|
ASSERT_NO_FATAL_FAILURE(entry.set_pst("pst 0"));
|
||||||
|
ASSERT_NO_FATAL_FAILURE(entry.MakeOfflineAndClose(this));
|
||||||
|
ASSERT_NO_FATAL_FAILURE(entry.OpenAndReload(this));
|
||||||
|
ASSERT_NO_FATAL_FAILURE(entry.session().close());
|
||||||
|
|
||||||
|
// 2. Make an entry then immediately move it into the previous slot.
|
||||||
|
// Not using helper functions because they shoehorn the session state into
|
||||||
|
// a limited set of possibilities. We want to create the specific case of
|
||||||
|
// immediately moving a newly created entry.
|
||||||
|
|
||||||
|
// Like LicenseWithUsageEntry::MakeAndLoad() but stop after creating the new
|
||||||
|
// usage entry.
|
||||||
|
Session session;
|
||||||
|
ASSERT_NO_FATAL_FAILURE(session.open());
|
||||||
|
ASSERT_NO_FATAL_FAILURE(InstallTestDrmKey(&session));
|
||||||
|
LicenseRoundTrip license_messages_(&session);
|
||||||
|
license_messages_.set_control(wvoec::kControlNonceOrEntry);
|
||||||
|
ASSERT_NO_FATAL_FAILURE(license_messages_.SignAndVerifyRequest());
|
||||||
|
ASSERT_NO_FATAL_FAILURE(license_messages_.CreateDefaultResponse());
|
||||||
|
ASSERT_NO_FATAL_FAILURE(license_messages_.EncryptAndSignResponse());
|
||||||
|
OEMCryptoResult result;
|
||||||
|
ASSERT_NO_FATAL_FAILURE(session.CreateNewUsageEntry(&result));
|
||||||
|
|
||||||
|
// Not the same as Session::MoveUsageEntry, which opens and closes a session
|
||||||
|
// around the move operation. We just want to call MoveEntry on the current
|
||||||
|
// state.
|
||||||
|
ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_MoveEntry(session.session_id(), 0));
|
||||||
|
ASSERT_NO_FATAL_FAILURE(session.close());
|
||||||
|
}
|
||||||
|
|
||||||
// A usage table entry cannot be moved into an entry where an open session is
|
// A usage table entry cannot be moved into an entry where an open session is
|
||||||
// currently using the entry.
|
// currently using the entry.
|
||||||
TEST_P(OEMCryptoUsageTableDefragTest, MoveUsageEntriesToOpenSession) {
|
TEST_P(OEMCryptoUsageTableDefragTest, MoveUsageEntriesToOpenSession) {
|
||||||
|
|||||||
Reference in New Issue
Block a user