• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (C) 2015 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 #ifndef TRUNKS_TRUNKS_CLIENT_TEST_H_
18 #define TRUNKS_TRUNKS_CLIENT_TEST_H_
19 
20 #include <string>
21 
22 #include <base/memory/scoped_ptr.h>
23 
24 #include "trunks/scoped_key_handle.h"
25 #include "trunks/tpm_generated.h"
26 #include "trunks/trunks_factory.h"
27 
28 namespace trunks {
29 
30 // This class is used to perform integration tests on the TPM. Each public
31 // method defines a different test to perform.
32 // NOTE: All these tests require that the TPM be owned, and SRKs exist.
33 // Example usage:
34 // TrunksClientTest test;
35 // CHECK(test.RNGTest());
36 // CHECK(test.SimplePolicyTest());
37 class TrunksClientTest {
38  public:
39   TrunksClientTest();
40   // Takes ownership of factory.
41   explicit TrunksClientTest(scoped_ptr<TrunksFactory> factory);
42   virtual ~TrunksClientTest();
43 
44   // This test verifies that the Random Number Generator on the TPM is working
45   // correctly.
46   bool RNGTest();
47 
48   // This test verifies that we can create an unrestricted RSA signing key and
49   // use it to sign arbitrary data.
50   bool SignTest();
51 
52   // This test verfifies that we can create an unrestricted RSA decryption key
53   // and use it to encrypt and decrypt arbitrary data.
54   bool DecryptTest();
55 
56   // This test verifies that we can import a RSA key into the TPM and use it
57   // to encrypt and decrypt some data.
58   bool ImportTest();
59 
60   // This test verifies that we can change a key's authorization data and
61   // still use it to encrypt/decrypt data.
62   bool AuthChangeTest();
63 
64   // This test verifies that we can create a key and then confirm that it
65   // was created by the TPM.
66   bool VerifyKeyCreationTest();
67 
68   // This test verifies that we can seal a secret to the TPM and access
69   // it later.
70   bool SealedDataTest();
71 
72   // This test performs a simple PCR extension and then reads the value in the
73   // PCR to verify if it is correct.
74   // NOTE: PCR banks need to be configured for this test to succeed. Normally
75   // this is done by the platform firmware.
76   bool PCRTest();
77 
78   // This test sets up a PolicySession with the PolicyAuthValue assertion.
79   // This policy is then used to create a key and use it to sign/verify and
80   // encrypt/decrypt.
81   bool PolicyAuthValueTest();
82 
83   // This test sets up a PolicySession that is based on the current PCR value
84   // and a CommandCode for signing. The key created this way is restricted to
85   // be only used for signing, and only if the PCR remains unchanged. The key
86   // is then used to sign arbitrary data, and the signature verified.
87   bool PolicyAndTest();
88 
89   // This test performs a complex assertion using PolicyOR.
90   // We create an unrestricted key, and restricts it to signing
91   // and decryption using Policy Sessions.
92   bool PolicyOrTest();
93 
94   // This test verfies that we can create, write, read, lock and delete
95   // NV spaces in the TPM.
96   // NOTE: This test needs the |owner_password| to work.
97   bool NvramTest(const std::string& owner_password);
98 
99   // This test uses many key handles simultaneously.
100   bool ManyKeysTest();
101 
102   // This test uses many sessions simultaneously.
103   bool ManySessionsTest();
104 
105  private:
106   // This method verifies that plaintext == decrypt(encrypt(plaintext)) using
107   // a given key.
108   // TODO(usanghi): Remove |session| argument once we can support multiple
109   // sessions.
110   bool PerformRSAEncrpytAndDecrpyt(TPM_HANDLE key_handle,
111                                    const std::string& key_authorization,
112                                    HmacSession* session);
113 
114   // Generates an RSA key pair in software. The |modulus| and |prime_factor|
115   // must not be NULL and will be populated with values that can be imported
116   // into the TPM. The |public_key| may be NULL, but if it is not, will be
117   // populated with a value that can be used with VerifyRSASignature.
118   void GenerateRSAKeyPair(std::string* modulus,
119                           std::string* prime_factor,
120                           std::string* public_key);
121 
122   // Verifies an RSA-SSA-SHA256 |signature| over the given |data|. The
123   // |public_key| is as produced by GenerateRSAKeyPair(). Returns true on
124   // success.
125   bool VerifyRSASignature(const std::string& public_key,
126                           const std::string& data,
127                           const std::string& signature);
128 
129   // Loads an arbitrary RSA signing key and provides the |key_handle| and the
130   // |public_key|. Returns true on success.
131   bool LoadSigningKey(ScopedKeyHandle* key_handle, std::string* public_key);
132 
133   // Signs arbitrary data with |key_handle| authorized by |delegate| and
134   // verifies the signature with |public_key|. Returns true on success.
135   bool SignAndVerify(const ScopedKeyHandle& key_handle,
136                      const std::string& public_key,
137                      AuthorizationDelegate* delegate);
138 
139   // Factory for instantiation of Tpm classes
140   scoped_ptr<TrunksFactory> factory_;
141 
142   DISALLOW_COPY_AND_ASSIGN(TrunksClientTest);
143 };
144 
145 }  // namespace trunks
146 
147 #endif  // TRUNKS_TRUNKS_CLIENT_TEST_H_
148