/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "Keymaster4_1HidlTest.h" #include namespace android::hardware::keymaster::V4_1::test { using std::string; using EarlyBootKeyTest = Keymaster4_1HidlTest; // Because VTS tests are run on fully-booted machines, we can only run negative tests for early boot // keys, which cannot be created or used after /data is mounted. This is the only test we can run // in the normal case. The positive test will have to be done by the Android system, when it // creates/uses early boot keys during boot. It should fail to boot if the early boot key usage // fails. TEST_P(EarlyBootKeyTest, CannotCreateEarlyBootKeys) { auto [aesKeyData, hmacKeyData, rsaKeyData, ecdsaKeyData] = CreateTestKeys(TAG_EARLY_BOOT_ONLY, ErrorCode::EARLY_BOOT_ENDED); CheckedDeleteKeyData(&aesKeyData); CheckedDeleteKeyData(&hmacKeyData); CheckedDeleteKeyData(&rsaKeyData); CheckedDeleteKeyData(&ecdsaKeyData); } // This is a more comprenhensive test, but it can only be run on a machine which is still in early // boot stage, which no proper Android device is by the time we can run VTS. To use this, // un-disable it and modify vold to remove the call to earlyBootEnded(). Running the test will end // early boot, so you'll have to reboot between runs. TEST_P(EarlyBootKeyTest, DISABLED_FullTest) { // Should be able to create keys, since early boot has not ended auto [aesKeyData, hmacKeyData, rsaKeyData, ecdsaKeyData] = CreateTestKeys(TAG_EARLY_BOOT_ONLY, ErrorCode::OK); // TAG_EARLY_BOOT_ONLY should be in hw-enforced. EXPECT_TRUE(contains(aesKeyData.characteristics.hardwareEnforced, TAG_EARLY_BOOT_ONLY)); EXPECT_TRUE(contains(hmacKeyData.characteristics.hardwareEnforced, TAG_EARLY_BOOT_ONLY)); EXPECT_TRUE(contains(rsaKeyData.characteristics.hardwareEnforced, TAG_EARLY_BOOT_ONLY)); EXPECT_TRUE(contains(ecdsaKeyData.characteristics.hardwareEnforced, TAG_EARLY_BOOT_ONLY)); // Should be able to use keys, since early boot has not ended EXPECT_EQ(ErrorCode::OK, UseAesKey(aesKeyData.blob)); EXPECT_EQ(ErrorCode::OK, UseHmacKey(hmacKeyData.blob)); EXPECT_EQ(ErrorCode::OK, UseRsaKey(rsaKeyData.blob)); EXPECT_EQ(ErrorCode::OK, UseEcdsaKey(ecdsaKeyData.blob)); // End early boot Return earlyBootResult = keymaster().earlyBootEnded(); EXPECT_TRUE(earlyBootResult.isOk()); EXPECT_EQ(earlyBootResult, ErrorCode::OK); // Should not be able to use already-created keys. EXPECT_EQ(ErrorCode::EARLY_BOOT_ENDED, UseAesKey(aesKeyData.blob)); EXPECT_EQ(ErrorCode::EARLY_BOOT_ENDED, UseHmacKey(hmacKeyData.blob)); EXPECT_EQ(ErrorCode::EARLY_BOOT_ENDED, UseRsaKey(rsaKeyData.blob)); EXPECT_EQ(ErrorCode::EARLY_BOOT_ENDED, UseEcdsaKey(ecdsaKeyData.blob)); CheckedDeleteKeyData(&aesKeyData); CheckedDeleteKeyData(&hmacKeyData); CheckedDeleteKeyData(&rsaKeyData); CheckedDeleteKeyData(&ecdsaKeyData); // Should not be able to create new keys std::tie(aesKeyData, hmacKeyData, rsaKeyData, ecdsaKeyData) = CreateTestKeys(TAG_EARLY_BOOT_ONLY, ErrorCode::EARLY_BOOT_ENDED); CheckedDeleteKeyData(&aesKeyData); CheckedDeleteKeyData(&hmacKeyData); CheckedDeleteKeyData(&rsaKeyData); CheckedDeleteKeyData(&ecdsaKeyData); } INSTANTIATE_KEYMASTER_4_1_HIDL_TEST(EarlyBootKeyTest); } // namespace android::hardware::keymaster::V4_1::test