| // Copyright 2021 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. |
| |
| #ifndef LIBHWSEC_FOUNDATION_TPM_TPM_VERSION_H_ |
| #define LIBHWSEC_FOUNDATION_TPM_TPM_VERSION_H_ |
| |
| #include <base/logging.h> |
| #include <base/optional.h> |
| |
| #include "libhwsec-foundation/hwsec-foundation_export.h" |
| |
| namespace hwsec_foundation { |
| namespace tpm { |
| |
| enum class TPMVer { |
| kUnknown = 0, |
| kTPM1 = 1, |
| kTPM2 = 2, |
| kNoTPM = 3, |
| }; |
| |
| #if USE_TPM_DYNAMIC |
| |
| HWSEC_FOUNDATION_EXPORT TPMVer |
| RuntimeTPMVer(base::Optional<TPMVer> set_cache_for_testing = base::nullopt); |
| |
| #else |
| |
| constexpr TPMVer RuntimeTPMVer() { |
| #if USE_TPM1 |
| return TPMVer::kTPM1; |
| #elif USE_TPM2 |
| return TPMVer::kTPM2; |
| #else |
| return TPMVer::kNoTPM; |
| #endif |
| } |
| |
| #endif |
| |
| } // namespace tpm |
| } // namespace hwsec_foundation |
| |
| /** |
| * These macros could help the caller switching between |
| * build-time code path and run-time code path. |
| * |
| * The example usage of these macros: |
| * |
| * TPM_SELECT_BEGIN; |
| * TPM1_SECTION({ |
| * singleton_ = new TpmImpl(); |
| * LOG(INFO) << "Use TPM1"; |
| * }); |
| * TPM2_SECTION({ |
| * singleton_ = new Tpm2Impl(); |
| * LOG(INFO) << "Use TPM2"; |
| * }); |
| * NO_TPM_SECTION({ |
| * LOG(INFO) << "No TPM"; |
| * }); |
| * OTHER_TPM_SECTION(); |
| * TPM_SELECT_END; |
| */ |
| |
| #define TPM_SELECT_BEGIN switch (::hwsec_foundation::tpm::RuntimeTPMVer()) { |
| #define OTHER_TPM_SECTION(block) \ |
| default: { \ |
| block \ |
| } |
| #define TPM_SELECT_END } |
| |
| #if USE_TPM_DYNAMIC || USE_TPM1 |
| #define TPM1_SECTION(block) \ |
| case ::hwsec_foundation::tpm::TPMVer::kTPM1: { \ |
| block \ |
| } break; |
| #else |
| #define TPM1_SECTION(block) |
| #endif |
| |
| #if USE_TPM_DYNAMIC || USE_TPM2 |
| #define TPM2_SECTION(block) \ |
| case ::hwsec_foundation::tpm::TPMVer::kTPM2: { \ |
| block \ |
| } break; |
| #else |
| #define TPM2_SECTION(block) |
| #endif |
| |
| #if USE_TPM_DYNAMIC || (!USE_TPM1 && !USE_TPM2) |
| #define NO_TPM_SECTION(block) \ |
| case ::hwsec_foundation::tpm::TPMVer::kNoTPM: { \ |
| block \ |
| } break; |
| #else |
| #define NO_TPM_SECTION(block) |
| #endif |
| |
| /** |
| * These macros could help the unittest environment selecting the TPM version. |
| */ |
| |
| #if USE_TPM_DYNAMIC |
| |
| #define SET_DEFAULT_TPM_FOR_TESTING \ |
| ::hwsec_foundation::tpm::RuntimeTPMVer( \ |
| ::hwsec_foundation::tpm::TPMVer::kTPM2); |
| #define SET_TPM1_FOR_TESTING \ |
| ::hwsec_foundation::tpm::RuntimeTPMVer( \ |
| ::hwsec_foundation::tpm::TPMVer::kTPM1); |
| #define SET_TPM2_FOR_TESTING \ |
| ::hwsec_foundation::tpm::RuntimeTPMVer( \ |
| ::hwsec_foundation::tpm::TPMVer::kTPM2); |
| #define SET_NO_TPM_FOR_TESTING \ |
| ::hwsec_foundation::tpm::RuntimeTPMVer( \ |
| ::hwsec_foundation::tpm::TPMVer::kNoTPM); |
| |
| #elif USE_TPM1 |
| |
| #define SET_DEFAULT_TPM_FOR_TESTING |
| #define SET_TPM1_FOR_TESTING |
| #define SET_TPM2_FOR_TESTING \ |
| static_assert(false, \ |
| "Shouldn't set testing TPM to 2.0 when USE_TPM1 is " \ |
| "true"); |
| #define SET_NO_TPM_FOR_TESTING \ |
| static_assert(false, \ |
| "Shouldn't set testing TPM to null when USE_TPM1 is true"); |
| |
| #elif USE_TPM2 |
| |
| #define SET_DEFAULT_TPM_FOR_TESTING |
| #define SET_TPM1_FOR_TESTING \ |
| static_assert(false, \ |
| "Shouldn't set testing TPM to 1.0 when USE_TPM2 is " \ |
| "true"); |
| #define SET_TPM2_FOR_TESTING |
| #define SET_NO_TPM_FOR_TESTING \ |
| static_assert(false, \ |
| "Shouldn't set testing TPM to null when USE_TPM2 is true"); |
| |
| #else // NO_TPM |
| |
| #define SET_DEFAULT_TPM_FOR_TESTING |
| #define SET_TPM1_FOR_TESTING \ |
| static_assert(false, \ |
| "Shouldn't set testing TPM to 1.0 when no TPM is " \ |
| "enable"); |
| #define SET_TPM2_FOR_TESTING \ |
| static_assert(false, \ |
| "Shouldn't set testing TPM to 2.0 when no TPM is " \ |
| "enable"); |
| #define SET_NO_TPM_FOR_TESTING |
| |
| #endif |
| |
| #endif // LIBHWSEC_FOUNDATION_TPM_TPM_VERSION_H_ |