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