blob: 965d5a88ed02cae8cfd845714dd830bf1872febf [file] [log] [blame]
// Copyright 2022 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <optional>
#include <set>
#include <utility>
#include <cryptohome/proto_bindings/UserDataAuth.pb.h>
#include <gtest/gtest.h>
#include <libhwsec/error/tpm1_error.h>
#include <libhwsec-foundation/status/status_chain.h>
#include "cryptohome/error/action.h"
#include "cryptohome/error/cryptohome_tpm_error.h"
namespace cryptohome {
namespace error {
class CryptohomeTPM1ErrorTest : public ::testing::Test {};
namespace {
using hwsec::TPM1Error;
using hwsec::TPMRetryAction;
using hwsec_foundation::status::MakeStatus;
using hwsec_foundation::status::StatusChain;
TEST_F(CryptohomeTPM1ErrorTest, FromTPM1ErrorSize) {
auto tpm_err = MakeStatus<TPM1Error>(TPM_E_SIZE);
// TPM_E_SIZE results in TPMRetryAction::kReboot and ErrorAction::kReboot.
auto err1 = MakeStatus<CryptohomeTPMError>(std::move(tpm_err));
ASSERT_FALSE(err1.ok());
EXPECT_EQ(err1->local_location(),
static_cast<CryptohomeError::ErrorLocation>(TPM_E_SIZE) |
hwsec::unified_tpm_error::kUnifiedErrorBit);
EXPECT_EQ(err1->local_actions(), ErrorActionSet({ErrorAction::kReboot}));
EXPECT_EQ(err1->ToTPMRetryAction(), TPMRetryAction::kReboot);
}
TEST_F(CryptohomeTPM1ErrorTest, FromTPM1ErrorDefend) {
auto tpm_err = MakeStatus<TPM1Error>(TPM_E_DEFEND_LOCK_RUNNING);
// TPM_E_DEFEND_LOCK_RUNNING results in TPMRetryAction::kDefend and
// ErrorAction::kTpmLockout.
auto err1 = MakeStatus<CryptohomeTPMError>(std::move(tpm_err));
ASSERT_FALSE(err1.ok());
EXPECT_EQ(
err1->local_location(),
static_cast<CryptohomeError::ErrorLocation>(TPM_E_DEFEND_LOCK_RUNNING) |
hwsec::unified_tpm_error::kUnifiedErrorBit);
EXPECT_EQ(err1->local_actions(), ErrorActionSet({ErrorAction::kTpmLockout}));
EXPECT_EQ(err1->ToTPMRetryAction(), TPMRetryAction::kDefend);
}
TEST_F(CryptohomeTPM1ErrorTest, FromTPM1ErrorComm) {
auto tpm_err = MakeStatus<TPM1Error>(TSS_E_COMM_FAILURE);
// TSS_E_COMM_FAILURE results in TPMRetryAction::kCommunication and
// ErrorAction::kReboot.
auto err1 = MakeStatus<CryptohomeTPMError>(std::move(tpm_err));
ASSERT_FALSE(err1.ok());
EXPECT_EQ(err1->local_location(),
static_cast<CryptohomeError::ErrorLocation>(TSS_E_COMM_FAILURE) |
hwsec::unified_tpm_error::kUnifiedErrorBit);
EXPECT_EQ(err1->local_actions(), ErrorActionSet({ErrorAction::kReboot}));
EXPECT_EQ(err1->ToTPMRetryAction(), TPMRetryAction::kCommunication);
}
TEST_F(CryptohomeTPM1ErrorTest, FromTPM1ErrorSuccess) {
StatusChain<TPM1Error> tpm_err;
auto err1 = MakeStatus<CryptohomeTPMError>(std::move(tpm_err));
EXPECT_TRUE(err1.ok());
}
} // namespace
} // namespace error
} // namespace cryptohome