1bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// 2bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Copyright (C) 2014 The Android Open Source Project 3bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// 4bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License"); 5bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// you may not use this file except in compliance with the License. 6bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// You may obtain a copy of the License at 7bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// 8bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// http://www.apache.org/licenses/LICENSE-2.0 9bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// 10bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Unless required by applicable law or agreed to in writing, software 11bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS, 12bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// See the License for the specific language governing permissions and 14bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// limitations under the License. 15bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// 16c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi 1703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn// trunks_client is a command line tool that supports various TPM operations. It 1803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn// does not provide direct access to the trunksd D-Bus interface. 1903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn 20c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi#include <stdio.h> 2130c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez#include <memory> 22c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi#include <string> 23c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi 24c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi#include <base/command_line.h> 2503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include <base/logging.h> 26b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn#include <base/strings/string_number_conversions.h> 279f01b702ae6c852cf800a7156b15040b92fad94bAlex Vakulenko#include <brillo/syslog_logging.h> 2803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn 2903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include "trunks/error_codes.h" 30ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/hmac_session.h" 31e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi#include "trunks/password_authorization_delegate.h" 32fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi#include "trunks/policy_session.h" 33e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi#include "trunks/scoped_key_handle.h" 3480c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn#include "trunks/tpm_state.h" 3503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include "trunks/tpm_utility.h" 362be346182387c502f65c65ea4da49707026ce8f9Utkarsh Sanghi#include "trunks/trunks_client_test.h" 3703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include "trunks/trunks_factory_impl.h" 38c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi 3903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahnnamespace { 4003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn 41de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghiusing trunks::CommandTransceiver; 42de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghiusing trunks::TrunksFactory; 43b180754b429c078cbc99175a6059a8b5d0491002Darren Krahnusing trunks::TrunksFactoryImpl; 44de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghi 4503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahnvoid PrintUsage() { 4603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn puts("Options:"); 4773fccebfb2083652855786322fb526d8d9a11886Vadim Bendebury puts(" --allocate_pcr - Configures PCR 0-15 under the SHA256 bank."); 48d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi puts(" --clear - Clears the TPM. Use before initializing the TPM."); 4973fccebfb2083652855786322fb526d8d9a11886Vadim Bendebury puts(" --help - Prints this message."); 5003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn puts(" --init_tpm - Initializes a TPM as CrOS firmware does."); 5139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi puts(" --own - Takes ownership of the TPM with the provided password."); 5273fccebfb2083652855786322fb526d8d9a11886Vadim Bendebury puts(" --owner_password - used to provide an owner password"); 5375f6bf5a8582017f08956f96d81f209ab40d33acUtkarsh Sanghi puts(" --regression_test - Runs some basic regression tests. If"); 5475f6bf5a8582017f08956f96d81f209ab40d33acUtkarsh Sanghi puts(" owner_password is supplied, it runs tests that"); 5575f6bf5a8582017f08956f96d81f209ab40d33acUtkarsh Sanghi puts(" need owner permissions."); 5673fccebfb2083652855786322fb526d8d9a11886Vadim Bendebury puts(" --startup - Performs startup and self-tests."); 5773fccebfb2083652855786322fb526d8d9a11886Vadim Bendebury puts(" --status - Prints TPM status information."); 584ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn puts(" --stress_test - Runs some basic stress tests."); 59b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn puts(" --read_pcr --index=<N> - Reads a PCR and prints the value."); 60b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn puts(" --extend_pcr --index=<N> --value=<value> - Extends a PCR."); 6103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn} 62c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi 63b180754b429c078cbc99175a6059a8b5d0491002Darren Krahnstd::string HexEncode(const std::string& bytes) { 64b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return base::HexEncode(bytes.data(), bytes.size()); 65c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi} 66c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi 67b180754b429c078cbc99175a6059a8b5d0491002Darren Krahnint Startup(const TrunksFactory& factory) { 68b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn factory.GetTpmUtility()->Shutdown(); 69b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return factory.GetTpmUtility()->Startup(); 70d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi} 71d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi 72b180754b429c078cbc99175a6059a8b5d0491002Darren Krahnint Clear(const TrunksFactory& factory) { 73b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return factory.GetTpmUtility()->Clear(); 7403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn} 7503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn 76b180754b429c078cbc99175a6059a8b5d0491002Darren Krahnint InitializeTpm(const TrunksFactory& factory) { 77b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return factory.GetTpmUtility()->InitializeTpm(); 78b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn} 79b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn 80b180754b429c078cbc99175a6059a8b5d0491002Darren Krahnint AllocatePCR(const TrunksFactory& factory) { 81e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi trunks::TPM_RC result; 82b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn result = factory.GetTpmUtility()->AllocatePCR(""); 83e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi if (result != trunks::TPM_RC_SUCCESS) { 84e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi LOG(ERROR) << "Error allocating PCR:" << trunks::GetErrorString(result); 85e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi return result; 86e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi } 87b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn factory.GetTpmUtility()->Shutdown(); 88b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return factory.GetTpmUtility()->Startup(); 89e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi} 90e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi 91b180754b429c078cbc99175a6059a8b5d0491002Darren Krahnint TakeOwnership(const std::string& owner_password, 92b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn const TrunksFactory& factory) { 93e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi trunks::TPM_RC rc; 94b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn rc = factory.GetTpmUtility()->TakeOwnership(owner_password, owner_password, 95b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn owner_password); 96e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi if (rc) { 97e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi LOG(ERROR) << "Error taking ownership: " << trunks::GetErrorString(rc); 98e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi return rc; 99e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi } 100e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi return 0; 101e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi} 102e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi 103b180754b429c078cbc99175a6059a8b5d0491002Darren Krahnint DumpStatus(const TrunksFactory& factory) { 104b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn std::unique_ptr<trunks::TpmState> state = factory.GetTpmState(); 10580c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn trunks::TPM_RC result = state->Initialize(); 10680c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn if (result != trunks::TPM_RC_SUCCESS) { 10780c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn LOG(ERROR) << "Failed to read TPM state: " 10880c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn << trunks::GetErrorString(result); 10980c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn return result; 11080c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn } 11180c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn printf("Owner password set: %s\n", 11280c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn state->IsOwnerPasswordSet() ? "true" : "false"); 11380c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn printf("Endorsement password set: %s\n", 11480c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn state->IsEndorsementPasswordSet() ? "true" : "false"); 11580c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn printf("Lockout password set: %s\n", 11680c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn state->IsLockoutPasswordSet() ? "true" : "false"); 1174dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn printf("Ownership status: %s\n", state->IsOwned() ? "true" : "false"); 1184dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn printf("In lockout: %s\n", state->IsInLockout() ? "true" : "false"); 11980c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn printf("Platform hierarchy enabled: %s\n", 120bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi state->IsPlatformHierarchyEnabled() ? "true" : "false"); 121bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi printf("Storage hierarchy enabled: %s\n", 122bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi state->IsStorageHierarchyEnabled() ? "true" : "false"); 123bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi printf("Endorsement hierarchy enabled: %s\n", 124bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi state->IsEndorsementHierarchyEnabled() ? "true" : "false"); 1254dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn printf("Is Tpm enabled: %s\n", state->IsEnabled() ? "true" : "false"); 12680c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn printf("Was shutdown orderly: %s\n", 127bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi state->WasShutdownOrderly() ? "true" : "false"); 1284dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn printf("Is RSA supported: %s\n", state->IsRSASupported() ? "true" : "false"); 1294dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn printf("Is ECC supported: %s\n", state->IsECCSupported() ? "true" : "false"); 13009176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi printf("Lockout Counter: %u\n", state->GetLockoutCounter()); 13109176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi printf("Lockout Threshold: %u\n", state->GetLockoutThreshold()); 13209176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi printf("Lockout Interval: %u\n", state->GetLockoutInterval()); 13309176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi printf("Lockout Recovery: %u\n", state->GetLockoutRecovery()); 13480c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn return 0; 13580c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn} 13680c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn 137b180754b429c078cbc99175a6059a8b5d0491002Darren Krahnint ReadPCR(const TrunksFactory& factory, int index) { 138b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn std::unique_ptr<trunks::TpmUtility> tpm_utility = factory.GetTpmUtility(); 139b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn std::string value; 140b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn trunks::TPM_RC result = tpm_utility->ReadPCR(index, &value); 141b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn if (result) { 142b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn LOG(ERROR) << "ReadPCR: " << trunks::GetErrorString(result); 143b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return result; 144b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn } 145b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn printf("PCR Value: %s\n", HexEncode(value).c_str()); 146b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return 0; 147b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn} 148b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn 149b180754b429c078cbc99175a6059a8b5d0491002Darren Krahnint ExtendPCR(const TrunksFactory& factory, 150b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn int index, 151b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn const std::string& value) { 152b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn std::unique_ptr<trunks::TpmUtility> tpm_utility = factory.GetTpmUtility(); 153b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn trunks::TPM_RC result = tpm_utility->ExtendPCR(index, value, nullptr); 154b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn if (result) { 155b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn LOG(ERROR) << "ExtendPCR: " << trunks::GetErrorString(result); 156b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return result; 157b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn } 158b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return 0; 159b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn} 160b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn 16103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn} // namespace 16203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn 1634dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahnint main(int argc, char** argv) { 1643978ff0bfabc5f04798851e003d3dc372280a989Alex Vakulenko base::CommandLine::Init(argc, argv); 16501f41a46e8a9e0b8d4518aaf7aa757e83f4f938fUtkarsh Sanghi brillo::InitLog(brillo::kLogToStderr); 1664dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn base::CommandLine* cl = base::CommandLine::ForCurrentProcess(); 167de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghi if (cl->HasSwitch("help")) { 168de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghi puts("Trunks Client: A command line tool to access the TPM."); 169de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghi PrintUsage(); 170de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghi return 0; 171de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghi } 172de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghi 173b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn TrunksFactoryImpl factory; 174b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn CHECK(factory.Initialize()) << "Failed to initialize trunks factory."; 175de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghi 17680c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn if (cl->HasSwitch("status")) { 177b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return DumpStatus(factory); 17880c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn } 17903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn if (cl->HasSwitch("startup")) { 180b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return Startup(factory); 181c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi } 182d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi if (cl->HasSwitch("clear")) { 183b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return Clear(factory); 184d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi } 18503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn if (cl->HasSwitch("init_tpm")) { 186b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return InitializeTpm(factory); 187c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi } 188e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi if (cl->HasSwitch("allocate_pcr")) { 189b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return AllocatePCR(factory); 190c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi } 191de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghi 192e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi if (cl->HasSwitch("own")) { 193b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return TakeOwnership(cl->GetSwitchValueASCII("owner_password"), factory); 194e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi } 19575f6bf5a8582017f08956f96d81f209ab40d33acUtkarsh Sanghi if (cl->HasSwitch("regression_test")) { 196b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn trunks::TrunksClientTest test(factory); 19775f6bf5a8582017f08956f96d81f209ab40d33acUtkarsh Sanghi LOG(INFO) << "Running RNG test."; 1984ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn if (!test.RNGTest()) { 1994ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(ERROR) << "Error running RNGtest."; 2004ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn return -1; 2014ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn } 2026ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi LOG(INFO) << "Running RSA key tests."; 2034ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn if (!test.SignTest()) { 2044ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(ERROR) << "Error running SignTest."; 2054ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn return -1; 2064ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn } 2074ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn if (!test.DecryptTest()) { 2084ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(ERROR) << "Error running DecryptTest."; 2094ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn return -1; 2104ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn } 2114ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn if (!test.ImportTest()) { 2124ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(ERROR) << "Error running ImportTest."; 2134ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn return -1; 2144ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn } 2154ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn if (!test.AuthChangeTest()) { 2164ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(ERROR) << "Error running AuthChangeTest."; 2174ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn return -1; 2184ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn } 219fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi if (!test.VerifyKeyCreationTest()) { 220fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi LOG(ERROR) << "Error running VerifyKeyCreationTest."; 221fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi return -1; 222fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi } 223a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi LOG(INFO) << "Running Sealed Data test."; 224a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi if (!test.SealedDataTest()) { 225a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi LOG(ERROR) << "Error running SealedDataTest."; 226a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi return -1; 227a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi } 2284ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(INFO) << "Running PCR test."; 2294ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn if (!test.PCRTest()) { 2304ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(ERROR) << "Error running PCRTest."; 2314ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn return -1; 2324ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn } 2334ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(INFO) << "Running policy tests."; 2344ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn if (!test.PolicyAuthValueTest()) { 2354ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(ERROR) << "Error running PolicyAuthValueTest."; 2364ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn return -1; 2374ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn } 2384ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn if (!test.PolicyAndTest()) { 2394ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(ERROR) << "Error running PolicyAndTest."; 2404ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn return -1; 2414ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn } 2424ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn if (!test.PolicyOrTest()) { 2434ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(ERROR) << "Error running PolicyOrTest."; 2444ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn return -1; 2454ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn } 24675f6bf5a8582017f08956f96d81f209ab40d33acUtkarsh Sanghi if (cl->HasSwitch("owner_password")) { 2472be346182387c502f65c65ea4da49707026ce8f9Utkarsh Sanghi std::string owner_password = cl->GetSwitchValueASCII("owner_password"); 2484ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(INFO) << "Running NVRAM test."; 2494ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn if (!test.NvramTest(owner_password)) { 2504ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(ERROR) << "Error running NvramTest."; 2514ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn return -1; 2524ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn } 25375f6bf5a8582017f08956f96d81f209ab40d33acUtkarsh Sanghi } 25475f6bf5a8582017f08956f96d81f209ab40d33acUtkarsh Sanghi LOG(INFO) << "All tests were run successfully."; 25575f6bf5a8582017f08956f96d81f209ab40d33acUtkarsh Sanghi return 0; 25639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi } 2574ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn if (cl->HasSwitch("stress_test")) { 2584ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(INFO) << "Running stress tests."; 259b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn trunks::TrunksClientTest test(factory); 2604ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn if (!test.ManyKeysTest()) { 2614ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(ERROR) << "Error running ManyKeysTest."; 2624ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn return -1; 2634ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn } 2644ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn if (!test.ManySessionsTest()) { 2654ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn LOG(ERROR) << "Error running ManySessionsTest."; 2664ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn return -1; 2674ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn } 2684ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn return 0; 2694ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn } 270b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn if (cl->HasSwitch("read_pcr") && cl->HasSwitch("index")) { 271b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return ReadPCR(factory, atoi(cl->GetSwitchValueASCII("index").c_str())); 272b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn } 273b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn if (cl->HasSwitch("extend_pcr") && cl->HasSwitch("index") && 274b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn cl->HasSwitch("value")) { 275b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn return ExtendPCR(factory, atoi(cl->GetSwitchValueASCII("index").c_str()), 276b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn cl->GetSwitchValueASCII("value")); 277b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn } 27803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn puts("Invalid options!"); 27903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn PrintUsage(); 280c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi return -1; 281c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi} 282