1 //
2 // Copyright (C) 2020 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 #pragma once
17 
18 #include <list>
19 #include <mutex>
20 #include <vector>
21 
22 #include <tss2/tss2_tcti.h>
23 
24 /*
25  * Exposes a TSS2_TCTI_CONTEXT for interacting with an in-process TPM simulator.
26  *
27  * TSS2_TCTI_CONTEXT is the abstraction for "communication channel to a TPM".
28  * It is not safe to create more than one of these per process or per working
29  * directory, as the TPM simulator implementation relies heavily on global
30  * variables and files saved in the working directory.
31  *
32  * TODO(schuffelen): Consider moving this to a separate process with its own
33  * working directory.
34  */
35 class InProcessTpm {
36 public:
37   InProcessTpm();
38   ~InProcessTpm();
39 
40   TSS2_RC Transmit(size_t size, uint8_t const* command);
41   TSS2_RC Receive(size_t* size, uint8_t* response, int32_t timeout);
42 
43   TSS2_TCTI_CONTEXT* TctiContext();
44   static InProcessTpm* TpmFromContext(TSS2_TCTI_CONTEXT*);
45 private:
46   TSS2_TCTI_CONTEXT_COMMON_CURRENT tcti_context_;
47   std::list<std::vector<uint8_t>> command_queue_;
48   std::mutex queue_mutex_;
49 };
50