1 //
2 // Copyright (C) 2014 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 #include "trunks/tpm_simulator_handle.h"
18
19 #include <unistd.h>
20
21 #if defined(USE_SIMULATOR)
22 extern "C" {
23 #include <tpm2/TpmBuildSwitches.h>
24 #include <tpm2/_TPM_Init_fp.h>
25 #include <tpm2/ExecCommand_fp.h>
26 #include <tpm2/Manufacture_fp.h>
27 #include <tpm2/Platform.h>
28 } // extern "C"
29 #endif // USE_SIMULATOR
30
31 #include <base/callback.h>
32 #include <base/logging.h>
33 #include <base/stl_util.h>
34
35 #include "trunks/error_codes.h"
36
37 namespace trunks {
38
TpmSimulatorHandle()39 TpmSimulatorHandle::TpmSimulatorHandle() {}
40
~TpmSimulatorHandle()41 TpmSimulatorHandle::~TpmSimulatorHandle() {}
42
Init()43 bool TpmSimulatorHandle::Init() {
44 #if defined(USE_SIMULATOR)
45 // Initialize TPM.
46 CHECK_EQ(chdir("/data/misc/trunksd"), 0);
47 TPM_Manufacture(TRUE);
48 _plat__SetNvAvail();
49 _plat__Signal_PowerOn();
50 _TPM_Init();
51 LOG(INFO) << "Simulator initialized.";
52 #else
53 LOG(FATAL) << "Simulator not configured.";
54 #endif
55 return true;
56 }
57
SendCommand(const std::string & command,const ResponseCallback & callback)58 void TpmSimulatorHandle::SendCommand(const std::string& command,
59 const ResponseCallback& callback) {
60 callback.Run(SendCommandAndWait(command));
61 }
62
SendCommandAndWait(const std::string & command)63 std::string TpmSimulatorHandle::SendCommandAndWait(const std::string& command) {
64 #if defined(USE_SIMULATOR)
65 unsigned int response_size;
66 unsigned char* response;
67 std::string mutable_command(command);
68 ExecuteCommand(command.size(), reinterpret_cast<unsigned char*>(
69 string_as_array(&mutable_command)),
70 &response_size, &response);
71 return std::string(reinterpret_cast<char*>(response), response_size);
72 #else
73 return CreateErrorResponse(TCTI_RC_GENERAL_FAILURE);
74 #endif
75 }
76
77 } // namespace trunks
78